Files
2022-10-26 12:25:11 +08:00

285 lines
7.4 KiB
C++

#include "stdafx.h"
#ifndef _NA_0_20110613_GAME_SHOP_RENEWAL
#include "./ShopCategory.h"
#ifdef _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
#include "./ShopItem.h"
//===============================================================================================
//
// class Category
//
//===============================================================================================
ShopCategory::ShopCategory()
: parent_(NULL)
, category_index_(SHOP_CATEGORY_INVALID)
, allowed_visitors_(true)
, shopitem_count_per_page_(1)
, child_shopitem_changed_count_(0)
{
}
ShopCategory::~ShopCategory()
{
}
void ShopCategory::Initialize(eSHOP_CATEGORY category_index, uint shopitem_count_per_page)
{
parent_ = NULL;
allowed_visitors_ = true;
child_shopitem_changed_count_ = 0;
category_index_ = category_index;
child_category_array_.clear();
child_shopitem_array_.clear();
shopitem_count_per_page_ = shopitem_count_per_page;
}
void ShopCategory::AttachCategory(ShopCategory* child_category)
{
child_category->parent_ = this;
child_category_array_.push_back(child_category);
child_shopitem_change();
}
void ShopCategory::InsertShopItem(ShopItem* shopitem)
{
child_shopitem_array_.push_back(shopitem);
child_shopitem_change();
}
void ShopCategory::RemoveShopItem(ShopItem* shopitem)
{
ShopItemArray::iterator iter = child_shopitem_array_.begin();
for (; iter != child_shopitem_array_.end(); ++iter)
{
if (*iter == shopitem)
{
child_shopitem_array_.erase(iter);
child_shopitem_change();
break;
}
}
}
void ShopCategory::RemoveShopItemAll()
{
child_shopitem_array_.clear();
child_shopitem_change();
}
void ShopCategory::Search(STLX_DEQUE<ShopItem*>& shopitem_array, uint shopitem_filter)
{
if (!child_category_array_.empty())
{
size_t count = child_category_array_.size();
for (uint idx = 0 ; idx < count ; ++idx)
{
if (child_category_array_[idx]->allowed_visitors_)
child_category_array_[idx]->Search(shopitem_array, shopitem_filter);
}
}
uint char_filter = SHOP_FILTER_CHAR_ALL & shopitem_filter;
uint slogan_filter = SHOP_FILTER_SLOGAN_ALL & shopitem_filter;
size_t count = child_shopitem_array_.size();
for (uint idx = 0 ; idx < count ; ++idx)
{
if (!(char_filter & child_shopitem_array_[idx]->GetItemFilter()))
continue;
if (slogan_filter != SHOP_FILTER_NONE)
{
if (slogan_filter != (slogan_filter & child_shopitem_array_[idx]->GetItemFilter()))
continue;
}
shopitem_array.push_back(child_shopitem_array_[idx]);
}
}
void ShopCategory::child_shopitem_change()
{
++child_shopitem_changed_count_;
ShopCategory* parent = parent_;
while(parent)
{
++(parent->child_shopitem_changed_count_);
parent = parent->parent_;
}
}
//==================================================================================================
#else //_NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
//==================================================================================================
#include <ArchiveOfStream.h>
#include "./ShopItem.h"
#include "./ShopManager.h"
ShopCategory::ShopCategory()
: m_Category(CT_ALLITEM)
{
}
ShopCategory::~ShopCategory()
{
}
void ShopCategory::Release()
{
m_Category = CT_ALLITEM;
m_ShopItemList.clear();
}
ShopItem* ShopCategory::FindShopItem(const ITEMGUID guid)
{
SHOPITEM_LIST::iterator it = m_ShopItemList.begin(), end = m_ShopItemList.end();
for (; it != end ; ++it)
{
ShopItem* shop_item = *it;
if (shop_item->GetGuid() == guid) {
return shop_item;
}
}
return NULL;
}
void ShopCategory::RemoveShopItem(ShopItem* pShopItem)
{
SHOPITEM_LIST::iterator it = m_ShopItemList.begin(), end = m_ShopItemList.end();
for (; it != end ;)
{
ShopItem* shop_item = *it;
if (shop_item->GetGuid() == pShopItem->GetGuid())
{
m_ShopItemList.erase(it++);
}
else
++it;
}
}
void ShopCategory::AddShopItem(ShopItem* pShopItem)
{
ASSERT(0 != pShopItem->GetGuid());
#ifdef _DEBUG
SHOPITEM_LIST::iterator it = m_ShopItemList.begin(), end = m_ShopItemList.end();
for (; it != end ; ++it)
{
ShopItem* shop_item = *it;
ASSERT(shop_item != pShopItem);
ASSERT(shop_item->GetGuid() != pShopItem->GetGuid());
if (shop_item == pShopItem ||
shop_item->GetGuid() == pShopItem->GetGuid()) return;
}
#endif
m_ShopItemList.push_back(pShopItem);
}
void ShopCategory::Serialize(ShopManager& mgr IN, BYTE page, ArchiveOfStream& ar, eSHOP_SERIALIZE se)
{
switch(se)
{
case eSHOP_SERIALIZE_ITEM_LIST_SAVE:
{
// 카테고리 반드시 존재
BYTE Count=0;
ITEMGUID Guid = 0;
ar >> Count;
for (BYTE i = 0 ; i < Count ; ++i)
{
ar >> Guid;
ShopItem* pShopItem = mgr.FindShopItem(Guid);
if (!pShopItem)
{
pShopItem = mgr.CreateShopItem(GetSeperateType());
pShopItem->Release();
ShopItem::ShopItemData* shop_item_data = pShopItem->GetEditableShopItemData();
shop_item_data->item_guid_ = Guid;
shop_item_data->category_ = static_cast<uint8_t>(GetCategory());
mgr.AddShopItem(pShopItem);
}
this->AddShopItem(pShopItem);
pShopItem->Serialize(mgr, ar, se);
}
}break;
case eSHOP_SERIALIZE_ITEM_LIST_LOAD:
{
// 페이지 처리 필요
int StartRecordIndex = page* GetItemNumPerPage();
int EndRecordIndex = StartRecordIndex + GetItemNumPerPage();
if ((int)m_ShopItemList.size() > StartRecordIndex)
{
if ((int)m_ShopItemList.size() >= EndRecordIndex)
ar << (BYTE)(GetItemNumPerPage());
else
ar << (BYTE)(m_ShopItemList.size() - StartRecordIndex);
}
else
{
ar << (BYTE)(0);
return;
}
int Index = 0;
SHOPITEM_LIST::iterator it = m_ShopItemList.begin(), end = m_ShopItemList.end();
for (; it != end && Index < EndRecordIndex ; ++it, ++Index)
{
ShopItem* pItem = (*it);
if (StartRecordIndex <= Index)
{
int ReserveSize = ar.GetBufferSize() - ar.GetSize();
int ItemMaxSize = pItem->GetType() == ShopItem::SINGLE
? sizeof(SingleItem) : sizeof(PackageItem);
if (ReserveSize < ItemMaxSize)
break;
pItem->Serialize(mgr, ar, se);
}
}
}break;
}
}
void ShopCategory::Display()
{
std::cout << "[Category:" << m_Category << "]-------------------------------------------------------------------" << std::endl;
SHOPITEM_LIST::iterator it = m_ShopItemList.begin(), end = m_ShopItemList.end();
for (; it != end ; ++it)
{
(*it)->Display();
}
}
#endif // _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
#endif // not defined _NA_0_20110613_GAME_SHOP_RENEWAL