#include "stdafx.h" #include "GameShop.ShopItemBuilder.h" #if !defined _NA_0_20110613_GAME_SHOP_RENEWAL #ifdef _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING #include #include namespace GameShop { IndexGenerator ShopItemBuilder::index_generator_; //=============================================================================================== // // class ShopItemBuilder // //=============================================================================================== ShopItemBuilder::ShopItemBuilder(ShopManager* shop_manager) : shop_manager_(shop_manager) { } ShopItemBuilder::~ShopItemBuilder() { } void ShopItemBuilder::BuildShopItem(tblSellItem* sell_item, uint count) { for (uint idx = 0 ; idx < count ; ++idx) { Build(&(sell_item[idx])); } } void ShopItemBuilder::BuildShopItem(tblSellPackage* sell_item, uint count) { for (uint idx = 0 ; idx < count ; ++idx) { Build(&(sell_item[idx])); } } void ShopItemBuilder::BuildShopItem(tblItemBranch* branch_item, uint count) { for (uint idx = 0 ; idx < count ; ++idx) { Build(&(branch_item[idx])); } shop_manager_->SetTransaction(false); } void ShopItemBuilder::Build(tblSellItem* sell_item) { sellItemContainer container; ZeroMemory(&container, sizeof(container)); // WARNING: f110711.2L, using packet pointer, don't store other container container.singleitem_info = sell_item; container.partition_index = SHOP_PARTITION_SINGLEITEM; container.cache_index = index_generator_.new_index(); container.category_index = SHOP_CATEGORY_ALL; container.is_skin_item = false; container.shopitem_filter = SHOP_FILTER_NONE; BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(sell_item->dwItemCODE); ASSERT(item_info); if (item_info == NULL) { SUNLOG(eCRITICAL_LOG, "[ShopManager::Translate] Invalid Item Code [code : %d]", sell_item->dwItemCODE); return; } switch (sell_item->dwCategoryID) { #ifdef __NA_00387_20070605_SHOP_MILEAGE2 case CT_MILEAGE: container.partition_index = SHOP_PARTITION_MILEAGEITEM; break; #endif case CT_PACKAGE: case CT_TEMP: SUNLOG(eCRITICAL_LOG, "[ShopManager::Translate] Invalid Item Category [guid : %d]", sell_item->dwItemGuid); return; case CT_WEAPON: container.category_index = get_skin_category(item_info); container.is_skin_item = true; break; case CT_PCROOM: container.category_index = SHOP_CATEGORY_PCROOM; break; case CT_PPCASH: container.category_index = SHOP_CATEGORY_PPCASH; break; case CT_PERIOD_EXTEND: container.category_index = SHOP_CATEGORY_PERIOD_EXTEND; break; default: container.category_index = get_category(item_info); break; } // ½ºÅ©¸³Æ®¿¡ Á¤ÀÇµÈ Ä«Å×°í¸®¸¦ ã¾Æ ³Ö´Â´Ù. uint category_index = CashCategoryParser::Instance()->get_category_index(sell_item->dwItemCODE); if (category_index != SHOP_CATEGORY_INVALID) container.category_index = category_index; // ¾ÆÀÌÅÛ »ç¿ë °¡´ÉÇÑ Ä³¸¯ÅÍÀÇ ÇÊÅÍ ¼³Á¤. container.shopitem_filter = get_character_class_filter(item_info); shop_manager_->BuildShopItem(container); } void ShopItemBuilder::Build(tblSellPackage* sell_item) { sellItemContainer container; ZeroMemory(&container, sizeof(container)); container.partition_index = SHOP_PARTITION_PACKAGEITEM; container.category_index = SHOP_CATEGORY_ALL; // WARNING: f110711.2L, using packet pointer, don't store other container container.packageitem_info = sell_item; container.cache_index = index_generator_.new_index(); container.shopitem_filter = SHOP_FILTER_NONE; uint count = sell_item->dwInItemCount; for (uint idx = 0 ; idx < count ; ++idx) { const tblSellItemPrice& sell_item_price = sell_item->inItemPrices[idx]; ShopItemPrice* shop_item_price = shop_manager_->FindShopItemPrice(sell_item_price.dwPriceGuid); if (shop_item_price == NULL) { SUNLOG(eCRITICAL_LOG, "[ERROR] PriceInfo Not Found : PriceGuid=%u", sell_item_price.dwPriceGuid); continue; } ShopItem* shopitem = shop_item_price->GetShopItem(); ASSERT(shopitem); if (shopitem && (shopitem->GetType() == ShopItem::SINGLE)) { SingleItem* single_item = static_cast(shopitem); BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(single_item->GetItemCode()); ASSERT(item_info); if (item_info && (item_info->IsArmor() || item_info->IsWeapon())) { // ¾ÆÀÌÅÛ »ç¿ë °¡´ÉÇÑ Ä³¸¯ÅÍÀÇ ÇÊÅÍ ¼³Á¤. container.shopitem_filter |= get_character_class_filter(item_info); } } } if (container.shopitem_filter == SHOP_FILTER_NONE) container.shopitem_filter = SHOP_FILTER_CHAR_ALL; shop_manager_->BuildShopItem(container); } void ShopItemBuilder::Build(tblItemBranch* branch_item) { DWORD temp_filter = 0; switch (branch_item->dwBranchID) { case CT_NEWARRIVAL: temp_filter = SHOP_FILTER_NEWARRIVAL; break; case CT_DISCOUNT: temp_filter = SHOP_FILTER_DISCOUNT; break; case CT_POPULARITEM: temp_filter = SHOP_FILTER_POPULAR; break; case CT_EVENT: temp_filter = SHOP_FILTER_EVENT; break; default: return; } ShopItem* shopitem = shop_manager_->FindShopItem(branch_item->dwGuid); if (shopitem) { DWORD filter = shopitem->GetItemFilter(); filter |= temp_filter; shopitem->SetItemFilter(filter); } else { SUNLOG(eCRITICAL_LOG, "[ShopItemBuilder : Branch Fail] Not Found Shop Item [guid : %d]", branch_item->dwGuid); } } uint ShopItemBuilder::get_character_class_filter(BASE_ITEMINFO* item_info) { uint character = SHOP_FILTER_NONE; if(item_info->m_wEqClass1) character |= SHOP_FILTER_CHAR_BERSERKER; if(item_info->m_wEqClass2) character |= SHOP_FILTER_CHAR_PALADIN; if(item_info->m_wEqClass3) character |= SHOP_FILTER_CHAR_SHADOW; if(item_info->m_wEqClass4) character |= SHOP_FILTER_CHAR_VALKYRIE; if(item_info->m_wEqClass5) character |= SHOP_FILTER_CHAR_ELEMENTALIST; return (character == SHOP_FILTER_NONE) ? SHOP_FILTER_CHAR_ALL : character; } uint ShopItemBuilder::get_category(BASE_ITEMINFO* item_info) { uint category_index = SHOP_CATEGORY_ALL; switch (item_info->m_wType) { // Ä¿½ºÅ͸¶ÀÌ¡ case eITEMTYPE_CHANGE_CHARACTER_APPEARANCE_ALL: category_index = SHOP_CATEGORY_CUSTOMIZING_ALL; break; case eITEMTYPE_CHANGE_CHARACTER_FACE: category_index = SHOP_CATEGORY_CUSTOMIZING_FACE; break; case eITEMTYPE_CHANGE_CHARACTER_HAIR: category_index = SHOP_CATEGORY_CUSTOMIZING_HAIR; break; case eITEMTYPE_CHANGE_CHARACTER_HEIGHT: category_index = SHOP_CATEGORY_CUSTOMIZING_ETC; break; // Àåºñ case eITEMTYPE_ARMOR: category_index = SHOP_CATEGORY_EQUIP_ARMOR; break; case eITEMTYPE_PROTECTOR: category_index = SHOP_CATEGORY_EQUIP_PROTECTOR; break; case eITEMTYPE_HELMET: category_index = SHOP_CATEGORY_EQUIP_HELMET; break; case eITEMTYPE_PANTS: category_index = SHOP_CATEGORY_EQUIP_PANTS; break; case eITEMTYPE_BOOTS: category_index = SHOP_CATEGORY_EQUIP_BOOTS; break; case eITEMTYPE_GLOVE: category_index = SHOP_CATEGORY_EQUIP_GLOVES; break; case eITEMTYPE_BELT: category_index = SHOP_CATEGORY_EQUIP_BELT; break; case eITEMTYPE_SHIRTS: category_index = SHOP_CATEGORY_EQUIP_SHIRTS; break; case eITEMTYPE_TWOHANDAXE: case eITEMTYPE_TWOHANDSWORD: case eITEMTYPE_ONEHANDSWORD: case eITEMTYPE_SPEAR: case eITEMTYPE_DAGGER: case eITEMTYPE_WHIP: case eITEMTYPE_ONEHANDCROSSBOW: case eITEMTYPE_ETHERWEAPON: case eITEMTYPE_SCIMITAR: case eITEMTYPE_STAFF: case eITEMTYPE_ORB: case eITEMTYPE_FISHING_POLE: case eITEMTYPE_PUNCH: case eITEMTYPE_GUNTLET: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC case eITEMTYPE_POLEARM: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC #ifdef _NA_000000_20130812_NEW_CHARACTER_HELLROID case eITEMTYPE_HELLROID_1: case eITEMTYPE_HELLROID_2: #endif //_NA_000000_20130812_NEW_CHARACTER_HELLROID #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE case eITEMTYPE_ARCBLADE: #endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE category_index = SHOP_CATEGORY_EQUIP_WEAPON; break; // Å»°Í case eITEMTYPE_RIDER: category_index = SHOP_CATEGORY_VEHICLE; break; case eITEMTYPE_RIDER_PARTS: { switch (item_info->m_wEqPos) { case eRIDER_PARTS_POS::HeadPart: category_index = SHOP_CATEGORY_VEHICLE_HEAD; break; case eRIDER_PARTS_POS::BodyPart: category_index = SHOP_CATEGORY_VEHICLE_BODY; break; case eRIDER_PARTS_POS::LegsPart: category_index = SHOP_CATEGORY_VEHICLE_LEGS; break; } } break; // Æê case eITEMTYPE_PET: category_index = SHOP_CATEGORY_PET; break; case eITEMTYPE_PET_FEED: category_index = SHOP_CATEGORY_PET_FEED; break; // ¾ÆÀÌÅÛ default: category_index = SHOP_CATEGORY_ITEM_ALL; break; } return category_index; } uint ShopItemBuilder::get_skin_category(BASE_ITEMINFO* item_info) { uint category_index = SHOP_CATEGORY_SKIN_ALL; switch (item_info->m_wType) { // Àåºñ case eITEMTYPE_ARMOR: category_index = SHOP_CATEGORY_SKIN_ARMOR; break; case eITEMTYPE_PROTECTOR: category_index = SHOP_CATEGORY_SKIN_PROTECTOR; break; case eITEMTYPE_HELMET: category_index = SHOP_CATEGORY_SKIN_HELMET; break; case eITEMTYPE_PANTS: category_index = SHOP_CATEGORY_SKIN_PENTS; break; case eITEMTYPE_BOOTS: category_index = SHOP_CATEGORY_SKIN_BOOTS; break; case eITEMTYPE_GLOVE: category_index = SHOP_CATEGORY_SKIN_GLOVES; break; case eITEMTYPE_BELT: category_index = SHOP_CATEGORY_SKIN_BELT; break; case eITEMTYPE_SHIRTS: category_index = SHOP_CATEGORY_SKIN_SHIRTS; break; case eITEMTYPE_TWOHANDAXE: case eITEMTYPE_TWOHANDSWORD: case eITEMTYPE_ONEHANDSWORD: case eITEMTYPE_SPEAR: case eITEMTYPE_DAGGER: case eITEMTYPE_WHIP: case eITEMTYPE_ONEHANDCROSSBOW: case eITEMTYPE_ETHERWEAPON: case eITEMTYPE_SCIMITAR: case eITEMTYPE_STAFF: case eITEMTYPE_ORB: case eITEMTYPE_FISHING_POLE: case eITEMTYPE_PUNCH: case eITEMTYPE_GUNTLET: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC case eITEMTYPE_POLEARM: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC #ifdef _NA_000000_20130812_NEW_CHARACTER_HELLROID case eITEMTYPE_HELLROID_1: case eITEMTYPE_HELLROID_2: #endif //_NA_000000_20130812_NEW_CHARACTER_HELLROID #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE case eITEMTYPE_ARCBLADE: #endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE category_index = SHOP_CATEGORY_SKIN_WEAPON; break; case eITEMTYPE_PET: category_index = SHOP_CATEGORY_PET_SKIN; break; } return category_index; } void ShopItemBuilder::ClearAll() { ASSERT(shop_manager_); index_generator_.clear(); } } //namespace GameShop #endif // _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING #endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL