#pragma once #ifndef SERVER_GAMESERVER_IMPLEMENTUTIL_H_ #define SERVER_GAMESERVER_IMPLEMENTUTIL_H_ //////////////////////////////////////////////////////////////////////////////////////////////////// /// /// @file ImplementUtil.h /// @author hukim /// @email silped@gmail.com /// @brief [2010/10/13 by hukim] This is created.\n /// @history /// - ~10.12.20 /// - 10.12.20, waverix, CHANGES: f101220.1L, fixed invalid function declaration /// about c-style static function, reference='f101217.1L' /// - 11.02.16, waverix, CHANGES: f110216.2L, same reason as 'f101220.1L' //////////////////////////////////////////////////////////////////////////////////////////////////// #include // #include "ItemManager.h" #include "SCItemSlotContainer.h" #include "RewardManager.h" namespace util { namespace internal { ; // CHANGES: f110216.2L, fixed unexpected code duplicated state in address space // ¿äû ¸Þ½ÃÁö¿¡ ´ëÇØ ±âº»ÀûÀÎ °Ë»ç¸¦ ÇÑ´Ù. template bool CheckRequestMessage( const MSG_BASE* const base_message, const WORD message_size, const REQUEST_MESSAGE_T*& OUT message, Player*& OUT requester) { // ÆÐŶ Å©±â¸¦ °Ë»çÇÑ´Ù. message = static_cast(base_message); if (message->GetSize() != message_size) { assert(false); return false; } // ¿äûÀÚ¸¦ °Ë»çÇÑ´Ù. requester = util::internal::IsExistInField(message->m_dwKey); if (requester == NULL) { return false; } return true; } // pseudo: true = { exist player & exist game_field } extern Player* IsExistInField(DWORD user_key); // ¿äûÀÚ »óÅ¿¡ ´ëÇØ ±âº»ÀûÀÎ °Ë»ç¸¦ ÇÑ´Ù. extern bool CheckRequesterState( Player* const requester, const TCHAR* called_function, int& OUT result_code); // ¾ÆÀÌÅÛ ÇÕ¼º ¶Ç´Â ºÐÇØ º¸»ó class ItemCompositionOrDecompositionReward { public: enum { kUnused = 0 }; enum { kDoNotUseLog = 0 }; enum RewardType { kUndefinedReward = kUnused, kItemCodeReward = 1, kRewardCodeReward = 2 }; typedef int RequestType; typedef SLOTCODE RewardItemCode; typedef POSTYPE RewardItemNumber; typedef CODETYPE RewardCode; typedef WORD SOCKETINDEX; struct ItemReward // ¾ÆÀÌÅÛ º¸»ó { RewardItemCode item_code; RewardItemNumber number_of_item; KindOfItemType::value_type ig_type; SOCKETINDEX zard_option; ItemReward() : item_code(kUnused), number_of_item(0), ig_type(KindOfItemType::Default), zard_option(kUnused) { } }; // ItemReward private: class ItemCodeReward; class RewardCodeReward; class RewardInterface // º¸»ó ÀÎÅÍÆäÀ̽º { protected: RewardInterface() : requester_(NULL) { } public: virtual ~RewardInterface() {} // Àκ¥Å丮¿¡ º¸»óÀ» ¾ò´Â´Ù. virtual RC::eITEM_RESULT ObtainToInventory( const int log_type, INVENTORY_TOTAL_INFO& OUT added_inventory_items) = 0; // ÇÕ¼º ¶Ç´Â ºÐÇØ ³»¿ª¿¡ º¸»ó Á¤º¸¸¦ Ãß°¡ÇÑ´Ù. virtual bool AddToHistory(ItemCompositionOrDecompositionHistory& OUT history) const = 0; // Àκ¥Å丮·Î ¾òÀº º¸»óÀÌ ÀÖ´ÂÁö °Ë»çÇÑ´Ù. virtual bool IsExistObtainedToInventory() const = 0; // ÃʱâÈ­ ÇÑ´Ù. void Init(Player* const requester) { requester_ = requester; } // ±¸Ã¼ ÀνºÅϽº¸¦ ¾ò´Â´Ù. template CONCRETE_T* GetConcrete() { return static_cast(this); } // ÀνºÅϽº¸¦ »ý¼ºÇÑ´Ù. static RewardInterface* CreateInstance(const RewardType reward_type); protected: Player* requester_; }; // RewardInterface // class ItemCodeReward : public RewardInterface // ¾ÆÀÌÅÛ ÄÚµå º¸»ó { friend class RewardInterface; enum { kMaxKindOfReward = 20 }; private: explicit ItemCodeReward(); public: bool Add(const ItemReward& item_reward); #ifdef _20220329_ADD_EQU_RECOVERY bool ObtainAdd(const ItemReward& item_reward); #endif RC::eITEM_RESULT ObtainToInventory( const int log_type, INVENTORY_TOTAL_INFO& OUT added_inventory_items); bool AddToHistory(ItemCompositionOrDecompositionHistory& OUT history) const; bool IsExistObtainedToInventory() const { return (number_of_kinds_ > 0); } private: POSTYPE number_of_kinds_; RewardItemCode item_code_list_[kMaxKindOfReward]; RewardItemNumber item_num_list_[kMaxKindOfReward]; KindOfItemType::value_type ig_type_list_[kMaxKindOfReward]; SOCKETINDEX zard_option_list_[kMaxKindOfReward]; bool is_use_ig_type_; bool is_use_zard_option_; __DISABLE_COPY(ItemCodeReward); }; // ItemCodeReward class RewardCodeReward : public RewardInterface // º¸»ó ÄÚµå º¸»ó °ü¸®ÀÚ { friend class RewardInterface; private: RewardCodeReward() : reward_code_(kUnused) { } public: bool Add(const RewardCode reward_code); RC::eITEM_RESULT ObtainToInventory( const int log_type, INVENTORY_TOTAL_INFO& OUT added_inventory_items); bool AddToHistory(ItemCompositionOrDecompositionHistory& OUT history) const; bool IsExistObtainedToInventory() const { return (obtained_result_.number_of_kinds > 0); } private: RewardCode reward_code_; RewardManager::ObtainedResult obtained_result_; __DISABLE_COPY(RewardCodeReward); }; // RewardCodeReward public: ItemCompositionOrDecompositionReward() : reward_type_(kUndefinedReward) { } // ÃʱâÈ­ ÇÑ´Ù. bool Init(Player* const requester, const RewardType reward_type); // ¾ÆÀÌÅÛ ÄÚµå º¸»óÀ» Ãß°¡ÇÑ´Ù. bool AddItemReward(const ItemReward& item_reward); #ifdef _20220329_ADD_EQU_RECOVERY bool AddObtainItemReward(const ItemReward& item_reward); #endif // º¸»ó ÄÚµå º¸»óÀ» Ãß°¡ÇÑ´Ù. bool AddReward(const RewardCode reward_code); // Àκ¥Å丮¿¡ º¸»óÀ» ¾ò´Â´Ù. RC::eITEM_RESULT ObtainRewardToInventory( const int log_type, INVENTORY_TOTAL_INFO& OUT added_inventory_items); // ÇÕ¼º ¶Ç´Â ºÐÇØ ³»¿ª¿¡ º¸»ó Á¤º¸¸¦ Ãß°¡ÇÑ´Ù. bool AddToHistory(ItemCompositionOrDecompositionHistory& OUT history) const; // Àκ¥Å丮·Î ¾òÀº º¸»óÀÌ ÀÖ´ÂÁö °Ë»çÇÑ´Ù. bool IsExistObtainedToInventory() const; private: RewardType reward_type_; boost::scoped_ptr reward_; }; // ItemCompositionOrDecompositionReward } // internal } // util #endif //}} SERVER_GAMESERVER_IMPLEMENTUTIL_H_