Files
Sun1602/Client/GameClient/Interface/uiGMWindowMan/uiGMWindowMan.cpp
T
2022-10-26 12:25:11 +08:00

664 lines
19 KiB
C++

#include "SunClientPrecompiledHeader.h"
#ifdef _DEV_VER
#include "uiGMWindowMan/uiGMWindowMan.h"
#include "uiGMItemWindow/uiGMItemWindow.h"
#include "uiGMItemOptionWindow/uiGMItemOptionWindow.h"
#include "uiGMItemResetWindow/uiGMItemResetWindow.h"
#include "uiGMItemMenuWindow/uiGMItemMenuWindow.h"
#ifdef _DH_GM_NPC_WINDOW
#include "uiGMNpcWindow/uiGMNpcWindow.h"
#endif//_DH_GM_NPC_WINDOW
#include "interfacemanager.h"
#include "GlobalFunc.h"
#include "ChatDialog.h"
#include "uiChatMan/uiChatMan_def.h"
const DWORD IM_GM_WINDOW_MANAGER::GM_ITEM_WINDOW = g_IDGenerator.GenerateID();
const DWORD IM_GM_WINDOW_MANAGER::GM_ITEM_OPTION_WINDOW = g_IDGenerator.GenerateID();
const DWORD IM_GM_WINDOW_MANAGER::GM_ITEM_RESET_WINDOW = g_IDGenerator.GenerateID();
const DWORD IM_GM_WINDOW_MANAGER::GM_ITEM_MENU_WINDOW = g_IDGenerator.GenerateID();
#ifdef _DH_GM_NPC_WINDOW
const DWORD IM_GM_WINDOW_MANAGER::GM_ITEM_NPC_WINDOW = g_IDGenerator.GenerateID();
#endif//_DH_GM_NPC_WINDOW
#ifdef _NA_002884_AC_DIALOG_RENEWAL
const char c_strDlgFname_GMItemWindow[] = ("Data\\Interface\\92_3_AC.iwz");
#else
const char c_strDlgFname_GMItemWindow[] = ("Data\\Interface\\92_1_AC.iwz");
#endif //_NA_002884_AC_DIALOG_RENEWAL
const char c_strDlgFname_GMItemOptionWindow[] = ("Data\\Interface\\3_6_Character_Create_Left.iwz");
const char c_strDlgFname_GMItemResetWindow[] = ("Data\\Interface\\27_1_Personal_Option.iwz");
const char c_strDlgFname_GMItemMenuWindow[] = ("Data\\Interface\\27_1_Personal_Option.iwz");
const char c_strDlgFname_GMNpcWindow[] = ("Data\\Interface\\61_2_BattleZone_List_new.iwz");
TCHAR* parser_string[uiGMWindowMan::kParser_Unknown] = {"Data", "[OPTION]\n", "[HISTORYMAX]\n", "[BOOKMARKMAX]\n",
"[STATE]\n", "[HISTORY]\n", "[BOOKMARK]\n", "[FINDWORD]\n" };
uiGMWindowMan::uiGMWindowMan(InterfaceManager *pUIMan):
uiBaseMan(pUIMan)
{
ui_gm_item_window_ = NULL;
ui_gm_item_option_window_ = NULL;
ui_gm_item_reset_window_ = NULL;
ui_gm_item_menu_window_ = NULL;
#ifdef _DH_GM_NPC_WINDOW
ui_gm_npc_window_ = NULL;
#endif//_DH_GM_NPC_WINDOW
}
uiGMWindowMan::~uiGMWindowMan(void)
{
FILE* file_ptr = fopen("C:\\GMItem.dat", "w+");
SaveData(file_ptr);
if (file_ptr)
{
fclose(file_ptr);
}
//Release();
}
//------------------------------------------------------------------------------
/**
*/
void uiGMWindowMan::OnInitialize()
{
LoadItemData();
// GM 아이템 시작
ui_gm_item_window_ = CreateUIDialog<uiGMItemWindow>(IM_GM_WINDOW_MANAGER::GM_ITEM_WINDOW,
c_strDlgFname_GMItemWindow, this, TRUE, TRUE);
assert(ui_gm_item_window_);
ui_gm_item_option_window_ = CreateUIDialog<uiGMItemOptionWindow>(IM_GM_WINDOW_MANAGER::GM_ITEM_OPTION_WINDOW,
c_strDlgFname_GMItemOptionWindow, this, TRUE, TRUE);
assert(ui_gm_item_option_window_);
ui_gm_item_reset_window_ = CreateUIDialog<uiGMItemResetWindow>(IM_GM_WINDOW_MANAGER::GM_ITEM_RESET_WINDOW,
c_strDlgFname_GMItemResetWindow, this, TRUE, TRUE);
assert(ui_gm_item_reset_window_);
ui_gm_item_menu_window_ = CreateUIDialog<uiGMItemMenuWindow>(IM_GM_WINDOW_MANAGER::GM_ITEM_MENU_WINDOW,
c_strDlgFname_GMItemMenuWindow, this, TRUE, TRUE);
assert(ui_gm_item_menu_window_);
#ifdef _DH_GM_NPC_WINDOW
// GM NPC 시작
ui_gm_npc_window_ = CreateUIDialog<uiGMNpcWindow>(IM_GM_WINDOW_MANAGER::GM_ITEM_NPC_WINDOW,
c_strDlgFname_GMNpcWindow, this, TRUE, TRUE);
assert(ui_gm_npc_window_);
#endif//_DH_GM_NPC_WINDOW
}
void uiGMWindowMan::ResetItemParametas()
{
item_parametas_.item_code = 0;
item_parametas_.item_count = 0;
item_parametas_.overlapping = true;
item_parametas_.item_type = ITEM_TYPE_NORMAL;
item_parametas_.enchant_level = 0;
item_parametas_.socket_count = 0;
item_parametas_.filter_main = FILTER_ALL;
item_parametas_.class_type = eCHAR_NONE;
for (int i = 0; i < FILTER_MAX; ++i)
{
item_parametas_.filter_subs[i] = 0;
}
}
void uiGMWindowMan::LoadItemData()
{
history_max_ = kDefault_History_Max;
find_word_max_ = kFind_Word_Max;
bookmark_max_ = kBookmark_Max;
ResetItemParametas();
TCHAR string_buffer[INTERFACE_STRING_LENGTH] = {0,};
FILE* gm_item_file_ptr = fopen("C:\\GMItem.dat", "r");
BYTE parser_type = kParser_Unknown;
BYTE current_parser_type = kParser_Unknown;
if (gm_item_file_ptr != NULL)
{
while (fgets(string_buffer, INTERFACE_STRING_LENGTH, gm_item_file_ptr) != NULL)
{
parser_type = GMItemOptionParserType(string_buffer);
if (parser_type == kParser_NoParser)
{
PushItemOptionData(current_parser_type, string_buffer);
}
else
{
current_parser_type = parser_type;
}
}
fclose(gm_item_file_ptr);
}
}
void uiGMWindowMan::PushItemOptionData(BYTE parser_type, TCHAR* string_buffer)
{
DWORD number = atoi(string_buffer);
switch (parser_type)
{
case kParser_Option:
sscanf(string_buffer, "%d %d %d %d %d", &item_parametas_.item_count, &item_parametas_.overlapping,
&item_parametas_.item_type, &item_parametas_.enchant_level, &item_parametas_.socket_count);
break;
case kParser_HistoryMax:
history_max_ = number;
break;
case kParser_BookMarkMax:
bookmark_max_ = number;
break;
case kParser_Sate:
item_window_state_ = static_cast<BYTE>(number);
break;
case kParser_History:
if (number != 0)
{
created_histroys_.push_back(number);// 중복체크 없이 다이렉트로 넣는다.
}
break;
case kParser_BookMark:
if (number != 0)
{
bookmark_lists_.push_back(number);// 중복체크 없이 다이렉트로 넣는다.
}
break;
case kParser_FindWord:
find_words_.push_back(string_buffer);
break;
default:
break;
}
}
void uiGMWindowMan::SaveData(FILE* file_ptr)
{
if (file_ptr == NULL)
{
return;
}
DWORD data = 0;
// 옵션 저장
fprintf(file_ptr, "%s", parser_string[kParser_Option]);
fprintf(file_ptr, "%d %d %d %d %d\n", item_parametas_.socket_count, item_parametas_.overlapping,
item_parametas_.item_type, item_parametas_.enchant_level, item_parametas_.socket_count);
// 히스토리 최대값 저장
fprintf(file_ptr, "%s", parser_string[kParser_HistoryMax]);
fprintf(file_ptr, "%d\n", history_max_);
// 즐겨찾기 최대값 저장
fprintf(file_ptr, "%s", parser_string[kParser_BookMarkMax]);
fprintf(file_ptr, "%d\n", bookmark_max_);
// 상태 저장
// ...
std::vector<DWORD>::iterator iter = created_histroys_.begin();
std::vector<DWORD>::iterator iter_end = created_histroys_.end();
// 히스토리 저장
fprintf(file_ptr, "%s", parser_string[kParser_History]);
size_t histroy_size = created_histroys_.size();
DWORD count = 0;
if (histroy_size > history_max_) //히스토리는 최근 50건(history_max_)만큼만 저장
{
count = histroy_size - history_max_;//시작값을 설정
}
for (DWORD i = count; i < histroy_size; ++i)
{
fprintf(file_ptr, "%d\n", created_histroys_[i]); // 데이터 저장
}
iter = bookmark_lists_.begin();
iter_end = bookmark_lists_.end();
// 즐겨찾기 저장
fprintf(file_ptr, "%s", parser_string[kParser_BookMark]);
while (iter != iter_end)
{
data = (*iter);
fprintf(file_ptr, "%d\n", data); // 데이터 저장
++iter;
}
// 검색어 저장: 일단 기능 제거 사용안함(문제가 있음)
/*std::vector<std::string>::iterator iter_str = find_words_.begin();
std::vector<std::string>::iterator iter_str_end = find_words_.end();
std::string string;
fprintf(file_ptr, "%s", parser_string[kParser_FindWord]);
while (iter_str != iter_str_end)
{
string = (*iter_str);
fprintf(file_ptr, "%s", string.c_str()); // 데이터 저장
++iter_str;
}*/
}
BYTE uiGMWindowMan::GMItemOptionParserType(TCHAR *string_buffer)
{
BYTE parser_type = kParser_Unknown;
// 파싱스테이트에 따라서 다르게 넣기
if (string_buffer[0] == '[') // 옵션 구문인가?
{
for (int i = kParser_Option; i < kParser_Unknown; ++i)
{
if (strcmp(string_buffer, parser_string[i]) == 0)
{
parser_type = i;
break;
}
}
}
else
{
parser_type = kParser_NoParser; // 파서가 아님
}
return parser_type;
}
uiBase* uiGMWindowMan::GetGMWindow(DWORD gm_window_id)
{
uiBase* ui_gm_window_ptr = NULL;
switch(gm_window_id)
{
case UI_GM_ITEM_WINDOW:// GM 아이템 윈도우
ui_gm_window_ptr = (uiBase*) ui_gm_item_window_;
break;
case UI_GM_ITEM_OPTION_WINDOW:// GM 아이템 옵션 윈도우
ui_gm_window_ptr = (uiBase*) ui_gm_item_option_window_;
break;
case UI_GM_ITEM_RESET_WINDOW:// GM 아이템 초기화 윈도우
ui_gm_window_ptr = (uiBase*) ui_gm_item_reset_window_;
break;
case UI_GM_ITEM_MENU_WINDOW:// GM 아이템 메뉴 윈도우
ui_gm_window_ptr = (uiBase*) ui_gm_item_menu_window_;
break;
#ifdef _DH_GM_NPC_WINDOW
case UI_GM_ITEM_NPC_WINDOW:// GM 엔피시 윈도우
ui_gm_window_ptr = (uiBase*) ui_gm_npc_window_;
#endif//_DH_GM_NPC_WINDOW
default:
break;
}
return ui_gm_window_ptr;
}
void uiGMWindowMan::ToggleGMWindow(DWORD gm_window_id)
{
uiBase* ui_gm_window_ptr = GetGMWindow(gm_window_id);
if (ui_gm_window_ptr)
{
BOOL is_show = ui_gm_window_ptr->IsVisible();
ui_gm_window_ptr->ShowInterface((is_show != TRUE));
}
}
bool uiGMWindowMan::IsShowGMWindow(DWORD gm_window_id)
{
uiBase* ui_gm_window_ptr = GetGMWindow(gm_window_id);
bool is_show = false;
if (ui_gm_window_ptr)
{
is_show = (ui_gm_window_ptr->IsVisible() == TRUE);
}
return is_show;
}
void uiGMWindowMan::ShowGMWindow(DWORD gm_window_id, bool value)
{
uiBase* ui_gm_window_ptr = GetGMWindow(gm_window_id);
if (ui_gm_window_ptr)
{
ui_gm_window_ptr->ShowInterface(value?TRUE:FALSE);
}
}
void uiGMWindowMan::SetCaptionFilter()
{
TCHAR caption_string[128] = {0,};
if (ui_gm_item_option_window_)
{
ui_gm_item_option_window_->SetCaptionSubFilter(caption_string);
}
if (ui_gm_item_window_)
{
if (ui_gm_item_window_)
{
ui_gm_item_window_->SetFilterName(caption_string);
}
}
}
bool uiGMWindowMan::IsSearching()
{
if (ui_gm_item_window_)
{
return !(ui_gm_item_window_->search_end());
}
return false;
}
void uiGMWindowMan::SetSearchEnd()
{
if (ui_gm_item_option_window_)
{
ui_gm_item_option_window_->SetSearch(false);
}
}
RECT uiGMWindowMan::GetResetWindowPosition(RECT *control_rect)
{
if (ui_gm_item_option_window_)
{
ui_gm_item_option_window_->GetResetControlPosition(control_rect);
}
return (*control_rect);
}
ITEM_PARAMETAS* uiGMWindowMan::GetItemOption()
{
ITEM_PARAMETAS* item_parameta = NULL;
if (ui_gm_item_option_window_)
{
item_parameta = ui_gm_item_option_window_->item_option_parametas();
}
return item_parameta;
}
void uiGMWindowMan::SetItemOptionParametas(ITEM_PARAMETAS* item_parameta)
{
if (ui_gm_item_option_window_)
{
ui_gm_item_option_window_->SetItemOptionParametas(item_parameta);
}
}
void uiGMWindowMan::SetPopupUpdateMenus(BASE_ITEMINFO *item_info, bool is_bookmark_state)
{
if (ui_gm_item_menu_window_)
{
ui_gm_item_menu_window_->UpdateMenus(item_info, is_bookmark_state);
}
}
void uiGMWindowMan::CreateItemFromParameta(BASE_ITEMINFO *item_info, ITEM_PARAMETAS* item_parameta)
{
if (ui_gm_item_window_)
{
ui_gm_item_window_->CreateItem(item_info, item_parameta);
}
}
void uiGMWindowMan::CreateItemLucky(BASE_ITEMINFO *item_info, ITEM_PARAMETAS* item_parameta, int lucky_expiry)
{
if (ui_gm_item_window_)
{
ui_gm_item_window_->CreateItem(item_info, item_parameta, CREATE_TYPE_LUCKY, lucky_expiry);
}
}
void uiGMWindowMan::CreateLimited(BASE_ITEMINFO *item_info, ITEM_PARAMETAS* item_parameta)
{
if (ui_gm_item_window_)
{
ui_gm_item_window_->CreateItem(item_info, item_parameta, CREATE_TYPE_LIMITED);
}
}
void uiGMWindowMan::CreateItemFromList()
{
if (ui_gm_item_window_)
{
ui_gm_item_window_->CreateItemFromList();
}
}
void uiGMWindowMan::AddFindWord(TCHAR* find_string)
{
bool is_finded = false;
if (find_string == "")
{
return; // 스트링이 없는 경우 추가하지 않는다.
}
else
{
size_t find_list_size = find_words_.size();
for (DWORD i = 0; i < find_list_size; ++i)
{
std::string string = find_words_[i].c_str();
if (string.find(find_string, 0) != -1)
{
is_finded = true;
}
}
if (is_finded == false)
{
if (find_list_size > 0 && find_list_size >= kFind_Word_Max)
{
find_words_.erase(find_words_.begin());
}
find_words_.push_back(find_string);
}
}
}
void uiGMWindowMan::DeleteAllFindWord()
{
find_words_.clear();
TCHAR message[INTERFACE_STRING_LENGTH] = {0,};
sprintf(message, "GMItemWin: 搜索列表已被删除.");
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message, CHAT_TYPE_SYSTEM);
}
int uiGMWindowMan::PreSearchFindWord(TCHAR* find_string)
{
size_t find_list_size = find_words_.size();
active_find_words_.clear();
std::vector<std::string>::iterator iter = find_words_.begin();
int find_count = 0;
for (DWORD i = 0; i < find_list_size; ++i)
{
std::string string = find_words_[i].c_str();
if (string.find(find_string, 0) != -1)
{
active_find_words_.push_back(string.c_str());
++find_count;
if (find_count >= 9)
{
break;
}
}
}
return find_count;
}
const char* uiGMWindowMan::GetActivateFindData(DWORD index)
{
DWORD size = active_find_words_.size();
if (size > 0)
{
return active_find_words_[index].c_str();
}
return NULL;
}
void uiGMWindowMan::AddBookMark(DWORD item_code)
{
DWORD size = bookmark_lists_.size();
bool is_addable = true;
if (size >= bookmark_max_)
{
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "GMItemWin: 无法添加超过收藏限制数.(Warring)", CHAT_TYPE_SYSTEM);
return;
}
std::vector<DWORD>::iterator iter = bookmark_lists_.end();
// 중복체크 모든 경우를 중복체크함
for (DWORD i = 0; i < size; ++i)
{
if (bookmark_lists_[i] == item_code)
{ // 중복됨 추가 안함
is_addable = false;
break;
}
}
if (is_addable == true)
{
bookmark_lists_.push_back(item_code);
BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(item_code);
TCHAR item_name[INTERFACE_STRING_LENGTH] = {0,};
TCHAR buffer_string[INTERFACE_STRING_LENGTH] = {0,};
if (item_info)
{
g_InterfaceManager.GetItemName(item_code, item_name);
sprintf(buffer_string, "GMItemWin: (ID: %d) %s 已添加到收藏夹中.", item_code, item_name);
}
else
{
sprintf(buffer_string, "GMItemWin: (ID: %d) 没有物品信息.", item_code);
}
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, buffer_string, CHAT_TYPE_SYSTEM);
}
else
{
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, "GMItemWin: 已登录到收藏中的物品.(Warring)", CHAT_TYPE_SYSTEM);
}
}
void uiGMWindowMan::DeleteBookMark(DWORD item_code)
{
int size = (int)bookmark_lists_.size();
bool is_deleted = false;
std::vector<DWORD>::iterator iter = bookmark_lists_.begin();
std::vector<DWORD>::iterator iter_end = bookmark_lists_.end();
// 중복체크 모든 경우를 중복체크함
for (int i = 0; i < size; ++i)
{
if (bookmark_lists_[i] == item_code)
{ // 찾았음 삭제
bookmark_lists_.erase(iter);
is_deleted = true;
break;
}
else
{
++iter;
}
}
if (ui_gm_item_window_)
{
DWORD size = bookmark_lists_.size();
ui_gm_item_window_->RefreshList(kState_BookMark, size, size);
}
}
void uiGMWindowMan::DeleteAllHistroys()
{
DWORD size = created_histroys_.size();
created_histroys_.clear();
TCHAR message[INTERFACE_STRING_LENGTH] = {0,};
sprintf(message, "GMItemWin: 历史记录%d已被删除.", size);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message, CHAT_TYPE_SYSTEM);
if (ui_gm_item_window_)
{
ui_gm_item_window_->RefreshList(kState_History, 0, 0);
}
}
void uiGMWindowMan::DeleteAllBookMarks()
{
DWORD size = created_histroys_.size();
bookmark_lists_.clear();
TCHAR message[INTERFACE_STRING_LENGTH] = {0,};
sprintf(message, "GMItemWin: 已删除%d个收藏夹.", size);
GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message, CHAT_TYPE_SYSTEM);
if (ui_gm_item_window_)
{
ui_gm_item_window_->RefreshList(kState_BookMark, 0, 0);
}
}
void uiGMWindowMan::AddHistory(DWORD item_code)
{
int size = (int)created_histroys_.size();
std::vector<DWORD>::iterator iter = created_histroys_.end();
DWORD count = 0;
// 중복체크 최근 50건에 한해서만 중복체크함
for (int i = (size - 1); i >= 0; --i)
{
--iter;
if (created_histroys_[i] == item_code)
{ // 중복됨
created_histroys_.erase(iter);//삭제 후 추가
break;
}
++count;
if (count >= history_max_)
{ // 중복없음
break;
}
}
created_histroys_.push_back(item_code);
if (ui_gm_item_window_)
{
DWORD size = created_histroys_.size();
ui_gm_item_window_->RefreshList(kState_History, size, size);
}
}
DWORD uiGMWindowMan::GetLastMakeItemCode()
{
if (ui_gm_item_window_)
{
return ui_gm_item_window_->last_make_item_code();
}
return 0;
}
void uiGMWindowMan::SetItemParametas(ITEM_PARAMETAS* item_parametas)
{
item_parametas_ = *item_parametas;
if (ui_gm_item_window_)
{
ui_gm_item_window_->RefreshItemInfo();
}
}
void uiGMWindowMan::SetItemOptionMakeCaptions(TCHAR *clipboard_string)
{
if (ui_gm_item_option_window_)
{
ui_gm_item_option_window_->SetItemOptionCaptions(PARAM_ITEM_CODE, clipboard_string);
}
}
void uiGMWindowMan::ItemSearch(TCHAR* search_word)
{
if (ui_gm_item_window_)
{
ui_gm_item_window_->ShowInterface(TRUE);
ui_gm_item_window_->ItemSearch(search_word);
}
}
#endif//_DEV_VER