#include "Stdafx.h" #include "VendorPage.h" #include "VendorPageManager.h" #include "VendorSlotContainer.h" #include ".\Player.h" #include "GameZone.h" VendorPage::VendorPage() { } VendorPage::~VendorPage() { } void VendorPage::CreatePage(Player * pOnlooker) { m_SearchContainerVector.reserve(COUNT_SEARCH_CONTAINER_INIT); m_byCountAllPage = 0; m_byCountListInPage = 0; m_pOnlooker = pOnlooker; InitPage(); InitSearchVec(); } void VendorPage::DestoryPage() { m_pOnlooker = NULL; } void VendorPage::InitPage() { for(int i = 0 ; i < COUNT_VENDOR_IN_PAGE; i++) m_VendorContainerArray[i] = NULL; } void VendorPage::InitSearchVec() { m_SearchContainerVector.resize(0); m_PatternLength = 0; memset(m_Pattern, 0, MAX_VENDOR_SEARCH_LENGTH+1); memset(m_PatternFail, 0, MAX_VENDOR_SEARCH_LENGTH+1); } BOOL VendorPage::SetPage(eVENDOR_LIST_PAGE_KIND ekind, BYTE page, ZONEKEY zonekey) { switch(ekind) { case PAGE_REQUIRE_KIND_ALL: m_eSearchedKind = PAGE_REQUIRE_KIND_ALL; return MakePageInAll(page, zonekey); break; case PAGE_REQUIRE_KIND_TITLE: case PAGE_REQUIRE_KIND_ID: #ifdef _NA_0_20091208_VENDOR_ITEM_SEARCH case PAGE_REQUIRE_KIND_ITEM: #endif //_NA_0_20091208_VENDOR_ITEM_SEARCH if(ekind != m_eSearchedKind) return FALSE; return MakePageInSearch(page); break; default: SUNLOG( eCRITICAL_LOG, "Require wrong PAGE_KIND(SetPage) [%d]", ekind); return FALSE; break; } } BOOL VendorPage::GetVendorListTotalInfo(VENDOR_LIST_TOTAL_INFO& vendor_list_total_info) const { BYTE vendor_list_index = 0; for (BYTE i = 0 ; i < m_byCountListInPage; ++i) { VendorSlotContainer* const vendor_container = m_VendorContainerArray[i]; if (vendor_container == NULL) { return FALSE; } const Player* const establisher = vendor_container->GetEstablisher(); if (establisher == NULL) { continue; } VENDOR_LIST_INFO& vendor_list_info = vendor_list_total_info.m_List[vendor_list_index]; _tcsncpy( vendor_list_info.m_pszTitle, vendor_container->GetTitle(), MAX_VENDOR_TITLE_LENGTH); CHECK_ID_LENGTH_BUFFER(vendor_list_info.m_pszID); _tcsncpy( vendor_list_info.m_pszID, establisher->GetCharName(), _countof(vendor_list_info.m_pszID)); vendor_list_info.m_pszID[_countof(vendor_list_info.m_pszID) - 1] = '\0'; vendor_list_info.m_dwPlayerKey = establisher->GetObjectKey(); ++vendor_list_index; } vendor_list_total_info.m_AllPage = m_byCountAllPage; vendor_list_total_info.m_Count = vendor_list_index; return TRUE; } #ifdef _NA_0_20091208_VENDOR_ITEM_SEARCH BOOL VendorPage::Search(eVENDOR_LIST_PAGE_KIND ekind, const TCHAR* pat, ZONEKEY zonekey, SLOTCODE ItemCode) #else //_NA_0_20091208_VENDOR_ITEM_SEARCH BOOL VendorPage::Search(eVENDOR_LIST_PAGE_KIND ekind, const TCHAR* pat, ZONEKEY zonekey) #endif //_NA_0_20091208_VENDOR_ITEM_SEARCH { InitSearchVec(); _tcsncpy(m_Pattern, pat, MAX_VENDOR_SEARCH_LENGTH); m_Pattern[MAX_VENDOR_SEARCH_LENGTH] = '\0'; m_PatternLength = _tcslen(m_Pattern); //½ÇÆÐÇÔ¼ö ÀÛ¼º CalFailFuction(); switch(ekind) { case PAGE_REQUIRE_KIND_TITLE: SearchTitle(zonekey); return TRUE; break; case PAGE_REQUIRE_KIND_ID: SearchID(zonekey); return TRUE; break; #ifdef _NA_0_20091208_VENDOR_ITEM_SEARCH case PAGE_REQUIRE_KIND_ITEM: SearchItem(zonekey, ItemCode); return TRUE; break; #endif //_NA_0_20091208_VENDOR_ITEM_SEARCH default: SUNLOG( eCRITICAL_LOG, "Require wrong PAGE_KIND(SetPage) [%d]", ekind); return FALSE; break; } } BOOL VendorPage::MakePageInAll(BYTE byPage, ZONEKEY zonekey) { //Vendor ¸Å´ÏÁ®·Î ºÎÅÍ ¸®½ºÆ® °¡Á®¿È VENDOR_SLOT_CONTAINER_LIST& VendorList = g_VendorPageManager.GetVondorContainerList(zonekey); DWORD VendorListSize = (DWORD)VendorList.size(); //ÆäÀÌÁö¿¡ ³ÖÀ» ¸®½ºÆ®°¡ ¾øÀ½ if(VendorListSize == 0) { m_byCountAllPage = 0; m_byCountListInPage = 0; return FALSE; } //ÆäÀÌÁö ºñ¿ò InitPage(); //ÃÑ ¸î ÆäÀÌÁöÀÎÁö °è»ê if( (VendorListSize / COUNT_VENDOR_IN_PAGE) > 255) return FALSE; m_byCountAllPage = (BYTE)( ((VendorListSize - 1) / COUNT_VENDOR_IN_PAGE ) + 1); //¿äûÆäÀÌÁö°¡ ÃÑ ÆäÀÌÁö º¸´Ù Å©¸é Á© ³¡ ÆäÀÌÁö Àü¼Û if(byPage > m_byCountAllPage) byPage = m_byCountAllPage; m_byCountListInPage = 0; DWORD dwCount = 0; VENDOR_SLOT_CONTAINER_LIST_IT it = VendorList.begin(); while(it != VendorList.end()) { //ÆäÀÌÁö°¡ ¿äûº¸´Ù ÀÛÀ¸¸é skip if(dwCount < (DWORD)((byPage - 1) * COUNT_VENDOR_IN_PAGE)) { dwCount++; it++; continue; } //ÆäÀÌÁö°¡ ¿äûº¸´Ù Å©¸é ¸ØÃßÀÚ if(dwCount >= (DWORD)((byPage * COUNT_VENDOR_IN_PAGE))) { break; } //»ðÀÔ m_VendorContainerArray[m_byCountListInPage] = (*it); m_byCountListInPage++; dwCount++; it++; } return TRUE; } BOOL VendorPage::MakePageInSearch(BYTE byPage) { DWORD VendorSearchListSize = (DWORD)m_SearchContainerVector.size(); if(VendorSearchListSize == 0) { m_byCountAllPage = 0; m_byCountListInPage = 0; return FALSE; } //ÆäÀÌÁö ºñ¿ò InitPage(); //ÃÑ ¸î ÆäÀÌÁöÀÎÁö °è»ê if( (VendorSearchListSize / COUNT_VENDOR_IN_PAGE) > 255) return FALSE; m_byCountAllPage = (BYTE)( ((VendorSearchListSize - 1) / COUNT_VENDOR_IN_PAGE ) + 1); if(byPage > m_byCountAllPage) return FALSE; m_byCountListInPage = 0; for(DWORD i = (byPage - 1) * COUNT_VENDOR_IN_PAGE ; i < ( (VendorSearchListSize < DWORD(byPage * COUNT_VENDOR_IN_PAGE)) ? VendorSearchListSize : DWORD(byPage * COUNT_VENDOR_IN_PAGE) ) ; i++ ) { m_VendorContainerArray[m_byCountListInPage] = m_SearchContainerVector[i]; m_byCountListInPage++; } return TRUE; } void VendorPage::SearchTitle(ZONEKEY zonekey) { m_eSearchedKind = PAGE_REQUIRE_KIND_TITLE; //°Ë»öÇØ¼­ ÆÐÅÏÀÌ ÀÖÀ¸¸é Ãß°¡ VENDOR_SLOT_CONTAINER_LIST& VendorList = g_VendorPageManager.GetVondorContainerList(zonekey); VENDOR_SLOT_CONTAINER_LIST_IT it = VendorList.begin(); while(it != VendorList.end()) { if(IsIncludePattern((*it)->GetTitle())) m_SearchContainerVector.push_back((*it)); it++; } } void VendorPage::SearchID(ZONEKEY zonekey) { m_eSearchedKind = PAGE_REQUIRE_KIND_ID; //°Ë»öÇØ¼­ ÆÐÅÏÀÌ ÀÖÀ¸¸é Ãß°¡ VENDOR_SLOT_CONTAINER_LIST& vendor_list = g_VendorPageManager.GetVondorContainerList(zonekey); VENDOR_SLOT_CONTAINER_LIST::const_iterator it = vendor_list.begin(); while (it != vendor_list.end()) { VendorSlotContainer* const vendor_conationer = *it; if (vendor_conationer != NULL) { const Player* const establisher = vendor_conationer->GetEstablisher(); if (establisher != NULL) { if (IsIncludePattern(establisher->GetCharName())) { m_SearchContainerVector.push_back(vendor_conationer); } } } ++it; } } #ifdef _NA_0_20091208_VENDOR_ITEM_SEARCH void VendorPage::SearchItem(ZONEKEY zonekey, SLOTCODE ItemCode) { m_eSearchedKind = PAGE_REQUIRE_KIND_ITEM; //°Ë»öÇØ¼­ ÆÐÅÏÀÌ ÀÖÀ¸¸é Ãß°¡ VENDOR_SLOT_CONTAINER_LIST& VendorList = g_VendorPageManager.GetVondorContainerList(zonekey); VENDOR_SLOT_CONTAINER_LIST_IT it = VendorList.begin(); while(it != VendorList.end()) { if((*it)->HasItem(ItemCode)) m_SearchContainerVector.push_back((*it)); it++; } } #endif //_NA_0_20091208_VENDOR_ITEM_SEARCH void VendorPage::CalFailFuction() { m_PatternFail[0] = -1; for(int j = 1; j < m_PatternLength; j++) { int i = m_PatternFail[j-1]; while((m_Pattern[j] != m_Pattern[i+1]) && (i >= 0)) i=m_PatternFail[i]; if(m_Pattern[j] == m_Pattern[i+1]) m_PatternFail[j] = i+1; else m_PatternFail[j] = -1; } } BOOL VendorPage::IsIncludePattern(const TCHAR* str) { DWORD PosP = 0, PosS = 0; int LengthS = _tcslen(str); while( (PosP < m_PatternLength) && (PosS < (DWORD)LengthS)) { if(m_Pattern[PosP] == str[PosS]) { PosP++; PosS++; } else { if(PosP == 0) PosS++; else PosP = m_PatternFail[PosP-1]+1; } } if(PosP