#pragma once #include #include #include //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // struct sITEM_POLICY { typedef __time64_t TIME_SPEC; enum ePOLICY { ITEM_POLICY_NOT_DEFINED = 0, ITEM_POLICY_NO_CONTROL = ITEM_POLICY_NOT_DEFINED, // ÄÁÆ®·ÑÇÒ Á¤º¸ ¾øÀ½ ITEM_POLICY_EXPIRATION_ITEM = 1<<0, // ij½Ã´Â ¾Æ´ÏÁö¸¸ ±â°£Á¦ ¾ÆÀÌÅÛÀÎ °æ¿ì ITEM_POLICY_RENDER_EFFECT = 1<<1, // ƯÁ¤ Item¿¡ ÀÇÇÑ Render Effect°¡ Àû¿ëµÇ´Â °æ¿ì (eSPECIAL_RENDER_EFFECT) ITEM_POLICY_EXCLUSIVE_PAIR = 1<<2, // ij¸¯ÅÍ¿¡ ¼­·Î ´Ù¸¥ Á¾·ù ¾ÆÀÌÅÛÁß ÅÃÀϸ¸ °¡´É }; ePOLICY POLICY; union uSHARED_BLK { struct sEXPIRATION_ITEM { CODETYPE ItemCode; TIME_SPEC ExpiredTime; } EXPIRATION_ITEM; struct sEXCLUSIVE_PAIR { CODETYPE XOR_Item0; CODETYPE XOR_Item1; } EXCLUSIVE_PAIR; struct sRENDER_EFFECT { CODETYPE ItemCode; eSPECIAL_RENDER_EFFECT RenderEffect; } RENDER_EFFECT; } SHARED_BLK; typedef uSHARED_BLK::sEXPIRATION_ITEM sEXPIRATION_ITEM; typedef uSHARED_BLK::sEXCLUSIVE_PAIR sEXCLUSIVE_PAIR; typedef uSHARED_BLK::sRENDER_EFFECT sRENDER_EFFECT; inline VOID Clear() { POLICY = ITEM_POLICY_NOT_DEFINED; ZeroMemory( &SHARED_BLK, sizeof(SHARED_BLK) ); } inline sEXPIRATION_ITEM& GetExpirationInfo() { return SHARED_BLK.EXPIRATION_ITEM; } inline sEXCLUSIVE_PAIR& GetExclusivePairInfo() { return SHARED_BLK.EXCLUSIVE_PAIR; } inline sRENDER_EFFECT& GetRenderEffectInfo() { return SHARED_BLK.RENDER_EFFECT; } }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // class AppliedItemDependencyChain : public IWorkNode { private: static const DWORD INTERVALforUPDATE = 10*1000; private: typedef sITEM_POLICY::ePOLICY ePOLICY; typedef sITEM_POLICY::sEXPIRATION_ITEM sEXPIRATION_ITEM; typedef sITEM_POLICY::sEXCLUSIVE_PAIR sEXCLUSIVE_PAIR; typedef sITEM_POLICY::sRENDER_EFFECT sRENDER_EFFECT; typedef sITEM_POLICY::TIME_SPEC TIME_SPEC; private: typedef std::pair POLICY_NODE; typedef STLX_LIST POLICY_LIST; typedef POLICY_LIST::iterator POLICY_LIST_IT; typedef sITEM_POLICY::ePOLICY ePOLICY_BITSET; // ÇØ´ç Äڵ忡 °ü·ÃµÈ ¸ðµç POLICY bitset typedef sITEM_POLICY* sXOR_ITEM_PTR; // XOR ¼Ó¼ºÀ» °¡Áö´Â °æ¿ì¿¡ ÇÒ´çµÊ typedef sITEM_POLICY* sEXPIRED_PTR; // ±â°£Á¦ ¼Ó¼ºÀ» °¡Áö´Â °æ¿ì typedef sITEM_POLICY* sEFFECT_PTR; // ±â°£Á¦ ¼Ó¼ºÀ» °¡Áö´Â °æ¿ì struct ITEMPOLICY_NODE { sEXPIRED_PTR m_pTIME; sXOR_ITEM_PTR m_pXOR; sEFFECT_PTR m_pEFFECT; ITEMPOLICY_NODE( const sEXPIRED_PTR pExp=NULL, const sXOR_ITEM_PTR pXor=NULL, const sEFFECT_PTR pEffect=NULL ) : m_pTIME(pExp), m_pXOR(pXor), m_pEFFECT(pEffect) {} }; //typedef pair ITEMPOLICY_NODE; typedef std::pair ITEMCODE_LINK; // typedef STLX_MAP ITEMCODE_LIST; typedef ITEMCODE_LIST::iterator ITEMCODE_LIST_IT; typedef std::pair ITEMCODE_NODE; private: AppliedItemDependencyChain(); public: virtual ~AppliedItemDependencyChain(); static VOID CreateInstance() { ms_pInstance ? 0 : new AppliedItemDependencyChain(); } static VOID DestoryInstance() { SAFE_DELETE(ms_pInstance); } inline static AppliedItemDependencyChain* Instance() { return ms_pInstance; } inline static WORK_KEY GetWorkKey() { return ms_WorkKey; } inline static VOID SetWorkKey( WORK_KEY wKey ) { ms_WorkKey = wKey; } public: virtual BOOL DoInit(); virtual BOOL DoProcess(); virtual BOOL IsComplete(); virtual BOOL DoRelease(); // Control Interface virtual VOID OnMsg( sSIG_MSG* pSIG_MSG ); inline ePOLICY GetItemDependencyInfo( const CODETYPE itemCode ) { ITEMCODE_LIST_IT itFIND = m_ItemCodeChain.find(itemCode); return itFIND != m_ItemCodeChain.end() ? itFIND->second.first : sITEM_POLICY::ITEM_POLICY_NO_CONTROL; } inline ePOLICY GetItemDependencyInfo( const CODETYPE itemCode, ITEMCODE_LIST_IT& OUT rIT ) { ITEMCODE_LIST_IT itFIND = m_ItemCodeChain.find(itemCode); rIT = itFIND; return itFIND != m_ItemCodeChain.end() ? itFIND->second.first : sITEM_POLICY::ITEM_POLICY_NO_CONTROL; } inline BOOL IsExpirationItem( const CODETYPE itemCode ) { return !!( sITEM_POLICY::ITEM_POLICY_EXPIRATION_ITEM&GetItemDependencyInfo(itemCode) ); } inline BOOL IsExclusiveItem( const CODETYPE itemCode ) { return !!( sITEM_POLICY::ITEM_POLICY_EXCLUSIVE_PAIR&GetItemDependencyInfo(itemCode) ); } inline BOOL IsRenderEffectItem( const CODETYPE itemCode ) { return !!( sITEM_POLICY::ITEM_POLICY_RENDER_EFFECT&GetItemDependencyInfo(itemCode) ); } public: CODETYPE GetExclusiveItem( const CODETYPE itemCode ); CODETYPE GetExclusiveItem( const CODETYPE itemCode, ITEMCODE_LIST_IT& IN rIT ); VOID AddPolicyExpirationItem( const CODETYPE itemCode, const TIME_SPEC expiredTime ); VOID AddPolicyExclusivePair( const CODETYPE itemCode0, const CODETYPE itemCode1 ); VOID AddPolicyRenderEffectItem( const CODETYPE itemCode, const eSPECIAL_RENDER_EFFECT effect ); VOID RemovePolicyExpirationItem( const CODETYPE itemCode ); VOID RemovePolicyExclusivePair( const CODETYPE itemCode ); VOID RemovePolicyRenderEffectItem( const CODETYPE itemCode ); public: BOOL IsAcceptableInsert( Player* IN pPlayer, SCItemSlot& IN rItemSlot, const INT iAddNum ); BOOL IsExpiredItem( SCItemSlot& IN rItemSlot ); BOOL CheckAndApplyEffect( Player* IN pPlayer, SCItemSlot& IN rItemSlot, const BOOL bInserted, const INT changed_total_count ); private: VOID _AddPolicyExclusivePair( const CODETYPE itemCode, POLICY_LIST_IT itInserted ); private: POLICY_LIST m_PolicyChain; ITEMCODE_LIST m_ItemCodeChain; ITimerBase m_UpdateTimer; TIME_SPEC m_CurrentTime; static WORK_KEY ms_WorkKey; static AppliedItemDependencyChain* ms_pInstance; };