//////////////////////////////////////////////////////////////////////////////////////////////////// /// /// @file CubeSystemParser.cpp /// @author hukim /// @brief [2010/08/24 by hukim] This is created.\n /// //////////////////////////////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "./CubeSystemParser.h" // header #include "PacketStruct_CG.h" #include "SCItemSlot.h" #include "SCItemSlotContainer.h" #include "ItemTypeList.h" #include "ItemInfoParser.h" #ifdef _NA_002253_20100811_CUBE_SYSTEM //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Constructor & Destructor //////////////////////////////////////////////////////////////////////////////////////////////////// CubeSystemParser::CubeSystemParser() { } CubeSystemParser::~CubeSystemParser() { } //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Implement //////////////////////////////////////////////////////////////////////////////////////////////////// namespace util { namespace internal { // ÀÔ·Â Àç·á ¸ñ·ÏÀ» Á¤·ÄÇÑ´Ù. static bool PredicateInputMaterial( const CompositionInfo::MaterialInfo& prev_material, const CompositionInfo::MaterialInfo& next_material) { // ÄÚµå ¼øÀ¸·Î Á¤·ÄÇÑ´Ù. if (prev_material.code_ != next_material.code_) { return prev_material.code_ < next_material.code_; } // ŸÀÔ ¼øÀ¸·Î Á¤·ÄÇÑ´Ù. if (prev_material.type_code_ != next_material.type_code_) { return prev_material.type_code_ < next_material.type_code_; } // ·¹º§ ¼øÀ¸·Î Á¤·ÄÇÑ´Ù. if (prev_material.level_ != next_material.level_) { return prev_material.level_ < next_material.level_; } // °³¼ö ¼øÀ¸·Î Á¤·ÄÇÑ´Ù. return prev_material.number_ < next_material.number_; } // À¯È¿ÇÏÁö ¾ÊÀº Àκ¥Å丮 À§Ä¡Àΰ¡? static bool IsValidInventoryPosition(const SCItemSlotContainer& inventory, const POSTYPE inventory_position) { return (inventory_position >= 0 && inventory_position < inventory.GetMaxSlotNum()); } // À¯È¿ÇÏÁö ¾ÊÀº Àκ¥Å丮 ¾ÆÀÌÅÛÀΰ¡? static bool IsValidInventoryItemState(const SCItemSlot& inventory_item) { #ifdef _SERVER return (!inventory_item.IsLocked() && !inventory_item.IsBlocked() && !inventory_item.IsUserBlocked() && inventory_item.IsContainValidItem()); #else return (!inventory_item.IsBlocked() && !inventory_item.IsUserBlocked() && inventory_item.IsContainValidItem()); #endif // _SERVER } // ÀÔ·Â Àç·á ¸ñ·ÏÀ» ¾ò´Â´Ù. static bool GetInputMaterialList( SCItemSlotContainer& inventory, const MaterialInventoryPositionList& inventory_position_list, CompositionInfo::MaterialList& OUT input_material_list) { CompositionInfo::MaterialList::size_type material_index = 0; FOREACH_CONTAINER( const POSTYPE inventory_position, inventory_position_list, MaterialInventoryPositionList) { if (!IsValidInventoryPosition(inventory, inventory_position)) { continue; } SCItemSlot& inventory_item = static_cast(inventory.GetSlot(inventory_position)); if (!IsValidInventoryItemState(inventory_item)) { continue; } CompositionInfo::MaterialInfo& input_material = input_material_list[material_index]; input_material.is_used_ = false; input_material.code_ = inventory_item.GetItemCode(); input_material.type_code_ = inventory_item.GetItemInfo()->m_wType; input_material.level_ = inventory_item.GetItemInfo()->m_LV; input_material.number_ = inventory_item.GetNum(); input_material.ig_type_ = nsSlot::ItemTypeChanger::GetKindOfItemType(inventory_item); input_material.inventory_position_ = inventory_position; ++material_index; } if (material_index == 0) { return false; } input_material_list.set_size(material_index); // ÀÔ·ÂÇÑ Àç·á¸¦ ÄÚµå/ŸÀÔ/·¹º§/°³¼ö ¼øÀ¸·Î Á¤·ÄÇÑ´Ù. std::stable_sort(input_material_list.begin(), input_material_list.end(), PredicateInputMaterial); return true; } // ÀÏÄ¡ÇÏ´Â ÇÕ¼ºÀ» Á¤·ÄÇÑ´Ù. static bool PredicateMatchedComposition( const MatchedCompositionInfo& prev_composition, const MatchedCompositionInfo& next_composition) { return (prev_composition.composition_->weight_) > (next_composition.composition_->weight_); } // ÀÏÄ¡ÇÏ´Â ÇÕ¼ºÀ» ¾ò´Â´Ù. static bool GetMatchedComposition( const CompositionInfo::MaterialList& input_material_list, const CompositionInfo& composition, MatchedCompositionInfo& OUT matched_composition) { // ÇÕ¼º Àç·á °³¼ö°¡ ÀÔ·Â Àç·á °³¼öº¸´Ù ¸¹´Ù¸é if ((composition.material_list_).size() > input_material_list.size()) { // ÀÏÄ¡ÇÒ ¼ö ¾ø´Ù. return false; } // ÀÏÄ¡ÇÏ´Â Àç·á ¸ñ·Ï Å©±â¸¦ ÃʱâÈ­Çϰí ÇÕ¼º Àç·á ¸ñ·Ï Å©±â·Î ¼³Á¤ÇÑ´Ù. MatchedCompositionInfo::MatchedMaterialList& matched_material_list = matched_composition.matched_material_list_; FOREACH_CONTAINER( MatchedCompositionInfo::MatchedMaterialInfo& matched_material, matched_material_list, MatchedCompositionInfo::MatchedMaterialList) { matched_material.Clear(); } matched_material_list.set_size((composition.material_list_).size()); // ÀÔ·Â Àç·á¿¡ ´ëÇØ CompositionInfo::MaterialList::const_iterator input_material_pos = input_material_list.begin(); while (input_material_pos != input_material_list.end()) { const CompositionInfo::MaterialInfo& input_material = *input_material_pos; MatchedCompositionInfo::MatchedMaterialList::iterator matched_material_pos = matched_material_list.begin(); // ÇÕ¼º Àç·á¿¡ ´ëÇØ FOREACH_CONTAINER( const CompositionInfo::MaterialInfo& composition_material, composition.material_list_, CompositionInfo::MaterialList) { MatchedCompositionInfo::MatchedMaterialInfo& matched_material = *matched_material_pos; ++matched_material_pos; // ÀÌ¹Ì ÀÏÄ¡ÇÏ´Â Àç·á¸¦ ã¾Ò´Ù¸é if (matched_material.is_find_) { // ´ÙÀ½ Àç·á¸¦ °Ë»çÇÑ´Ù. continue; } // Àç·á Äڵ尡 ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.code_ != CompositionInfo::kUnused) { if (composition_material.code_ != input_material.code_) { continue; } } // Àç·á Á¾·ù°¡ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.type_code_ != CompositionInfo::kUnused) { if (composition_material.type_code_ != input_material.type_code_) { continue; } } // Àç·á ·¹º§ÀÌ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.level_ != CompositionInfo::kUnused) { if (composition_material.level_ != input_material.level_) { continue; } } // Àç·á ¾ÆÀÌÅÛ Å¸ÀÔÀÌ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.ig_type_ != input_material.ig_type_) { continue; } matched_material.input_material_start_pos_ = &input_material; matched_material.is_mixed_input_material_ = false; // ´Ù¸¥ Á¶°ÇÀº ¸¸Á·Çϴµ¥ ÀÔ·Â Àç·á °³¼ö°¡ ºÎÁ·ÇÏ´Ù¸é if (composition_material.number_ > input_material.number_) { // Äڵ尡 °°Àº ÀÔ·Â Àç·áµéÀÇ °³¼ö¸¦ ÇÕÃļ­ ÇÕ¼º Àç·á °³¼ö¸¦ ¸¸Á·½Ãų ¼ö ÀÖ´ÂÁö °Ë»çÇÑ´Ù. int same_material_number = input_material.number_; CompositionInfo::MaterialList::const_iterator temp_input_material_pos = &input_material; while (++temp_input_material_pos != input_material_list.end()) { // ´ÙÀ½ ÀÔ·Â Àç·á°¡ ÇöÀç ÀÔ·Â Àç·á¿Í °°Àº ÄÚµåÀÎÁö °Ë»çÇÑ´Ù. const CompositionInfo::MaterialInfo& next_input_material = *temp_input_material_pos; if (next_input_material.code_ != input_material.code_) { break; } // ´ÙÀ½ ÀÔ·Â Àç·á°¡ °°Àº ÄÚµåÀÇ Àç·á¶ó¸é °³¼ö¸¦ ´õÇØ¼­ ´Ù½Ã °Ë»çÇÑ´Ù. same_material_number += next_input_material.number_; if (composition_material.number_ > same_material_number) { continue; } // ¿©±â±îÁö ¿Ô´Ù¸é °°Àº ÄÚµåÀÇ ÀÔ·Â Àç·á¸¦ ¸ð¾Æ¼­ ÇÕ¼º Àç·á Çϳª¸¦ ¸¸Á· ½ÃŲ´Ù. matched_material.input_material_end_pos_ = temp_input_material_pos + 1; matched_material.is_mixed_input_material_ = true; break; } // °°Àº ÄÚµåÀÇ Àç·á¸¦ ÇÕÃĵµ °³¼ö°¡ ºÎÁ·Çϸé if (!matched_material.is_mixed_input_material_) { // ´ÙÀ½ Àç·á¸¦ °Ë»çÇÑ´Ù. continue; } // °°Àº ÄÚµåÀÇ ÀÔ·Â Àç·á¸¦ ÇÕÃļ­ ÀÏÄ¡ÇÏ´Â Àç·á ã±â¿¡ ¼º°øÇß´Ù¸é // ÀÔ·Â Àç·áÀÇ ¹Ýº¹ÀÚ¸¦ ÇÕÄ£ ¹üÀ§ ¸¸Å­ Áõ°¡½ÃÄÑ ÁØ´Ù. input_material_pos = temp_input_material_pos; } // ÀÏÄ¡ÇÏ´Â Àç·á¸¦ ¹ß°ßÇßÀ½À» ¼³Á¤ÇÑ´Ù. matched_material.composition_material_ = &composition_material; matched_material.is_find_ = true; } // ÇÕ¼º Àç·á¿¡ ´ëÇØ ++input_material_pos; } // ÀÔ·Â Àç·á¿¡ ´ëÇØ // ¸ðµç ÀÏÄ¡ÇÏ´Â Àç·á¸¦ ã¾Ò´ÂÁö °Ë»çÇÑ´Ù. FOREACH_CONTAINER( const MatchedCompositionInfo::MatchedMaterialInfo& matched_material, matched_material_list, MatchedCompositionInfo::MatchedMaterialList) { if (!matched_material.is_find_) { return false; } } matched_composition.composition_ = &composition; return true; } // ÀÏÄ¡ÇÏ´Â ÇÕ¼º Á¤º¸·ÎºÎÅÍ ¿äûÀ» ¼³Á¤ÇÑ´Ù. static bool SetCompositionRequest( const MatchedCompositionList& matched_composition_list, MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN& OUT request) { if (matched_composition_list.size() == 0) { return false; } // ÀÏÄ¡ÇÑ ÇÕ¼º Áß Ã¹¹øÂ°¸¦ ¼±ÅÃÇÑ´Ù. const MatchedCompositionInfo& matched_composition = matched_composition_list[0]; const MatchedCompositionInfo::MatchedMaterialList& matched_material_list = matched_composition.matched_material_list_; // ÇÕ¼º Äڵ带 ¼³Á¤ÇÑ´Ù. request.reserved_code_ = (matched_composition.composition_)->code_; // ÀÏÄ¡ÇÑ ÇÕ¼ºÀ» ±âÁØÀ¸·Î ¿äûÀ» ¸¸µç´Ù. MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialListSize request_material_index = 0; FOREACH_CONTAINER( const MatchedCompositionInfo::MatchedMaterialInfo& matched_material, matched_material_list, MatchedCompositionInfo::MatchedMaterialList) { // °°Àº ÄÚµåÀÇ ÀÔ·Â Àç·á¸¦ ÇÕÃļ­ ÇÕ¼º Àç·á¸¦ ¸¸Á· ½ÃÄ×´Ù¸é if (matched_material.is_mixed_input_material_) { int same_material_number = 0; // ÇÕÄ£ ÀÔ·Â Àç·á¿¡ ´ëÇØ CompositionInfo::MaterialList::const_iterator input_material_pos = matched_material.input_material_start_pos_; for (; input_material_pos != matched_material.input_material_end_pos_; ++input_material_pos) { const CompositionInfo::MaterialInfo& input_material = *input_material_pos; MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialInfo& request_material = (request.material_list_)[request_material_index]; { request_material.inventory_position_ = input_material.inventory_position_; request_material.matched_index_ = (matched_material.composition_material_)->column_number_ - 1; // ¸¶Áö¸· ÀÔ·Â Àç·á¶ó¸é if (input_material_pos == (matched_material.input_material_end_pos_ - 1)) { // ÇÕ¼º Àç·á¿¡ ÇÊ¿äÇÑ °³¼ö¸¸Å­¸¸ ¿äû °³¼ö·Î ¼³Á¤ÇÑ´Ù. request_material.selected_number_ = static_cast((matched_material.composition_material_)->number_ - same_material_number); } else { request_material.selected_number_ = input_material.number_; same_material_number += request_material.selected_number_; } } ++request_material_index; } continue; } // ÀÔ·Â Àç·á¿Í ÇÕ¼º Àç·á°¡ 1:1·Î ÀÏÄ¡ÇÑ´Ù. MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialInfo& request_material = (request.material_list_)[request_material_index]; { request_material.inventory_position_ = (matched_material.input_material_start_pos_)->inventory_position_; request_material.selected_number_ = (matched_material.composition_material_)->number_; request_material.matched_index_ = (matched_material.composition_material_)->column_number_ - 1; } ++request_material_index; } request.material_list_size_ = request_material_index; return true; } // º¸»óÀÇ ¾ÆÀÌÅÛÄڵ尡 °°ÀºÁö °Ë»çÇÑ´Ù. static bool IsSameItemCode( const CompositionInfo::RewardInfo& reward, CompositionInfo::RewardInfo::RewardCode reward_code) { if (reward.type_ == CompositionInfo::RewardInfo::kItemCode) { return reward.code_ == reward_code; } return false; } // ÇÕ¼º ¿äûÀ» ¾ò´Â´Ù. static bool GetCompositionRequest( const CompositionMap& composition_map, SCItemSlotContainer& inventory, const MaterialInventoryPositionList& inventory_position_list, MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN& OUT request) { // Àκ¥Å丮 ¾ÆÀÌÅÛÀ¸·ÎºÎÅÍ ÇÕ¼ºÁ¤º¸¸¦ Ž»öÇÒ Àç·á ¸ñ·ÏÀ» »ý¼ºÇÑ´Ù. CompositionInfo::MaterialList input_material_list; if (!GetInputMaterialList(inventory, inventory_position_list, input_material_list)) { return false; } // ÀÔ·Â Àç·á¿¡ ÀÏÄ¡ÇÏ´Â ÇÕ¼º ¸ñ·ÏÀ» ¾ò´Â´Ù. MatchedCompositionList matched_composition_list; { // ÇÕ¼º ¸ñ·ÏÀÇ ÇÕ¼º¿¡ ´ëÇØ MatchedCompositionList::size_type matched_composition_index = 0; FOREACH_CONTAINER( const CompositionMap::value_type& composition_value, composition_map, CompositionMap) { // ÀÏÄ¡ÇÏ´Â ÇÕ¼º ¸ñ·ÏÀÌ ´Ù á´Ù¸é if (matched_composition_index >= _countof(matched_composition_list.elems) || matched_composition_list.full()) { // ã±â¸¦ ÁßÁöÇÑ´Ù. break; } // ÀÏÄ¡ÇÏ´Â ÇÕ¼ºÀ» ã´Â´Ù. const CompositionInfo& composition = *(composition_value.second); MatchedCompositionInfo& matched_composition = matched_composition_list[matched_composition_index]; if (!GetMatchedComposition(input_material_list, composition, matched_composition)) { continue; } ++matched_composition_index; matched_composition_list.set_size(matched_composition_index); } // ÀÏÄ¡ÇÏ´Â ÇÕ¼ºÀ» ã¾Ò´ÂÁö °Ë»çÇÑ´Ù. if (matched_composition_index == 0) { return false; } } // ÇÕ¼º ¸ñ·ÏÀ» Á¶°ÇÀÌ ´õ ±¸Ã¼ÀûÀÎ ¼øÀ¸·Î Á¤·ÄÇÑ´Ù. std::stable_sort( matched_composition_list.begin(), matched_composition_list.end(), PredicateMatchedComposition); return SetCompositionRequest(matched_composition_list, request); } } // internal } // util //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Public //////////////////////////////////////////////////////////////////////////////////////////////////// void CubeSystemParser::Release() { ReleaseComposition(); } BOOL CubeSystemParser::LoadScript(eSCRIPT_CODE script_code, BOOL is_reload) { if (script_code == SCRIPT_CUBE_COMPOSE) { return (LoadComposition(!!is_reload) ? TRUE : FALSE); } else if (script_code == SCRIPT_CUBE_DECOMPOSE) { return (LoadDecomposition(!!is_reload) ? TRUE : FALSE); } return FALSE; } CompositionInfo* CubeSystemParser::FindComposition(const CompositionInfo::CompositionCode code) const { const CompositionMap::const_iterator& pos = composition_map_.find(code); if (pos != composition_map_.end()) { return pos->second; } return NULL; } // ºÐÇØ Àç·á ¸ñ·ÏÀ» ¾ò´Â´Ù. bool CubeSystemParser::GetDecompositionMaterialList( SCItemSlotContainer& inventory, const MaterialInventoryPositionList& inventory_position_list, DecompositionInfo::MaterialList& OUT material_list) const { DecompositionInfo::MaterialList::size_type material_index = 0; FOREACH_CONTAINER( const POSTYPE inventory_position, inventory_position_list, MaterialInventoryPositionList) { using namespace util::internal; // Àκ¥Å丮 À§Ä¡¸¦ °Ë»çÇÑ´Ù. if (IsValidInventoryPosition(inventory, inventory_position) == false) { continue; } // Àκ¥Å丮 ¾ÆÀÌÅÛ »óŸ¦ °Ë»çÇÑ´Ù. SCItemSlot& inventory_item = static_cast(inventory.GetSlot(inventory_position)); if (IsValidInventoryItemState(inventory_item) == false) { continue; } // ¹«±â³ª ¹æ¾î±¸ÀÎÁö °Ë»çÇÑ´Ù. const BASE_ITEMINFO* const inventory_item_info = inventory_item.GetItemInfo(); if ((inventory_item_info->IsWeapon() == false) && (inventory_item_info->IsArmor() == false)) { continue; } // ij½Ã ¾ÆÀÌÅÛÀº ºÐÇØ ¸ñ·Ï¿¡¼­ Á¦¿Ü ½ÃŲ´Ù. if (inventory_item_info->IsChargeItem() == true) { continue; } DecompositionInfo::MaterialInfo& material = material_list[material_index]; material.enchant_ = inventory_item.GetEnchant(); material.socket_number_ = inventory_item.GetSocketNum(); material.item_level_ = inventory_item.GetItemInfo()->m_LV; material.number_ = inventory_item.GetNum(); material.inventory_position_ = inventory_position; // ¼ÒÄÏ °³¼ö¸¦ °Ë»çÇÑ´Ù. if (material.socket_number_ > SOCKET_MAX) { continue; } BOOST_STATIC_ASSERT(DecompositionInfo::ZardInfo::kMaxSize >= 4); (material.zard_list_[0]).grade_ = DecompositionInfo::ZardInfo::kGradeLv1; (material.zard_list_[1]).grade_ = DecompositionInfo::ZardInfo::kGradeLv2; (material.zard_list_[2]).grade_ = DecompositionInfo::ZardInfo::kGradeLv3; (material.zard_list_[3]).grade_ = DecompositionInfo::ZardInfo::kGradeLv4; material.zard_list_.set_size(DecompositionInfo::ZardInfo::kMaxSize); for (DecompositionInfo::MaterialInfo::SocketNumber socket_index = 0; socket_index < material.socket_number_; ++socket_index) { // _NA_000251_20100727_SOCKET_SYSTEM const sSOCKET_OPTION* socket_option = inventory_item.GetSocketOption(static_cast(socket_index)); if (socket_option != NULL) { const eSOCKET_LEVEL zard_grade = socket_option->zard_grade; switch (zard_grade) { case kZardGrade1: (material.zard_list_[0]).number_++; break; case kZardGrade2: (material.zard_list_[1]).number_++; break; case kZardGrade3: (material.zard_list_[2]).number_++; break; case kZardGrade4: (material.zard_list_[3]).number_++; break; } } } ++material_index; } if (material_index == 0) { return false; } material_list.set_size(material_index); return true; } DecompositionInfo::DecompositionPoint CubeSystemParser::GetDecompositionPoint( const DecompositionInfo::MaterialList& material_list) const { const BYTE kEnchantPerPoint = 4; // ÀÎþƮ 1´ç Æ÷ÀÎÆ® const BYTE kSocketNumberPerPoint = 2; // ¼ÒÄÏ 1°³´ç Æ÷ÀÎÆ® const BYTE kItemLevelPerPoint = 2; // ¾ÆÀÌÅÛ ·¹º§ 1´ç Æ÷ÀÎÆ® const BYTE kGradeLv1ZardPerPoint = 1; // ÇÏ±Þ Àðµå 1´ç Æ÷ÀÎÆ® const BYTE kGradeLv2ZardPerPoint = 3; // Áß±Þ Àðµå 1´ç Æ÷ÀÎÆ® const BYTE kGradeLv3ZardPerPoint = 4; // »ó±Þ Àðµå 1´ç Æ÷ÀÎÆ® const BYTE kGradeLv4ZardPerPoint = 10; // ÃÖ»ó±Þ Àðµå 1´ç Æ÷ÀÎÆ® DecompositionInfo::DecompositionPoint decomposition_point = 0; // Àç·á ¸ñ·ÏÀÇ Àç·á¿¡ ´ëÇØ FOREACH_CONTAINER( const DecompositionInfo::MaterialInfo& material, material_list, DecompositionInfo::MaterialList) { // ÀÎþƮ Æ÷ÀÎÆ®¸¦ °è»êÇÑ´Ù. const DecompositionInfo::DecompositionPoint enchant_point = material.enchant_ * kEnchantPerPoint; // ¼ÒÄÏ Æ÷ÀÎÆ®¸¦ °è»êÇÑ´Ù. const DecompositionInfo::DecompositionPoint socket_point = material.socket_number_ * kSocketNumberPerPoint; // ¾ÆÀÌÅÛ ·¹º§ Æ÷ÀÎÆ®¸¦ °è»êÇÑ´Ù. const DecompositionInfo::DecompositionPoint item_level_point = material.item_level_ * kItemLevelPerPoint; // Àðµå Æ÷ÀÎÆ®¸¦ °è»êÇÑ´Ù. DecompositionInfo::DecompositionPoint zard_point = 0; FOREACH_CONTAINER( const DecompositionInfo::ZardInfo& zard, material.zard_list_, DecompositionInfo::ZardList) { if (zard.number_ < 1) { continue; } switch (zard.grade_) { case DecompositionInfo::ZardInfo::kGradeLv1: zard_point += (zard.number_ * kGradeLv1ZardPerPoint); break; case DecompositionInfo::ZardInfo::kGradeLv2: zard_point += (zard.number_ * kGradeLv2ZardPerPoint); break; case DecompositionInfo::ZardInfo::kGradeLv3: zard_point += (zard.number_ * kGradeLv3ZardPerPoint); break; case DecompositionInfo::ZardInfo::kGradeLv4: zard_point += (zard.number_ * kGradeLv4ZardPerPoint); break; } } // ºÐÇØ Æ÷ÀÎÆ®¸¦ °è»êÇÑ´Ù. decomposition_point += ((enchant_point + socket_point + zard_point + 1) * item_level_point); } return decomposition_point; } bool CubeSystemParser::GetDecompositionRewardList( const DecompositionInfo::DecompositionPoint decomposition_point, DecompositionInfo::RewardList& OUT reward_list) const { // ÀԷ°ªÀ» °Ë»çÇÑ´Ù. if (decomposition_point == 0 || !reward_list.empty()) { return false; } FOREACH_CONTAINER( const DecompositionInfo::RewardInfo& reward, decomposition_reward_list_, DecompositionInfo::RewardList) { // ¹ÝȯÇÒ º¸»ó Á¤º¸¸¦ »ðÀÎÇÑ ÈÄ reward_list.push_back(reward); // º¸»ó È®·üÀ» °è»êÇÑ´Ù. DecompositionInfo::RewardInfo& new_reward = reward_list.back(); new_reward.ratio_ = reward.ratio_ * decomposition_point; } return true; } bool CubeSystemParser::GetRequest( SCItemSlotContainer& inventory, const bool is_composition, const MaterialInventoryPositionList& inventory_position_list, const POSTYPE using_item_position, MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN& OUT request) const { // Àκ¥Å丮¿¡ ¿©À¯ °ø°£ÀÌ ¾øÀ¸¸é ½ÃµµÇÒ Çʿ䰡 ¾ø´Ù. if (inventory.GetEmptySlotNum() == 0) { return false; } request.request_type_ = MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::kCubeRequest; request.is_composition_ = is_composition; // Å¥ºê ½Ã½ºÅÛÀº ¾ÆÀÌÅÛÀ» »ç¿ëÇØ¼­ ½ÇÇàÇϱ⠶§¹®¿¡ Å¥ºê ¾ÆÀÌÅÛÀ» °Ë»çÇÑ´Ù. { if (!util::internal::IsValidInventoryPosition(inventory, using_item_position)) { return false; } SCItemSlot& using_item = static_cast(inventory.GetSlot(using_item_position)); if (!util::internal::IsValidInventoryItemState(using_item)) { return false; } if ((using_item.GetItemInfo())->m_wType != eITEMTYPE_CUBE) { return false; } request.using_item_position_ = using_item_position; } // ÇÕ¼º ¿äûÀ̶ó¸é if (request.is_composition_) { return util::internal::GetCompositionRequest( composition_map_, inventory, inventory_position_list, request); } // ºÐÇØÇÒ Àç·á ¸ñ·ÏÀ» ¾ò´Â´Ù. DecompositionInfo::MaterialList material_list; if (!GetDecompositionMaterialList(inventory, inventory_position_list, material_list)) { return false; } // ¿äûÇÒ Àç·á¸¦ ¼³Á¤ÇÑ´Ù. MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialListSize material_index = 0; FOREACH_CONTAINER( const DecompositionInfo::MaterialInfo& material, material_list, DecompositionInfo::MaterialList) { MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialInfo& request_material = request.material_list_[material_index]; request_material.inventory_position_ = material.inventory_position_; request_material.selected_number_ = material.number_; request_material.matched_index_ = 0; ++material_index; } request.material_list_size_ = material_index; // ºÐÇØ Æ÷ÀÎÆ®¸¦ ¾ò´Â´Ù. const DecompositionInfo::DecompositionPoint decomposition_point = GetDecompositionPoint(material_list); if (decomposition_point == 0) { return false; } request.reserved_code_ = decomposition_point; return true; } //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Private //////////////////////////////////////////////////////////////////////////////////////////////////// bool CubeSystemParser::LoadComposition(const bool is_reload) { // ½ºÅ©¸³Æ®¸¦ ´Ù½Ã Àд´ٸé if (is_reload) { // ÀÌÀü ÇÕ¼º Á¤º¸¸¦ Á¦°ÅÇÑ´Ù. ReleaseComposition(); } bool is_valid_script = true; const int row_size = GetRowSize(); for (int row = 0; row < row_size; row++) { // ÇÕ¼º Äڵ带 Àоî¿Í¼­ ÇÕ¼º Á¤º¸¸¦ ã´Â´Ù. const CompositionInfo::CompositionCode composition_code = GetDataDWORD(_T("Code"), row); CompositionInfo* composition = FindComposition(composition_code); // ÇÕ¼º Á¤º¸¸¦ ãÀ» ¼ö ¾øÀ¸¸é if (composition == NULL) { // »õ·Î¿î ÇÕ¼º Á¤º¸¸¦ »ý¼ºÇÑ´Ù. composition = new CompositionInfo(composition_code); composition_map_[composition_code] = composition; } // Ä®·³ °³¼ö¸¦ °Ë»çÇÑ´Ù. const CompositionInfo::ColumnNumber column_number = GetDataBYTE(_T("ColumnNumber"), row); if (column_number < 1 || column_number > max(CompositionInfo::MaterialInfo::kMaxSize, CompositionInfo::RewardInfo::kMaxSize)) { SUNLOG(eCRITICAL_LOG, _T("|%s|ColumnNumber(Ä®·³¹øÈ£)´Â 1~%d »çÀÌÀÇ ¼ýÀÚ·Î ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d, ColumnNumber = %d|"), __FUNCTION__, max(CompositionInfo::MaterialInfo::kMaxSize, CompositionInfo::RewardInfo::kMaxSize), row, column_number); is_valid_script = false; continue; } const CompositionInfo::ColumnNumber material_or_reward_index = column_number-1; // Àç·á Ä®·³À» »ç¿ëÇÑ´Ù¸é const int use_material = GetDataInt(_T("UseMaterial"), row); if (use_material == CompositionInfo::kUsed) { CompositionInfo::MaterialList& material_list = composition->material_list_; CompositionInfo::MaterialInfo& material = material_list[material_or_reward_index]; // Àç·á°¡ ÀÌ¹Ì ¼³Á¤µÇ¾ú´Ù¸é if (material.is_used_) { // Áߺ¹µÈ Àç·á Ä®·³ÀÌ´Ù. SUNLOG(eCRITICAL_LOG, _T("|%s|°°Àº ÇÕ¼ºÁ¤º¸¾È¿¡¼­ Àç·áÀÇ ColumnNumber(Ä®·³¹øÈ£)´Â Áߺ¹ µÉ ¼ö ¾ø½À´Ï´Ù.|ÇöÀçÁÙ = %d, ColumnNumber = %d|"), __FUNCTION__, row, column_number); is_valid_script = false; continue; } // Àç·á °³¼ö¸¦ °Ë»çÇÑ´Ù. const int material_number = GetDataInt(_T("MaterialNumber"), row); if (material_number < 1 || material_number > USHRT_MAX/*UCHAR_MAX*/) { SUNLOG(eCRITICAL_LOG, _T("|%s|MaterialNumber(Àç·á°³¼ö)°¡ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.|ÇöÀçÁÙ = %d, Àç·á°³¼ö = %d|"), __FUNCTION__, row, material_number); is_valid_script = false; continue; } // Àç·á Á¤º¸¸¦ Àоî¿Â´Ù. material.is_used_ = true; material.column_number_ = column_number; material.code_ = GetDataDWORD(_T("MaterialCode"), row); material.type_code_ = GetDataDWORD(_T("MaterialTypeCode"), row); material.level_ = GetDataWORD(_T("MaterialLevel"), row); material.number_ = static_cast(material_number); material.ig_type_ = GetDataBYTE(_T("MaterialIGType"), row); // Àоî¿Â Àç·áÀÇ Á¶°Çµé Áß ÃÖ¼ÒÇÑ Çϳª´Â »ç¿ëÇØ¾ß ÇÑ´Ù. if (material.code_ == CompositionInfo::kUnused && material.type_code_ == CompositionInfo::kUnused && material.level_ == CompositionInfo::kUnused) { SUNLOG(eCRITICAL_LOG, _T("|%s|MaterialCode(Àç·áÄÚµå),MaterialTypeCode(Àç·áÁ¾·ùÄÚµå),MaterialLevel(Àç·á·¹º§) Áß¿¡ ÃÖ¼ÒÇÑ Çϳª´Â ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, row); is_valid_script = false; continue; } // Àç·á ¾ÆÀÌÅÛ Å¸ÀÔ ¹üÀ§¸¦ °Ë»çÇÑ´Ù. if (material.ig_type_ < KindOfItemType::Default || material.ig_type_ >= KindOfItemType::Counts) { SUNLOG(eCRITICAL_LOG, _T("|%s|MaterialIGType(Àç·á¾ÆÀÌÅÛŸÀÔ) °ªÀÇ ¹üÀ§°¡ ¿Ç¹Ù¸£Áö ¾Ê½À´Ï´Ù.|ÇöÀçÁÙ = %d, MaterialIGType = %d|"), __FUNCTION__, row, material.ig_type_); is_valid_script = false; continue; } // °¡ÁßÄ¡¸¦ °è»êÇÑ´Ù. (ÄÚµå > ŸÀÔ ÄÚµå > ·¹º§ > °³¼ö) { enum { kMaterialNumberWeight = 1, kMaterialLevelWeight, kMaterialTypeWeight, kMaterialCodeWeight }; if (material.code_ != CompositionInfo::kUnused) { composition->weight_ += kMaterialCodeWeight; } if (material.type_code_ != CompositionInfo::kUnused) { composition->weight_ += kMaterialTypeWeight; } if (material.level_ != CompositionInfo::kUnused) { composition->weight_ += kMaterialLevelWeight; } composition->weight_ += (material.number_ * kMaterialNumberWeight); } // Ä®·³ ¹øÈ£°¡ ¸ñ·Ï Å©±âº¸´Ù Å©´Ù¸é »õ·Î »ðÀÔµÈ °ÍÀ̹ǷΠif (static_cast(column_number) > material_list.size()) { // ¸ñ·ÏÀÇ Å©±â¸¦ »õ·Î ¼³Á¤ÇÑ´Ù. material_list.set_size(column_number); } } // º¸»ó Ä®·³À» »ç¿ëÇÑ´Ù¸é const int use_reward = GetDataInt(_T("UseReward"), row); if (use_reward == CompositionInfo::kUsed) { CompositionInfo::RewardList& reward_list = composition->reward_list_; CompositionInfo::RewardInfo& reward = reward_list[material_or_reward_index]; // º¸»óÀÌ ÀÌ¹Ì ¼³Á¤µÇ¾ú´Ù¸é if (reward.is_used_) { // Áߺ¹µÈ º¸»ó Ä®·³ÀÌ´Ù. SUNLOG(eCRITICAL_LOG, _T("|%s|°°Àº ÇÕ¼ºÁ¤º¸¾È¿¡¼­ º¸»óÀÇ ColumnNumber(Ä®·³¹øÈ£)´Â Áߺ¹ µÉ ¼ö ¾ø½À´Ï´Ù.|ÇöÀçÁÙ = %d, ColumnNumber = %d|"), __FUNCTION__, row, column_number); is_valid_script = false; continue; } // º¸»ó °³¼ö¸¦ °Ë»çÇÑ´Ù. const int reward_number = GetDataInt(_T("RewardNumber"), row); if (reward_number > UCHAR_MAX) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardNumber(º¸»ó°³¼ö)°¡ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.|ÇöÀçÁÙ = %d, º¸»ó°³¼ö = %d|"), __FUNCTION__, row, reward_number); is_valid_script = false; continue; } // º¸»ó Á¤º¸¸¦ Àоî¿Â´Ù. reward.is_used_ = true; reward.column_number_ = column_number; reward.type_ = GetDataInt(_T("RewardType"), row); reward.code_ = GetDataDWORD(_T("RewardCode"), row); reward.ig_type_ = GetDataBYTE(_T("RewardIGType"), row); reward.ratio_ = GetDataWORD(_T("RewardRatio"), row); reward.number_ = static_cast(reward_number); // º¸»óÁ¾·ù¸¦ °Ë»çÇÑ´Ù. if (reward.type_ != CompositionInfo::RewardInfo::kItemCode && reward.type_ != CompositionInfo::RewardInfo::kRewardCode) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)Àº ¾ÆÀÌÅÛÄÚµå(%d)À̰ųª º¸»óÄÚµå(%d)À̾î¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d, RewardType = %d|"), __FUNCTION__, CompositionInfo::RewardInfo::kItemCode, CompositionInfo::RewardInfo::kRewardCode, row, reward.type_); is_valid_script = false; continue; } // º¸»óÄÚµå´Â º¸»ó Á¾·ù¿¡ »ó°ü¾øÀÌ ¹Ýµå½Ã ÀÔ·Â µÇ¾î¾ß ÇÑ´Ù. if (reward.code_ == CompositionInfo::kUnused) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardCode(º¸»óÄÚµå)´Â RewardType(º¸»óÁ¾·ù)¿¡ ÇØ´çÇÏ´Â °ªÀ» ¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, row); is_valid_script = false; continue; } // º¸»ó ¾ÆÀÌÅÛ Å¸ÀÔ ¹üÀ§¸¦ °Ë»çÇÑ´Ù. if (reward.ig_type_ < KindOfItemType::Default || reward.ig_type_ >= KindOfItemType::Counts) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardIGType(º¸»ó¾ÆÀÌÅÛŸÀÔ) °ªÀÇ ¹üÀ§°¡ ¿Ç¹Ù¸£Áö ¾Ê½À´Ï´Ù.|ÇöÀçÁÙ = %d, RewardIGType = %d|"), __FUNCTION__, row, reward.ig_type_); is_valid_script = false; continue; } // º¸»óÁ¾·ù°¡ ¾ÆÀÌÅÛÄÚµåÀ϶§ if (reward.type_ == CompositionInfo::RewardInfo::kItemCode) { // º¸»ó È®·üÀº 0º¸´Ù ÀÛÀ» ¼ö ¾ø´Ù. if (reward.ratio_ < 0 || reward.ratio_ > CompositionInfo::RewardInfo::kMaxRewardRatioSize) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)°¡ ¾ÆÀÌÅÛÄÚµå(%d)À϶§ RewardRatio(º¸»óÈ®·ü)Àº 0~%d »çÀÌÀÇ °ªÀ̾î¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, CompositionInfo::RewardInfo::kItemCode, CompositionInfo::RewardInfo::kMaxRewardRatioSize, row); is_valid_script = false; continue; } // º¸»ó °³¼ö´Â 0º¸´Ù Ä¿¾ß ÇÑ´Ù. if (reward.number_ == 0) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)°¡ ¾ÆÀÌÅÛÄÚµå(%d)À϶§ RewardNumber(º¸»ó°³¼ö)´Â 0º¸´Ù Ä¿¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, CompositionInfo::RewardInfo::kItemCode, row); is_valid_script = false; continue; } } // º¸»óÁ¾·ù°¡ º¸»óÄÚµåÀ϶§ if (reward.type_ == CompositionInfo::RewardInfo::kRewardCode) { // º¸»óÈ®·üÀº 0ÀÌ ¾Æ´Ï¶ó¸é if (reward.ratio_ != 0.0) { // º¸Á¤ °¡´ÉÇϹǷΠº¸Á¤ÇÑ´Ù. SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)°¡ º¸»óÄÚµå(%d)À϶§ RewardRatio(º¸»óÈ®·ü)´Â 0À̾î¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, CompositionInfo::RewardInfo::kRewardCode, row); reward.ratio_ = 0; } // º¸»ó°³¼ö°¡ 0ÀÌ ¾Æ´Ï¶ó¸é if (reward.number_ != 0) { // º¸Á¤ °¡´ÉÇϹǷΠº¸Á¤ÇÑ´Ù. SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)°¡ º¸»óÄÚµå(%d)À϶§ RewardNumber(º¸»ó°³¼ö)´Â 0À̾î¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, CompositionInfo::RewardInfo::kRewardCode, row); reward.number_ = 0; } } // Ä®·³ ¹øÈ£°¡ ¸ñ·Ï Å©±âº¸´Ù Å©´Ù¸é »õ·Î »ðÀÔµÈ °ÍÀ̹ǷΠif (static_cast(column_number) > reward_list.size()) { // ¸ñ·ÏÀÇ Å©±â¸¦ »õ·Î ¼³Á¤ÇÑ´Ù. reward_list.set_size(column_number); } } } // for (int row = 0; row < row_size; row++) // ½ºÅ©¸³Æ®¸¦ ¹Ì¸® °ËÁõÇÏÀÚ. // º¸»ó Á¾·ù°¡ º¸»óÄÚµå¶ó¸é º¹¼öÀÇ º¸»ó Àǹ̸¦ ³»Æ÷Çϰí ÀÖÀ¸¹Ç·Î º¸»ó ÄÚµåÀ϶§´Â ¿ÀÁ÷ Çϳª¸¸ Çã¿ëÇÑ´Ù. // ÇÏÁö¸¸ º¸»ó Á¾·ù°¡ ¾ÆÀÌÅÛÄÚµå¶ó¸é º¹¼öÀÇ ¾ÆÀÌÅÛÄڵ带 Çã¿ëÇÑ´Ù. // º¸»óÄÚµå¿Í ¾ÆÀÌÅÛÄÚµåÀÇ Á¶ÇÕÀº Çã¿ëÇÏÁö ¾Ê´Â´Ù. // °¢ ÇÕ¼º¿¡ ´ëÇØ FOREACH_CONTAINER( const CompositionMap::value_type& composition_value, composition_map_, CompositionMap) { const CompositionInfo* const composition = composition_value.second; // ÇÕ¼º Á¤º¸ÀÇ Àç·á °³¼ö°¡ ÃÖ¼Ò 1°³´Â ÇÊ¿äÇÏ´Ù. if ((composition->material_list_).size() == 0) { SUNLOG(eCRITICAL_LOG, _T("|%s|ÇÕ¼º Á¤º¸¾È¿¡ Àç·á°¡ ÃÖ¼ÒÇÑ Çϳª ÀÌ»ó ÇÊ¿äÇÕ´Ï´Ù.|CompositionCode = %d|"), __FUNCTION__, composition->code_); is_valid_script = false; continue; } // ÀоîµéÀÎ Àç·á ¸ñ·ÏÀ» °Ë»çÇÑ´Ù. FOREACH_CONTAINER( const CompositionInfo::MaterialInfo& material, composition->material_list_, CompositionInfo::MaterialList) { // Àç·á°¡ »ç¿ë °¡´ÉÇÑÁö °Ë»çÇÑ´Ù. if (!material.is_used_) { SUNLOG(eCRITICAL_LOG, _T("|%s|Àç·á°¡ »ç¿ë¾ÈÇÔÀ¸·Î ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù.|CompositionCode = %d|ColumnNumber = %d|"), __FUNCTION__, composition->code_, material.column_number_); is_valid_script = false; break; } } // ÀоîµéÀÎ º¸»ó ¸ñ·ÏÀ» °Ë»çÇÑ´Ù. bool is_find_reward_code = false; FOREACH_CONTAINER( const CompositionInfo::RewardInfo& reward, composition->reward_list_, CompositionInfo::RewardList) { // º¸»óÀÌ »ç¿ë °¡´ÉÇÑÁö °Ë»çÇÑ´Ù. if (!reward.is_used_) { SUNLOG(eCRITICAL_LOG, _T("|%s|º¸»óÀÌ »ç¿ë¾ÈÇÔÀ¸·Î ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù.|CompositionCode = %d|ColumnNumber = %d|"), __FUNCTION__, composition->code_, reward.column_number_); is_valid_script = false; break; } // ÀÌ¹Ì º¸»óÄڵ尡 Çϳª ¹ß°ßµÇ¾ú´Âµ¥ if (is_find_reward_code) { // ´Ù¸¥ Á¾·ùÀÇ º¸»óÀÌ ¶Ç ¹ß°ßµÇ¾ú´Ù. SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)°¡ º¸»óÄÚµå·Î ¼³Á¤µÇ¾î ÀÖÀ» ¶§´Â ¿ÀÁ÷ ÇϳªÀÇ º¸»ó¸¸ ÀÔ·Â °¡´ÉÇÕ´Ï´Ù.|CompositionCode = %d|"), __FUNCTION__, composition->code_); is_valid_script = false; break; } if (reward.type_ == CompositionInfo::RewardInfo::kRewardCode) { is_find_reward_code = true; } // º¸»óÀÇ ¾ÆÀÌÅÛ Äڵ尡 º¸»ó¸ñ·Ï¿¡¼­ À¯ÀÏÇÑÁö °Ë»çÇÑ´Ù. const CompositionInfo::RewardList::difference_type same_item_code_count = \ std::count_if(composition->reward_list_.begin(), composition->reward_list_.end(), boost::bind(&util::internal::IsSameItemCode, _1, reward.code_)); if (same_item_code_count > 1) { SUNLOG(eCRITICAL_LOG, _T("|%s|º¸»ó ¸ñ·Ï¿¡¼­ ¾ÆÀÌÅÛ ÄÚµå´Â À¯ÀÏÇØ¾ß ÇÕ´Ï´Ù.|Áߺ¹°³¼ö = %d|"), __FUNCTION__, same_item_code_count); is_valid_script = false; break; } } // º¸»ó Äڵ尡 ¹ß°ßµÇ¾ú´Âµ¥ º¸»óÀÌ Çϳª°¡ ¾Æ´Ï´Ù. if (is_find_reward_code && (composition->reward_list_).size() != 1) { SUNLOG(eCRITICAL_LOG, _T("|%s|RewardType(º¸»óÁ¾·ù)°¡ º¸»óÄÚµå·Î ¼³Á¤µÇ¾î ÀÖÀ» ¶§´Â ¿ÀÁ÷ ÇϳªÀÇ º¸»ó¸¸ ÀÔ·Â °¡´ÉÇÕ´Ï´Ù.|CompositionCode = %d|"), __FUNCTION__, composition->code_); is_valid_script = false; } } // °¢ ÇÕ¼º¿¡ ´ëÇØ FASSERT(is_valid_script && _T("½ºÅ©¸³Æ® Êý¾ÝÓдíÎó.")); return is_valid_script; } bool CubeSystemParser::LoadDecomposition(const bool is_reload) { if (is_reload) { decomposition_reward_list_.clear(); } bool is_valid_script = true; const int row_size = GetRowSize(); for (int row = 0; row < row_size; row++) { // º¸»ó Á¤º¸¸¦ Àоî¿Â´Ù. DecompositionInfo::RewardInfo reward; { reward.type_ = GetDataInt(_T("DecRewardType"), row); reward.code_ = GetDataDWORD(_T("DecRewardCode"), row); reward.min_code_ = GetDataDWORD(_T("DecMinCode"), row); reward.max_code_ = GetDataDWORD(_T("DecMaxCode"), row); reward.ratio_ = GetDataWORD(_T("DecRewardRatio"), row); } // º¸»óÁ¾·ù¸¦ °Ë»çÇÑ´Ù. if (reward.type_ != DecompositionInfo::RewardInfo::kItemCode && reward.type_ != DecompositionInfo::RewardInfo::kZard) { SUNLOG(eCRITICAL_LOG, _T("|%s|DecRewardType(º¸»óÁ¾·ù)Àº ¾ÆÀÌÅÛÄÚµå(%d)À̰ųª Àðµå(%d) À̾î¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d, DecRewardType = %d|"), __FUNCTION__, DecompositionInfo::RewardInfo::kItemCode, DecompositionInfo::RewardInfo::kZard, row, reward.type_); is_valid_script = false; continue; } // º¸»óÄڵ带 °Ë»çÇÑ´Ù. if (reward.code_ == DecompositionInfo::kUnused) { SUNLOG(eCRITICAL_LOG, _T("|%s|DecRewardCode(º¸»óÄÚµå)¿¡´Â ¹Ýµå½Ã DecRewardType(º¸»óÁ¾·ù)¿¡ ÇØ´çÇÏ´Â Äڵ带 ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, row); is_valid_script = false; continue; } // º¸»óÈ®·üÀ» °Ë»çÇÑ´Ù. if (reward.ratio_ <= 0 || reward.ratio_ > DecompositionInfo::RewardInfo::kMaxRewardRatioSize) { SUNLOG(eCRITICAL_LOG, _T("|%s|DecRewardRatio(º¸»óÈ®·ü)´Â 1~%d »çÀÌÀÇ °ªÀ̾î¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, DecompositionInfo::RewardInfo::kMaxRewardRatioSize, row); is_valid_script = false; continue; } // º¸»óÁ¾·ù°¡ ÀðµåÀ϶§ if (reward.type_ == DecompositionInfo::RewardInfo::kZard) { // º¸»óÄڵ忡 Àðµåµî±ÞÀÌ µé¾î°¬´ÂÁö °Ë»çÇÑ´Ù. if (reward.code_ != DecompositionInfo::ZardInfo::kGradeLv1 && reward.code_ != DecompositionInfo::ZardInfo::kGradeLv2 && reward.code_ != DecompositionInfo::ZardInfo::kGradeLv3 && reward.code_ != DecompositionInfo::ZardInfo::kGradeLv4) { SUNLOG(eCRITICAL_LOG, _T("|%s|¿Ç¹Ù¸¥ Àðµå µî±ÞÀ» ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d, DecRewardCode = %d|"), __FUNCTION__, row, reward.code_); is_valid_script = false; continue; } // ÀðµåÀÎ ¾ÆÀÌÅÛÀÇ ÃÖ¼Ò ÄÚµå ¹üÀ§°¡ ÀԷµǾú´ÂÁö °Ë»çÇÑ´Ù. if (reward.min_code_ == DecompositionInfo::kUnused) { SUNLOG(eCRITICAL_LOG, _T("|%s|DecMinCode ¿¡´Â Àðµå µî±ÞÀÌ %dÀÎ ¾ÆÀÌÅÛµéÀÇ ÃÖ¼Ò ¾ÆÀÌÅÛÄÚµå ¹üÀ§¸¦ ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, reward.code_, row); is_valid_script = false; continue; } // ÀðµåÀÎ ¾ÆÀÌÅÛÀÇ ÃÖ´ë ÄÚµå ¹üÀ§°¡ ÀԷµǾú´ÂÁö °Ë»çÇÑ´Ù. if (reward.max_code_ == DecompositionInfo::kUnused) { SUNLOG(eCRITICAL_LOG, _T("|%s|DecMaxCode ¿¡´Â Àðµå µî±ÞÀÌ %dÀÎ ¾ÆÀÌÅÛµéÀÇ ÃÖ´ë ¾ÆÀÌÅÛÄÚµå ¹üÀ§¸¦ ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.|ÇöÀçÁÙ = %d|"), __FUNCTION__, reward.code_, row); is_valid_script = false; continue; } // ÃÖ¼Ò º¸»óÄÚµå´Â ÃÖ´ë º¸»ó Äڵ庸´Ù Ŭ ¼ö ¾ø´Ù. if (reward.min_code_ > reward.max_code_) { SUNLOG(eCRITICAL_LOG, _T("|%s|DecMinCode´Â DecMaxCode º¸´Ù Ŭ ¼ö ¾ø½À´Ï´Ù.|DecMinCode = %d, DecMaxCode = %d, ÇöÀçÁÙ = %d|"), __FUNCTION__, reward.min_code_, reward.max_code_, row); is_valid_script = false; continue; } // Àðµå º¸»ó ¹üÀ§¸¦ °Ë»çÇØ¼­ À¯È¿ÇÑ ¹üÀ§¸¸ ¾ò´Â´Ù. const ItemInfoParser* const item_info_parser = ItemInfoParser::Instance(); for (DecompositionInfo::RewardInfo::RewardCode zard_code = reward.min_code_; zard_code <= reward.max_code_; ++zard_code) { const BASE_ITEMINFO* const zard = item_info_parser->GetItemInfo(zard_code); if (zard == NULL) { continue; } if (zard->m_wType != eITEMTYPE_SOCKET_ZARD && zard->m_wType != eITEMTYPE_SOCKET_ZARD_RINGS) // xiaomi add bool CubeSystemParser::LoadDecomposition(const bool is_reload) { continue; } #ifdef _NA_006251_CUBESYSTEM_Decomposition_REWARD_REMOVE_CASH_ZARD if (zard->m_ChargeType == 1) // ij½Ã¾ÆÀÌÅÛÀϰæ¿ì ChargeTypeÀ» 1·Î ¼³Á¤ { // ij½ÃÀðµå ¾ÆÀÌÅÛÀº º¸»ó¸®½ºÆ®¿¡ Æ÷ÇÔ½ÃŰÁö ¾Ê´Â´Ù. continue; } #endif // _NA_006251_CUBESYSTEM_Decomposition_REWARD_REMOVE_CASH_ZARD (reward.zard_list).push_back(zard_code); } if ((reward.zard_list).empty()) { SUNLOG(eCRITICAL_LOG, _T("|%s|Àðµå º¸»ó ÄÚµå ¹üÀ§°¡ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.|DecMinCode = %d, DecMaxCode = %d, ÇöÀçÁÙ = %d|"), __FUNCTION__, reward.min_code_, reward.max_code_, row); is_valid_script = false; continue; } } // º¸»ó ¸ñ·Ï¿¡ »ðÀÔÇÑ´Ù. decomposition_reward_list_.push_back(reward); } FASSERT(is_valid_script && _T("½ºÅ©¸³Æ® Êý¾ÝÓдíÎó.")); return is_valid_script; } void CubeSystemParser::ReleaseComposition() { FOREACH_CONTAINER( const CompositionMap::value_type& composition_value, composition_map_, CompositionMap) { CompositionInfo* composition = composition_value.second; SAFE_DELETE(composition); } composition_map_.clear(); } #endif // _NA_002253_20100811_CUBE_SYSTEM