GCC Code Coverage Report
Directory: src/ Exec Total Coverage
File: src/being/being.h Lines: 19 116 16.4 %
Date: 2021-03-17 Branches: 0 26 0.0 %

Line Branch Exec Source
1
/*
2
 *  The ManaPlus Client
3
 *  Copyright (C) 2004-2009  The Mana World Development Team
4
 *  Copyright (C) 2009-2010  The Mana Developers
5
 *  Copyright (C) 2011-2019  The ManaPlus Developers
6
 *  Copyright (C) 2019-2021  Andrei Karas
7
 *
8
 *  This file is part of The ManaPlus Client.
9
 *
10
 *  This program is free software; you can redistribute it and/or modify
11
 *  it under the terms of the GNU General Public License as published by
12
 *  the Free Software Foundation; either version 2 of the License, or
13
 *  any later version.
14
 *
15
 *  This program is distributed in the hope that it will be useful,
16
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 *  GNU General Public License for more details.
19
 *
20
 *  You should have received a copy of the GNU General Public License
21
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
 */
23
24
#ifndef BEING_BEING_H
25
#define BEING_BEING_H
26
27
#include "position.h"
28
29
#include "enums/being/badgeindex.h"
30
#include "enums/being/reachable.h"
31
32
#include "enums/gui/usercolorid.h"
33
34
#include "enums/simpletypes/move.h"
35
36
#include "enums/being/visiblenamepos.h"
37
38
#include "resources/beinginfo.h"
39
#include "resources/beingslot.h"
40
41
#include "being/actorsprite.h"
42
43
#include "enums/being/attacktype.h"
44
#include "enums/being/badgedrawtype.h"
45
#include "enums/being/beingaction.h"
46
#include "enums/being/gender.h"
47
48
#include "listeners/configlistener.h"
49
50
#include "localconsts.h"
51
52
static const int DEFAULT_BEING_WIDTH = 32;
53
static const int DEFAULT_BEING_HEIGHT = 32;
54
55
class AnimatedSprite;
56
class BeingCacheEntry;
57
class CastingEffect;
58
class Color;
59
class Equipment;
60
class FlashText;
61
class Guild;
62
class ItemInfo;
63
class Particle;
64
class Party;
65
class SpeechBubble;
66
class Text;
67
68
struct ChatObject;
69
struct HorseInfo;
70
struct MissileInfo;
71
struct SkillInfo;
72
struct ParticleInfo;
73
74
extern volatile time_t cur_time;
75
76
struct NextSoundInfo final
77
{
78
103
    NextSoundInfo() noexcept2 :
79
        sound(nullptr),
80
        x(0),
81
        y(0),
82
103
        time(0)
83
    {
84
    }
85
86
    A_DELETE_COPY(NextSoundInfo)
87
88
    const SoundInfo *sound;
89
    int x;
90
    int y;
91
    int time;
92
};
93
94
class Being notfinal : public ActorSprite,
95
                       public ConfigListener
