//////////////////////////////////////////////////////////////////////////////////////////////////// /// /// @file CubeSystemImplement.cpp /// @author hukim /// @brief [2010/08/25 by hukim] This is created.\n /// //////////////////////////////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "./CubeSystemImplement.h" // header #include "ChaoState.h" #include "CubeSystem/CubeSystemParser.h" #include "ItemManager.h" #include "RewardManager.h" #include "SCItemSlotContainer.h" #include "ItemTypeList.h" #include "ImplementUtil.h" #ifdef _NA_002253_20100811_CUBE_SYSTEM //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Constructor & Destructor //////////////////////////////////////////////////////////////////////////////////////////////////// CubeSystemImplement::CubeSystemImplement() { } CubeSystemImplement::~CubeSystemImplement() { } //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Implement //////////////////////////////////////////////////////////////////////////////////////////////////// namespace util { namespace internal { // ÇÕ¼ºÇÑ´Ù. static RC::eITEM_RESULT Compose( const MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN& request, Player& INOUT requester, ItemCompositionOrDecompositionReward& OUT composition_reward) { // Ä«¿À »óÅ¿¡¼­ »ç¿ë °¡´É¿©ºÎ´Â Àϰü¼ºÀ» À§ÇØ ±âÁ¸ ÇÕ¼º ±ÔÄ¢À» µû¶ó°£´Ù. if (requester.GetChaoState().CanUseFuction(CHAO_USE_COMPOSE) == false) { SUNLOG(eCRITICAL_LOG, _T("|%s|Ä«¿À »óÅ¿¡¼­´Â »ç¿ë °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù.|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, requester.GetCharName()); return RC::RC_ITEM_UNABLE_FUNCTION_FOR_CHAOSTATE; } // ÇÕ¼º Á¤º¸¸¦ ã´Â´Ù. const CubeSystemParser* const cube_system_parser = CubeSystemParser::Instance(); const CompositionInfo* const composition = cube_system_parser->FindComposition(request.reserved_code_); if (composition == NULL) { SUNLOG(eCRITICAL_LOG, _T("|%s|ÇÕ¼º Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.|ÇÕ¼ºÄÚµå = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, request.reserved_code_, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } ItemManager* const item_manager = requester.GetItemManager(); SCItemSlotContainer* const inventory = item_manager->GetItemSlotContainer(SI_INVENTORY); // ¿äûÇÑ Àç·áµéÀÌ ÇÕ¼º¹ý¿¡ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. for (MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialListSize request_material_index = 0; request_material_index < request.material_list_size_; ++request_material_index) { // ¿äûÇÑ Àç·á¸¦ ¾ò´Â´Ù. const MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialInfo& request_material = (request.material_list_)[request_material_index]; // ¿äûÇÑ Àç·á¿Í ÀÏÄ¡ÇÏ´Â ÇÕ¼ºÁ¤º¸ÀÇ Àç·á¸¦ ¾ò´Â´Ù. const CompositionInfo::MaterialInfo& composition_material = composition->material_list_[request_material.matched_index_]; // ¿äûÇÑ Àç·á¿Í ÀÏÄ¡ÇÏ´Â ÇÕ¼º Àç·á¸¦ ã¾Ò´Âµ¥ »ç¿ë¾ÈÇÔÀ¸·Î ¼³Á¤µÇ¾î ÀÖ´Ù¸é if (composition_material.is_used_ == CompositionInfo::kUnused) { // À߸øµÈ °ªÀÌ´Ù. SUNLOG(eCRITICAL_LOG, _T("|%s|¿äûÇÑ Àç·á´Â ÇÕ¼º Á¤º¸¿¡¼­ »ç¿ë °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù.|¿äûÀç·áÀ妽º = %d, ÀÏÄ¡Àç·áÀ妽º = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, request_material_index, request_material.matched_index_, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // ¿äû Àç·á °³¼ö°¡ ÇÕ¼ºÁ¤º¸ÀÇ Àç·á °³¼ö º¸´Ù Àû´Ù¸é °°Àº Á¾·ùÀÇ Àç·áµé³¢¸® ¸ð¾Æ¼­ ÇÕ¼ºÀÌ °¡´ÉÇÑÁö °Ë»çÇÑ´Ù. if (request_material.selected_number_ < composition_material.number_) { bool check_combine_composition = false; MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialListSize same_material_index = request_material_index; int same_material_number = request_material.selected_number_; while (++same_material_index < request.material_list_size_) { const MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialInfo& next_request_material = (request.material_list_)[same_material_index]; if (next_request_material.matched_index_ != request_material.matched_index_) { break; } // Á¾·ù°¡ °°Àº Àç·á³¢¸® °³¼ö¸¦ ¸ð¾Æ ÇÕ¼º Àç·á °³¼ö¸¦ ¸¸Á·½Ã۸é same_material_number += next_request_material.selected_number_; if (same_material_number >= composition_material.number_) { // °Ë»ç ¼º°øÇϰí ÇÕÄ£ Àç·á¸¸Å­ À妽º¸¦ ¹Ð¾îÁØ´Ù. check_combine_composition = true; request_material_index = same_material_index; break; } } if (!check_combine_composition) { SUNLOG(eCRITICAL_LOG, _T("|%s|¿äûÇÑ Àç·á °³¼ö°¡ ÇÕ¼º¿¡¼­ ¿ä±¸ÇÏ´Â °³¼öº¸´Ù ºÎÁ·ÇÕ´Ï´Ù.|ÇÕ¼ºÄÚµå = %d, Àç·áÄ®·³¹øÈ£ = %d, Çʿ䰳¼ö = %d, ÇöÀç°³¼ö = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, composition->code_, composition_material.column_number_, composition_material.number_, same_material_number, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } // Àç·á¿¡ ÇØ´çÇÏ´Â Àκ¥Å丮 ¾ÆÀÌÅÛ »óŸ¦ °Ë»çÇÑ´Ù. SCItemSlot& inventory_item = static_cast(inventory->GetSlot(request_material.inventory_position_)); if (inventory_item.IsLocked() || inventory_item.IsBlocked() || inventory_item.IsUserBlocked() || !inventory_item.IsContainValidItem()) { SUNLOG(eCRITICAL_LOG, _T("|%s|Àç·á¿¡ ÇØ´çÇÏ´Â Àκ¥Å丮 ¾ÆÀÌÅÛÀÌ ÇÕ¼º °¡´ÉÇÑ »óŰ¡ ¾Æ´Õ´Ï´Ù.|Àκ¥Å丮À§Ä¡ = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, request_material.inventory_position_, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // ¿äûÇÑ Àç·áÀÇ °³¼ö¸¦ °Ë»çÇÑ´Ù. if (request_material.selected_number_ > inventory_item.GetNum()) { SUNLOG(eCRITICAL_LOG, _T("|%s|¿äûÇÑ Àç·á °³¼ö°¡ ½ÇÁ¦ Àκ¥Å丮ÀÇ ¾ÆÀÌÅÛ °³¼öº¸´Ù ¸¹½À´Ï´Ù.|Àκ¥Å丮À§Ä¡ = %d, ¿äû°³¼ö = %d, ½ÇÁ¦°³¼ö = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, request_material.inventory_position_, request_material.selected_number_, inventory_item.GetNum(), requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // ÇÕ¼ºÁ¤º¸ÀÇ Àç·áÄڵ带 Á¶°ÇÀ¸·Î »ç¿ëÇÒ ¶§ Àç·á Äڵ尡 ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.code_ != CompositionInfo::kUnused) { if (composition_material.code_ != inventory_item.GetItemCode()) { SUNLOG(eCRITICAL_LOG, _T("|%s|ÇÕ¼ºÀç·áÄڵ尡 ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù.|ÇÕ¼ºÀç·áÄÚµå = %d, Àκ¥Å丮Àç·áÄÚµå = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, composition_material.code_, inventory_item.GetItemCode(), requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } // ÇÕ¼ºÁ¤º¸ÀÇ Àç·áÁ¾·ùÄڵ带 Á¶°ÇÀ¸·Î »ç¿ëÇÒ ¶§ Àç·áÁ¾·ùÄڵ尡 ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.type_code_ != CompositionInfo::kUnused) { if (composition_material.type_code_ != inventory_item.GetItemInfo()->m_wType) { SUNLOG(eCRITICAL_LOG, _T("|%s|ÇÕ¼ºÀç·áÁ¾·ùÄڵ尡 ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù.|ÇÕ¼ºÀç·áÁ¾·ùÄÚµå = %d, Àκ¥Å丮Àç·áÁ¾·ùÄÚµå = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, composition_material.type_code_, inventory_item.GetType(), requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } // ÇÕ¼º¹ýÀÇ Àç·á·¹º§À» Á¶°ÇÀ¸·Î »ç¿ëÇÒ ¶§ Àç·á·¹º§ÀÌ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. if (composition_material.level_ != CompositionInfo::kUnused) { if (composition_material.level_ != inventory_item.GetItemInfo()->m_LV) { SUNLOG(eCRITICAL_LOG, _T("|%s|ÇÕ¼ºÀç·á·¹º§ÀÌ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù.|ÇÕ¼ºÀç·á·¹º§ = %d, Àκ¥Å丮Àç·á·¹º§ = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, composition_material.level_, inventory_item.GetItemInfo()->m_LV, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } // ¿äûÇÑ Àç·á ¾ÆÀÌÅÛ Å¸ÀÔÀÌ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. const KindOfItemType::value_type inventory_ig_type = nsSlot::ItemTypeChanger::GetKindOfItemType(inventory_item); if (composition_material.ig_type_ != inventory_ig_type) { SUNLOG(eCRITICAL_LOG, _T("|%s|ÇÕ¼ºÀç·á¾ÆÀÌÅÛŸÀÔÀÌ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù.|ÇÕ¼ºÀç·á¾ÆÀÌÅÛŸÀÔ = %d, Àκ¥Å丮Àç·á¾ÆÀÌÅÛŸÀÔ = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, composition_material.ig_type_, inventory_ig_type, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } // ¿äûÇÑ Àç·áµéÀÌ ÇÕ¼º¹ý¿¡ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù. // Àκ¥Å丮¿¡ ÃÖ¼ÒÇÑ º¸»ó Á¾·ù¸¸Å­Àº ¿©À¯ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»çÇÑ´Ù. const CompositionInfo::RewardList& reward_list = composition->reward_list_; const CompositionInfo::RewardList::size_type reward_list_size = reward_list.size(); if (inventory->GetEmptySlotNum() < reward_list_size) { SUNLOG(eCRITICAL_LOG, _T("|%s|Àκ¥Å丮¿¡ º¸»óÀ» ¹ÞÀ» ¿©À¯ °ø°£ÀÌ ¾ø½À´Ï´Ù.|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, requester.GetCharName()); return RC::RC_ITEM_HAVENOTSPACE; } // º¸»ó Á¾·ù°¡ º¸»óÄÚµåÀÏ °æ¿ì º¸»óÀ» ¼³Á¤ÇÑ´Ù. typedef ItemCompositionOrDecompositionReward CubeCompositionReward; const bool is_reward_code_type = (reward_list_size == 1) && (reward_list[0].type_ == CompositionInfo::RewardInfo::kRewardCode); if (is_reward_code_type) { if (!composition_reward.Init(&requester, CubeCompositionReward::kRewardCodeReward)) { SUNLOG(eCRITICAL_LOG, _T("|%s|Å¥ºê ÇÕ¼º º¸»ó¸ñ·Ï º¸»óÀ» ÃʱâÈ­ Çϴµ¥ ½ÇÆÐ Çß½À´Ï´Ù.|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } const CubeCompositionReward::RewardCode reward_code = reward_list[0].code_; if (!composition_reward.AddReward(reward_code)) { SUNLOG(eCRITICAL_LOG, _T("|%s|º¸»óÄڵ带 º¸»ó¿¡ Ãß°¡Çϴµ¥ ½ÇÆÐ Çß½À´Ï´Ù.|º¸»óÄÚµå = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward_code, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } return RC::RC_ITEM_SUCCESS_TO_COMPOSE_CUBE; } // º¸»ó Á¾·ù°¡ ¾ÆÀÌÅÛÄÚµåÀÏ °æ¿ì º¸»óÀ» ¼³Á¤ÇÑ´Ù. { FOREACH_CONTAINER( const CompositionInfo::RewardInfo& reward, reward_list, CompositionInfo::RewardList) { // º¸»ó È®·üÀ» »ç¿ëÇÑ´Ù¸é if (reward.ratio_ > 0) { // º¸»ó °¡´É ¿©ºÎ¸¦ °Ë»çÇÑ´Ù. const int fail_ratio = random(1, CompositionInfo::RewardInfo::kMaxRewardRatioSize); if (fail_ratio > reward.ratio_) { continue; } } CubeCompositionReward::ItemReward reward_item; { reward_item.item_code = static_cast(reward.code_); reward_item.number_of_item = reward.number_; reward_item.ig_type = reward.ig_type_; } if (!composition_reward.AddItemReward(reward_item)) { SUNLOG(eCRITICAL_LOG, _T("|%s|Å¥ºê ÇÕ¼º º¸»ó ¾ÆÀÌÅÛÀ» º¸»ó¿¡ Ãß°¡Çϴµ¥ ½ÇÆÐ Çß½À´Ï´Ù.|º¸»ó¾ÆÀÌÅÛÄÚµå = %d, º¸»ó¾ÆÀÌÅÛ°³¼ö = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward_item.item_code, reward_item.number_of_item, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } } return RC::RC_ITEM_SUCCESS_TO_COMPOSE_CUBE; } static RC::eITEM_RESULT GetDecompositionReward( const DecompositionInfo::RewardList& reward_list, Player& requester, ItemCompositionOrDecompositionReward& OUT decomposition_reward) { typedef ItemCompositionOrDecompositionReward CubeDecompositionReward; const ItemInfoParser* const item_info_parser = ItemInfoParser::Instance(); // ºÐÇØ º¸»ó ¸ñ·Ï¿¡ ´ëÇØ FOREACH_CONTAINER( const DecompositionInfo::RewardInfo& reward, reward_list, DecompositionInfo::RewardList) { // º¸»óÈ®·üÀÌ 100%º¸´Ù ÀÛ´Ù¸é º¸»ó °¡´É ¿©ºÎ¸¦ °Ë»çÇÑ´Ù. if (reward.ratio_ < DecompositionInfo::RewardInfo::kMaxRewardRatioSize) { const int fail_ratio = random(1, DecompositionInfo::RewardInfo::kMaxRewardRatioSize); if (fail_ratio > reward.ratio_) { continue; } } // º¸»óÇÒ ÃÑ °³¼ö¸¦ ±¸ÇÑ´Ù. DURATYPE reward_item_number = 1; if (reward.ratio_ > DecompositionInfo::RewardInfo::kMaxRewardRatioSize) { // ¸ÕÀú ¹«Á¶°Ç º¸»óÇÒ °³¼ö¸¦ ¾ò´Â´Ù. reward_item_number = reward.ratio_ / DecompositionInfo::RewardInfo::kMaxRewardRatioSize; // ¼Ò¼öÁ¡ ÀÌÇÏ·Î º¸»óÇÒ È®·üÀ» °è»êÇÑ´Ù. const DecompositionInfo::RewardInfo::RewardRatio temp_ratio = reward.ratio_ % DecompositionInfo::RewardInfo::kMaxRewardRatioSize; const int fail_ratio = random(1, DecompositionInfo::RewardInfo::kMaxRewardRatioSize); if (fail_ratio <= temp_ratio) { ++reward_item_number; } } // º¸»ó Á¾·ù¿¡ µû¶ó ó¸®ÇÑ´Ù. switch (reward.type_) { case DecompositionInfo::RewardInfo::kZard: // º¸»ó Á¾·ù°¡ ÀðµåÀ϶§ { // Àðµå µî±ÞÀ» °Ë»çÇÑ´Ù. if (reward.code_ < DecompositionInfo::ZardInfo::kGradeLv1 || reward.code_ > DecompositionInfo::ZardInfo::kGradeLv4) { SUNLOG(eCRITICAL_LOG, _T("|%s|¾Ë ¼ö ¾ø´Â Àðµå µî±ÞÀÔ´Ï´Ù.|Àðµåµî±Þ = %d|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward.code_, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // º¸»ó ¹üÀ§¸¦ °Ë»çÇÑ´Ù. if (reward.min_code_ > reward.max_code_) { SUNLOG(eCRITICAL_LOG, _T("|%s|Àðµå º¸»óÀ϶§ ÃÖ¼Òº¸»óÄÚµå´Â Ãִ뺸»óÄÚµå º¸´Ù Ŭ ¼ö ¾ø½À´Ï´Ù.|ÃÖ¼Òº¸»óÄÚµå = %d, Ãִ뺸»óÄÚµå = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward.min_code_, reward.max_code_, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // Àðµå´Â °³º°ÀûÀ¸·Î º¸»óÀ» ¼³Á¤ÇÑ´Ù. for (DURATYPE zard_count = 0; zard_count < reward_item_number; ++zard_count) { // º¸»óÇÒ Àðµå ¾ÆÀÌÅÛÀ» ã´Â´Ù. const DecompositionInfo::RewardInfo::RewardCode zard_code = reward.SelectZard(); const BASE_ITEMINFO* const zard = item_info_parser->GetItemInfo(zard_code); if (zard == NULL) { SUNLOG(eCRITICAL_LOG, _T("|%s|º¸»ó¹ÞÀ» Àðµå ¾ÆÀÌÅÛÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù.|¾ÆÀÌÅÛ ÄÚµå = %u, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, zard_code, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } CubeDecompositionReward::ItemReward reward_item; { reward_item.item_code = static_cast(zard_code); reward_item.number_of_item = 1; } if (decomposition_reward.AddItemReward(reward_item) == false) { SUNLOG(eCRITICAL_LOG, _T("|%s|Àðµå ¾ÆÀÌÅÛÀ» Å¥ºê ºÐÇØ º¸»ó¿¡ Ãß°¡Çϴµ¥ ½ÇÆÐ Çß½À´Ï´Ù.|Àðµå¾ÆÀÌÅÛÄÚµå = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward_item.item_code, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } } break; case DecompositionInfo::RewardInfo::kItemCode: // º¸»óÁ¾·ù°¡ ¾ÆÀÌÅÛÀ϶§ { CubeDecompositionReward::ItemReward reward_item; { reward_item.item_code = static_cast(reward.code_); reward_item.number_of_item = reward_item_number; } if (!decomposition_reward.AddItemReward(reward_item)) { SUNLOG(eCRITICAL_LOG, _T("|%s|Å¥ºê ºÐÇØ º¸»ó ¾ÆÀÌÅÛÀ» º¸»ó¿¡ Ãß°¡Çϴµ¥ ½ÇÆÐ Çß½À´Ï´Ù.|º¸»ó¾ÆÀÌÅÛÄÚµå = %d, º¸»ó¾ÆÀÌÅÛ°³¼ö = %d, ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward_item.item_code, reward_item.number_of_item, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } break; default: SUNLOG(eCRITICAL_LOG, _T("|%s|¾Ë ¼ö ¾ø´Â º¸»óÁ¾·ùÀÔ´Ï´Ù.|º¸»óÁ¾·ù = %d|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, reward.type_, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } } // ºÐÇØ º¸»ó ¸ñ·Ï¿¡ ´ëÇØ return RC::RC_ITEM_SUCCESS_TO_DECOMPOSE_CUBE; } // ºÐÇØÇÑ´Ù. static RC::eITEM_RESULT Decompose( const MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN& request, Player& requester, ItemCompositionOrDecompositionReward& OUT decomposition_reward) { // Ä«¿À »óÅ¿¡¼­ »ç¿ë °¡´É¿©ºÎ´Â Àϰü¼ºÀ» À§ÇØ ±âÁ¸ °áÁ¤È­ ±ÔÄ¢À» µû¶ó°£´Ù. if (requester.GetChaoState().CanUseFuction(CHAO_USE_CRYSTALIZE) == false) { SUNLOG(eCRITICAL_LOG, _T("|%s|Ä«¿À »óÅ¿¡¼­´Â »ç¿ë °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù.|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, requester.GetCharName()); return RC::RC_ITEM_UNABLE_FUNCTION_FOR_CHAOSTATE; } // Àκ¥Å丮 À§Ä¡ ¸ñ·ÏÀ» ¾ò´Â´Ù. MaterialInventoryPositionList inventory_position_list; for (MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialListSize request_material_index = 0; request_material_index < request.material_list_size_; ++request_material_index) { const MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::MaterialInfo& request_material = request.material_list_[request_material_index]; inventory_position_list.push_back(request_material.inventory_position_); } ItemManager* const item_manager = requester.GetItemManager(); SCItemSlotContainer* const inventory = item_manager->GetItemSlotContainer(SI_INVENTORY); // ¿äûÇÑ Àç·á ¸ñ·ÏÀ¸·ÎºÎÅÍ ºÐÇØÇÒ Àç·á ¸ñ·ÏÀ» ¾ò´Â´Ù. DecompositionInfo::MaterialList decomposition_material_list; const CubeSystemParser* const cube_system_parser = CubeSystemParser::Instance(); if (!cube_system_parser->GetDecompositionMaterialList(*inventory, inventory_position_list, decomposition_material_list)) { SUNLOG(eCRITICAL_LOG, _T("|%s|¿äûÀ¸·ÎºÎÅÍ ºÐÇØÇÒ Àç·á ¸ñ·ÏÀ» ¾òÀ» ¼ö ¾ø½À´Ï´Ù.|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // Ŭ¶óÀÌ¾ðÆ®¿¡¼­ º¸³»¿Â ºÐÇØ Æ÷ÀÎÆ®°ªÀÌ ¼­¹ö¿¡¼­ °è»êÇѰª°ú °°ÀºÁö °Ë»çÇÑ´Ù. const DecompositionInfo::DecompositionPoint decomposition_point = cube_system_parser->GetDecompositionPoint(decomposition_material_list); if (decomposition_point != static_cast(request.reserved_code_)) { SUNLOG(eCRITICAL_LOG, _T("|%s|ºÐÇØ Æ÷ÀÎÆ® °ªÀÌ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù.|Ŭ¶ó¿äû°ª = %d, ¼­¹ö°è»ê°ª = %d|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, request.reserved_code_, decomposition_point, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } // º¸»óÀ» ¾ò´Â´Ù. DecompositionInfo::RewardList reward_list; if (!cube_system_parser->GetDecompositionRewardList(decomposition_point, reward_list)) { SUNLOG(eCRITICAL_LOG, _T("|%s|ºÐÇØ Æ÷ÀÎÆ®¿¡ ÇØ´çÇÏ´Â º¸»ó ¸ñ·ÏÀ» ¾ò´Âµ¥ ½ÇÆÐÇß½À´Ï´Ù.|ºÐÇØÆ÷ÀÎÆ® = %d|ij¸¯ÅÍÀ̸§ = %s|"), __FUNCTION__, decomposition_point, requester.GetCharName()); return RC::RC_ITEM_INVALID_VALUE; } return GetDecompositionReward(reward_list, requester, decomposition_reward); } } // internal } // util //////////////////////////////////////////////////////////////////////////////////////////////////// // REGION : Public //////////////////////////////////////////////////////////////////////////////////////////////////// RC::eITEM_RESULT CubeSystemImplement::CubeComposeOrDecompose( const MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN& request, Player& INOUT requester, util::internal::ItemCompositionOrDecompositionReward& OUT reward) const { // Å¥ºê ¾ÆÀÌÅÛÀ» »ç¿ëÇÑ´Ù. ItemManager* const item_manager = requester.GetItemManager(); const RC::eITEM_RESULT cube_item_using_result = item_manager->UseItemByType( eITEMTYPE_CUBE, SI_INVENTORY, request.using_item_position_, true, __FUNCTION__); if (cube_item_using_result != RC::RC_ITEM_SUCCESS) { return cube_item_using_result; } // Å¥ºê ¾ÆÀÌÅÛÀ» Á¤»óÀûÀ¸·Î »ç¿ëÇßÀ¸¹Ç·Î Å¥ºê¾ÈÀÇ ¾ÆÀÌÅÛµéÀ» ÇÕ¼º ¶Ç´Â ºÐÇØÇÑ´Ù. if (request.is_composition_) { return util::internal::Compose(request, requester, reward); } return util::internal::Decompose(request, requester, reward); } #endif // _NA_002253_20100811_CUBE_SYSTEM