00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef BEING_H
00023 #define BEING_H
00024
00025 #include <guichan/color.hpp>
00026
00027 #include <SDL_types.h>
00028
00029 #include <set>
00030 #include <string>
00031 #include <vector>
00032
00033 #include "map.h"
00034 #include "particlecontainer.h"
00035 #include "position.h"
00036 #include "sprite.h"
00037 #include "vector.h"
00038
00039 #include "resources/spritedef.h"
00040
00041 #define FIRST_IGNORE_EMOTE 14
00042 #define STATUS_EFFECTS 32
00043
00044 #define SPEECH_TIME 500
00045 #define SPEECH_MAX_TIME 1000
00046
00047 class AnimatedSprite;
00048 class Image;
00049 class ItemInfo;
00050 class Item;
00051 class Map;
00052 class Graphics;
00053 class Particle;
00054 class Position;
00055 class SimpleAnimation;
00056 class SpeechBubble;
00057 class Text;
00058
00059 class StatusEffect;
00060
00061 typedef std::list<Sprite*> Sprites;
00062 typedef Sprites::iterator SpriteIterator;
00063
00064 enum Gender
00065 {
00066 GENDER_MALE = 0,
00067 GENDER_FEMALE = 1,
00068 GENDER_UNSPECIFIED = 2
00069 };
00070
00071 class Being : public Sprite
00072 {
00073 public:
00074 enum Type
00075 {
00076 UNKNOWN,
00077 PLAYER,
00078 NPC,
00079 MONSTER
00080 };
00081
00087 enum Action
00088 {
00089 STAND,
00090 WALK,
00091 ATTACK,
00092 SIT,
00093 DEAD,
00094 HURT
00095 };
00096
00097 enum Sprite
00098 {
00099 BASE_SPRITE = 0,
00100 SHOE_SPRITE,
00101 BOTTOMCLOTHES_SPRITE,
00102 TOPCLOTHES_SPRITE,
00103 #ifdef EATHENA_SUPPORT
00104 MISC1_SPRITE,
00105 MISC2_SPRITE,
00106 #endif
00107 HAIR_SPRITE,
00108 HAT_SPRITE,
00109 #ifdef EATHENA_SUPPORT
00110 CAPE_SPRITE,
00111 GLOVES_SPRITE,
00112 #endif
00113 WEAPON_SPRITE,
00114 #ifdef EATHENA_SUPPORT
00115 SHIELD_SPRITE,
00116 #endif
00117 VECTOREND_SPRITE
00118 };
00119
00120 enum TargetCursorSize
00121 {
00122 TC_SMALL = 0,
00123 TC_MEDIUM,
00124 TC_LARGE,
00125 NUM_TC
00126 };
00127
00128 enum Speech
00129 {
00130 NO_SPEECH = 0,
00131 TEXT_OVERHEAD,
00132 NO_NAME_IN_BUBBLE,
00133 NAME_IN_BUBBLE,
00134 NUM_SPEECH
00135 };
00136
00137 enum AttackType
00138 {
00139 HIT = 0x00,
00140 CRITICAL = 0x0a,
00141 MULTI = 0x08,
00142 REFLECT = 0x04,
00143 FLEE = 0x0b
00144 };
00145
00149 enum { DOWN = 1, LEFT = 2, UP = 4, RIGHT = 8 };
00150
00151 #ifdef EATHENA_SUPPORT
00152 Uint16 mX, mY;
00153 int mFrame;
00154 int mWalkTime;
00155 #endif
00156 int mEmotion;
00157 int mEmotionTime;
00158 int mSpeechTime;
00159
00160 int mAttackSpeed;
00161 Action mAction;
00162 Uint16 mJob;
00171 Being(int id, int job, Map *map);
00172
00173 virtual ~Being();
00174
00178 void clearPath();
00179
00183 #ifdef EATHENA_SUPPORT
00184 virtual void setDestination(Uint16 destX, Uint16 destY);
00185 #else
00186 void setDestination(int x, int y);
00187
00191 const Vector &getDestination() const { return mDest; }
00192
00196 void adjustCourse(int srcX, int srcY);
00197
00201 void adjustCourse(int srcX, int srcY, int destX, int destY);
00202 #endif
00203
00211 void setSpeech(const std::string &text, int time = 500);
00212
00220 virtual void takeDamage(Being *attacker, int damage, AttackType type);
00221
00229 #ifdef TMWSERV_SUPPORT
00230 virtual void handleAttack();
00231 #else
00232 virtual void handleAttack(Being *victim, int damage, AttackType type);
00233 #endif
00234
00238 const std::string &getName() const
00239 { return mName; }
00240
00246 virtual void setName(const std::string &name)
00247 { mName = name; }
00248
00252 int getHairColor() const { return mHairColor; }
00253
00257 int getHairStyle() const { return mHairStyle; }
00258
00262 static int getNumOfHairstyles() { return mNumberOfHairstyles; }
00263
00267 virtual void setHairStyle(int style, int color);
00268
00272 virtual void setSprite(int slot, int id,
00273 const std::string &color = "");
00274
00278 virtual void setGender(Gender gender) { mGender = gender; }
00279
00280 Gender getGender() const { return mGender; }
00281
00282 #ifdef EATHENA_SUPPORT
00283
00286 virtual void nextStep();
00287 #endif
00288
00292 virtual void setGM() { mIsGM = true; }
00293
00297 virtual void logic();
00298
00302 void drawSpeech(int offsetX, int offsetY);
00303
00307 void drawEmotion(Graphics *graphics, int offsetX, int offsetY);
00308
00312 virtual Type getType() const;
00313
00317 void setWalkSpeed(int speed) { mWalkSpeed = speed; }
00318
00319 int getWalkSpeed() const { return mWalkSpeed; }
00320
00324 void setId(int id) { mId = id; }
00325
00326 int getId() const { return mId; }
00327
00331 void setMap(Map *map);
00332
00336 virtual void setAction(Action action, int attackType = 0);
00337
00341 bool isAlive() const { return mAction != DEAD; }
00342
00346 Uint8 getDirection() const { return mDirection; }
00347
00351 void setDirection(Uint8 direction);
00352
00353 #ifdef EATHENA_SUPPORT
00354
00357 int getWalkTime() const { return mWalkTime; }
00358 #endif
00359
00363 #ifdef TMWSERV_SUPPORT
00364 SpriteDirection getSpriteDirection() const
00365 { return SpriteDirection(mSpriteDirection); }
00366 #else
00367 SpriteDirection getSpriteDirection() const;
00368 #endif
00369
00375 virtual void draw(Graphics *graphics, int offsetX, int offsetY) const;
00376
00380 int getPixelX() const { return mPx; }
00381
00387 int getPixelY() const { return mPy; }
00388
00389 #ifdef EATHENA_SUPPORT
00390
00393 int getXOffset() const
00394 { return getOffset(LEFT, RIGHT); }
00395
00399 int getYOffset() const
00400 { return getOffset(UP, DOWN); }
00401 #endif
00402
00406 void setPosition(const Vector &pos);
00407
00413 void setPosition(float x, float y, float z = 0.0f)
00414 {
00415 setPosition(Vector(x, y, z));
00416 }
00417
00421 const Vector &getPosition() const { return mPos; }
00422
00423
00427 virtual int getWidth() const;
00428
00432 virtual int getHeight() const;
00433
00437 virtual Being::TargetCursorSize getTargetCursorSize() const
00438 { return TC_MEDIUM; }
00439
00443 void controlParticle(Particle *particle);
00444
00448 virtual unsigned char getWalkMask() const
00449 { return 0x00; }
00450
00455 const Path &getPath() const { return mPath; }
00456
00460 void setTargetAnimation(SimpleAnimation* animation);
00461
00465 void untarget() { mUsedTargetCursor = NULL; }
00466
00467 void setEmote(Uint8 emotion, Uint8 emote_time)
00468 {
00469 mEmotion = emotion;
00470 mEmotionTime = emote_time;
00471 }
00472
00477 void setStunMode(int stunMode)
00478 {
00479 if (mStunMode != stunMode)
00480 updateStunMode(mStunMode, stunMode);
00481 mStunMode = stunMode;
00482 };
00483
00484 void setStatusEffect(int index, bool active);
00485
00492 void setStatusEffectBlock(int offset, Uint16 flags);
00493
00501 virtual void triggerEffect(int effectId)
00502 {
00503 internalTriggerEffect(effectId, false, true);
00504 }
00505
00506 static int getHairColorCount();
00507
00508 static int getHairStyleCount();
00509
00510 static std::string getHairColor(int index);
00511
00512 virtual AnimatedSprite *getSprite(int index) const
00513 { return mSprites[index]; }
00514
00515 static void load();
00516
00517 protected:
00521 void setPath(const Path &path);
00522
00526 virtual void updateCoords() {}
00527
00531 virtual Map::BlockType getBlockType() const
00532 { return Map::BLOCKTYPE_NONE; }
00533
00541 void internalTriggerEffect(int effectId, bool sfx, bool gfx);
00542
00547 virtual void updateStunMode(int oldMode, int newMode);
00548
00553 virtual void updateStatusEffect(int index, bool newStatus);
00554
00561 virtual void handleStatusEffect(StatusEffect *effect, int effectId);
00562
00563 int mId;
00564 Uint8 mDirection;
00565 #ifdef TMWSERV_SUPPORT
00566 Uint8 mSpriteDirection;
00567 #endif
00568 Map *mMap;
00569 std::string mName;
00570 SpriteIterator mSpriteIterator;
00571 bool mIsGM;
00572 bool mParticleEffects;
00575 const ItemInfo *mEquippedWeapon;
00576
00577 static std::vector<std::string> hairColors;
00578 static int mNumberOfHairColors;
00579 static int mNumberOfHairstyles;
00581 Path mPath;
00582 std::string mSpeech;
00583 Text *mText;
00584 int mHairStyle;
00585 int mHairColor;
00586 Gender mGender;
00587 Uint16 mStunMode;
00588 std::set<int> mStatusEffects;
00590 const gcn::Color* mNameColor;
00591
00592 std::vector<AnimatedSprite*> mSprites;
00593 std::vector<int> mSpriteIDs;
00594 std::vector<std::string> mSpriteColors;
00595 ParticleList mStunParticleEffects;
00596 ParticleVector mStatusParticleEffects;
00597 ParticleList mChildParticleEffects;
00598
00599 private:
00600 #ifdef EATHENA_SUPPORT
00601
00605 int getOffset(char pos, char neg) const;
00606 #endif
00607
00609 bool mMustResetParticles;
00610
00612 SpeechBubble *mSpeechBubble;
00613
00614 int mWalkSpeed;
00616 Vector mPos;
00617 Vector mDest;
00618 int mPx, mPy;
00621 SimpleAnimation* mUsedTargetCursor;
00622 };
00623
00624 #endif