/** @file ItemManager.h @brief 管理器
*	Copyright (c) 2007,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:
*	作    者:张少东
*	完成日期:2008-07-09
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #ifndef ITEMMANAGER_H #define ITEMMANAGER_H enum ITEM_TYPE { //可装备 TYPE_EQUIP, //可消耗 TYPE_CONSUME, //普通物品 TYPE_NORMAL, //技能书 TYPE_SKILLBOOK, //任务道具 TYPE_TASK, //功能道具 TYPE_FUNC, //价值物道具 TYPE_VALUEOBJ, //蓝图道具 TYPE_BLUEPRINT, //时装道具 TYPE_CLOTHES, }; //消耗类型 enum ECONSUME_TYPE { ECONSUME_DEATH, //死亡 ECONSUME_USE, //使用次数 ECONSUME_DAMAGE, //受伤害次数 ECONSUME_SKILL, //使用技能次数 ECONSUME_TIME, //时间 }; enum MONEY_TYPE { MONEY_GAME, MONEY_RMB, MONEY_ITEM, }; enum ITEM_MASSLEVEL { E_GRAY,//灰色 E_WHITE,//白色 E_GREEN,//绿色 E_BLUE,//蓝色 E_PURPLE,//紫色 E_ORANGE,//橙色 E_GOLD = 9, //暗金 }; //装备类型 enum ITEM_GEARARM_TYPE { E_HEAD = 0x0,//头部装备 E_BODY,//身体装备 E_HAND,//手部装备 E_FOOT,//脚部装备 E_SHOULDER,//肩部装备 E_BACK,//背部装备 E_EAR,//耳环装备 E_NECKLACE,//项链装备 E_BRACELET,//手镯装备 E_FINGER,//手指装备 E_FRISTHAND,//主手装备 E_SECONDHAND,//副手装备 E_DOUBLEHAND,//双手武器 E_DRIVE,//坐骑装备 }; //所属种族 enum ITEM_NATION { E_HUMAN = 1,//人类 E_AIKA,//艾卡 E_FAIRY,//精灵 }; //所属职业 enum ITEM_CLASS { E_SWORDMAN = 1,//剑士 E_ASSASSIN,//刺客 E_GOLDRIDER,//圣骑士 E_DEVILSWORDMAN,//魔剑士 E_ARCHER,//弓箭手 E_ENCHANTER,//法师 }; enum ITEM_BIND_TYPE { E_EQUIP_BIND, //装备绑定已绑定 E_EQUIP_UNBIND, //装备绑定未绑定 E_PICK_BIND, //拾取绑定 E_CANNOT_BIND, //不可被绑定 }; enum ITEM_BIND_LEVEL { E_CANNOT_DELETE, //不可被删除 E_CANNOT_TRADEWITHPLAYER, //不可与玩家交易 E_CANNOT_TRADEWITHNPC, //不可与NPC交易 E_CANNOT_DROPONDIE, //死亡后不掉落 }; ///所有道具的公有属性 class CIntList { public: void Set(string strString); vector& GetInts(); bool IsIn(int iData) const; string GetRawValue() { return m_RawValue; } private: vector m_vecInts; string m_RawValue; }; class CItemManager; class CItem { public: explicit CItem(CItemManager* pItemManager, const TiXmlElement* pItemXml); public: CItemManager* m_ItemManager; public: int ItemID; //道具ID ITEM_TYPE ItemType; //道具类型 CIntList Race; //种族 CIntList Class; //职业 string Name; //道具名字 int MaxWear; //最大耐久度 int Price; //价格 int Level; //等级 int MaxAmount; //最大数量 ITEM_MASSLEVEL MassLevel; //质量等级 int CannotDepot; //是否可存仓库 0 可存 1 否 ITEM_BIND_TYPE BindEquip; //绑定方式 CIntList BindEquipList; //绑定内容 int Uniquely; //是否装备唯一 CIntList ConsumeWear; //消耗类型 string Text; //描述 protected: virtual int LoadFromXml(const TiXmlElement* pItemXml); public: virtual int ShowTip(vector& vectItemInfo); string GetClassByClassID(unsigned long ulClassID); string GetRaceByRaceID(unsigned long ulRaceID); string GetGearArmTypeString(int nGearArmType); }; //附加属性 class CEquipAddInfo { public: void LoadFromXml(const TiXmlElement* pElem); public: void GetProp(vector& vectProp); public: int nAttackPhyMin; //最小物理攻击力 int nAttackPhyMax; //最大物理攻击力 int nAttackMagMin; //最小魔法攻击力 int nAttackMagMax; //最大魔法攻击力 int nAddHP; int nAddMP; int nAddPhysicsAttack; //物理攻击 int nAddMagicAttack; //魔法攻击 int nAddPhysicsDef; //物理防御 int nAddMagicDef; //魔法防御 int nAddPhysicsHit; //物理命中 int nAddMagicHit; //魔法命中 int nAddPhysicsCritical; //物理暴击(几率)等级 int nAddMagicCritical; //魔法暴击(几率)等级 int nAddPhysicsAttackPercent; //物理攻击百分比 int nAddMagicAttackPercent; //魔法攻击百分比 int nAddPhysicsCriticalDamage; //附加物理暴击伤害 int nAddMagicCriticalDamage; //附加魔法暴击伤害 int nAddPhysicsDefendPercent; //物理防御百分比 int nAddMagicDefendPercent; //魔法防御百分比 int nAddPhysicsCriticalDerate; //减免物理暴击(几率)等级 int nAddMagicCriticalDerate; //减免魔法暴击(几率)等级 int nAddPhysicsCriticalDamageDerate; //减免物理暴击伤害 int nAddMagicCriticalDamageDerate; //减免魔法暴击伤害 int nAddPhysicsJouk; //物理闪避等级 int nAddMagicJouk; //魔法闪避等级 int nAddPhysicsDeratePercent; //物理伤害减免百分比 int nAddMagicDeratePercent; //魔法伤害减免百分比 int nAddStun; //击晕(几率)等级 int nAddTie; //束缚(几率)等级 int nAddAntistun; //抗晕(几率)等级 int nAddAntitie; //抗束缚(几率)等级 int nAddPhysicsAttackAdd; //20%产生额外物理伤害 int nAddMagicAttackAdd; //20%产生额外魔法伤害 int nAddPhysicsRift; //物理穿透等级 int nAddMagicRift; //魔法穿透等级 int nAddSpeed; //移动速度 }; //装备升级属性表 class CItemLevelUp { public: void LoadFromXml(const TiXmlElement* pItemLevelXml); public: void GetProp(vector& vectProp); public: int ID; int AttackPhyMin; //物理攻击下限 int AttackPhyMax; //物理攻击上限 int AttackMagMin; //魔法攻击下限 int AttackMagMax; //魔法攻击上限 int PhysicsAttack; //物理攻击 int MagicAttack; //魔法攻击 int PhysicsDefend; //物理防御 int MagicDefend; //魔法防御 }; //装备 class CEquipItem: public CItem { public: explicit CEquipItem(CItemManager* pItemManager, const TiXmlElement* pItemXml); protected: virtual int LoadFromXml(const TiXmlElement* pItemXml); public: ITEM_GEARARM_TYPE iGearArmType; //装备类型 int iSuitID; //套装编号 int nAttackPhyMin; //最小物理攻击力 int nAttackPhyMax; //最大物理攻击力 int nAttackMagMin; //最小魔法攻击力 int nAttackMagMax; //最大魔法攻击力 int nAddHP; int nAddMP; int nBrand; //品牌号,在显示装备升级时需要 需要和升级的等级合并产生一个id,用这个id在道具升级属性表中查找 int nAddPhysicsAttack; //物攻 int nAddMagicAttack; //魔攻 int nAddPhysicsDef; //物防 int nAddMagicDef; //魔防 int nAddPhysicsHit; //物理命中 int nAddMagicHit; //魔法命中 int nAddPhysicsCritical; //物理会心一击等级 int nAddMagicCritical; //魔法会心一击等级 int nAddPhysicsAttackPercent; //物理攻击百分比 int nAddMagicAttackPercent; //魔法攻击百分比 int nAddPhysicsCriticalDamage; //物理会心一击伤害 int nAddMagicCriticalDamage; //魔法会心一击伤害 int nAddPhysicsDefendPercent; //物理防御百分比 int nAddMagicDefendPercent; //魔法防御百分比 int nAddPhysicsCriticalDerate; //减免物理会心一击等级 int nAddMagicCriticalDerate; //减免魔法会心一击等级 int nAddPhysicsCriticalDamageDerate; //减免物理会心一击伤害 int nAddMagicCriticalDamageDerate; //减免魔法会心一击伤害 int nAddPhysicsJouk; //物理闪避等级 int nAddMagicJouk; //魔法闪避等级 int nAddPhysicsDeratePercent; //物理伤害减免百分比 int nAddMagicDeratePercent; //魔法伤害减免百分比 int nAddStun; //击晕(几率)等级 int nAddTie; //束缚(几率)等级 int nAddAntistun; //抗晕(几率)等级 int nAddAntitie; //抗束缚(几率)等级 int nAddPhysicsAttackAdd; //20%几率造成额外物理伤害 int nAddMagicAttackAdd; //20%几率造成额外魔法伤害 int nAddPhysicsRift; //物理穿透等级 int nAddMagicRift; //魔法穿透等级 int nAddSpeed; //移动速度 int AddID; //追加编号 public: virtual int ShowTip(vector& vectItemInfo); }; //套装 class CSuit { public: void LoadFromXml(const TiXmlElement* pSuitXml); //添加该套装所需的装备 void Add(const CItem* pItem); //得到所需要的装备 vector& GetItems() { return Items; } void BuildEffect(); vector& GetEffects() { return Effects; } private: vector Items; vector Effects; public: int ID; int Head; //头 int Body; //身 int Hand; //手 int Foot; //脚 int Shoulder; //肩 int Back; //背 int Torque; //项链 int Ring1; //戒指1 int Ring2; //戒指2 int Earring1; //耳环1 int Earring2; //耳环2 int Bangle1; //手镯1 int Bangle2; //手镯2 int Weapon1; //主手 int Weapon2; //副手 int Weapon3; //双手 int Mounts; //座骑 int AttackPhyMin; //最小物理攻击力 int AttackPhyMax; //最大物理攻击力 int AttackMagMin; //最小魔法攻击力 int AttackMagMax; //最大魔法攻击力 int Hp; int Mp; int PhysicsAttack; //物理攻击 int MagicAttack; //魔法攻击 int PhysicsDefend; //物理防御 int MagicDefend; //魔法防御 int PhysicsHit; //物理命中 int MagicHit; //魔法命中 int PhysicsCritical; //物理暴击等级 int MagicCritical; //魔法暴击等级 int PhysicsAttackPercent; //物理攻击百分比 int MagicAttackPercent; //魔法攻击百分比 int PhysicsCriticalDamage; //附加物理暴击伤害 int MagicCriticalDamage; //附加魔法暴击伤害 int PhysicsDefendPercent; //物理防御百分比 int MagicDefendPercent; //魔法防御百分比 int PhysicsCriticalDerate; //减免物理暴击等级 int MagicCriticalDerate; //减免魔法暴击等级 int PhysicsCriticalDamageDerate; //减免物理暴击伤害 int MagicCriticalDamageDerate; //减免魔法暴击伤害 int PhysicsJouk; //物理闪避等级 int MagicJouk; //魔法闪避等级 int PhysicsDeratePercent; //物理伤害减免百分比 int MagicDeratePercent; //魔法伤害减免百分比 int Stun; //击晕等级 int Tie; //束缚等级 int Antistun; //抗晕等级 int Antitie; //抗束缚等级 int PhysicsAttackAdd; //20%产生额外物理伤害 int MagicAttackAdd; //20%产生额外魔法伤害 int PhysicsRift; //物理穿透等级 int MagicRift; //魔法穿透等级 int AddSpeed; //移动速度 }; class CItemManager { public: CItemManager(void); virtual ~CItemManager(void); public: CItem* GetItem(unsigned long ulItemID); public: int LoadItemData(const char* szXmlFile); int LoadSuitData(const char* szXmlFile); int LoadAddAttrData(const char* szXmlFile); int LoadItemLevelUpData(const char* szXmlFile); CEquipAddInfo* GetEquipAddInfo(int nID); CSuit* GetSuit(int nSuitID); CItemLevelUp* GetItemLevelUp(int nItemLevelUpID); private: map m_Items; map m_ItemAddInfoMap; map m_SuitMap; map m_ItemLevelUpMap; }; #endif