#pragma once #ifdef _NA_008012_20150130_RANKING_SYSTEM #ifndef RANKING_LIB_RANKING_MANAGER_H #define RANKING_LIB_RANKING_MANAGER_H //================================================================================================== /// RankingManager class /** @author Kim Min Wook < taiyo@webzen.com > @since 2006. 8. 22 @remark - ·©Å·À» °ü¸®Çϴ Ŭ·¡½º, ÇöÀç´Â ¹Ì¼Ç¸¸ @note - ·©Å·ÀÇ Á¾·ù : ¸í¿¹ÀÇ Àü´ç, Áö³­ÁÖ ¼øÀ§, ÇöÀçÁÖ ¼øÀ§ - Ŭ¶óÀ̾ðÆ®+¼­¹ö °øÀ¯ ¸ðµâ @history - ~2011.05.12, - 2011.05.12, waverix, code rearrangements */ //================================================================================================== #include #include #include "./RankingDefine.h" #include "./RankingStruct.h" #include "./MissionRanking.h" #include "./MissionRankingRecord.h" #include "./RankingMember.h" //================================================================================================== enum eRANKING_TYPE { #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM // eRANKING_TYPEÀº Áö³­ÁÖ/ÇöÀçÁÖÀÇ ±¸°£À» Ç¥½Ã // eRANKING_SYSTEM_TYPEÀº 1~5¹øÀ¸·Î ¹Ì¼Ç/Æ÷ÀÎÆ®/ÀüÀå·©Å·À» ³ªÅ¸³½´Ù #else // 1303ÆÐÄ¡ ÀÌÈÄ·Î º£½ºÆ®¿Àºêº£½ºÆ® Ç׸ñÀº »èÁ¦µÈ´Ù eRANKING_FAME, #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM eRANKING_LASTWEEK, eRANKING_TODAYWEEK, eRANKING_MAX, #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM eRANKING_MYRANKING, #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM }; enum eRANKING_STATUS { eRANKING_STATUS_INIT, eRANKING_STATUS_SUSPENDING, eRANKING_STATUS_NORMAL, // eRANKING_STATUS_COUNTS // EOR }; #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR class GameRankingManager; #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR //================================================================================================== // class RankingManager : public IParser { #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR friend GameRankingManager; #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR // BEGIN ENUM, STRUCT ------------------------------------------------------------------------------ public: enum { MAX_TODAYWEEK_CUTLINE_NUM = 50, MAX_FAME_CUTLINE_NUM = 1, }; struct LEVEL_AREA_BASE { #if defined (_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) RANKINGID m_Id; #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM RANKINGNO m_MissionNo; LEVELTYPE m_MinLV; LEVELTYPE m_MaxLV; DWORD m_MaxMonsterKill; BYTE m_RankingType; WORD m_PointRankingIndex; #if defined (_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) WORD m_GroupString; BYTE m_GroupOrder; WORD m_MissionString; BYTE m_MissionOrder; #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM }; struct REWARD_BASE { RANKINGNO m_MissionNo; BYTE m_Class; //< Ŭ·¡½º WORD m_Ranking; //< ¼øÀ§ #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM BYTE reward_type_; //< º¸»ó ŸÀÔ #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM DWORD m_RewardCode; //< º¸»ó ÄÚµå }; // END ENUM, STRUCT--------------------------------------------------------------------------------- // BEGIN TYPEDEF ----------------------------------------------------------------------------------- public: typedef const LEVEL_AREA_BASE LEVEL_AREA; typedef const REWARD_BASE REWARD; #if defined (_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) typedef STLX_HASH_MAP MISSION_LEVEL_AREA_HASH; #else typedef STLX_HASH_MAP MISSION_LEVEL_AREA_HASH; #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM private: static const ulong kUpdateInterval = 5 * 1000; // typedef STLX_HASH_MAP MISSION_RANKING; typedef STLX_HASH_MAP TMP_MISSION_RECORD_HASH; //typedef STLX_HASH_MAP MISSION_RECORD_HASH_FOR_KEY; typedef STLX_HASH_MAP MISSION_REWARD_HASH; #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR typedef STLX_HASH_MAP BATTLEGROUND_RANKING; #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR struct SettleInfo; // about ranking settlements // END TYPEDEF------------------------------------------------------------------------------------- // BEGIN FUNCTION----------------------------------------------------------------------------------- public: // RankingManager(); virtual ~RankingManager(); //---------------------------------------------------------------------------------------------- virtual void Initialize(); virtual void Update(); // CHANGES: f110511.1L // IParser interfaces virtual BOOL LoadScript(eSCRIPT_CODE script_code, BOOL reloaded); virtual void Release(); // properties const MISSION_LEVEL_AREA_HASH& GetMissionLevelAreaTable() const; //---------------------------------------------------------------------------------------------- // acquisition interfaces using script data = { #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM LEVEL_AREA* FindLVArea(RANKINGNO no, RANKINGTYPE ranking_type = 0) const; LEVEL_AREA* FindLVArea_ID(RANKINGID id) const; REWARD* FindReward(RANKINGNO mission_no, BYTE class_type, WORD ranking, BYTE reward_type) const; const RANKINGID FindRankingID(RANKINGNO mission_no, RANKINGTYPE ranking_type) const; #else LEVEL_AREA* FindLVArea(RANKINGNO no) const; REWARD* FindReward(RANKINGNO mission_no, BYTE class_type, WORD ranking) const; #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM eRANKING_SYSTEM_TYPE GetRankingType(MAPCODE map_code) const; WORD GetPointRankingIndex(MAPCODE map_code) const; // } // Á¤»ê ½ÃÀÛ ³¯Â¥(ymd y:m:s), Á¤»ê ÁÖ±â(³¯¼ö) void InitComputation(int year, int month, int day, int hour, int minute, int second, int period, int suspend_time); void ClearRanking(); //---------------------------------------------------------------------------------------------- // ¹ÙÀÌÆ® ½ºÆ®¸² Á÷·ÄÈ­ ÇÏ´Â ¸Þ¼­µå : ·©Å· Á¤º¸ ¿äû¿¡ ´ëÇÑ ÀÀ´ä¿ë //void Serialize(BYTE* INOUT stream, WORD& INOUT size, eRANKING_SERIALIZE se); #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR void Serialize(eRANKING_TYPE type, RANKINGNO no, BYTE page, BYTE* INOUT stream, WORD& INOUT size, eRANKING_SERIALIZE se, RANKINGTYPE ranking_type = 0); void SerializeForClient(eRANKING_TYPE type, RANKINGNO no, BYTE page, BYTE* INOUT stream, WORD& INOUT size, eRANKING_SERIALIZE se, RANKINGTYPE ranking_type = 0); #else void Serialize(eRANKING_TYPE type, RANKINGNO no, BYTE page, BYTE* INOUT stream, WORD& INOUT size, eRANKING_SERIALIZE se); void SerializeForClient(eRANKING_TYPE type, RANKINGNO no, BYTE page, BYTE* INOUT stream, WORD& INOUT size, eRANKING_SERIALIZE se); #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR //---------------------------------------------------------------------------------------------- // ¹Ì¼Ç Ŭ¸®¾î½Ã ±â·Ï¿ë ¸Þ¼­µå // called by 'CanRegisterMissionRecord' x 2 // known inputs = { MISSION_RANK_MEMBER_INFO, _MISSION_RANK_MEMBER_INFO } template RC::eRANKING_RESULT CanRegisterMissionRecord(RANKINGNO mission_no, BYTE number_of_members, const MEMBER_INFO_TYPE* const member_info_list) const; // ¼­¹ö¿ë RC::eRANKING_RESULT CanRegisterMissionRecord( const _MISSION_RANKING_TOTAL_INFO& ranking_total_info) const; // DWORD RegisterMissionRecordInTemp(_MISSION_RANKING_TOTAL_INFO& rTotalInfo, DWORD GenKey = 0); MissionRankingRecord* FindTmpMissionRankingRecord(RANKINGKEY key) const; // ÇöÀçÁÖ ·©Å·¿¡ ¹Ì¼Ç·©Å· µî·Ï #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR DWORD OnRegisterMissionRecordOnTodayweek(BOOL bSuccess, RANKINGNO no, RANKINGKEY key, RANKINGKEY NewKey, RANKINGTYPE ranking_type = 0); #else DWORD OnRegisterMissionRecordOnTodayweek(BOOL bSuccess, RANKINGNO no, RANKINGKEY key, RANKINGKEY NewKey); #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR void RegisterMissionRecordOnTodayweek(RANKINGKEY key, _MISSION_RANKING_TOTAL_INFO& rTotalInfo); //---------------------------------------------------------------------------------------------- // º¸»ó ¿äû #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM RC::eRANKING_RESULT CanReward(RANKINGNO mission_no, RANKINGKEY key, const TCHAR* char_name, RankingMember** const result_ranking_member, RANKINGTYPE ranking_type = 0) const; RC::eRANKING_RESULT DoReward(RANKINGNO no, RANKINGKEY key, const TCHAR* charname, RANKINGTYPE ranking_type = 0); virtual void OnReward(BOOL bSuccess, RANKINGNO no, RANKINGKEY key, const TCHAR* charname, RANKINGTYPE ranking_type = 0); #else RC::eRANKING_RESULT CanReward(RANKINGNO mission_no, RANKINGKEY key, const TCHAR* char_name, RankingMember** const result_ranking_member) const; RC::eRANKING_RESULT DoReward(RANKINGNO no, RANKINGKEY key, const TCHAR* charname); virtual void OnReward(BOOL bSuccess, RANKINGNO no, RANKINGKEY key, const TCHAR* charname); #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM //---------------------------------------------------------------------------------------------- #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR MissionRankingRecord* FindMissionRecord(eRANKING_TYPE type, RANKINGNO mission_no, RANKINGKEY key, RANKINGTYPE ranking_type = 0) const; MissionRanking* FindMissionRanking(eRANKING_TYPE type, RANKINGNO mission_no, RANKINGTYPE ranking_type = 0) const; #else MissionRankingRecord* FindMissionRecord(eRANKING_TYPE type, RANKINGNO mission_no, RANKINGKEY key) const; MissionRanking* FindMissionRanking(eRANKING_TYPE type, RANKINGNO mission_no) const; #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR //MISSION_RANKING& FindRankingHashForType(eRANKING_TYPE type); int GetDanglingRankingCount(); // #if defined (_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) const int GetMaxLow() const; #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM #ifdef _SERVER void Display() const; void DisplayRanking() const; #endif void SortAll(); #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR MissionRanking* CreateRanking(eRANKING_TYPE type, RANKINGNO no, RANKINGTYPE ranking_type = 0); #else MissionRanking* CreateRanking(eRANKING_TYPE type, RANKINGNO no); #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR //---------------------------------------------------------------------------------------------- // about ranking settlements eRANKING_STATUS GetStatus() const; void SetStatus(eRANKING_STATUS s); // 20060904 DWORD GetOldSettledDate(); DWORD GetSettledDate(); int GetOldSettledDate_Year(); int GetOldSettledDate_Month(); int GetOldSettledDate_Day(); // minute int GetSuspendTime(); // 14day int GetPeriod(); // Åׯ®¿ë Àӽà ÇÔ¼ö void DoTestCurSettle(); #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM //À̹ø ÁÖ°£¿¡¼­ ÀÚ½ÅÀÇ ÃÖ°í ·©Å·ÀÇ ·¹Äڵ带 ã´Â´Ù MissionRankingRecord* FindMyBestRanking(const TCHAR* _charname, eRANKING_TYPE _ranking_type , WORD _missionNo, eRANKING_SYSTEM_TYPE _ranking_system_type); void Serialize_MyRanking(const TCHAR* charname, RANKINGID id, BYTE* INOUT stream, WORD& INOUT size, WORD& INOUT myranking); void SerializeForClient_MyRanking(const TCHAR* charname, RANKINGID id, BYTE* INOUT stream, WORD& INOUT size, WORD& INOUT myranking); void GetRewardableMissionList(const TCHAR* _charname,REWARDABLE_MISSION_LIST* rewardable_mission_list); #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM protected: //---------------------------------------------------------------------------------------------- // about ranking settlements // »ó¼Ó ¹ÞÀº Ŭ·¡½º¿¡¼­ ±¸ÇöÇØ¾ß ÇÏ´Â°Í virtual void OnChangedStatus() {} virtual void OnSettled() {} #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM //°ÔÀÓ¼­¹öÀÇ RankingManagerÀÇ °á»êÀÏÀ» ¾÷µ¥ÀÌÆ®½Ã۱âÀ§ÇÑ ÇÔ¼ö void UpdateSettleTime() { this->NextCalcSettleTime(); } const MISSION_RANKING* GetRankingTables() const {return ranking_tables_;} #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR const BATTLEGROUND_RANKING* GetBattleGroundRankingTables() const {return battleground_ranking_tables_;} #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM private: // bool _LoadLVAreaInfo(); bool _LoadRewardInfo(); // #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR RANKING _RegisterRecord(eRANKING_TYPE type, BYTE MaxRanking, RANKINGNO no, MissionRankingRecord* pRankingRecord, RANKINGTYPE ranking_type = 0); #else DWORD _RegisterRecord(eRANKING_TYPE type, BYTE MaxRanking, RANKINGNO no, MissionRankingRecord* pRankingRecord); #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR //---------------------------------------------------------------------------------------------- // about ranking settlements = { void UpdateSuspending(); void UpdateNormal(); void NextCalcSettleTime(); void DoSettle(); // } void UnLoad(); #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM DWORD Make_Mission_RewardKey(RANKINGNO mission_no, BYTE class_type, WORD ranking, BYTE reward_type) const; #else DWORD Make_Mission_RewardKey(RANKINGNO mission_no, BYTE class_type, WORD ranking) const; #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM // SettleInfo* settle_data_impl_; eRANKING_STATUS ranking_status_; ITimerBase update_timer_; // ¹Ì¼Ç º° ·©Å· °ü¸® MISSION_RANKING ranking_tables_[eRANKING_MAX]; #if defined(_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) MISSION_RANKING my_ranking_table_; #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM #ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR BATTLEGROUND_RANKING battleground_ranking_tables_[eRANKING_MAX]; BATTLEGROUND_RANKING my_battleground_table_; #endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR TMP_MISSION_RECORD_HASH temp_ranking_table_; // MISSION_RECORD_HASH_FOR_KEY m_TodayRankingRecordHash; //< Helper Hash for search // about script management related to ranking MISSION_LEVEL_AREA_HASH mission_level_area_table_; MISSION_REWARD_HASH mission_reward_table_; util::CMemoryPoolFactory m_MissionRankingPool; util::CMemoryPoolFactory m_MissionRankingRecordPool; util::CMemoryPoolFactory m_RankingMemberPool; // REWARD_BASE* mission_ranking_reward_array_; // __DISABLE_COPY(RankingManager); }; //================================================================================================== // inline implements //inline MISSION_RANKING& RankingManager::FindRankingHashForType(eRANKING_TYPE type) //{ // ASSERT(type < eRANKING_MAX); // return ranking_tables_[type]; //} inline int RankingManager::GetDanglingRankingCount() { return (int)temp_ranking_table_.size(); } inline eRANKING_STATUS RankingManager::GetStatus() const { return ranking_status_; } inline void RankingManager::SetStatus(eRANKING_STATUS s) { ranking_status_ = s; } #ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM inline DWORD RankingManager::Make_Mission_RewardKey( RANKINGNO mission_no, BYTE class_type, WORD ranking, BYTE reward_type) const { return MAKEDWORD(mission_no,MAKEWORD(class_type, ranking)) * reward_type; } #else inline DWORD RankingManager::Make_Mission_RewardKey( RANKINGNO mission_no, BYTE class_type, WORD ranking) const { return MAKEDWORD(mission_no, MAKEWORD(class_type, ranking)); } #endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM inline const RankingManager::MISSION_LEVEL_AREA_HASH& RankingManager::GetMissionLevelAreaTable() const { return mission_level_area_table_; }; #if defined(_NA_006802_20130704_REORGANIZATION_RANK_SYSTEM) inline const int RankingManager::GetMaxLow() const { return this->GetRowSize(); } #endif // _NA_006802_20130704_REORGANIZATION_RANK_SYSTEM #endif //RANKING_LIB_RANKING_MANAGER_H #endif // _NA_008012_20150130_RANKING_SYSTEM