96
{
97
    public:
98
        friend class ActorManager;
99
        friend class BeingEquipBackend;
100
        friend class LocalPlayer;
101
102
        /**
103
         * Constructor.
104
         *
105
         * @param id      a unique being id
106
         * @param subtype partly determines the type of the being
107
         * @param map     the map the being is on
108
         */
109
        Being(const BeingId id,
110
              const ActorTypeT type);
111
112
        A_DELETE_COPY(Being)
113
114
        ~Being() override;
115
116
12
        ActorTypeT getType() const restrict2 noexcept2 override final
117
                           A_WARN_UNUSED
118
24
        { return mType; }
119
120
        /**
121
         * Removes all path nodes from this being.
122
         */
123
        void clearPath() restrict2;
124
125
        /**
126
         * Returns the time spent in the current action.
127
         */
128
        int getActionTime() const restrict2 noexcept2 A_WARN_UNUSED
129
        { return mActionTime; }
130
131
        /**
132
         * Set the current action time.
133
         * @see Ea::BeingHandler that set it to tick time.
134
         */
135
        void setActionTime(const int actionTime) restrict2 noexcept2
136
        { mActionTime = actionTime; }
137
138
        /**
139
         * Makes this being take the next tile of its path.
140
         */
141
        virtual void nextTile() restrict2;
142
143
        /**
144
         * Creates a path for the being from current position to ex and ey
145
         */
146
        void setDestination(const int dstX,
147
                            const int dstY) restrict2;
148
149
        void setCachedDestination(const int dstX,
150
                                  const int dstY) restrict2 noexcept2
151
        { mCachedX = dstX; mCachedY = dstY; }
152
153
        int getCachedX() const noexcept2 A_WARN_UNUSED
154
        { return mCachedX; }
155
156
        int getCachedY() const noexcept2 A_WARN_UNUSED
157
        { return mCachedY; }
158
159
        /**
160
         * Returns the destination for this being.
161
         */
162
        const Vector &getDestination() const restrict2 noexcept2 A_WARN_UNUSED
163
        { return mDest; }
164
165
        /**
166
         * Returns the tile x coord
167
         */
168
2
        int getTileX() const restrict2 noexcept2 override A_WARN_UNUSED
169
2
        { return mX; }
170
171
        /**
172
         * Returns the tile y coord
173
         */
174
2
        int getTileY() const restrict2 noexcept2 override A_WARN_UNUSED
175
2
        { return mY; }
176
177
        /**
178
         * Sets the tile x and y coord
179
         */
180
        virtual void setTileCoords(const int x, const int y) restrict2;
181
182
        /**
183
         * Puts a "speech balloon" above this being for the specified amount
184
         * of time.
185
         *
186
         * @param text The text that should appear.
187
         * @param time The amount of time the text should stay in milliseconds.
188
         */
189
        void setSpeech(const std::string &restrict text) restrict2;
190
191
        /**
192
         * Puts a damage bubble above this being.
193
         *
194
         * @param attacker the attacking being
195
         * @param amount the amount of damage recieved (0 means miss)
196
         * @param type the attack type
197
         * @param attackId the attack id
198
         * @param level the skill level
199
         */
200
        void takeDamage(Being *restrict const attacker,
201
                        const int amount,
202
                        const AttackTypeT type,
203
                        const int attackId,
204
                        const int level) restrict2;
205
206
        /**
207
         * Handles an attack of another being by this being.
208
         *
209
         * @param victim the victim being
210
         * @param damage the amount of damage dealt (0 means miss)
211
         * @param attackId the attack id
212
         */
213
        void handleAttack(Being *restrict const victim,
214
                          const int damage,
215
                          const int attackId) restrict2;
216
217
        void handleSkillCasting(Being *restrict const victim,
218
                                const int skillId,
219
                                const int skillLevel) restrict2;
220
221
        void handleSkill(Being *restrict const victim,
222
                         const int damage,
223
                         const int skillId,
224
                         const int skillLevel) restrict2;
225
226
        const ItemInfo *getEquippedWeapon() const restrict2 A_WARN_UNUSED
227
        { return mEquippedWeapon; }
228
229
        /**
230
         * Returns the name of the being.
231
         */
232
        const std::string &getName() const restrict2 noexcept2 A_WARN_UNUSED
233
34
        { return mName; }
234
235
        const std::string &getExtName() const restrict2 noexcept2 A_WARN_UNUSED
236
        { return mExtName; }
237
238
        /**
239
         * Sets the name for the being.
240
         *
241
         * @param name The name that should appear.
242
         */
243
        void setName(const std::string &restrict name) restrict2;
244
245
        bool getShowName() const noexcept2 A_WARN_UNUSED
246
7
        { return mShowName; }
247
248
        void setShowName(const bool doShowName) restrict2;
249
250
        /**
251
         * Sets the name of the party the being is in. Shown in BeingPopup.
252
         */
253
        void setPartyName(const std::string &restrict name) restrict2;
254
255
        const std::string &getPartyName() const restrict2 noexcept2
256
                                        A_WARN_UNUSED
257
        { return mPartyName; }
258
259
        const std::string &getGuildName() const restrict2 noexcept2
260
                                        A_WARN_UNUSED
261
        { return mGuildName; }
262
263
        const std::string &getClanName() const restrict2 noexcept2
264
                                       A_WARN_UNUSED
265
        { return mClanName; }
266
267
        /**
268
         * Sets the name of the primary guild the being is in. Shown in
269
         * BeingPopup (eventually).
270
         */
271
        void setGuildName(const std::string &restrict name) restrict2;
272
273
        void setGuildPos(const std::string &restrict pos) restrict2;
274
275
        void setClanName(const std::string &restrict name) restrict2;
276
277
        /**
278
         * Adds a guild to the being.
279
         */
280
        void addGuild(Guild *restrict const guild) restrict2;
281
282
        /**
283
         * Removers a guild from the being.
284
         */
285
        void removeGuild(const int id) restrict2;
286
287
        /**
288
         * Returns a pointer to the specified guild that the being is in.
289
         */
290
        const Guild *getGuild(const std::string &restrict guildName)
291
                              const restrict2 A_WARN_UNUSED;
292
293
        /**
294
         * Returns a pointer to the specified guild that the being is in.
295
         */
296
        const Guild *getGuild(const int id) const restrict2 A_WARN_UNUSED;
297
298
        /**
299
         * Returns a pointer to the specified guild that the being is in.
300
         */
301
        Guild *getGuild() const restrict2 A_WARN_UNUSED;
302
303
        /**
304
         * Returns all guilds the being is in.
305
         */
306
        const std::map<int, Guild*> &getGuilds() const restrict2 noexcept2
307
                                               A_WARN_UNUSED
308
        { return mGuilds; }
309
310
        /**
311
         * Removes all guilds the being is in.
312
         */
313
        void clearGuilds() restrict2;
314
315
        /**
316
         * Get number of guilds the being belongs to.
317
         */
318
        int16_t getNumberOfGuilds() const restrict2 A_WARN_UNUSED
319
        { return CAST_S16(mGuilds.size()); }
320
321
        bool isInParty() const restrict2 noexcept2 A_WARN_UNUSED
322
7
        { return mParty != nullptr; }
323
324
        void setParty(Party *restrict const party) restrict2;
325
326
        void setGuild(Guild *restrict const guild) restrict2;
327
328
        void updateGuild() restrict2;
329
330
        Party *getParty() const restrict2 noexcept2 A_WARN_UNUSED
331
1
        { return mParty; }
332
333
        void setSprite(const unsigned int slot,
334
                       const int id,
335
                       std::string color,
336
                       ItemColor colorId) restrict2;
337
338
        void setSpriteColor(const unsigned int slot,
339
                            const int id,
340
                            const std::string &color) restrict2;
341
342
        void setSpriteColorId(const unsigned int slot,
343
                              const int id,
344
                              ItemColor colorId) restrict2;
345
346
        void setSpriteCards(const unsigned int slot,
347
                            const int id,
348
                            const CardsList &restrict cards) restrict2;
349
350
        void setSpriteId(const unsigned int slot,
351
                         const int id) restrict2;
352
353
        void unSetSprite(const unsigned int slot) restrict2;
354
355
        void setWeaponId(const int id) restrict2;
356
357
        void setTempSprite(const unsigned int slot,
358
                           const int id) restrict2;
359
360
        void setHairTempSprite(const unsigned int slot,
361
                               const int id) restrict2;
362
363
        void updateSprite(const unsigned int slot,
364
                          const int id,
365
                          const std::string &restrict color)
366
                          restrict2;
367
368
        void setHairColorSpriteID(const unsigned int slot,
369
                                  const int id) restrict2;
370
371
        void setSpriteColor(const unsigned int slot,
372
                            const std::string &restrict color) restrict2;
373
374
        /**
375
         * Get the number of layers used to draw the being
376
         */
377
        int getNumberOfLayers() const restrict2 override A_WARN_UNUSED
378
        { return CompoundSprite::getNumberOfLayers(); }
379
380
        /**
381
         * Performs being logic.
382
         */
383
        void logic() restrict2 override;
384
385
        void botLogic() restrict2;
386
387
        /**
388
         * Draws the speech text above the being.
389
         */
390
        void drawSpeech(const int offsetX,
391
                        const int offsetY) restrict2;
392
393
        /**
394
         * Draws the emotion picture above the being.
395
         */
396
        void drawEmotion(Graphics *restrict const graphics,
397
                         const int offsetX,
398
                         const int offsetY) const restrict2 A_NONNULL(2);
399
400
        BeingTypeId getSubType() const restrict2 noexcept2 A_WARN_UNUSED
401
        { return mSubType; }
402
403
         /**
404
          * Set Being's subtype (mostly for view for monsters and NPCs)
405
          */
406
        void setSubtype(const BeingTypeId subtype,
407
                        const uint16_t look) restrict2;
408
409
        const BeingInfo *getInfo() const restrict2 noexcept2 A_WARN_UNUSED
410
        { return mInfo; }
411
412
        TargetCursorSizeT getTargetCursorSize() const restrict2 override final
413
                                              A_WARN_UNUSED;
414
415
        int getTargetOffsetX() const restrict2 override A_WARN_UNUSED
416
        {
417
            if (mInfo == nullptr)
418
                return 0;
419
            return mInfo->getTargetOffsetX();
420
        }
421
422
        int getTargetOffsetY() const restrict2 override A_WARN_UNUSED
423
        {
424
            if (mInfo == nullptr)
425
                return 0;
426
            return mInfo->getTargetOffsetY();
427
        }
428
429
        /**
430
         * Gets the way the object is blocked by other objects.
431
         */
432
        virtual unsigned char getBlockWalkMask() const restrict2 A_WARN_UNUSED
433
        {
434
            if (mInfo == nullptr)
435
                return 0;
436
            return mInfo->getBlockWalkMask();
437
        }
438
439
        /**
440
         * Gets the way the monster blocks pathfinding for other objects
441
         */
442
        BlockTypeT getBlockType() const restrict2 override A_WARN_UNUSED
443
        {
444
            if (mInfo == nullptr)
445
                return BlockType::NONE;
446
            return mInfo->getBlockType();
447
        }
448
449
        /**
450
         * Sets the walk speed in pixels per second.
451
         */
452
        void setWalkSpeed(const int speed) restrict2
453
        { mWalkSpeed = speed; mSpeed = speed; }
454
455
        /**
456
         * Gets the walk speed in pixels per second.
457
         */
458
        int getWalkSpeed() const restrict2 noexcept2 A_WARN_UNUSED
459
94
        { return mWalkSpeed; }
460
461
        /**
462
         * Sets the attack speed.
463
         */
464
        void setAttackSpeed(const int speed) restrict2 noexcept2
465
        { mAttackSpeed = speed; }
466
467
        /**
468
         * Gets the attack speed.
469
         */
470
        int getAttackSpeed() const restrict2 noexcept2 A_WARN_UNUSED
471
        { return mAttackSpeed; }
472
473
        /**
474
         * Sets the current action.
475
         */
476
        virtual void setAction(const BeingActionT &restrict action,
477
                               const int attackId) restrict2;
478
479
        /**
480
         * Get the being's action currently performed.
481
         */
482
        BeingActionT getCurrentAction() const restrict2 noexcept2 A_WARN_UNUSED
483
        { return mAction; }
484
485
        /**
486
         * Returns whether this being is still alive.
487
         */
488
        bool isAlive() const restrict2 noexcept2 A_WARN_UNUSED
489
        { return mAction != BeingAction::DEAD; }
490
491
        /**
492
         * Returns the current direction.
493
         */
494
        uint8_t getDirection() const restrict2 noexcept2 A_WARN_UNUSED
495
        { return mDirection; }
496
497
        /**
498
         * Sets the current direction.
499
         */
500
        virtual void setDirection(const uint8_t direction) restrict2;
501
502
        void setDirectionDelayed(const uint8_t direction) restrict2 noexcept2
503
        { mDirectionDelayed = direction; }
504
505
        uint8_t getDirectionDelayed() const restrict2 noexcept2 A_WARN_UNUSED
506
        { return mDirectionDelayed; }
507
508
        /**
509
         * Returns the direction the being is facing.
510
         */
511
        SpriteDirection::Type getSpriteDirection() const restrict2 noexcept2
512
                                                 A_WARN_UNUSED
513
        { return mSpriteDirection; }
514
515
        void setPixelPositionF(const Vector &restrict pos) restrict2 override;
516
517
        /**
518
         * Overloaded method provided for convenience.
519
         *
520
         * @see setPosition(const Vector &pos)
521
         */
522
        inline void setPixelPositionF(const float x,
523
                                      const float y,
524
                                      const float z) restrict2 A_INLINE
525
        { setPixelPositionF(Vector(x, y, z)); }
526
527
        /**
528
         * Returns the horizontal size of the current base sprite of the being.
529
         */
530
        int getWidth() const restrict2 override final A_WARN_UNUSED
531
        { return std::max(CompoundSprite::getWidth(), DEFAULT_BEING_WIDTH); }
532
533
        /**
534
         * Returns the vertical size of the current base sprite of the being.
535
         */
536
        int getHeight() const restrict2 override final A_WARN_UNUSED
537
        { return std::max(CompoundSprite::getHeight(), DEFAULT_BEING_HEIGHT); }
538
539
        /**
540
         * Shoots a missile particle from this being, to target being
541
         */
542
        void fireMissile(Being *restrict const victim,
543
                         const MissileInfo &restrict missile) const restrict2;
544
545
        /**
546
         * Returns the path this being is following. An empty path is returned
547
         * when this being isn't following any path currently.
548
         */
549
        const Path &getPath() const restrict2 noexcept2 A_WARN_UNUSED
550
        { return mPath; }
551
552
        int getDistance() const restrict2 noexcept2 A_WARN_UNUSED
553
        { return mDistance; }
554
555
        void setDistance(const int n) restrict2 noexcept2
556
        { mDistance = n; }
557
558
        /**
559
         * Set the Emoticon type and time displayed above
560
         * the being.
561
         */
562
        void setEmote(const uint8_t emotion,
563
                      const int emote_time) restrict2;
564
565
        void setState(const uint8_t state) restrict2;
566
567
        void drawPlayerSprites(Graphics *restrict const  graphics,
568
                               const int posX,
569
                               const int posY) const
570
                               restrict2 A_NONNULL(2);
571
572
        void drawSpritesSDL(Graphics *restrict const graphics,
573
                            const int posX,
574
                            const int posY) const
575
                            restrict2 override final A_NONNULL(2);
576
577
        void drawHpBar(Graphics *restrict const graphics,
578
                       const int maxHP,
579
                       const int hp,
580
                       const int damage,
581
                       const UserColorIdT color1,
582
                       const UserColorIdT color2,
583
                       const int x,
584
                       const int y,
585
                       const int width,
586
                       const int height) const restrict2 A_NONNULL(2);
587
588
        void optionChanged(const std::string &restrict value)
589
                           restrict2 override;
590
591
        void flashName(const int time) restrict2;
592
593
        int getDamageTaken() const restrict2 noexcept2 A_WARN_UNUSED
594
1
        { return mDamageTaken; }
595
596
        void setDamageTaken(const int damage) restrict2 noexcept2
597
        { mDamageTaken = damage; }
598
599
        void updateName() restrict2;
600
601
        void setLevel(const int n) restrict2 noexcept2
602
        { mLevel = n; }
603
604
        virtual int getLevel() const restrict2 A_WARN_UNUSED
605
        { return mLevel; }
606
607
        void setReachable(const ReachableT n) restrict2 noexcept2
608
        { mReachable = n; }
609
610
        ReachableT getReachable() const restrict2 noexcept2 A_WARN_UNUSED
611
        { return mReachable; }
612
613
        static void reReadConfig();
614
615
        static BeingCacheEntry* getCacheEntry(const BeingId id) A_WARN_UNUSED;
616
617
        void addToCache() const restrict2;
618
619
        bool updateFromCache() restrict2;
620
621
        /**
622
         * Sets the gender of this being.
623
         */
624
        virtual void setGender(const GenderT gender) restrict2;
625
626
        GenderT getGender() const restrict2 noexcept2 A_WARN_UNUSED
627
        { return mGender; }
628
629
        /**
630
         * Return sprite sit action for current environment.
631
         */
632
        std::string getSitAction() const restrict2 A_WARN_UNUSED;
633
634
        std::string getCastAction() const restrict2 A_WARN_UNUSED;
635
636
        std::string getCastAction(const SkillInfo *restrict const skill) const
637
                                  restrict2 A_WARN_UNUSED;
638
639
        std::string getMoveAction() const restrict2 A_WARN_UNUSED;
640
641
        std::string getDeadAction() const restrict2 A_WARN_UNUSED;
642
643
        std::string getStandAction() const restrict2 A_WARN_UNUSED;
644
645
        std::string getSpawnAction() const restrict2 A_WARN_UNUSED;
646
647
        std::string getWeaponAttackAction(const ItemInfo *restrict const
648
                                          weapon) const
649
                                          restrict2 A_WARN_UNUSED;
650
651
        std::string getAttackAction() const restrict2 A_WARN_UNUSED;
652
653
        std::string getAttackAction(const Attack *restrict const attack1) const
654
                                    restrict2 A_WARN_UNUSED;
655
656
        /**
657
         * Whether or not this player is a GM.
658
         */
659
        bool isGM() const restrict2 noexcept2 A_WARN_UNUSED
660
2
        { return mIsGM; }
661
662
        /**
663
         * Triggers whether or not to show the name as a GM name.
664
         */
665
        void setGM(const bool gm) restrict2;
666
667
        bool canTalk() const restrict2 noexcept2 A_WARN_UNUSED
668
        { return mType == ActorType::Npc; }
669
670
        void talkTo() const restrict2;
671
672
        void draw(Graphics *restrict const graphics,
673
                  const int offsetX,
674
                  const int offsetY) const
675
                  restrict2 override final A_NONNULL(2);
676
677
        void drawPlayer(Graphics *restrict const graphics,
678
                        const int offsetX,
679
                        const int offsetY) const
680
                        restrict2 A_NONNULL(2);
681
682
        void drawOther(Graphics *restrict const graphics,
683
                       const int offsetX,
684
                       const int offsetY) const
685
                       restrict2 A_NONNULL(2);
686
687
        void drawNpc(Graphics *restrict const graphics,
688
                     const int offsetX,
689
                     const int offsetY) const
690
                     restrict2 A_NONNULL(2);
691
692
        void drawMonster(Graphics *restrict const graphics,
693
                         const int offsetX,
694
                         const int offsetY) const
695
                         restrict2 A_NONNULL(2);
696
697
        void drawPortal(Graphics *restrict const graphics,
698
                        const int offsetX,
699
                        const int offsetY) const
700
                        restrict2 A_NONNULL(2);
701
702
        void drawBasic(Graphics *restrict const graphics,
703
                       const int x,
704
                       const int y) const restrict2 A_NONNULL(2);
705
706
        void setMoveTime() restrict2 noexcept2
707
        { mMoveTime = cur_time; }
708
709
        void setAttackTime() restrict2 noexcept2
710
        { mAttackTime = cur_time; }
711
712
        void setTalkTime() restrict2 noexcept2
713
        { mTalkTime = cur_time; }
714
715
        void setTestTime() restrict2 noexcept2
716
        { mTestTime = cur_time; }
717
718
        void setOtherTime() restrict2 noexcept2
719
        { mOtherTime = cur_time; }
720
721
        time_t getMoveTime() const restrict2 noexcept2
722
        { return mMoveTime; }
723
724
        time_t getAttackTime() const restrict2 noexcept2
725
        { return mAttackTime; }
726
727
        time_t getTalkTime() const restrict2 noexcept2
728
        { return mTalkTime; }
729
730
        time_t getTestTime() const restrict2 noexcept2
731
        { return mTestTime; }
732
733
        time_t getOtherTime() const restrict2 noexcept2
734
        { return mOtherTime; }
735
736
        void resetCounters() restrict2;
737
738
        void updateColors() restrict2;
739
740
        void setEnemy(const bool n) restrict2 noexcept2
741
        { mEnemy = n; }
742
743
        const std::string &getIp() const restrict2 noexcept2 A_WARN_UNUSED
744
        { return mIp; }
745
746
        void setIp(const std::string &restrict ip) restrict2 noexcept2
747
        { mIp = ip; }
748
749
        unsigned int getPvpRank() const restrict2 noexcept2 A_WARN_UNUSED
750
        { return mPvpRank; }
751
752
        void setPvpRank(const unsigned int rank) restrict2 noexcept2
753
        { mPvpRank = rank; }
754
755
        void setHP(const int hp) restrict2;
756
757
        void setMaxHP(const int hp) restrict2;
758
759
        int getHP() const restrict2 noexcept2 A_WARN_UNUSED
760
        { return mHP; }
761
762
        int getMaxHP() const restrict2 noexcept2 A_WARN_UNUSED
763
        { return mMaxHP; }
764
765
        uint8_t calcDirection(const int dstX,
766
                              const int dstY) const restrict2 A_WARN_UNUSED;
767
768
        uint8_t calcDirection() const restrict2 A_WARN_UNUSED;
769
770
        void setAttackDelay(const int n) restrict2 noexcept2
771
        { mAttackDelay = n; }
772
773
        int getAttackDelay() const restrict2 noexcept2 A_WARN_UNUSED
774
        { return mAttackDelay; }
775
776
        int getMinHit() const restrict2 noexcept2 A_WARN_UNUSED
777
        { return mMinHit; }
778
779
        void setMinHit(const int n) restrict2 noexcept2
780
        { mMinHit = n; }
781
782
        int getMaxHit() const restrict2 noexcept2 A_WARN_UNUSED
783
        { return mMaxHit; }
784
785
        void setMaxHit(const int n) restrict2 noexcept2
786
        { mMaxHit = n; }
787
788
        int getCriticalHit() const restrict2 A_WARN_UNUSED
789
        { return mCriticalHit; }
790
791
        void setCriticalHit(const int n) restrict2 noexcept2
792
        { mCriticalHit = n; }
793
794
        void updateHit(const int amount) restrict2;
795
796
        Equipment *getEquipment() restrict2 A_WARN_UNUSED;
797
798
        void undressItemById(const int id) restrict2;
799
800
        int getGoodStatus() const restrict2 noexcept2 A_WARN_UNUSED
801
7
        { return mGoodStatus; }
802
803
        void setGoodStatus(const int n) restrict2 noexcept2
804
6
        { mGoodStatus = n; }
805
806
        std::string getGenderSign() const restrict2 A_WARN_UNUSED;
807
808
        std::string getGenderSignWithSpace() const restrict2 A_WARN_UNUSED;
809
810
        void updateComment() restrict2;
811
812
        const std::string getComment() const restrict2 noexcept2 A_WARN_UNUSED
813
        { return mComment; }
814
815
        void setComment(const std::string &restrict n) restrict2 noexcept2
816
        { mComment = n; }
817
818
        static void clearCache();
819
820
        static std::string loadComment(const std::string &restrict name,
821
                                       const ActorTypeT &restrict type)
822
                                       A_WARN_UNUSED;
823
824
        static void saveComment(const std::string &restrict name,
825
                                const std::string &restrict comment,
826
                                const ActorTypeT &restrict type);
827
828
        bool isAdvanced() const restrict2 noexcept2 A_WARN_UNUSED
829
        { return mAdvanced; }
830
831
        void setAdvanced(const bool n) restrict2
832
        { mAdvanced = n; addToCache(); }
833
834
        bool isBuyShopEnabled() const restrict2 A_WARN_UNUSED;
835
836
        bool isSellShopEnabled() const restrict2 A_WARN_UNUSED;
837
838
        void enableShop(const bool b) restrict2;
839
840
        /**
841
         * Sets the attack range.
842
         */
843
        void setAttackRange(const int range) restrict2 noexcept2
844
        { mAttackRange = range; }
845
846
/*
847
        void attack(Being *restrict target = nullptr,
848
                    bool keep = false,
849
                    bool dontChangeEquipment = false) restrict2;
850
851
        void attack2(Being *restrict target = nullptr,
852
                     bool keep = false,
853
                     bool dontChangeEquipment = false) restrict2;
854
*/
855
856
        void updatePercentHP() restrict2;
857
858
        void setRaceName(const std::string &restrict name) restrict2 noexcept2
859
        { mRaceName = name; }
860
861
        std::string getRaceName() const restrict2 noexcept2 A_WARN_UNUSED
862
2
        { return mRaceName; }
863
864
        int getSpriteID(const int slot) const restrict2 A_WARN_UNUSED;
865
866
        const BeingSlot &getSpriteSlot(const int slot) const
867
                                       restrict2 A_WARN_UNUSED;
868
869
        ItemColor getSpriteColor(const int slot) const restrict2 A_WARN_UNUSED;
870
871
        void setHairStyle(const unsigned int slot,
872
                          const int id) restrict2;
873
874
        void setHairColor(const unsigned int slot,
875
                          const ItemColor color) restrict2;
876
877
        void setHairColor(const ItemColor color) restrict2 noexcept2
878
        { mHairColor = color; }
879
880
        void setSpriteSlot(const unsigned int slot,
881
                           const BeingSlot &beingSlot);
882
883
        ItemColor getHairColor() const noexcept2 A_WARN_UNUSED
884
        { return mHairColor; }
885
886
        void recalcSpritesOrder() restrict2;
887
888
        static int getHitEffect(const Being *restrict const attacker,
889
                                const AttackTypeT type,
890
                                const int attackId,
891
                                const int level);
892
893
        CursorT getHoverCursor() const restrict2 A_WARN_UNUSED
894
        {
895
            return mInfo != nullptr ?
896
                mInfo->getHoverCursor() : Cursor::CURSOR_POINTER;
897
        }
898
899
        void addAfkEffect() restrict2;
900
901
        void removeAfkEffect() restrict2;
902
903
        void updateAwayEffect() restrict2;
904
905
        void addSpecialEffect(const int effect) restrict2;
906
907
        void removeSpecialEffect() restrict2;
908
909
        void addEffect(const std::string &restrict name) restrict2;
910
911
        void setOwner(Being *restrict const owner) restrict2 noexcept2
912
        { mOwner = owner; }
913
914
        Being *getOwner() const restrict2 noexcept2
915
        { return mOwner; }
916
917
        void playSfx(const SoundInfo &sound,
918
                     Being *const being,
919
                     const bool main,
920
                     const int x, const int y) const restrict2;
921
922
        uint16_t getLook() const restrict2 noexcept2
923
        { return mLook; }
924
925
        void setLook(const uint16_t look) restrict2;
926
927
        constexpr2 static uint8_t genderToInt(const GenderT sex)
928
                                              A_CONST A_WARN_UNUSED
929
        {
930
            switch (sex)
931
            {
932
                case Gender::FEMALE:
933
                case Gender::UNSPECIFIED:
934
                default:
935
                    return 0;
936
                case Gender::MALE:
937
                    return 1;
938
            }
939
        }
940
941
        constexpr2 static GenderT intToGender(const uint8_t sex)
942
                                              A_CONST A_WARN_UNUSED
943
        {
944
            switch (sex)
945
            {
946
                case 0:
947
                default:
948
                    return Gender::FEMALE;
949
                case 1:
950
                    return Gender::MALE;
951
            }
952
        }
953
954
        NextSoundInfo mNextSound;
955
956
        /**
957
         * Sets the new path for this being.
958
         */
959
        void setPath(const Path &restrict path) restrict2;
960
961
        int getSortPixelY() const restrict2 override A_WARN_UNUSED
962
        { return CAST_S32(mPos.y) - mYDiff - mSortOffsetY; }
963
964
        void setMap(Map *restrict const map) restrict2 override;
965
966
        void recreateItemParticles() restrict2;
967
968
        void incUsage() restrict2 noexcept2
969
        { mUsageCounter ++; }
970
971
        int decUsage() restrict2 noexcept2
972
        { return --mUsageCounter; }
973
974
        virtual int getLastAttackX() const restrict2
975
        { return mLastAttackX; }
976
977
        virtual int getLastAttackY() const restrict2
978
        { return mLastAttackY; }
979
980
        void drawHomunculus(Graphics *restrict const graphics,
981
                            const int offsetX,
982
                            const int offsetY) const
983
                            restrict2 A_NONNULL(2);
984
985
        void drawMercenary(Graphics *restrict const graphics,
986
                           const int offsetX,
987
                           const int offsetY) const
988
                           restrict2 A_NONNULL(2);
989
990
        void drawElemental(Graphics *restrict const graphics,
991
                           const int offsetX,
992
                           const int offsetY) const
993
                           restrict2 A_NONNULL(2);
994
995
        void setTrickDead(const bool b) restrict2 override final;
996
997
        void setChat(ChatObject *restrict const obj) restrict2;
998
999
        ChatObject *getChat() const restrict2 noexcept2
1000
        { return mChat; }
1001
1002
        void setRiding(const bool b) restrict2 override final;
1003
1004
        void setHorse(const int horseId) restrict2;
1005
1006
        void removeHorse() restrict2;
1007
1008
        void setSellBoard(const std::string &restrict text) restrict2;
1009
1010
        std::string getSellBoard() const restrict2 noexcept2 A_WARN_UNUSED
1011
        { return mSellBoard; }
1012
1013
        void setBuyBoard(const std::string &restrict text) restrict2;
1014
1015
        std::string getBuyBoard() const restrict2 noexcept2 A_WARN_UNUSED
1016
        { return mBuyBoard; }
1017
1018
        void setSpiritBalls(const unsigned int balls) restrict2;
1019
1020
        unsigned int getSpiritBalls() const restrict2 noexcept2 A_WARN_UNUSED
1021
        { return mSpiritBalls; }
1022
1023
        void stopCast(const bool b) override final;
1024
1025
        void setCreatorId(const BeingId id)
1026
        { mCreatorId = id; }
1027
1028
        BeingId getCreatorId() const noexcept2 A_WARN_UNUSED
1029
        { return mCreatorId; }
1030
1031
        void setKarma(const int karma) restrict2 noexcept2
1032
        { mKarma = karma; }
1033
1034
        int getKarma() const restrict2 noexcept2 A_WARN_UNUSED
1035
        { return mKarma; }
1036
1037
        void setManner(const int manner) restrict2 noexcept2
1038
        { mManner = manner; }
1039
1040
        int getManner() const restrict2 noexcept2 A_WARN_UNUSED
1041
        { return mManner; }
1042
1043
        void disableBotAi() restrict2 noexcept2
1044
        { mBotAi = false; }
1045
1046
        void enableBotAi() restrict2 noexcept2
1047
        { mBotAi = true; }
1048
1049
        int getAreaSize() const restrict2 noexcept2 A_WARN_UNUSED
1050
        { return mAreaSize; }
1051
1052
        void setAreaSize(const int areaSize) restrict2 noexcept2
1053
        { mAreaSize = areaSize; }
1054
1055
        void setTeamId(const uint16_t teamId) restrict2;
1056
1057
        void showTeamBadge(const bool show) restrict2;
1058
1059
        void showGuildBadge(const bool show) restrict2;
1060
1061
        void showClanBadge(const bool show) restrict2;
1062
1063
        void showGmBadge(const bool show) restrict2;
1064
1065
        void showPartyBadge(const bool show) restrict2;
1066
1067
        void showNameBadge(const bool show) restrict2;
1068
1069
        void showShopBadge(const bool show) restrict2;
1070
1071
        void showInactiveBadge(const bool show) restrict2;
1072
1073
        void showAwayBadge(const bool show) restrict2;
1074
1075
        void showBadges(const bool show) restrict2;
1076
1077
        void setLanguageId(const int lang) restrict2 noexcept2;
1078
1079
        int getLanguageId() restrict2 noexcept2 A_WARN_UNUSED
1080
        { return mLanguageId; }
1081
1082
        uint16_t getTeamId() const restrict2 noexcept2 A_WARN_UNUSED
1083
        { return mTeamId; }
1084
1085
        virtual void setGroupId(const int id);
1086
1087
        int getGroupId() const noexcept2 A_WARN_UNUSED
1088
1
        { return mGroupId; }
1089
1090
        void serverRemove() restrict2 noexcept2;
1091
1092
        void addCast(const int dstX,
1093
                     const int dstY,
1094
                     const int skillId,
1095
                     const int skillLevel,
1096
                     const int range,
1097
                     const int waitTimeTicks);
1098
1099
        void fixDirectionOffsets(int &offsetX,
1100
                                 int &offsetY) const;
1101
1102
        bool getAllowNpcEquipment() const noexcept2 A_WARN_UNUSED
1103
        { return mAllowNpcEquipment; }
1104
1105
        static Being *createBeing(const BeingId id,
1106
                                  const ActorTypeT type,
1107
                                  const BeingTypeId subtype,
1108
                                  Map *const map);
1109
1110
    protected:
1111
        void drawPlayerSpriteAt(Graphics *restrict const graphics,
1112
                                const int x,
1113
                                const int y) const restrict2 A_NONNULL(2);
1114
1115
        void drawOtherSpriteAt(Graphics *restrict const graphics,
1116
                               const int x,
1117
                               const int y) const restrict2 A_NONNULL(2);
1118
1119
        void drawNpcSpriteAt(Graphics *restrict const graphics,
1120
                             const int x,
1121
                             const int y) const restrict2 A_NONNULL(2);
1122
1123
        void drawPortalSpriteAt(Graphics *restrict const graphics,
1124
                                const int x,
1125
                                const int y) const restrict2 A_NONNULL(2);
1126
1127
        void drawMonsterSpriteAt(Graphics *restrict const graphics,
1128
                                 const int x,
1129
                                 const int y) const restrict2 A_NONNULL(2);
1130
1131
        void drawHomunculusSpriteAt(Graphics *restrict const graphics,
1132
                                    const int x,
1133
                                    const int y) const restrict2 A_NONNULL(2);
1134
1135
        void drawMercenarySpriteAt(Graphics *restrict const graphics,
1136
                                   const int x,
1137
                                   const int y) const restrict2 A_NONNULL(2);
1138
1139
        void drawElementalSpriteAt(Graphics *restrict const graphics,
1140
                                   const int x,
1141
                                   const int y) const restrict2 A_NONNULL(2);
1142
1143
        void drawCompound(Graphics *const graphics,
1144
                          const int posX,
1145
                          const int posY) const A_NONNULL(2);
1146
1147
        /**
1148
         * Updates name's location.
1149
         */
1150
        virtual void updateCoords() restrict2;
1151
1152
        void showName() restrict2;
1153
1154
        void addItemParticles(const int id,
1155
                              const SpriteDisplay &restrict display) restrict2;
1156
1157
        void addItemParticlesCards(const int id,
1158
                                   const SpriteDisplay &restrict display,
1159
                                   const CardsList &restrict cards) restrict2;
1160
1161
        void removeAllItemsParticles() restrict2;
1162
1163
        void removeItemParticles(const int id) restrict2;
1164
1165
        void createSpeechBubble() restrict2;
1166
1167
        void setDefaultNameColor(const UserColorIdT defaultColor) restrict2;
1168
1169
        void updateBadgesCount() restrict2;
1170
1171
        static int getDefaultEffectId(const AttackTypeT &restrict type);
1172
1173
        BeingInfo *restrict mInfo;
1174
        AnimatedSprite *restrict mEmotionSprite;
1175
        AnimatedSprite *restrict mAnimationEffect;
1176
        CastingEffect *restrict mCastingEffect;
1177
        AnimatedSprite *restrict mBadges[BadgeIndex::BadgeIndexSize];
1178
1179
        std::string mSpriteAction;
1180
        std::string mName;              /**< Name of being */
1181
        std::string mExtName;           /**< Full name of being */
1182
        std::string mRaceName;
1183
        std::string mPartyName;
1184
        std::string mGuildName;
1185
        std::string mClanName;
1186
        std::string mSpeech;
1187
1188
        /**
1189
         * Holds a text object when the being displays it's name, 0 otherwise
1190
         */
1191
        FlashText *restrict mDispName;
1192
        const Color *restrict mNameColor;
1193
1194
        /** Engine-related infos about weapon. */
1195
        const ItemInfo *restrict mEquippedWeapon;
1196
1197
        Path mPath;
1198
        Text *restrict mText;
1199
        const Color *restrict mTextColor;
1200
1201
        Vector mDest;  /**< destination coordinates. */
1202
1203
        typedef std::map<int, ParticleInfo*> SpriteParticleInfo;
1204
        typedef SpriteParticleInfo::iterator SpriteParticleInfoIter;
1205
1206
        STD_VECTOR<BeingSlot> mSlots;
1207
        SpriteParticleInfo mSpriteParticles;
1208
1209
        // Character guild information
1210
        std::map<int, Guild*> mGuilds;
1211
        Party *mParty;
1212
1213
        int mActionTime;      /**< Time spent in current action */
1214
        int mEmotionTime;     /**< Time until emotion disappears */
1215
1216
        /** Time until the last speech sentence disappears */
1217
        int mSpeechTime;
1218
        int mAttackSpeed;     /**< Attack speed */
1219
1220
        int mLevel;
1221
        int mGroupId;
1222
        int mAttackRange;
1223
        int mLastAttackX;
1224
        int mLastAttackY;
1225
1226
        int mPreStandTime;
1227
1228
        GenderT mGender;
1229
        BeingActionT mAction;
1230
        BeingTypeId mSubType;       /**< Subtype (graphical view, basically) */
1231
        uint8_t mDirection;         /**< Facing direction */
1232
        uint8_t mDirectionDelayed;  /**< Facing direction */
1233
        SpriteDirection::Type mSpriteDirection;  /**< Facing direction */
1234
        bool mShowName;
1235
        bool mIsGM;
1236
1237
    protected:
1238
        void postInit(const BeingTypeId subType,
1239
                      Map *const map);
1240
1241
        void updateBadgesPosition();
1242
1243
        /**
1244
         * Calculates the offset in the given directions.
1245
         * If walking in direction 'neg' the value is negated.
1246
         */
1247
        template<signed char pos, signed char neg>
1248
        int getOffset() const restrict2 A_WARN_UNUSED;
1249
1250
        int searchSlotValue(const STD_VECTOR<int> &restrict slotRemap,
1251
                            const int val) const restrict2 A_WARN_UNUSED;
1252
1253
        static void searchSlotValueItr(STD_VECTOR<int>::iterator &restrict it,
1254
                                       int &idx,
1255
                                       STD_VECTOR<int> &restrict slotRemap,
1256
                                       const int val);
1257
1258
        void addSpiritBalls(const unsigned int balls,
1259
                            const int effectId) restrict2;
1260
1261
        void removeSpiritBalls(const unsigned int balls) restrict2;
1262
1263
        void dumpSprites() const restrict2;
1264
1265
        void drawBeingCursor(Graphics *const graphics,
1266
                             const int offsetX,
1267
                             const int offsetY) const A_NONNULL(2);
1268
1269
        void drawCasting(Graphics *const graphics,
1270
                         const int offsetX,
1271
                         const int offsetY) const A_NONNULL(2);
1272
1273
        void updateBotFollow(int dstX,
1274
                             int dstY,
1275
                             const int divX,
1276
                             const int divY);
1277
1278
        void moveBotTo(int dstX,
1279
                       int dstY);
1280
1281
        void updateBotDirection(const int dstX,
1282
                                const int dstY);
1283
1284
        void botFixOffset(int &restrict dstX,
1285
                          int &restrict dstY) const;
1286
1287
        const ActorTypeT mType;
1288
1289
        /** Speech Bubble components */
1290
        SpeechBubble *restrict mSpeechBubble;
1291
1292
        /**
1293
         * Walk speed for x and y movement values.
1294
         * In pixels per second.
1295
         * @see MILLISECONDS_IN_A_TICK
1296
         */
1297
        int mWalkSpeed;
1298
        int mSpeed;
1299
        std::string mIp;
1300
        int *restrict mSpriteRemap A_NONNULLPOINTER;
1301
        int *restrict mSpriteHide A_NONNULLPOINTER;
1302
        int *restrict mSpriteDraw A_NONNULLPOINTER;
1303
        std::string mComment;
1304
        std::string mBuyBoard;
1305
        std::string mSellBoard;
1306
        Being *restrict mOwner;
1307
        Particle *restrict mSpecialParticle;
1308
        ChatObject *restrict mChat;
1309
        HorseInfo *restrict mHorseInfo;
1310
        STD_VECTOR<AnimatedSprite*> mDownHorseSprites;
1311
        STD_VECTOR<AnimatedSprite*> mUpHorseSprites;
1312
        STD_VECTOR<Particle*> mSpiritParticles;
1313
1314
        int mX;             // position in tiles
1315
        int mY;             // position in tiles
1316
        int mCachedX;
1317
        int mCachedY;
1318
        int mSortOffsetY;  // caculated offset in pixels based on mPixelOffsetY
1319
        int mPixelOffsetY;  // tile height offset in pixels
1320
                            // calculated between tiles
1321
        int mFixedOffsetY;  // fixed tile height offset in pixels for tile
1322
        uint8_t mOldHeight;
1323
1324
        int mDamageTaken;
1325
        int mHP;
1326
        int mMaxHP;
1327
        int mDistance;
1328
        ReachableT mReachable;
1329
        int mGoodStatus;
1330
1331
        static time_t mUpdateConfigTime;
1332
        static unsigned int mConfLineLim;
1333
        static int mSpeechType;
1334
        static bool mHighlightMapPortals;
1335
        static bool mHighlightMonsterAttackRange;
1336
        static bool mLowTraffic;
1337
        static bool mDrawHotKeys;
1338
        static bool mShowBattleEvents;
1339
        static bool mShowMobHP;
1340
        static bool mShowOwnHP;
1341
        static bool mShowGender;
1342
        static bool mShowLevel;
1343
        static bool mShowPlayersStatus;
1344
        static bool mEnableReorderSprites;
1345
        static bool mHideErased;
1346
        static Move mMoveNames;
1347
        static bool mUseDiagonal;
1348
        static BadgeDrawType::Type mShowBadges;
1349
        static int mAwayEffect;
1350
        static VisibleNamePos::Type mVisibleNamePos;
1351
1352
        time_t mMoveTime;
1353
        time_t mAttackTime;
1354
        time_t mTalkTime;
1355
        time_t mOtherTime;
1356
        time_t mTestTime;
1357
        int mAttackDelay;
1358
        int mMinHit;
1359
        int mMaxHit;
1360
        int mCriticalHit;
1361
        unsigned int mPvpRank;
1362
        unsigned int mNumber;
1363
        unsigned int mSpiritBalls;
1364
        int mUsageCounter;
1365
        int mKarma;
1366
        int mManner;
1367
        int mAreaSize;
1368
        int mCastEndTime;
1369
        int mLanguageId;
1370
        int mBadgesX;
1371
        int mBadgesY;
1372
        BeingId mCreatorId;
1373
        uint16_t mTeamId;
1374
        uint16_t mLook;
1375
        uint16_t mBadgesCount;
1376
        ItemColor mHairColor;
1377
        bool mErased;
1378
        bool mEnemy;
1379
        bool mGotComment;
1380
        bool mAdvanced;
1381
        bool mShop;
1382
        bool mAway;
1383
        bool mInactive;
1384
        bool mNeedPosUpdate;
1385
        bool mBotAi;
1386
        bool mAllowNpcEquipment;
1387
};
1388
1389
extern std::list<BeingCacheEntry*> beingInfoCache;
1390
1391
#endif  // BEING_BEING_H