#pragma once #if defined(_VILLAGESERVER) || defined(_GAMESERVER) class CDNGameDataManager; #else #include "DNTableFile.h" #endif //------------------------------------------------------------------------------ /** Note Çѱâ: ½ºÅ³ Æ®¸® °ü·Ã Å×ÀÌºí¿¡¼­ µ¥ÀÌÅ͸¦ ·ÎµåÇØ¼­ Áã°í ÀÖ´Ù°¡ µ¥ÀÌÅÍ È®ÀÎ ¿äû/µ¥ÀÌÅÍ Á¶È¸ ¿äûÀ» ó¸®ÇÕ´Ï´Ù. µ¥ÀÌÅͰ¡ ±¸¼ºµÈ ÈÄ¿¡ ¹«¾ð°¡¸¦ »õ·Î »ý¼ºÇϰųª µ¥ÀÌÅ͸¦ Àоî³õ°í º¯°æÀ» °¡ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¸ÖƼ½º·¹µå °í·Á°¡ µÇ¾îÀÖÁö ¾Ê½À´Ï´Ù. */ //------------------------------------------------------------------------------ // ½ºÅ³ ½½·Ô ÃÖ´ë °¹¼öÀÔ´Ï´Ù. Æ®¸®¸¦ ¾î¶»°Ô ²Ù¹Ì´À³Ä¿¡ µû¶ó ´Þ¶óÁö±â ¶§¹®¿¡ // ¸¸¾à ÃÖ´ë ½ºÅ³ ½½·ÔÀ» ´Ã·Á¾ß ÇÑ´Ù¸é ÀÌ »ó¼ö°ªÀ» º¯°æÇϰí // R:/GameRes/Resource/UI/Skill/SkillTreeContentDlg.ui ÆÄÀÏ¿¡¼­µµ °°ÀÌ ½½·Ô °¹¼ö¸¦ ¸ÂÃçÁà¾ß ÇÕ´Ï´Ù. const int MAX_SKILL_SLOT_COUNT = 28; const int MAX_PARENT_SKILL_COUNT = 3; const int MAX_SKILL_PER_LINE = 4; class CDnSkillTreeSystem { private: struct S_UNLOCK_CONDITION { int iUnlockSkillBookItemID; S_UNLOCK_CONDITION( void ) : iUnlockSkillBookItemID( 0 ) { }; }; struct S_ACQUIRE_CONDITION { // ½ºÅ³À» ¾ð¶ôÇϱâ À§ÇÑ ÇÊ¿ä ij¸¯ÅÍ ·¹º§. °¢ ½ºÅ³¸¶´Ù ½ºÅ³·¹º§Å×ÀÌºí¿¡ 1·¾¿¡ Á¤ÀǵǾîÀÖÀ½. int iNeedLevel; // ¿ä±¸µÇ´Â ºÎ¸ð ½ºÅ³ ·¹º§. NodeInfo ¿¡ ÀÖ´Â ¼ø¼­¿Í ÀÏÄ¡ÇÏ¸ç ¶Ç ±×·¡¾ß¸¸ ÇÔ. vector vlParentSkillNeedLevel; S_ACQUIRE_CONDITION( void ) : iNeedLevel( 0 ) { }; }; public: // UI Ç¥½Ã¿ë ±¸Á¶Ã¼. struct S_NODE_RENDER_INFO { int iSkillID; int iSlotIndex; int iJobID; const S_UNLOCK_CONDITION* pUnLockCondition; const S_ACQUIRE_CONDITION* pAcquireCondition; vector vlChildSlotIndexInJob; // ¿ÞÂʺÎÅÍ ¿À¸¥ÂÊÀ¸·Î ³ª°¡´Â Æ®¸® ½½·Ô À妽º. °°Àº Á÷¾÷ Æ®¸® ¾È¿¡¼­¸¸ ÀÖ´Â ÀÚ½Ä. // ´Ù¸¥ Á÷¾÷ÀÇ ½ºÅ³ÀÌ ºÎ¸ð ½ºÅ³ÀÌ µÉ ¼ö ÀÖÀ½. vector vlParentSkillJobIDs; vector vlParentSkillIDs; #if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP) vector vlNeedJobSP; //Á÷¾÷±º º° ÇÊ¿ä sp°ª #endif // PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP S_NODE_RENDER_INFO() : iSkillID( 0 ), iSlotIndex( 0 ), iJobID( 0 ), pUnLockCondition( NULL ) , pAcquireCondition( NULL ){}; S_NODE_RENDER_INFO( int argiSkillID, int argiSlotIndex, int argiJobID, const S_UNLOCK_CONDITION* argpUnLockCondition, const S_ACQUIRE_CONDITION* argpAcquireCondition ) : iSkillID( argiSkillID ), iSlotIndex( argiSlotIndex ), iJobID( argiJobID ), pUnLockCondition( argpUnLockCondition ), pAcquireCondition( argpAcquireCondition ) {}; }; private: // ½ºÅ³ Æ®¸® ³ëµå Á¤º¸. struct S_NODE_INFO { int iJobID; int iSkillID; int iNeedSkillPointToAcquire; // ȹµæÇϱâ À§ÇØ ÇÊ¿äÇÑ ½ºÅ³ Æ÷ÀÎÆ® //------------------------------------------------------------------------------ /** Æ®¸® ½½·Ô ID ´Â ¿ÞÂʺÎÅÍ ¿À¸¥ÂÊÀ¸·Î 0ºÎÅÍ ¼øÂ÷ÀûÀ¸·Î ³ª°©´Ï´Ù. ÇöÀç´Â 4 Ä­ÀÌ ÇÑ ÁÙ ±âÁØÀÓ. */ //------------------------------------------------------------------------------ int iTreeSlotIndex; bool bDefaultLocked; // ÀÌ ³ëµåÀÇ ½ºÅ³À» ¾ð¶ô, ȹµæÇϱâ À§ÇÑ Á¶°Ç S_UNLOCK_CONDITION UnLockCondition; S_ACQUIRE_CONDITION AcquireCondition; vector vlpChildNodeInfo; vector vlpParentNodeInfo; // ºÎ¸ð ½ºÅ³³ëµå´Â ÃÖ´ë 3°³°¡ µÉ ¼ö ÀÖÀ½. ¸ðµÎ ÀÖ¾î¾ß ½ºÅ³ ȹµæ °¡´É. #if defined( PRE_ADD_PRESET_SKILLTREE ) vector vecAdviceSkillLevel; #endif // #if defined( PRE_ADD_PRESET_SKILLTREE ) #if defined( PRE_ADD_ONLY_SKILLBOOK ) bool bNeedSkillBook; #endif // #if defined( PRE_ADD_ONLY_SKILLBOOK ) // ³ëµå ·»´õ¸µ Á¤º¸ S_NODE_RENDER_INFO* pNodeRenderInfo; S_NODE_INFO() : iTreeSlotIndex( 0 ), iJobID( 0 ), iSkillID( 0 ), iNeedSkillPointToAcquire( 0 ), bDefaultLocked( false ), pNodeRenderInfo( NULL ) #if defined( PRE_ADD_ONLY_SKILLBOOK ) , bNeedSkillBook( false ) #endif // #if defined( PRE_ADD_ONLY_SKILLBOOK ) { }; }; struct S_SKILLTREE_INFO { int iJobID; vector vlpNodeList; // ¸®½ºÆ®·Î ½ºÅ³ ³ëµå Á¢±Ù. map mapNodeBySkillID; // ½ºÅ³ ID¸¦ Ű °ªÀ¸·Î ½ºÅ³ ³ëµå¿¡ Á¢±Ù. vector vlNodeRenderInfo; // ³ëµå ·»´õ¿ë Á¤º¸. ~S_SKILLTREE_INFO() { SAFE_DELETE_PVEC( vlpNodeList ); } }; vector m_vlpJobSkillTreeList; map m_mapSkillTreeByJobID; // Á÷¾÷(Àâ) ID ·Î ½ºÅ³ Æ®¸®¿¡ Á¢±Ù. map m_mapNodeListBySkillBookID; // ½ºÅ³ºÏ ¾ÆÀÌÅÛ ID·Î ³ëµå Á¤º¸¸¦ ãÀ» ¼ö ÀÖÀ½. protected: S_NODE_INFO* _FindNode( int iSkillID ); void _MakeupParentSkillLinks( DNTableFileFormat* pSkillTreeTable, DNTableFileFormat* pSkillTable ); public: CDnSkillTreeSystem(void); ~CDnSkillTreeSystem(void); // Å×ÀÌºí ·ÎµåÇØ¼­ ÇÊ¿äÇÑ Á¤º¸ ÃʱâÈ­. // ¼­¹ö¿¡¼­´Â DataManager ¿¡¼­ Á¤¸®ÇسõÀº µ¥ÀÌÅͰ¡ Àֱ⠶§¹®¿¡ ÀÌ°É »ç¿ëÇØ¼­ ÃʱâÈ­ ÇÑ´Ù. #if defined(_VILLAGESERVER) || defined(_GAMESERVER) bool InitializeTableUsingDataManager( CDNGameDataManager* pDataManager ); #endif bool InitializeTable( void ); struct S_POSSESSED_SKILL_INFO { int iSkillID; int iSkillLevel; // ·¹º§Å×À̺í ID ¾Æ´Ô. ¼ø¼ö ½ºÅ³ ÇöÀç ·¹º§ bool bCurrentLock; // ÇöÀç ¶ôÀÌ µÈ »óÅÂÀÎÁö ¾Æ´ÑÁö. S_POSSESSED_SKILL_INFO() : iSkillID( 0 ), iSkillLevel( 0 ), bCurrentLock( true ) { }; S_POSSESSED_SKILL_INFO( int argiSkillID, int argiSkillLevel, bool argbCurrentLock ) : iSkillID(argiSkillID), iSkillLevel(argiSkillLevel), bCurrentLock(argbCurrentLock) { }; }; // ¾ÖÃʺÎÅÍ È£ÃâµÇ¸é ¾ÈµÇ´Â ÄÉÀ̽º. enum ERROR_CODE { E_NONE = 0, // ¿¡·¯ ¾Æ´Ô E_CANT_FIND_SKILLNODE, // ½ºÅ³ Æ®¸®³ëµå¸¦ ãÀ» ¼ö ¾øÀ½. (Á÷¾÷ÀÌ ´Ù¸¥ °æ¿ìµµ Æ÷ÇÔ) E_MISMATCH_JOB, E_INVALID_CALL, // À߸øµÈ È£Ãâ }; // enum RESULT_CODE { R_SUCCESS, R_NOT_ENOUGH_CHAR_LEVEL, // ij¸¯ÅÍ ¿ä±¸·¹º§ÀÌ ¸ðÀÚ¶÷. R_INVALID_SKILLBOOK_ITEMID, // ½ºÅ³ºÏ ¾ÆÀÌÅÛ ID °¡ ¸ÂÁö ¾ÊÀ½. R_DONT_HAVE_PARENT_SKILL, // ¼±Çà(ºÎ¸ð) ½ºÅ³ÀÌ ¾øÀ½. R_LOCKED_PARENTSKILL, // ºÎ¸ð ½ºÅ³ÀÌ ¶ôÀÌ µÇ¾îÀÖÀ½. R_NOT_ENOUGH_PARENT_SKILL_LEVEL, // ºÎ¸ð½ºÅ³ÀÇ ·¹º§ÀÌ ÃæÁ·µÇÁö ¾ÊÀ½. R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE, // ½ºÅ³ Æ÷ÀÎÆ®°¡ ¸ðÀÚ¶ó¼­ ½ºÅ³À» ȹµæÇÒ ¼ö ¾øÀ½. R_EXCLUSIVE_SKILL, R_ONLY_SKILL_BOOK, // ½ºÅ³ºÏÀ¸·Î¸¸ ¹è¿ï ¼ö ÀÖ´Â ½ºÅ³. R_FAIL, R_ERROR, }; #if defined( PRE_ADD_PRESET_SKILLTREE ) enum { E_ADVICE_SKILL_LEVEL_COUNT = 3 }; #endif // #if defined( PRE_ADD_PRESET_SKILLTREE ) // ÇöÀç ȹµæ ½ºÅ³, ½ºÅ³ºÏ »ç¿ë Á¤º¸. struct S_TRY_UNLOCK { int iCurrentCharLevel; int iTryUnlockSkillID; // ¾ò°íÀÚ ÇÏ´Â ½ºÅ³ ID int iSkillBookItemID; // »ç¿ëÇÏ´Â ½ºÅ³ ºÏ ItemID int iJobID; // ÇöÀç Á÷¾÷. ÀüÁ÷ÇßÀ» ¶§ ÀÌÀü ½ºÅ³ ¾ð¶ôÇÒ¶§ ¾îÂîÇÒÁø »ý°¢Çغ¸ÀÚ. //const vector& vlPossessedSkillInfo; // º¸À¯Çϰí ÀÖ´Â ½ºÅ³ Á¤º¸. (¾µµ¥¾ø´Â º¹»ç ¹æÁö) //S_CURRENT_USERSKILL_INFO( const vector& _vlSkillInfo ) : // vlPossessedSkillInfo( _vlSkillInfo ), // iCurrentCharLevel( 0 ), iSkillBookItemID( 0 ), iTryUnlockSkillID( 0 ), iJobID( 0 ) //{ //}; S_TRY_UNLOCK( void ) : iCurrentCharLevel( 0 ), iTryUnlockSkillID( 0 ), iSkillBookItemID( 0 ), iJobID( 0 ) { } }; struct S_TRY_ACQUIRE { int iCurrentCharLevel; int iTryAcquireSkillID; int iHasSkillPoint; int iJobID; const vector& vlPossessedSkillInfo; S_TRY_ACQUIRE( const vector& _vlSkillInfo ) : vlPossessedSkillInfo( _vlSkillInfo ), iCurrentCharLevel( 0 ), iTryAcquireSkillID( 0 ), iHasSkillPoint( 0 ), iJobID( 0 ) { }; }; // ¿äû °á°ú. struct S_OUTPUT { RESULT_CODE eResult; ERROR_CODE eErrorCode; S_OUTPUT() : eResult( R_FAIL ), eErrorCode( E_NONE ) { }; }; #ifdef PRE_ADD_ONLY_SKILLBOOK bool IsNeedSkillBook( int iSkillID, bool& bExistSkill ); #endif // PRE_ADD_ONLY_SKILLBOOK // ½ºÅ³ ¾ð¶ô ½Ãµµ. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ÀÌ¹Ì ¾ð¶ôµÈ ½ºÅ³Àº È£ÃâÇÏÁö ¾Êµµ·Ï È®ÀÎÇØÁÖ¼¼¿ä! void TryUnLockSkill( /*IN*/ const S_TRY_UNLOCK& PresentInfo, /*OUT*/ S_OUTPUT* pResult ); void TryAcquireSkill( /**/ const S_TRY_ACQUIRE& TryAcquire, /*OUT*/ S_OUTPUT* pResult ); int FindSkillBySkillBook( int iSkillBookItemID ); #ifdef PRE_ADD_LEVELUP_GUIDE void GetLevelUpSkillInfo(std::vector& newSkillIdList, int newLevel, int jobId); void GetLevelUpSkillInfo(std::vector& newSkillIdList, int newLevel, const std::vector& jobHistoryVec); #endif //#ifndef (_GAMESERVER)&(_VILLAGESERVER) // Ŭ¶óÀÌ¾ðÆ®¿¡¼­¸¸ »ç¿ëÇÏ´Â Æ®¸® Ÿ±â. int GetNodeCount( int iJobID ) const; // À¯È¿ÇÑ ½ºÅ³ ³ëµå °¹¼ö. int GetSlotCount( int iJobID ) const; // »ç¿ëÇÏ´Â ½½·Ô °¹¼ö. (Áß°£¿¡ ºóÄ­ Á¸ÀçÇÒ ¼ö ÀÖÀ½) void GetNodeRenderInfo( int iSlotIndex, int iJobID, /*OUT*/S_NODE_RENDER_INFO* pNodeRenderInfo ) const; //#endif #if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP) void GetNeedSPValuesByJob(int nSkillID, std::vector& nNeedSPValues); #endif // PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP int IsParentSkill( const int nParentSkillID, const int nChildSkillID ); void GetParentSkillData( const int nChildSkillID, std::vector< std::pair > & vecParentSkillData ); #if defined( PRE_ADD_PRESET_SKILLTREE ) void GetAdviceSkillTree( const int nAdviceSkill_Index, const std::vector & vecJobList, std::vector< std::pair > & vecData ); #endif // #if defined( PRE_ADD_PRESET_SKILLTREE ) };