#pragma once //======================================================================================================================= /// SocketOptionParser class /** @author Kim Min Wook < taiyo@webzen.com > @since 2006. 1. 9 @remarks - ¼ÒÄÏ ¿É¼Ç¿¡ ´ëÇÑ ÆÄ¼­ - ¼ÒÄϱ¸¸Û¿¡ ¿É¼ÇÀ» ºÙÀ϶§ sSOCKETITEM_OPTIONÀÇ Á¤º¸¸¦ ÀÌ¿ëÇÑ´Ù. - ¼ÒÄϿɼǿ¡ ´ëÇÑ Encode, Decode¸¦ ÇÒ ¶§, sSOCKET_OPTION Á¤º¸¸¦ ÀÌ¿ëÇÑ´Ù. @note - @history - 2006.11.29 : ¼ÒÄÏ ¿É¼Ç °³¼ö Áõ°¡ 32->64 */ //======================================================================================================================= #include #include #include #include #include #include "RatioSelector.h" #ifdef _NA_0_20100727_SOCKET_SYSTEM_PARSER //================================================================================================== // Àðµå ¿É¼Ç Á¤º¸ struct ZardOptionInfo { typedef BYTE ItemOptionCode; // ¾ÆÀÌÅÛ ±âÁØ ¿É¼Ç ÄÚµå typedef int OptionPoint; // ¿É¼ÇÆ÷ÀÎÆ® struct OptionValueInfo // ¿É¼Ç°ª Á¤º¸ { typedef int ValueType; OptionPoint point; // ¿É¼ÇÆ÷ÀÎÆ® eVALUE_TYPE type; // ¿É¼ÇŸÀÔ ValueType value; // ¿É¼Ç°ª OptionValueInfo() : point(0), type(VALUE_TYPE_VALUE), value(0) { } private: __DISABLE_COPY(OptionValueInfo); }; typedef STLX_MAP OptionValueMap; public: ZardOptionInfo() : item_option_code(eATTR_TYPE_INVALID), attr_option_code(eATTR_TYPE_INVALID) { } ~ZardOptionInfo(); public: // ¿É¼Ç°ªÀ» »ðÀÔÇÑ´Ù. »ðÀÔ¿¡ ½ÇÆÐÇÏ¸é »õ ¿É¼Ç°ªÀº ÀÚµ¿ ÇØÁ¦µÈ´Ù. bool Insert(OptionValueInfo*& INOUT new_option_value); // Æ÷ÀÎÆ®¿¡ µû¸¥ ¿É¼Ç°ªÀ» ã´Â´Ù. const OptionValueInfo* Find(const OptionPoint option_point) const; // Æ÷ÀÎÆ®¿¡ µû¸¥ ¿É¼Ç°ªÀÌ Á¸ÀçÇÏ´ÂÁö °Ë»çÇÑ´Ù. bool IsExist(const OptionPoint option_point) const { return (option_value_map_.find(option_point) != option_value_map_.end()); } // ¿É¼Ç°ª ¸ñ·ÏÀ» ¾ò´Â´Ù. const OptionValueMap& GetOptionValues() const { return option_value_map_; } // ¿É¼Ç ŸÀÔÀ» ¾ò´Â´Ù. eVALUE_TYPE GetOptionType() const; public: ItemOptionCode item_option_code; // ¾ÆÀÌÅÛ ±âÁØ ¿É¼ÇÄÚµå eATTR_TYPE attr_option_code; // ¼Ó¼º ±âÁØ ¿É¼ÇÄÚµå private: OptionValueMap option_value_map_; __DISABLE_COPY(ZardOptionInfo); }; // ZardOptionInfo typedef WORD SOCKETINDEX; // ¼ÒÄÏ ¿É¼Ç struct sSOCKET_OPTION { typedef BYTE ItemOptionKind; typedef int OptionValue; struct OptionPointInfo // ¿É¼Ç Æ÷ÀÎÆ® Á¤º¸ { enum { kMaxListSize = 5 }; typedef BYTE ListSizeType; ZardOptionInfo::ItemOptionCode item_option_code; // ¾ÆÀÌÅÛ ±âÁØ ¿É¼Ç ÄÚµå ZardOptionInfo::OptionPoint option_point; // ¿É¼Ç Æ÷ÀÎÆ® const ZardOptionInfo* zard_option; // Àðµå ¿É¼Ç Á¤º¸ OptionPointInfo() : item_option_code(eATTR_TYPE_INVALID), option_point(0), zard_option(NULL) { } private: __DISABLE_COPY(OptionPointInfo); }; public: sSOCKET_OPTION() : index(0), zard_grade(kZardGradeUnused), name_code(0), item_option_kind(eATTR_TYPE_INVALID), attr_option_kind(eATTR_TYPE_INVALID), item_code(0), option_image(0), option_type(VALUE_TYPE_VALUE), option_value(0), option_point_list_size(0) { } public: // NOTE: f110330.3L, added interface to access easy iterating int GetPointArrayInfo(const OptionPointInfo** begin_it) const; // ¿É¼Ç Æ÷ÀÎÆ® Á¤º¸¸¦ ¾ò´Â´Ù. OptionPointInfo* GetPointInfoByMutable(const OptionPointInfo::ListSizeType index); // ¿É¼Ç Æ÷ÀÎÆ® Á¤º¸¸¦ ¾ò´Â´Ù. const OptionPointInfo* GetPointInfo(const OptionPointInfo::ListSizeType index) const; // Æ÷ÀÎÆ® ¹æ½Ä ÀÌÀü ¹öÀüÀ» À§ÇØ ÁÖ ¿É¼Ç°ªÀ» ¼³Á¤ÇÑ´Ù. bool SetMainOption(); public: SOCKETINDEX index; eSOCKET_LEVEL zard_grade; // Àðµåµî±Þ CODETYPE name_code; // ¿É¼Ç À̸§ ÄÚµå (Æ÷ÀÎÆ® ¹æ½Ä ÀÌÀü Áö¿ø/ÀÌÈÄ ¹öÀü¿¡¼± »èÁ¦ ¿¹Á¤) ItemOptionKind item_option_kind; // ¾ÆÀÌÅÛ ±âÁØ ¿É¼Ç ÄÚµå (Æ÷ÀÎÆ® ¹æ½Ä ÀÌÀü Áö¿ø/ÀÌÈÄ ¹öÀü¿¡¼± ÁÖ ¿É¼Ç°ª) eATTR_TYPE attr_option_kind; // ¼Ó¼º ±âÁØ ¿É¼Ç ÄÚµå (Æ÷ÀÎÆ® ¹æ½Ä ÀÌÀü ¹öÀü Áö¿ø/ÀÌÈÄ ¹öÀü¿¡¼± ÁÖ ¿É¼Ç°ª) CODETYPE item_code; // Àðµå ¾ÆÀÌÅÛ ÄÚµå CODETYPE option_image; // Àðµå ¾ÆÀÌÄÜ À̹ÌÁö eVALUE_TYPE option_type; // ¿É¼Ç°ª ÀÔ·Â Çü½Ä (Æ÷ÀÎÆ® ¹æ½Ä ÀÌÀü ¹öÀü Áö¿ø/ÀÌÈÄ ¹öÀü¿¡¼± ÁÖ ¿É¼Ç°ª) OptionValue option_value; // ¿É¼Ç°ª (Æ÷ÀÎÆ® ¹æ½Ä ÀÌÀü ¹öÀü Áö¿ø/ÀÌÈÄ ¹öÀü¿¡¼± ÁÖ ¿É¼Ç°ª) OptionPointInfo::ListSizeType option_point_list_size; // ¿É¼Ç Æ÷ÀÎÆ® ¸ñ·Ï Å©±â private: OptionPointInfo option_point_list_[OptionPointInfo::kMaxListSize]; // ¿É¼Ç Æ÷ÀÎÆ® ¸ñ·Ï __DISABLE_COPY(sSOCKET_OPTION); }; // sSOCKET_OPTION // NOTE: f110330.3L, added interface to access easy iterating inline int sSOCKET_OPTION::GetPointArrayInfo(const OptionPointInfo** begin_it) const { *begin_it = option_point_list_; return option_point_list_size; } // ¿É¼Ç Æ÷ÀÎÆ® Á¤º¸¸¦ ¾ò´Â´Ù. inline sSOCKET_OPTION::OptionPointInfo* sSOCKET_OPTION::GetPointInfoByMutable(const OptionPointInfo::ListSizeType index) { if (index < 0 || index >= _countof(option_point_list_)) { return NULL; } return &(option_point_list_[index]); } // ¿É¼Ç Æ÷ÀÎÆ® Á¤º¸¸¦ ¾ò´Â´Ù. inline const sSOCKET_OPTION::OptionPointInfo* sSOCKET_OPTION::GetPointInfo(const OptionPointInfo::ListSizeType index) const { if (index < 0 || index >= option_point_list_size) { // Àбâ Àü¿ëÀ¸·Î Á¢±ÙÇϱ⠶§¹®¿¡ À¯È¿ÇÑ µ¥ÀÌÅͰ¡ µé¾îÀÖ´Â ¹üÀ§±îÁö¸¸ Çã¿ëÇÑ´Ù. return NULL; } return &(option_point_list_[index]); } //================================================================================================== // ¼ÒÄÏ ¿É¼Ç ÆÄ¼­ class SocketOptionParser : public util::Singleton, public IParser { //////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Define //////////////////////////////////////////////////////////////////////////////////////////////// public: enum { kInvalidSocketOptionIndex = 0 }; enum { kEmptySocketOptionIndex = 0 }; typedef WORD ZardOptionRatioKey; // µî±Þ + ¿É¼ÇÄÚµå typedef int ZardGrade; typedef int ZardOptionKind; typedef STLX_HASH_MAP SocketOptionMap; private: // ZardOptionRatioMap typedef RatioSelector ZardOptionRatio; typedef STLX_HASH_MAP ZardOptionRatioMap; typedef STLX_HASH_MAP ZardItemRatioMap; // ZardOptionMap typedef STLX_HASH_MAP ZardOptionMap; //////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Constructor & Destructor //////////////////////////////////////////////////////////////////////////////////////////////// public: SocketOptionParser(); ~SocketOptionParser(); //////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Public //////////////////////////////////////////////////////////////////////////////////////////////// public: virtual void Release(); virtual BOOL LoadScript(eSCRIPT_CODE script_code, BOOL is_reload); public: // ¼ÒÄÏ ¿É¼ÇÀ» ã´Â´Ù. const sSOCKET_OPTION* const FindSocketOption(const SOCKETINDEX socket_option_index) const; // ¼ÒÄÏ ¿É¼Ç¸ÊÀ» ¾ò´Â´Ù. const SocketOptionMap& GetSocketOptionMap() const { return socket_option_map_; } // µî±Þ¿¡ ÇØ´çÇÏ´Â Àðµå°¡ °¡Áú ¼ö ÀÖ´Â ¿É¼Ç Áß Çϳª¸¦ ¾ò´Â´Ù. SOCKETINDEX GetRandomZardOptionByGrade( const ZardGrade zard_grade, const ZardOptionKind zard_item_option_kind) const; // Àðµå°¡ °¡Áú ¼ö ÀÖ´Â ¿É¼Ç Áß Çϳª¸¦ ¾ò´Â´Ù. SOCKETINDEX GetRandomZardOption(const CODETYPE item_code) const; // Àðµå°¡ °¡Áú ¼ö ÀÖ´Â ¿É¼ÇÀÌ ¿ÀÁ÷ ÇϳªÀÏ °æ¿ì ¾òÀ» ¼ö ÀÖ´Â ¿É¼ÇÀ» ¾ò´Â´Ù. SOCKETINDEX GetFixedZardOption(const CODETYPE item_code) const; // Àðµå ¿É¼ÇÀ» ã´Â´Ù. ZardOptionInfo* FindZardOption(const ZardOptionInfo::ItemOptionCode item_option_code) const; //////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Private //////////////////////////////////////////////////////////////////////////////////////////////// private: bool LoadSocketOption(const bool is_reload); void ReleaseSocketOption(); ZardOptionRatio* FindZardOptionRatio( const ZardGrade zard_grade, const ZardOptionKind zard_item_option_kind) const; bool LoadZardOption(const bool is_reload); void ReleaseZardOption(); bool LoadZardPoint(const int row, sSOCKET_OPTION* OUT socket_option); private: SocketOptionMap socket_option_map_; ZardOptionRatioMap zard_option_ratio_map_; ZardItemRatioMap zard_item_ratio_map_; ZardOptionMap zard_option_map_; __DISABLE_COPY(SocketOptionParser); }; //================================================================================================== #else // _NA_0_20100727_SOCKET_SYSTEM_PARSER //================================================================================================== #define MAX_ATTRIBUTENAME_LENGTH (16) struct sSOCKET_OPTION { INT m_AttrIndex; // Ű CODETYPE m_SocketItemCode; char m_pszAttrName[MAX_ATTRIBUTENAME_LENGTH]; CODETYPE m_NCode; eVALUE_TYPE m_NumericType; INT m_iValue[SOCKETLV_MAX]; }; struct sSOCKETITEM_OPTION { CODETYPE m_SocketItemCode; //< Ű INT m_AttrIndex; char m_pszAttrName[MAX_ATTRIBUTENAME_LENGTH]; CODETYPE m_NCode; eSOCKET_LEVEL m_SocketLevel; eVALUE_TYPE m_NumericType; BYTE m_byValue; }; class SocketOptionParser : public util::Singleton, public IParser { typedef STLX_HASH_MAP SOCKET_OPTION_INFO; public: SocketOptionParser(void); virtual ~SocketOptionParser(void); VOID Init( char * pszPackFileName ); VOID Release(){} VOID Unload(); VOID Reload(); inline const sSOCKETITEM_OPTION * GetSocketItemOption( CODETYPE SocketItemCode ) { return m_SocketOptionParamHash.GetData(SocketItemCode); } inline const sSOCKET_OPTION * GetSocketOption( DWORD OptionIndex ); BOOL LoadScript(eSCRIPT_CODE ScriptCode, BOOL bReload); BOOL LoadSocketOption(BOOL bReload); private: WORD ValidCheck(sSOCKETITEM_OPTION *pInfo); private: util::SolarHashTable m_SocketOptionParamHash; sSOCKET_OPTION m_SocketOption[MAX_ITEM_OPTION_KIND_NUM]; char m_pszFileName[MAX_PATH]; }; inline const sSOCKET_OPTION * SocketOptionParser::GetSocketOption( DWORD OptionIndex ) { if( OptionIndex > MAX_ITEM_OPTION_KIND_NUM ) return NULL; return &m_SocketOption[OptionIndex]; } #endif //_NA_0_20100727_SOCKET_SYSTEM_PARSER