diff options
Diffstat (limited to 'src/being.h')
-rw-r--r-- | src/being.h | 323 |
1 files changed, 271 insertions, 52 deletions
diff --git a/src/being.h b/src/being.h index cd317859..a704b3df 100644 --- a/src/being.h +++ b/src/being.h @@ -1,49 +1,68 @@ /* * The Mana World - * Copyright 2004 The Mana World Development Team + * Copyright (C) 2004 The Mana World Development Team * * This file is part of The Mana World. * - * The Mana World is free software; you can redistribute it and/or modify + * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * - * The Mana World is distributed in the hope that it will be useful, + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software + * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef _TMW_BEING_H -#define _TMW_BEING_H +#ifndef BEING_H +#define BEING_H + +#include <guichan/color.hpp> -#include <list> -#include <string> #include <SDL_types.h> + +#include <set> +#include <string> #include <vector> +#include "map.h" +#include "particlecontainer.h" #include "position.h" #include "sprite.h" -#include "map.h" -#include "animatedsprite.h" #include "vector.h" +#include "resources/spritedef.h" + +#define FIRST_IGNORE_EMOTE 14 +#define STATUS_EFFECTS 32 + +#define SPEECH_TIME 500 +#define SPEECH_MAX_TIME 1000 + class AnimatedSprite; -class Equipment; +class Image; class ItemInfo; class Item; class Map; class Graphics; -class ImageSet; class Particle; +class Position; +class SimpleAnimation; class SpeechBubble; +class Text; + +class StatusEffect; -enum Gender { +typedef std::list<Sprite*> Sprites; +typedef Sprites::iterator SpriteIterator; + +enum Gender +{ GENDER_MALE = 0, GENDER_FEMALE = 1, GENDER_UNSPECIFIED = 2 @@ -52,7 +71,8 @@ enum Gender { class Being : public Sprite { public: - enum Type { + enum Type + { UNKNOWN, PLAYER, NPC, @@ -64,7 +84,8 @@ class Being : public Sprite * WARNING: Has to be in sync with the same enum in the Being class * of the server! */ - enum Action { + enum Action + { STAND, WALK, ATTACK, @@ -73,33 +94,59 @@ class Being : public Sprite HURT }; - enum Sprite { + enum Sprite + { BASE_SPRITE = 0, SHOE_SPRITE, BOTTOMCLOTHES_SPRITE, TOPCLOTHES_SPRITE, +#ifdef EATHENA_SUPPORT + MISC1_SPRITE, + MISC2_SPRITE, +#endif HAIR_SPRITE, HAT_SPRITE, +#ifdef EATHENA_SUPPORT + CAPE_SPRITE, + GLOVES_SPRITE, +#endif WEAPON_SPRITE, +#ifdef EATHENA_SUPPORT + SHIELD_SPRITE, +#endif VECTOREND_SPRITE }; - enum TargetCursorSize { + enum TargetCursorSize + { TC_SMALL = 0, TC_MEDIUM, TC_LARGE, NUM_TC }; + enum Speech + { + NO_SPEECH = 0, + TEXT_OVERHEAD, + NO_NAME_IN_BUBBLE, + NAME_IN_BUBBLE, + NUM_SPEECH + }; /** * Directions, to be used as bitmask values */ enum { DOWN = 1, LEFT = 2, UP = 4, RIGHT = 8 }; - std::string mName; /**< Name of character */ +#ifdef EATHENA_SUPPORT + Uint16 mX, mY; /**< Tile coordinates */ + Uint16 mFrame; + Uint16 mWalkTime; +#endif Uint8 mEmotion; /**< Currently showing emotion */ Uint8 mEmotionTime; /**< Time until emotion disappears */ + Uint16 mAttackSpeed; /**< Attack speed */ Action mAction; /**< Action the being is performing */ Uint16 mJob; /**< Job (player job, npc, monster, creature ) */ @@ -122,6 +169,9 @@ class Being : public Sprite /** * Sets a new destination for this being to walk to. */ +#ifdef EATHENA_SUPPORT + virtual void setDestination(Uint16 destX, Uint16 destY); +#else void setDestination(int x, int y); /** @@ -138,6 +188,7 @@ class Being : public Sprite * Adjusts course to expected start and end points. */ void adjustCourse(int srcX, int srcY, int destX, int destY); +#endif /** * Puts a "speech balloon" above this being for the specified amount @@ -146,7 +197,7 @@ class Being : public Sprite * @param text The text that should appear. * @param time The amount of time the text should stay in milliseconds. */ - void setSpeech(const std::string &text, Uint32 time); + void setSpeech(const std::string &text, Uint32 time = 500); /** * Puts a damage bubble above this being. @@ -156,9 +207,21 @@ class Being : public Sprite virtual void takeDamage(int amount); /** + * Puts a crit notification bubble above this being. + */ + virtual void showCrit(); + + /** * Handles an attack of another being by this being. + * + * @param victim The attacked being. + * @param damage The amount of damage dealt (0 means miss). */ +#ifdef TMWSERV_SUPPORT virtual void handleAttack(); +#else + virtual void handleAttack(Being *victim, int damage); +#endif /** * Returns the name of the being. @@ -171,12 +234,8 @@ class Being : public Sprite * * @param name The name that should appear. */ - void setName(const std::string &name) { mName = name; } - - /** - * Sets the gender for this being. - */ - virtual void setGender(Gender gender) { mGender = gender; } + virtual void setName(const std::string &name) + { mName = name; } /** * Gets the hair color for this being. @@ -191,12 +250,12 @@ class Being : public Sprite { return mHairStyle; } /** + * Get the number of hairstyles implemented + */ + static int getNumOfHairstyles() { return mNumberOfHairstyles; } + + /** * Sets the hair style and color for this being. - * - * NOTE: This method was necessary for convenience in the 0.0 client. - * It should be removed here since the server can provide the hair ID - * and coloring the same way it does for other equipment pieces. Then - * Being::setSprite can be used instead. */ virtual void setHairStyle(int style, int color); @@ -207,6 +266,31 @@ class Being : public Sprite const std::string &color = ""); /** + * Sets the gender of this being. + */ + virtual void setGender(Gender gender) { mGender = gender; } + + /** + * Gets the gender of this being. + */ + Gender getGender() const { return mGender; } + +#ifdef EATHENA_SUPPORT + /** + * Makes this being take the next step of his path. + */ + virtual void nextStep(); +#endif + + /** + * Triggers whether or not to show the name as a GM name. + * NOTE: This doesn't mean that just anyone can use this. + * If the server doesn't acknowlege you, you won't be shown + * as a GM on other people's clients. + */ + virtual void setGM() { mIsGM = true; } + + /** * Performs being logic. */ virtual void logic(); @@ -214,7 +298,7 @@ class Being : public Sprite /** * Draws the speech text above the being. */ - void drawSpeech(Graphics* graphics, int offsetX, int offsetY); + void drawSpeech(int offsetX, int offsetY); /** * Draws the emotion picture above the being. @@ -222,11 +306,6 @@ class Being : public Sprite void drawEmotion(Graphics *graphics, int offsetX, int offsetY); /** - * Draws the name text below the being. - */ - virtual void drawName(Graphics *, int, int) {}; - - /** * Returns the type of the being. */ virtual Type getType() const; @@ -245,12 +324,12 @@ class Being : public Sprite /** * Gets the being id. */ - Uint16 getId() const { return mId; } + Uint32 getId() const { return mId; } /** * Sets the sprite id. */ - void setId(Uint16 id) { mId = id; } + void setId(Uint32 id) { mId = id; } /** * Sets the map the being is on @@ -268,16 +347,32 @@ class Being : public Sprite bool isAlive() { return mAction != DEAD; } /** - * Returns the direction the being is facing. + * Returns the current direction. */ - SpriteDirection getSpriteDirection() const - { return SpriteDirection(mSpriteDirection); } + Uint8 getDirection() const { return mDirection; } /** * Sets the current direction. */ void setDirection(Uint8 direction); +#ifdef EATHENA_SUPPORT + /** + * Gets the current action. + */ + int getWalkTime() { return mWalkTime; } +#endif + + /** + * Returns the direction the being is facing. + */ +#ifdef TMWSERV_SUPPORT + SpriteDirection getSpriteDirection() const + { return SpriteDirection(mSpriteDirection); } +#else + SpriteDirection getSpriteDirection() const; +#endif + /** * Draws this being to the given graphics context. * @@ -288,14 +383,36 @@ class Being : public Sprite /** * Returns the pixel X coordinate. */ +#ifdef TMWSERV_SUPPORT int getPixelX() const { return (int) mPos.x; } +#else + int getPixelX() const { return mPx; } +#endif /** * Returns the pixel Y coordinate. * * @see Sprite::getPixelY() */ +#ifdef TMWSERV_SUPPORT int getPixelY() const { return (int) mPos.y; } +#else + int getPixelY() const { return mPy; } +#endif + +#ifdef EATHENA_SUPPORT + /** + * Get the current X pixel offset. + */ + int getXOffset() const + { return getOffset(LEFT, RIGHT); } + + /** + * Get the current Y pixel offset. + */ + int getYOffset() const + { return getOffset(UP, DOWN); } +#endif /** * Sets the position of this being. When the being was walking, it also @@ -318,6 +435,7 @@ class Being : public Sprite */ const Vector &getPosition() const { return mPos; } + /** * Returns the horizontal size of the current base sprite of the being. */ @@ -352,21 +470,68 @@ class Being : public Sprite const Path &getPath() const { return mPath; } /** + * Sets the target animation for this being. + */ + void setTargetAnimation(SimpleAnimation* animation); + + /** + * Untargets the being + */ + void untarget() { mUsedTargetCursor = NULL; } + + AnimatedSprite* getEmote(int index) { return emotionSet[index]; } + + void setEmote(Uint8 emotion, Uint8 emote_time) + { + mEmotion = emotion; + mEmotionTime = emote_time; + } + + /** + * Sets the being's stun mode. If zero, the being is `normal', + * otherwise it is `stunned' in some fashion. + */ + void setStunMode(int stunMode) + { + if (mStunMode != stunMode) + updateStunMode(mStunMode, stunMode); + mStunMode = stunMode; + }; + + void setStatusEffect(int index, bool active); + + /** + * A status effect block is a 16 bit mask of status effects. + * We assign each such flag a block ID of offset + bitnr. + * + * These are NOT the same as the status effect indices. + */ + void setStatusEffectBlock(int offset, Uint16 flags); + + /** * Triggers a visual effect, such as `level up' * * Only draws the visual effect, does not play sound effects * * \param effectId ID of the effect to trigger */ - virtual void - triggerEffect(int effectId) { internalTriggerEffect(effectId, false, true); } + virtual void triggerEffect(int effectId) + { + internalTriggerEffect(effectId, false, true); + } + + // Target cursor being used by the being + Image *mTargetCursor; - static int getHairColorsNr(void); + static int getHairColorsNr(); - static int getHairStylesNr(void); + static int getHairStylesNr(); static std::string getHairColor(int index); + virtual AnimatedSprite* getSprite(int index) const + { return mSprites[index]; } + protected: /** * Sets the new path for this being. @@ -374,6 +539,11 @@ class Being : public Sprite void setPath(const Path &path); /** + * Let the sub-classes react to a replacement + */ + virtual void updateCoords() {} + + /** * Gets the way the object blocks pathfinding for other objects */ virtual Map::BlockType getBlockType() const @@ -386,34 +556,80 @@ class Being : public Sprite * \param sfx Whether to trigger sound effects * \param gfx Whether to trigger graphical effects */ - void - internalTriggerEffect(int effectId, bool sfx, bool gfx); + void internalTriggerEffect(int effectId, bool sfx, bool gfx); - Uint16 mId; /**< Unique being id */ + /** + * Notify self that the stun mode has been updated. Invoked by + * setStunMode if something changed. + */ + virtual void updateStunMode(int oldMode, int newMode); + + /** + * Notify self that a status effect has flipped. + * The new flag is passed. + */ + virtual void updateStatusEffect(int index, bool newStatus); + + /** + * Handle an update to a status or stun effect + * + * \param The StatusEffect to effect + * \param effectId -1 for stun, otherwise the effect index + */ + virtual void handleStatusEffect(StatusEffect *effect, int effectId); + + Uint32 mId; /**< Unique sprite id */ + Uint8 mDirection; /**< Facing direction */ +#ifdef TMWSERV_SUPPORT Uint8 mSpriteDirection; /**< Facing direction */ - Uint8 mDirection; /**< Walking direction */ +#endif Map *mMap; /**< Map on which this being resides */ + std::string mName; /**< Name of character */ SpriteIterator mSpriteIterator; + bool mIsGM; + bool mParticleEffects; /**< Whether to display particles or not */ /** Engine-related infos about weapon. */ const ItemInfo* mEquippedWeapon; + static int mNumberOfHairstyles; /** Number of hair styles in use */ + Path mPath; std::string mSpeech; + Text *mText; int mHairStyle; int mHairColor; Gender mGender; Uint32 mSpeechTime; + Sint32 mPx, mPy; /**< Pixel coordinates */ + Uint16 mStunMode; /**< Stun mode; zero if not stunned */ + std::set<int> mStatusEffects; /**< set of active status effects */ + + gcn::Color mNameColor; std::vector<AnimatedSprite*> mSprites; std::vector<int> mSpriteIDs; std::vector<std::string> mSpriteColors; - std::list<Particle *> mChildParticleEffects; + ParticleList mStunParticleEffects; + ParticleVector mStatusParticleEffects; + ParticleList mChildParticleEffects; private: +#ifdef EATHENA_SUPPORT + /** + * Calculates the offset in the given directions. + * If walking in direction 'neg' the value is negated. + */ + int getOffset(char pos, char neg) const; +#endif + /** Reset particle status effects on next redraw? */ + bool mMustResetParticles; + +#ifdef TMWSERV_SUPPORT static const int DEFAULT_WIDTH = 32; static const int DEFAULT_HEIGHT = 32; +#endif // Speech Bubble components SpeechBubble *mSpeechBubble; @@ -423,8 +639,11 @@ class Being : public Sprite Vector mPos; Vector mDest; - static int instances; /**< Number of Being instances */ - static ImageSet *emotionSet; /**< Emoticons used by beings */ + // Target cursor being used + SimpleAnimation* mUsedTargetCursor; + + static int instances; /**< Number of Being instances */ + static std::vector<AnimatedSprite*> emotionSet; /**< Emoticons used by beings */ }; #endif |