#ifndef _CITEM_CLASS_H_ #define _CITEM_CLASS_H_ #include #include #include "ItemStructure.h" // Àü¹æ ÂüÁ¶ namespace Skill { struct ProtoType; } namespace Item { class CItem { public: CItem(); CItem(unsigned __int64 dwItemUID, const ItemInfo& itemInfo); // Create Item virtual ~CItem(); // ½ºÅ©¸³Æ®·ÎºÎÅÍ ·ÎµåÇÑ ¾ÆÀÌÅÛ µ¥ÀÌÅ͸¦ ¾ò¾î ¿Â´Ù. const ItemInfo& GetItemInfo() const { return m_ItemInfo; } // Desc : ¾ÆÀÌÅÛ Á¤º¸¸¦ char¹öÆÛ·Î ±â·ÏÇÑ´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - ±â·ÏÇÑ Å©±â virtual bool SerializeOut(char* lpSerializeItem_Out, size_t& nBufferLength_InOut); // Desc : char¹öÆÛ·ÎºÎÅÍ ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀÐ¾î ¿Â´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - »ç¿ëÇÑ ¹öÆÛ Å©±â virtual bool SerializeIn(const char* lpSerializeItem_In, size_t& nBufferLength_InOut); // Move Item inline void MoveItem(ItemPos itemPos) { m_ItemData.m_ItemPos = itemPos; } // ¾ÆÀÌÅÛ °¡º¯ Á¤º¸. inline unsigned __int64 GetUID() const { return m_ItemData.m_dwUID; } inline ItemPos GetPos() const { return m_ItemData.m_ItemPos; } inline ItemPos GetRealPos() const { return m_itemPos_Real; } inline unsigned short GetPrototypeID() const { return m_ItemData.m_usProtoTypeID; } inline unsigned char GetNumOrDurability() const { return m_ItemData.m_cNumOrDurability; } inline unsigned char GetMaxNumOrDurability() const { return m_cMaxNumOrDurability; } inline void SetNumOrDurability(unsigned char cNumOrDurability) { m_ItemData.m_cNumOrDurability = cNumOrDurability; } inline void SetStallPrice(unsigned long dwStallPrice) { m_dwStallPrice = dwStallPrice; } inline unsigned long GetBuyPrice() const { return (0 == m_dwStallPrice) ? m_ItemInfo.m_DetailData.m_dwPrice : m_dwStallPrice; } inline unsigned long GetBuyBlackPrice() const { return m_ItemInfo.m_DetailData.m_dwBlackPrice; } inline unsigned long GetSellPrice() const; inline unsigned long GetRepairPrice() const; inline const char* GetItemTypeName() const; inline unsigned char GetOptionLimit() const { return m_ItemInfo.m_DetailData.m_cOptionLimit; } inline bool IsSet(unsigned long dwDetailDataFlag) const { return dwDetailDataFlag == (m_ItemInfo.m_DetailData.m_dwFlags & dwDetailDataFlag); } // ÀçÀÏÀ̰¡ Ãß°¡ÇÑ °Í inline bool GetEnableRepair(); inline bool GetEnableStack(); inline bool GetSocketItem(); inline bool GetTwohandItem(); inline bool GetEnableEquip(); inline void SetItemPos(unsigned short wItemPos) { m_ItemData.m_ItemPos.m_cPos = wItemPos; } inline unsigned short GetItemPos(void) { return m_ItemData.m_ItemPos.m_cPos; } inline void SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex) { m_ItemData.m_ItemPos.SetPos(cXIndex, cYIndex, cZIndex); } inline void SetXIndex(unsigned char cXIndex) { m_ItemData.m_ItemPos.SetXIndex(cXIndex); } inline void SetYIndex(unsigned char cYIndex) { m_ItemData.m_ItemPos.SetYIndex(cYIndex); } inline void SetZIndex(unsigned char cZIndex) { m_ItemData.m_ItemPos.SetZIndex(cZIndex); } inline void SetPos(unsigned short wIndex) { m_ItemData.m_ItemPos.SetPos(wIndex); } protected: const ItemInfo& m_ItemInfo; // ½ºÅ©¸³Æ®·ÎºÎÅÍ ·ÎµåÇÑ ¾ÆÀÌÅÛ µ¥ÀÌÅÍ ItemData m_ItemData; // DB¿¡ ÀúÀåµÇ´Â ¾ÆÀÌÅÛ µ¥ÀÌÅÍ ItemPos m_itemPos_Real; // Àӽà °ø°£ÀÌ ¾Æ´Ñ ¾ÆÀÌÅÛ À§Ä¡ unsigned char m_cMaxNumOrDurability; // ÃÖ´ë ³»±¸µµ unsigned long m_dwStallPrice; // ³ëÁ¡»ó¿¡¼­ÀÇ °¡°Ý }; class CEquipment : public CItem { public: enum EQUIPMENT_ERROR { E_SUCCESS = 0, // ¼º°ø E_SERVER_ERROR = 1, // ¼­¹ö ¿¡·¯ E_GET_EQUIP_FAILED = 2, // Àåºñ ¾ò±â ½ÇÆÐ E_GET_GEM_FAILED = 3, // Áª ¾ò±â ½ÇÆÐ E_NOT_EQUIP = 4, // Àåºñ ¾ÆÀÌÅÛ ¾Æ´Ô E_NOT_GEM = 5, // Áª ¾ÆÀÌÅÛ ¾Æ´Ô E_REMOVE_GEM_FAILED = 6, // Áª Á¦°Å ½ÇÆÐ E_SOCKET_IS_FULL = 7, // ¼ÒÄÏ ½½·Ô Ãʰú E_OVER_MAX_SOCKET = 8, // ÃÖ´ë ¼ÒÄÏ Ãʰú E_GET_MINERAL_FAILED = 3, E_NOT_MINERAL = 5, E_NOT_MATCH_MINERAL_TYPE = 6, E_NOT_ENOUGH_MINERAL = 7, E_REMOVE_EQUIP_FAILED = 8, E_CREATE_ITEM_FAILED = 9, E_REMOVE_MINERAL_FAILED = 10 }; CEquipment(unsigned __int64 dwItemUID, const ItemInfo& itemInfo); virtual ~CEquipment(); // ¾ÆÀÌÅÛÀ» Àåºñ·Î DowncastÇÑ´Ù. inline static CEquipment* DowncastToEquipment(CItem* lpItem); // Desc : ¾ÆÀÌÅÛ Á¤º¸¸¦ char¹öÆÛ·Î ±â·ÏÇÑ´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - ±â·ÏÇÑ Å©±â virtual bool SerializeOut(char* lpSerializeItem_Out, size_t& nBufferLength_InOut); // Desc : char¹öÆÛ·ÎºÎÅÍ ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀÐ¾î ¿Â´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - »ç¿ëÇÑ ¹öÆÛ Å©±â virtual bool SerializeIn(const char* lpSerializeItem_In, size_t& nBufferLength_InOut); // ¾ÆÀÌÅÛ ¼Ó¼ºÀ» ÀÓÀÇ·Î ¹Ù²Ù±â À§ÇÔ. void AddAttribute(Item::Attribute::Type eAttributeType, unsigned short nAttributeValue) { m_usAttribute[eAttributeType] += nAttributeValue; } inline void AddAttribute(const short* lpAttributeArray_In, unsigned short nArraySize); // ¾ÆÀÌÅÛ ¼Ó¼ºÀ» ¾ò¾î ¿Â´Ù. unsigned short GetAttribute(Item::Attribute::Type eAttributeType) { return m_usAttribute[eAttributeType]; } inline void GetAttribute(short* lpAttributeArray_Out, unsigned short nArraySize); // Desc : InstallSocket - // ¼ÒÄÏ¿¡ º¸¼®À» ¹Ú´Â ¼ø¼­. 1. º¸¼®À» ã´Â´Ù. 2. Àåºñ¸¦ ã¾Æ¼­ ¹þ´Â´Ù. // 3. Àåºñ¿¡ º¸¼®À» ¹Ú´Â´Ù. 4. º¸¼®À» ¾ø¾Ø´Ù. 5. Àåºñ¸¦ ´Ù½Ã ÀԴ´Ù. EQUIPMENT_ERROR InstallSocket(CItem& Gem); // Desc : UpgradeItem - EQUIPMENT_ERROR UpgradeItem(CItem& Mineral); void InitializeAttribute(); unsigned char m_cSocket[Item::EquipmentInfo::MAX_SOCKET_NUM]; // ¾ÆÀÌÅÛ ¼ÒÄÏ Á¤º¸ short m_usAttribute[Item::Attribute::MAX_ATTRIBUTE_NUM]; // ¾ÆÀÌÅÛ ¼Ó¼º unsigned short m_usRuneSocket; // ·é ¼ÒÄÏ unsigned char m_cMaterialType; // ÀçÁú°ª unsigned char m_cMaxSocket; // ÃÖ´ë ¼ÒÄÏ °³¼ö unsigned char m_cSocketNum; // ¼ÒÄÏ °³¼ö unsigned char m_cMaxAttribute; // ÃÖ´ë ¼Ó¼º °³¼ö unsigned char m_cReserved; // ¿¹¾àµÈ °ø°£ unsigned char m_cReserved2; // ¿¹¾àµÈ °ø°£ }; class CUseItem : public CItem { public: CUseItem(unsigned __int64 dwItemUID, const ItemInfo& itemInfo); virtual ~CUseItem(); inline static CUseItem* DowncastToUseItem(CItem* lpItem); bool Use(); }; class CSkillItem : public CItem { public: CSkillItem(); virtual ~CSkillItem() { } inline void SetProtoTypeID(unsigned short usProtoTypeID) { m_ItemData.m_usProtoTypeID = usProtoTypeID; } inline unsigned char GetMaxNumOrDurability() const { return m_cMaxDurability; } inline void SetMaxNumOrDurability(unsigned char cMaxNumOrDurability) { m_cMaxDurability = cMaxNumOrDurability; } bool SetSkillInfo(const Skill::ProtoType *lpSkillInfo); protected: ItemInfo m_ItemInfoInstance; unsigned char m_cMaxDurability; // ÃÖ´ë ³»±¸µµ }; }; inline const char* Item::CItem::GetItemTypeName() const { switch (m_ItemInfo.m_DetailData.m_cItemType) { case Item::CItemType::HELM: return "Åõ±¸"; case Item::CItemType::SHIRT: return "¼ÅÃ÷"; case Item::CItemType::TUNIC: return "Æ©´Ð"; case Item::CItemType::ARMOUR: return "¾Æ¸Ó"; case Item::CItemType::GLOVE: return "Àå°©"; case Item::CItemType::BOOTS: return "ºÎÃ÷"; case Item::CItemType::SWORD: return "ÇѼհË"; case Item::CItemType::BLUNT: return "ÇѼյбâ"; case Item::CItemType::AXE: return "ÇѼյµ³¢"; case Item::CItemType::TWOHANDED_BLUNT: return "¾ç¼ÕµÐ±â"; case Item::CItemType::TWOHANDED_AXE: return "¾ç¼Õµµ³¢"; case Item::CItemType::TWOHANDED_SWORD: return "¾ç¼Õ°Ë"; case Item::CItemType::BOW: return "Ȱ"; case Item::CItemType::CROSSBOW: return "¼®±Ã"; case Item::CItemType::STAFF: return "½ºÅÂÇÁ"; case Item::CItemType::DAGGER: return "´Ü°Ë"; case Item::CItemType::SHIELD: return "¹æÆÐ"; case Item::CItemType::CLOAK: return "¸ÁÅä"; case Item::CItemType::RING: return "¹ÝÁö"; case Item::CItemType::NECKLACE: return "¸ñ°ÉÀÌ"; case Item::CItemType::POTION: return "¹°¾à"; case Item::CItemType::POISON: return "µ¶¾à"; case Item::CItemType::TRAP: return "Æ®·¦"; case Item::CItemType::SKILLBOOK: return "½ºÅ³ºÏ"; case Item::CItemType::GEM: return "º¸¼®·ù"; case Item::CItemType::RUNE: return "·é"; case Item::CItemType::MATERIAL: return "¸ÞÅ׸®¾ó"; case Item::CItemType::AMMO: return "¼Ò¸ðǰ"; case Item::CItemType::ETC: return "±âŸ"; case Item::CItemType::HEAD: return "Çìµå¾Æ¸Ó"; case Item::CItemType::BODY: return "¹Ùµð¾Æ¸Ó"; case Item::CItemType::PROTECT_A: return "ÇÁ·ÎÅØÆ®¾Ï"; case Item::CItemType::PELVIS: return "Æçºñ½º¾Æ¸Ó"; case Item::CItemType::COM_BLUNT: return "ÄĹèÅÏÆ® µÐ±â"; case Item::CItemType::COM_SWORD: return "ÄĹèÅÏÆ® °Ë"; case Item::CItemType::OPP_HAMMER: return "¿ÀÇǼ¼ÀÌÅÍ µÐ±â"; case Item::CItemType::OPP_AXE: return "¿ÀÇǼ¼ÀÌÅÍ µµ³¢"; case Item::CItemType::OPP_SLUSHER: return "¿ÀÇǼ¼ÀÌÅÍ ½½·¯¼Å"; case Item::CItemType::OPP_TALON: return "¿ÀÇǼ¼ÀÌÅÍ Å»·é"; case Item::CItemType::OPP_SYTHE: return "¿ÀÇǼ¼ÀÌÅÍ »çÀ̵å"; case Item::CItemType::SKILL_A_GUARD: return "°¡µå¾Ï"; case Item::CItemType::SKILL_A_ATTACK: return "¾îÅþÏ"; case Item::CItemType::SKILL_A_GUN: return "°Ç¾Ï"; case Item::CItemType::SKILL_A_KNIFE: return "³ªÀÌÇÁ¾Ï"; case Item::CItemType::ACCESSORY: return "¾Ç¼¼¼­¸®"; case Item::CItemType::ARROW: return "È­»ì"; case Item::CItemType::BOLT: return "º¼Æ®"; } return NULL; } inline unsigned long Item::CItem::GetSellPrice() const { if (0 != m_dwStallPrice) { return m_dwStallPrice; } unsigned long dwSellPrice = m_ItemInfo.m_DetailData.m_dwPrice; unsigned long dwFlags = m_ItemInfo.m_DetailData.m_dwFlags; if(IsSet(DetailData::EQUIP)) { dwSellPrice = IsSet(DetailData::STACKABLE) ? dwSellPrice / 2 : (dwSellPrice * m_ItemData.m_cNumOrDurability / m_cMaxNumOrDurability / 2); } else { dwSellPrice = (Item::CItemType::SKILLBOOK == m_ItemInfo.m_DetailData.m_cItemType) ? dwSellPrice / 4 : dwSellPrice / 2; } return (0 == dwSellPrice) ? 1 : dwSellPrice; } inline unsigned long Item::CItem::GetRepairPrice() const { unsigned long dwRepairPrice = (m_ItemInfo.m_DetailData.m_dwPrice * (m_cMaxNumOrDurability - m_ItemData.m_cNumOrDurability) / m_cMaxNumOrDurability / 2); return (0 == dwRepairPrice) ? 1 : dwRepairPrice; } inline Item::CEquipment* Item::CEquipment::DowncastToEquipment(Item::CItem* lpItem) { return lpItem->IsSet(DetailData::EQUIP) ? static_cast(lpItem) : NULL; } void Item::CEquipment::AddAttribute(const short* lpAttributeArray_In, unsigned short nArraySize) { unsigned short nCopyNum = nArraySize < Item::Attribute::MAX_ATTRIBUTE_NUM ? nArraySize : Item::Attribute::MAX_ATTRIBUTE_NUM; while(0 <= --nCopyNum) { m_usAttribute[nCopyNum] += lpAttributeArray_In[nCopyNum]; } } void Item::CEquipment::GetAttribute(short* lpAttributeArray_Out, unsigned short nArraySize) { unsigned short nCopyNum = nArraySize < Item::Attribute::MAX_ATTRIBUTE_NUM ? nArraySize : Item::Attribute::MAX_ATTRIBUTE_NUM; short* lpAttributePastEnd = m_usAttribute + nCopyNum; std::copy(m_usAttribute, lpAttributePastEnd, lpAttributeArray_Out); } inline Item::CUseItem* Item::CUseItem::DowncastToUseItem(CItem* lpItem) { return lpItem->IsSet(DetailData::USE_ITEM) ? static_cast(lpItem) : NULL; } // ÀçÀÏÀ̰¡ Ãß°¡ ÇÑ °Í inline bool Item::CItem::GetEnableRepair() { unsigned long dwFlags = GetItemInfo().m_DetailData.m_dwFlags; if((dwFlags & Item::DetailData::EQUIP) && !(dwFlags & Item::DetailData::STACKABLE)) return true; return false; } inline bool Item::CItem::GetEnableStack() { if(GetItemInfo().m_DetailData.m_dwFlags & Item::DetailData::STACKABLE) return true; return false; } inline bool Item::CItem::GetEnableEquip() { if(GetItemInfo().m_DetailData.m_dwFlags & Item::DetailData::EQUIP) return true; return false; } inline bool Item::CItem::GetSocketItem() { unsigned char cItemType = GetItemInfo().m_DetailData.m_cItemType; if(cItemType == Item::CItemType::GEM || cItemType == Item::CItemType::RUNE) return true; return false; } inline bool Item::CItem::GetTwohandItem() { unsigned char cItemType = GetItemInfo().m_DetailData.m_cItemType; if(cItemType == Item::CItemType::BOW || cItemType == Item::CItemType::CROSSBOW || cItemType == Item::CItemType::STAFF || cItemType == Item::CItemType::TWOHANDED_AXE || cItemType == Item::CItemType::TWOHANDED_BLUNT || cItemType == Item::CItemType::TWOHANDED_SWORD || cItemType == Item::CItemType::OPP_SYTHE) return true; return false; } #endif