/* * The Mana World * Copyright 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 * 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, * 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 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id$ */ #ifndef _TMW_LOCALPLAYER_H #define _TMW_LOCALPLAYER_H #include #include "player.h" // TODO move into some sane place... #define MAX_SLOT 2 class FloorItem; class Inventory; class Item; /** * Stats every being needs */ enum BeingStats { BASE_ATTR_STRENGTH = 0, // Basic attributes BASE_ATTR_AGILITY, BASE_ATTR_DEXTERITY, BASE_ATTR_VITALITY, BASE_ATTR_INTELLIGENCE, BASE_ATTR_WILLPOWER, BASE_ATTR_CHARISMA, NB_BASE_ATTRIBUTES, ATTR_EFF_STRENGTH = NB_BASE_ATTRIBUTES, // modified basic attributes ATTR_EFF_AGILITY, ATTR_EFF_DEXTERITY, ATTR_EFF_VITALITY, ATTR_EFF_INTELLIGENCE, ATTR_EFF_WILLPOWER, ATTR_EFF_CHARISMA, NB_EFFECTIVE_ATTRIBUTES, DERIVED_ATTR_HP_MAXIMUM = NB_EFFECTIVE_ATTRIBUTES, // Computed stats DERIVED_ATTR_PHYSICAL_ATTACK_MINIMUM, DERIVED_ATTR_PHYSICAL_ATTACK_FLUCTUATION, DERIVED_ATTR_PHYSICAL_DEFENCE, // add new computed statistics when they are needed NB_ATTRIBUTES_BEING }; /** * Player character specific stats */ enum CharacterStats { CHAR_SKILL_WEAPON_UNARMED = NB_ATTRIBUTES_BEING, CHAR_SKILL_WEAPON_SWORD, CHAR_SKILL_WEAPON_AXE, CHAR_SKILL_WEAPON_POLEARM, CHAR_SKILL_WEAPON_JAVELIN, CHAR_SKILL_WEAPON_WHIP, CHAR_SKILL_WEAPON_DAGGER, CHAR_SKILL_WEAPON_STAFF, CHAR_SKILL_WEAPON_BOW, CHAR_SKILL_WEAPON_CROSSBOW, CHAR_SKILL_WEAPON_THROWN, NB_CHAR_WEAPONSKILLS, CHAR_SKILL_MAGIC_IAMJUSTAPLACEHOLDER = NB_CHAR_WEAPONSKILLS, NB_CHAR_MAGICSKILLS, CHAR_SKILL_CRAFT_IAMJUSTAPLACEHOLDER = NB_CHAR_MAGICSKILLS, NB_CHAR_CRAFTSKILLS, CHAR_SKILL_IAMJUSTAPLACEHOLDER = NB_CHAR_CRAFTSKILLS, NB_CHAR_OTHERSKILLS, NB_ATTRIBUTES_CHAR = NB_CHAR_OTHERSKILLS }; /** * The local player character. */ class LocalPlayer : public Player { public: enum Attribute { STR = 0, AGI, DEX, VIT, INT, WIL, CHR }; /** * Constructor. */ LocalPlayer(); /** * Destructor. */ ~LocalPlayer(); virtual void logic(); /** * Adds a new step when walking before calling super. Also, when * specified it picks up an item at the end of a path. */ virtual void nextStep(); /** * Draws the name text below the being. */ virtual void drawName(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) {}; virtual Type getType() const; void clearInventory(); void addInvItem(int id, int quantity, bool equipment); void addInvItem(int index, int id, int quantity, bool equipment); Item* getInvItem(int index); /** * Equips an item. */ void equipItem(Item *item); /** * Unequips an item. */ void unequipItem(Item *item); void useItem(Item *item); void dropItem(Item *item, int quantity); void pickUp(FloorItem *item); /** * Sents a trade request to the given being. */ void trade(Being *being) const; /** * Accept or decline a trade offer */ void tradeReply(bool accept); /** * Returns true when the player is ready to accept a trade offer. * Returns false otherwise. */ bool tradeRequestOk() const; /** * Sets the trading state of the player, i.e. whether or not he is * currently involved into some trade. */ void setTrading(bool trading) { mTrading = trading; } void attack(); Being* getTarget() const; /** * Overridden to do nothing. The attacks of the local player are * displayed as soon as the player attacks, not when the server says * the player does. */ virtual void handleAttack() {} /** * Sets the target being of the player. */ void setTarget(Being* target) { mTarget = target; } /** * Sets a new destination for this being to walk to. */ void setDestination(Uint16 x, Uint16 y); /** * Sets a new direction to keep walking in. */ void setWalkingDir(int dir); void raiseAttribute(size_t attr); void toggleSit(); void emote(Uint8 emotion); void revive(); int getHP() const { return mHP; } int getMaxHP() const { return mMaxHP; } void setHP(int value) { mHP = value; } void setMaxHP(int value) { mMaxHP = value; } int getLevel() const { return mLevel; } void setLevel(int value) { mLevel = value; } int getMoney() const { return mMoney; } void setMoney(int value) { mMoney = value; } int getTotalWeight() const { return mTotalWeight; } int getMaxWeight() const { return mMaxWeight; } int getAttributeBase(size_t num) const { return mAttributeBase.at(num); } void setAttributeBase(size_t num, int value) { mAttributeBase.at(num) = value; } int getAttributeEffective(size_t num) const { return mAttributeEffective.at(num); } void setAttributeEffective(size_t num, int value) { mAttributeEffective.at(num) = value; } int getAttributeIncreasePoints() const { return mAttributeIncreasePoints; } float mLastAttackTime; /**< Used to synchronize the charge dialog */ std::auto_ptr mInventory; protected: void walk(unsigned char dir); // Character status: std::vector mAttributeBase; std::vector mAttributeEffective; int mAttributeIncreasePoints; int mLevel; int mMoney; int mTotalWeight; int mMaxWeight; int mHP; int mMaxHP; Being *mTarget; FloorItem *mPickUpTarget; bool mTrading; int mLastAction; /**< Time stamp of the last action, -1 if none. */ int mWalkingDir; /**< The direction the player is walking in. */ int mDestX; /**< X coordinate of destination. */ int mDestY; /**< Y coordinate of destination. */ }; extern LocalPlayer *player_node; #endif