#ifndef _SOLAR_SLOT_SCRANKINFO_H #define _SOLAR_SLOT_SCRANKINFO_H #pragma once //================================================================================================== /// ¾ÆÀÌÅÛ ·©Å© ¿É¼Ç Á¤º¸ Ŭ·¡½º /** @author Kim Min Wook < taiyo@webzen.co.kr > @since 2006. 1. 9 @remark - ¾ÆÀÌÅÛ ¿É¼Ç¿¡¼­ ·©Å©ºÎºÐÀ» µû·Î ¶¼¾î³»¼­ Ŭ·¡½ºÈ­ ½ÃÅ´ - ¹ÙÀ̳ʸ® ·©Å© ¿É¼Ç ºÎºÐÀ» DecodeÇÑ Á¤º¸¸¦ ³ªÅ¸³¿ - SCItemSlotÀÇ ¸É¹ö·Î »ç¿ëµÊ - ¾ÆÀÌÅÛÂÊÀº eATTR_TYPEÀÇ ÃÖ´ë°ªÀÌ Å©±â¶§¹®¿¡ Á÷Á¢ ½ºÅ©¸³Æ®¿¡¼­ »ç¿ëÇÏÁö ¾Ê°í, µû·Î AttrIndex·Î eATTR_TYPE¿¡ ´ëÀÀÇÏ¿© °ªÀ» °¡Á®¿À´Â ¹æ½ÄÀ» ÃëÇÑ´Ù. (sRANK_ATTR_VALUEÀÇ ¸É¹ö m_AttrIndex -> m_AttrTypeÀ¸·Î ÄÁ¹öÆÃÀ» ÇÑ´Ù. Decode()½Ã) @note - sRANK_ATTR_VALUEÀÇ ¹è¿­ RANK_E°ªÀº »ç¿ëµÇÁö ¾ÊÀ½ @history - 09.09.06 | waverix | code rearrangement @usage - ex) 1. RANK_E ¾ÆÀÌÅÛÀ» RANK_D·Î ·©Å©¾÷ ÇßÀ» ¶§ SetRankAttr(RANK_D, eATTR_TYPE, 3); 2. RANK_D ¾ÆÀÌÅÛÀ» RANK_C·Î ·©Å©¾÷ ÇßÀ» ¶§ SetRankAttr(RANK_C, eATTR_TYPE, 2); */ //================================================================================================== #include "ItemOptionHeader.h" #include #include "SCSlotStruct.h" class BitStream; //================================================================================================== // class SCRankInfo { // ½ÇÁ¦ Slot¿¡¼­ »ç¿ëÇÏ´Â Á¤º¸ // ÇöÀç ¾ÆÀÌÅÛÀÌ °¡Áø ¿É¼Ç Á¤º¸ÀÇ ´©Àû°ª struct AttrValues { eRANK rank_; int attr_index_; eATTR_TYPE attr_type_; int attr_value_; const sRANK_OPTION* rank_option_; }; // for editable object void Clear(); //void Encode(BitStream& IN bitstream) const; //void Decode(const WORD item_type, BitStream& OUT bitstream); //void Encode(OPTIONPART_VER5* OUT dest) const; //void Decode(const WORD item_type, const OPTIONPART_VER5* IN src); private: void SetInfo(const nsSlot::SerializeItemOption::sEquip& src, const BASE_ITEMINFO* item_info); void SetInfo(const nsSlot::SerializeItemOption::sEquipTime& src, const BASE_ITEMINFO* item_info); void SetInfo(const nsSlot::SerializeItemOption::sEquipEtc& src, const BASE_ITEMINFO* item_info); void SetInfo(const nsSlot::SerializeItemOption::sEquipEtcTime& src, const BASE_ITEMINFO* item_info); //void SetInfo(const nsSlot::SerializeItemOption::sLimited& src, const BASE_ITEMINFO* item_info); //void SetInfo(const nsSlot::SerializeItemOption::sFate& src, const BASE_ITEMINFO* item_info); void GetInfo(nsSlot::SerializeItemOption::sEquip* dest); void GetInfo(nsSlot::SerializeItemOption::sEquipTime* dest); void GetInfo(nsSlot::SerializeItemOption::sEquipEtc* dest); void GetInfo(nsSlot::SerializeItemOption::sEquipEtcTime* dest); void GetInfo(nsSlot::SerializeItemOption::sLimited* dest); //void GetInfo(nsSlot::SerializeItemOption::sFate* dest); // (ADD-IN) ÁÖ¾îÁø ·©Å©°¡ Á¤»óÀÌ ¾Æ´Ñ °æ¿ì¶ó¸é, empty value·Î ä¿öÁø RANK_E { 0, }À» ¹ÝȯÇÑ´Ù. const AttrValues& GetRankAttrBlock(eRANK rank) const; static BOOLEAN IsAcceptableRank(int rank); // (NOTE) RankUp½Ã ±âÁ¸ ·ÎÁ÷ : SetRank(cur_rank + 1); SetRankAttr(cur_rank + 1, rank_option) // RankDown½Ã : DelRankAttr(cur_rank); // - »ó±â ·ÎÁ÷´ë·ÎÀÏ °æ¿ì´Â ¿ÜºÎ¿¡¼­ »ç¿ëÇÒ ¶§, Á¹~¶ó ÁÖÀÇÇØ¾ß ÇÑ´Ù. stackÇüÅ·Πó¸®ÇÏ´Â°Ô ´õ // ³ªÀ» °Å¶ó »ý°¢µÇÁö¸¸... Áß°£ÀÇ ·©Å© Á¤º¸¸¦ ¹Ù²Ü ¼öµµ ÀÖ´Â »ç·Ê´Â ÃæºÐÈ÷ ÀÖ´Ù. SCItemSlotÀÇ // Rank°ü·Ã ÇÔ¼öÀÇ ¼öÁ¤À» °í·ÁÇÏÀÚ. // (PROPOSAL) // UpdateRank : setup random access rank [E, MAX) boundary // RankUp : current rank + 1 // RankDown : current rank - 1 void SetRankAttr(eRANK rank, const sRANK_OPTION* rank_option); void DelRankAttr(eRANK rank); //const sRANK_OPTION* GetRankAttrDesc(eRANK rank) const { return m_RankAttribute[rank].m_pRankOption; } //static eRANK_OPTION_ITEM_TYPE GetRankOptionItemType(DWORD ItemInfoType); void _SetInfo(ulong rank, const ulong attr_index[RANK_MAX], const BASE_ITEMINFO* item_info); void _GetInfo(ulong* rank, ulong attr_index[RANK_MAX]); static void _SetRankAttr(SCRankInfo::AttrValues* OUT dest, eRANK rank, const sRANK_OPTION* rank_option); //---------------------------------------------------------------------------------------------- static const DWORD NumberOfBits_Rank = 4; static const DWORD NumberOfBits_RankAttrIndex = 7; // (WAVERIX) (CRITICAL NOTE) bitstreamÀ¸·Î »ç¿ëÇÏ´Â ºñÆ® ¼ö´Â 9ÀÌ´Ù. // OPTIONPART::RankOptions : 7·Î Á¤ÀǵǾî ÀÖÀ½. //---------------------------------------------------------------------------------------------- BYTE current_rank_; AttrValues rank_attributes_[RANK_MAX]; friend class SCItemSlot; }; //-------------------------------------------------------------------------------------------------- inline void SCRankInfo::Clear() { BOOST_STATIC_ASSERT(RANK_E == 0); // current_rank_, rank_... default RANK_E(grade: no rank) ZeroMemory(this, sizeof(*this)); } // (ADD-IN) ÁÖ¾îÁø ·©Å©°¡ Á¤»óÀÌ ¾Æ´Ñ °æ¿ì¶ó¸é, empty value·Î ä¿öÁø RANK_E { 0, }À» ¹ÝȯÇÑ´Ù. inline const SCRankInfo::AttrValues& SCRankInfo::GetRankAttrBlock(eRANK rank) const { //[RANK_E, RANK_MAX) if(FlowControl::FCAssert(RANK_E <= rank && rank <= (eRANK)current_rank_)) { return rank_attributes_[rank]; } return rank_attributes_[RANK_E]; } inline BOOLEAN SCRankInfo::IsAcceptableRank(int rank) { // Acceptalbe list // { RANK_D, RANK_C, RANK_B, RANK_MA, RANK_A, RANK_PA, RANK_MS, RANK_S, RANK_PS, } return RANK_D <= rank && rank < RANK_MAX; } inline void SCRankInfo::SetInfo(const nsSlot::SerializeItemOption::sEquip& src, const BASE_ITEMINFO* item_info) { _SetInfo(src.Rank, src.RankOption, item_info); } inline void SCRankInfo::SetInfo(const nsSlot::SerializeItemOption::sEquipTime& src, const BASE_ITEMINFO* item_info) { _SetInfo(src.Rank, src.RankOption, item_info); } inline void SCRankInfo::SetInfo(const nsSlot::SerializeItemOption::sEquipEtc& src, const BASE_ITEMINFO* item_info) { _SetInfo(src.Rank, src.RankOption, item_info); } inline void SCRankInfo::SetInfo(const nsSlot::SerializeItemOption::sEquipEtcTime& src, const BASE_ITEMINFO* item_info) { _SetInfo(src.Rank, src.RankOption, item_info); } //inline void //SCRankInfo::SetInfo(const nsSlot::SerializeItemOption::sLimited& src, const BASE_ITEMINFO* item_info) { // _SetInfo(src.Rank, src.RankOption, item_info); //} // //inline void //SCRankInfo::SetInfo(const nsSlot::SerializeItemOption::sFate& src, const BASE_ITEMINFO* item_info) { // _SetInfo(src.Rank, src.RankOption, item_info); //} inline void SCRankInfo::GetInfo(nsSlot::SerializeItemOption::sEquip* dest) { _GetInfo(&dest->Rank, dest->RankOption); } inline void SCRankInfo::GetInfo(nsSlot::SerializeItemOption::sEquipTime* dest) { _GetInfo(&dest->Rank, dest->RankOption); } inline void SCRankInfo::GetInfo(nsSlot::SerializeItemOption::sEquipEtc* dest) { _GetInfo(&dest->Rank, dest->RankOption); } inline void SCRankInfo::GetInfo(nsSlot::SerializeItemOption::sEquipEtcTime* dest) { _GetInfo(&dest->Rank, dest->RankOption); } //inline void //SCRankInfo::GetInfo(nsSlot::SerializeItemOption::sLimited* dest) { // _GetInfo(&dest->Rank, dest->RankOption); //} // //inline void //SCRankInfo::GetInfo(nsSlot::SerializeItemOption::sFate* dest) { // _GetInfo(&dest->Rank, dest->RankOption); //} //================================================================================================== //================================================================================================== //================================================================================================== #endif //_SOLAR_SLOT_SCRANKINFO_H