00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _TMWSERV_ITEM
00023 #define _TMWSERV_ITEM
00024
00025 #include <vector>
00026
00027 #include "game-server/actor.hpp"
00028
00029 class AttackZone;
00030 class Being;
00031 class Script;
00032
00036 enum ItemType
00037 {
00038 ITEM_UNUSABLE = 0,
00039 ITEM_USABLE,
00040 ITEM_EQUIPMENT_ONE_HAND_WEAPON,
00041 ITEM_EQUIPMENT_TWO_HANDS_WEAPON,
00042 ITEM_EQUIPMENT_TORSO,
00043 ITEM_EQUIPMENT_ARMS,
00044 ITEM_EQUIPMENT_HEAD,
00045 ITEM_EQUIPMENT_LEGS,
00046 ITEM_EQUIPMENT_SHIELD,
00047 ITEM_EQUIPMENT_RING,
00048 ITEM_EQUIPMENT_NECKLACE,
00049 ITEM_EQUIPMENT_FEET,
00050 ITEM_EQUIPMENT_AMMO,
00051 ITEM_HAIRSPRITE,
00052 ITEM_RACESPRITE,
00053 ITEM_UNKNOWN
00054 };
00055
00056 ItemType itemTypeFromString (const std::string &name);
00057
00058
00062 enum WeaponType
00063 {
00064 WPNTYPE_NONE = 0,
00065 WPNTYPE_KNIFE,
00066 WPNTYPE_SWORD,
00067 WPNTYPE_POLEARM,
00068 WPNTYPE_STAFF,
00069 WPNTYPE_WHIP,
00070 WPNTYPE_BOW,
00071 WPNTYPE_SHOOTING,
00072 WPNTYPE_MACE,
00073 WPNTYPE_AXE,
00074 WPNTYPE_THROWN
00075 };
00076
00077 WeaponType weaponTypeFromString (const std::string &name);
00078
00083 enum
00084 {
00085 SET_STATE_NORMAL = 0,
00086 SET_STATE_POISONED,
00087 SET_STATE_STONED,
00088 SET_STATE_STUNNED,
00089 SET_STATE_SLOWED,
00090 SET_STATE_TIRED,
00091 SET_STATE_MAD,
00092 SET_STATE_BERSERK,
00093 SET_STATE_HASTED,
00094 SET_STATE_FLOATING,
00095
00096 SET_STATE_NOT_POISONED,
00097 SET_STATE_NOT_STONED,
00098 SET_STATE_NOT_STUNNED,
00099 SET_STATE_NOT_SLOWED,
00100 SET_STATE_NOT_TIRED,
00101 SET_STATE_NOT_MAD,
00102 SET_STATE_NOT_BERSERK,
00103 SET_STATE_NOT_HASTED,
00104 SET_STATE_NOT_FLOATING
00105 };
00106
00110 enum
00111 {
00112 MOD_WEAPON_TYPE = 0,
00113 MOD_WEAPON_RANGE,
00114 MOD_WEAPON_DAMAGE,
00115 MOD_ELEMENT_TYPE,
00116 MOD_LIFETIME,
00117 MOD_ATTRIBUTE
00118 };
00119
00123 struct ItemModifier
00124 {
00125 unsigned char type;
00126 short value;
00127 };
00128
00132 class ItemModifiers
00133 {
00134 public:
00135
00139 int getValue(int type) const;
00140
00144 void setValue(int type, int amount);
00145
00149 int getAttributeValue(int attr) const;
00150
00154 void setAttributeValue(int attr, int amount);
00155
00159 void applyAttributes(Being *) const;
00160
00165 void cancelAttributes(Being *) const;
00166
00167 private:
00168 std::vector< ItemModifier > mModifiers;
00169 };
00170
00174 class ItemClass
00175 {
00176 public:
00177 ItemClass(int id, ItemType type, Script *s = NULL)
00178 : mScript(NULL), mDatabaseID(id), mType(type), mAttackZone(NULL)
00179 {}
00180
00181 ~ItemClass();
00182
00187 bool use(Being *itemUser);
00188
00192 ItemType getType() const
00193 { return mType; }
00194
00198 int getWeight() const
00199 { return mWeight; }
00200
00204 void setWeight(int weight)
00205 { mWeight = weight; }
00206
00210 int getCost() const
00211 { return mCost; }
00212
00216 void setCost(int cost)
00217 { mCost = cost; }
00218
00222 int getMaxPerSlot() const
00223 { return mMaxPerSlot; }
00224
00228 void setMaxPerSlot(int perSlot)
00229 { mMaxPerSlot = perSlot; }
00230
00234 const ItemModifiers &getModifiers() const
00235 { return mModifiers; }
00236
00240 void setModifiers(const ItemModifiers &modifiers)
00241 { mModifiers = modifiers; }
00242
00246 int getDatabaseID()
00247 { return mDatabaseID; }
00248
00252 void setSpriteID(int spriteID)
00253 { mSpriteID = spriteID; }
00254
00258 int getSpriteID()
00259 { return mSpriteID; }
00260
00264 void setScript(Script *s)
00265 { mScript = s; }
00266
00270 void setAttackZone(AttackZone* attackZone) { mAttackZone = attackZone; }
00271
00275 const AttackZone *getAttackZone() const
00276 { return mAttackZone ; }
00277
00278
00279 private:
00280 Script *mScript;
00282 unsigned short mDatabaseID;
00284 unsigned short mSpriteID;
00285 ItemType mType;
00286 unsigned short mWeight;
00287 unsigned short mCost;
00289 unsigned short mMaxPerSlot;
00290
00291 ItemModifiers mModifiers;
00292 AttackZone *mAttackZone;
00293 };
00294
00295 class Item : public Actor
00296 {
00297 public:
00298 Item(ItemClass *type, int amount)
00299 : Actor(OBJECT_ITEM), mType(type), mAmount(amount)
00300 {}
00301
00302 ItemClass *getItemClass() const
00303 { return mType; }
00304
00305 int getAmount() const
00306 { return mAmount; }
00307
00308 virtual void update() {}
00309
00310 private:
00311 ItemClass *mType;
00312 unsigned char mAmount;
00313 };
00314
00315 #endif