#include "SunClientPrecompiledHeader.h" #include "uiCharacterSelectList.h" #include "uiCharacterSelectMan/uiCharacterSelectMan.h" #include "uiLoginBack/uiLoginBackTop.h" #include "uiLoginMan/uiLoginMan.h" #include "CharacterScene.h" #include "InterfaceManager.h" #include "FTextParser.h" #include "FTextRender.h" #include "MapInfoParser.h" #include "GlobalFunc.h" #include "CharSelectDialog.h" #include "objectmanager.h" #include "Player.h" namespace { const WzID kCharacterNameFont = StrToWzID("mn12"); const WzID kLevelFont = StrToWzID("mn12"); const WzID kCurrentMapNameFont = StrToWzID("mn12"); const DWORD kCharacterNameColor = WzColor_RGBA(255, 255, 255, 255); const DWORD kLevelColor = WzColor_RGBA(255, 199, 4, 255); const DWORD kCurrentMapNameColor = WzColor_RGBA(160, 160, 160, 255); const DWORD kCloseSlotColor = WzColor_RGBA(255, 0, 0, 200); const int kListLeftMargin = 10; }; uiCharacterSelectList::uiCharacterSelectList(InterfaceManager* ui_manager): uiBase(ui_manager) { } uiCharacterSelectList::~uiCharacterSelectList() { } void uiCharacterSelectList::Init(CDrawBase* draw_base) { uiBase::Init(draw_base); RegisterControl(); } void uiCharacterSelectList::RegisterControl() { RegisterControlPosition(StrToWzID("C000"), kControl_CheckBT_C000);//ij¸¯Åͽ½·Ô1 RegisterControlPosition(StrToWzID("C001"), kControl_CheckBT_C001); RegisterControlPosition(StrToWzID("C002"), kControl_CheckBT_C002); RegisterControlPosition(StrToWzID("C003"), kControl_CheckBT_C003); RegisterControlPosition(StrToWzID("C004"), kControl_CheckBT_C004); RegisterControlPosition(StrToWzID("C005"), kControl_CheckBT_C005); RegisterControlPosition(StrToWzID("C006"), kControl_CheckBT_C006); RegisterControlPosition(StrToWzID("C007"), kControl_CheckBT_C007); RegisterControlPosition(StrToWzID("C008"), kControl_CheckBT_C008); RegisterControlPosition(StrToWzID("C009"), kControl_CheckBT_C009);//ij¸¯Åͽ½·Ô10 } void uiCharacterSelectList::Release() { } void uiCharacterSelectList::MessageProc( SI_MESSAGE * message ) { if (IsLock()) return; if (g_CharSelectScene.m_bPickCharLock == TRUE) { return; } static bool is_double_click = false; switch (message->eResultMsg) { case RT_MSG_LBUTTONCLICK: { if (is_double_click == true) { is_double_click = false; } else { OnLButtonClick(message); } } break; case RT_MSG_LBUTTONDCLICK: OnLButtonDClick(message); is_double_click = true; break; default: SolarDialog::MessageProc(message); break; } } void uiCharacterSelectList::OnShowWindow(BOOL val) { if (val) { SetServerName(); CharacterListUp(); } else { } } void uiCharacterSelectList::OnRenderSolarDialog() { for (int slot_index = 0; slot_index < kMaxListSlot; ++slot_index) { character_info_text_[slot_index].Render(); } } void uiCharacterSelectList::OnUpdateSolarDialog() { CDialogWZ* dialog_ptr = GetDialogWZ(); if (dialog_ptr != NULL) { RECT enable_rect = dialog_ptr->GetClientWZ()->GetSizeRect();; BYTE mouse_wheel_state = GetMouseWheelStatus(&enable_rect); if ((mouse_wheel_state == MOUSE_WHEEL_UP) || g_Input.GetState(DIK_UP, KS_UP) || g_Input.GetState(DIK_LEFT, KS_UP)) { OnSelectPrevCharacter(); } else if ((mouse_wheel_state == MOUSE_WHEEL_DOWN) || g_Input.GetState(DIK_DOWN, KS_UP) || g_Input.GetState(DIK_RIGHT, KS_UP)) { OnSelectNextCharacter(); } } } bool uiCharacterSelectList::OnLButtonClick( SI_MESSAGE* message ) { bool result = true; DWORD control_position = GetControlPosition_byID(message->dwCtrlID); switch (control_position) { case kControl_CheckBT_C000: case kControl_CheckBT_C001: case kControl_CheckBT_C002: case kControl_CheckBT_C003: case kControl_CheckBT_C004: case kControl_CheckBT_C005: case kControl_CheckBT_C006: case kControl_CheckBT_C007: case kControl_CheckBT_C008: case kControl_CheckBT_C009: { SetSelectedCharacterListIndex(control_position - kControl_CheckBT_C000); } break; default: break; } return result; } bool uiCharacterSelectList::OnLButtonDClick( SI_MESSAGE* message ) { BYTE make_and_makeable_slot = g_CharSelectScene.GetCharacterSlotNumber(); BYTE list_slot_size = character_slot_list_.size(); bool result = true; DWORD control_position = GetControlPosition_byID(message->dwCtrlID); if (list_slot_size <= control_position && make_and_makeable_slot > control_position) { CharSelectDialog* charater_select_dialog = GET_CAST_DIALOG(CharSelectDialog, IM_CHARACTERSELECT_MANAGER::CHARACTER_SELECT_DIALOG); if (charater_select_dialog) { charater_select_dialog->OnCreateCharacter(); } return false; } if (g_CharSelectScene.GetCurSelectCharacterInfo() && (g_CharSelectScene.GetCurSelectCharacterInfo()->CharacterInfo.m_DelChk != 0)) { CharSelectDialog* charater_select_dialog = GET_CAST_DIALOG(CharSelectDialog, IM_CHARACTERSELECT_MANAGER::CHARACTER_SELECT_DIALOG); if (charater_select_dialog) { charater_select_dialog->OnDeleteCharacter(); } return false; } switch (control_position) { case kControl_CheckBT_C000: case kControl_CheckBT_C001: case kControl_CheckBT_C002: case kControl_CheckBT_C003: case kControl_CheckBT_C004: case kControl_CheckBT_C005: case kControl_CheckBT_C006: case kControl_CheckBT_C007: case kControl_CheckBT_C008: case kControl_CheckBT_C009: { SetSelectedCharacterListIndex(control_position - kControl_CheckBT_C000); g_Input.Reset(); TCHAR notice_message[INTERFACE_STRING_LENGTH] = {'\0', }; WzColor notice_color = WzColor_RGBA(255, 80, 80, 255); if( g_CharSelectScene.SendCharSelectPacket() == FALSE ) { // ¼±ÅÃµÈ Ä³¸¯ÅͰ¡ ¾ø½À´Ï´Ù g_InterfaceManager.GetInterfaceString(eST_NOT_SELECTED_CHARACTER, notice_message, INTERFACE_STRING_LENGTH); g_InterfaceManager.ShowMessageBox(notice_message, 3000, ¬ice_color, 0); } } break; default: break; } return result; } void uiCharacterSelectList::SetServerName() { uiLoginBackTop* login_back_top = GET_CAST_DIALOG(uiLoginBackTop, uiLoginBackTop::kDialog_ID); if (login_back_top == NULL) { return; } uiLoginMan* login_manager = GET_DIALOG_MANAGER(uiLoginMan, UIMAN_LOGIN); if (login_manager == NULL) { return; } AuthSetverData* server_data = login_manager->GetCurrentServerData(); if (server_data == NULL) { return; } #ifdef _DH_LAST_SELECTED_CHARACTER uiCharacterSelectMan* select_manager = GET_DIALOG_MANAGER(uiCharacterSelectMan, UIMAN_CHARACTERSELECT); if (select_manager) { select_manager->SetLastSelectServer(static_cast(server_data->m_GroupID), static_cast(server_data->m_ChannelID)); } #endif//_DH_LAST_SELECTED_CHARACTER TCHAR* server_name = const_cast(server_data->m_GroupName.c_str()); login_back_top->SetSceneTitleString(server_name); } void uiCharacterSelectList::CharacterListUp() { character_slot_list_.clear(); selected_list_index_ = 0; for (int slot_index = 0; slot_index < MAX_CHARACTER_LIST_NUM; ++slot_index) { CharListInfo* character_info = g_CharSelectScene.GetCharacterInfoBySlotIndex(slot_index); if (character_info == NULL) { continue; } character_slot_list_.push_back(slot_index); } #ifdef _DH_LAST_SELECTED_CHARACTER //ij¸¯ÅÍ »èÁ¦½Ã ¹× °»½Å½Ã ¼±Åà ºÎºÐÀÌ ´Ù½Ã ó¸® µÇ°Ô µÈ´Ù. uiCharacterSelectMan* select_manager = GET_DIALOG_MANAGER(uiCharacterSelectMan, UIMAN_CHARACTERSELECT); if (select_manager && select_manager->last_selected_header().last_select_version > 0 && select_manager->last_selected_header().last_select_version <= LAST_SELECT_VERSION) { int selected_slot_index = select_manager->FindLastSelectedSlotIndex(select_manager->last_selected_header().last_select_server); selected_list_index_ = GetListIndexFromSlotIndex(selected_slot_index); } #endif//_DH_LAST_SELECTED_CHARACTER RefreshSelectList(); SetSelectedCharacterListIndex(selected_list_index_); } void uiCharacterSelectList::RefreshSelectList() { int list_size = static_cast(character_slot_list_.size()); assert(list_size <= kMaxListSlot); ShowListSlotByCount(list_size); // ºó½½·Ô »ç¿ë ¸øÇÏ°Ô for (int slot_index = 0; slot_index < kMaxListSlot; ++slot_index) { if (slot_index >= static_cast(character_slot_list_.size())) { SetCharacterSlot(slot_index); } else { CharListInfo* character_info = g_CharSelectScene.GetCharacterInfoBySlotIndex(character_slot_list_[slot_index]); if (character_info == NULL) { continue; } TCHAR buffer_string[INTERFACE_STRING_LENGTH] = {0,}; TCHAR delete_string[INTERFACE_STRING_LENGTH] = "%d:%d"; g_InterfaceManager.GetInterfaceString(70560, buffer_string); Player* player = static_cast(g_ObjectManager.GetPlayer(character_info->dwObjectKey)); if (character_info->CharacterInfo.m_DelChk != 0 && player) { int day = 0 , hour = 0 , minute = 0; int RemainTotalTime = player->GetCharDelRemainTime(); int remainder = RemainTotalTime; // 1ÀÏ º¸´Ù Å«°¡ if( RemainTotalTime >= 86400) { day = RemainTotalTime / 86400; remainder = RemainTotalTime % 86400; } // 1½Ã°£ º¸´Ù Å«°¡ if( RemainTotalTime >= 3600 ) { hour = remainder / 3600; remainder = RemainTotalTime % 3600; } // ºÐ ´ÜÀ§ Àΰ¡ minute = remainder / 60; sprintf(delete_string, buffer_string, day, (hour+1)); } CLIENT_CHARACTER_PART* part_info = &(character_info->CharacterInfo); SetCharacterSlotInfo(slot_index, part_info->m_tszCharName, part_info->m_DelChk, part_info->m_LV, part_info->m_byClass, part_info->m_iRegion, delete_string); } } } void uiCharacterSelectList::ShowListSlotByCount(int slot_count) { BYTE make_and_makeable_slot = g_CharSelectScene.GetCharacterSlotNumber(); for (int slot_index = 0; slot_index < kMaxListSlot; ++slot_index) { DWORD control_id = GetControlID_byPosition(kControl_CheckBT_C000 + slot_index); CControlWZ* check_control = GetControlWZ(control_id); if (check_control == NULL) { continue; } //ENUM_STATEWZ control_state = (slot_index >= slot_count) ? WZ_HIDE : WZ_SHOW; //if (slot_index >= slot_count) if (slot_index >= make_and_makeable_slot) { check_control->EnableWindowWZ(false); } else { check_control->EnableWindowWZ(true); } //check_control->ShowWindowWZ(control_state); character_info_text_[slot_index].ClearSentence(); } CharSelectDialog* charater_select_dialog = GET_CAST_DIALOG(CharSelectDialog, IM_CHARACTERSELECT_MANAGER::CHARACTER_SELECT_DIALOG); if (charater_select_dialog) { charater_select_dialog->EnableButton((slot_count < make_and_makeable_slot), CharSelectDialog::CharSelect_Create); } } void uiCharacterSelectList::SetCharacterSlot(int list_index) { if (list_index < 0 || list_index >= kMaxListSlot) { return; } DWORD control_id = GetControlID_byPosition(kControl_CheckBT_C000 + list_index); CCtrlButtonCheckWZ* check_control = static_cast(GetControlWZ(control_id)); if (check_control == NULL) { return; } TCHAR character_info_string[INTERFACE_STRING_LENGTH] = {'\0', }; TCHAR class_string[INTERFACE_STRING_LENGTH] = {'\0', }; FTextParser parser; FTextSentence sentence; RECT control_rect = check_control->GetSizeRect(); character_info_text_[list_index].Init(GetDrawBase(), control_rect); character_info_text_[list_index].SetVCenterAlign(true); character_info_text_[list_index].SetHCenterAlign(true); character_info_text_[list_index].SetMargin(kListLeftMargin, FTextRender::DEFAULT_MARGIN_TOP, kListLeftMargin, FTextRender::DEFAULT_MARGIN_BOTTOM); // ij¸¯ÅÍ À̸§ BYTE make_and_makeable_slot = g_CharSelectScene.GetCharacterSlotNumber(); if (list_index < make_and_makeable_slot) { g_InterfaceManager.GetInterfaceString(5993, character_info_string); // 5993: ij¸¯Å͸¦ »ý¼º ÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù. parser.SetDefaultFont(kCharacterNameFont, kLevelColor); } else { g_InterfaceManager.GetInterfaceString(5994, character_info_string); // 5994: ij¸¯Å͸¦ »ý¼º ÇÏ½Ç ¼ö ¾ø½À´Ï´Ù. parser.SetDefaultFont(kCharacterNameFont, kCloseSlotColor); } parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); // ij¸¯ÅÍ ·¹º§ & Ŭ·¡½º /*int class_name_code = GlobalFunc::GetClassNameCode(class_type); g_InterfaceManager.GetInterfaceString(class_name_code, class_string); Snprintf(character_info_string, INTERFACE_STRING_LENGTH - 1, "%d %s", level, class_string); parser.SetDefaultFont(kLevelFont, kLevelColor); parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); // ÇöÀçÁö¿ª const sMAPINFO* current_map_info = MapInfoParser::Instance()->FindMapInfo(current_mapcode); if (current_map_info != NULL) { g_InterfaceManager.GetInterfaceString(current_map_info->dwNCode, character_info_string); parser.SetDefaultFont(kCurrentMapNameFont, kCurrentMapNameColor); parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); }*/ character_info_text_[list_index].convertLineInfo(); } void uiCharacterSelectList::SetCharacterSlotInfo(int list_index, TCHAR* character_name, BYTE delete_check, int level, BYTE class_type, MAPCODE current_mapcode, TCHAR* day_for_delete) { if (character_name == NULL) { return; } if (list_index < 0 || list_index >= kMaxListSlot) { return; } DWORD control_id = GetControlID_byPosition(kControl_CheckBT_C000 + list_index); CCtrlButtonCheckWZ* check_control = static_cast(GetControlWZ(control_id)); if (check_control == NULL) { return; } TCHAR character_info_string[INTERFACE_STRING_LENGTH] = {'\0', }; TCHAR class_string[INTERFACE_STRING_LENGTH] = {'\0', }; FTextParser parser; FTextSentence sentence; RECT control_rect = check_control->GetSizeRect(); character_info_text_[list_index].Init(GetDrawBase(), control_rect); character_info_text_[list_index].SetVCenterAlign(true); character_info_text_[list_index].SetHCenterAlign(false); character_info_text_[list_index].SetMargin(kListLeftMargin, FTextRender::DEFAULT_MARGIN_TOP, kListLeftMargin, FTextRender::DEFAULT_MARGIN_BOTTOM); // ij¸¯ÅÍ À̸§ Snprintf(character_info_string, INTERFACE_STRING_LENGTH - 1, character_name); if (delete_check > 0) { parser.SetDefaultFont(kCharacterNameFont, kCloseSlotColor); // »èÁ¦ ´ë±âÁßÀÌ¸é »¡°£»ö } else { parser.SetDefaultFont(kCharacterNameFont, kCharacterNameColor); } parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); // ij¸¯ÅÍ ·¹º§ & Ŭ·¡½º int class_name_code = GlobalFunc::GetClassNameCode(class_type); g_InterfaceManager.GetInterfaceString(class_name_code, class_string); Snprintf(character_info_string, INTERFACE_STRING_LENGTH - 1, "%d %s", level, class_string); parser.SetDefaultFont(kLevelFont, kLevelColor); parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); // ÇöÀçÁö¿ª const sMAPINFO* current_map_info = MapInfoParser::Instance()->FindMapInfo(current_mapcode); if (delete_check > 0) { // »èÁ¦ ´ë±âÁßÀÌ¸é »èÁ¦ ´ë±â ¸Þ½ÃÁö g_InterfaceManager.GetInterfaceString(5038, class_string); Snprintf(character_info_string, INTERFACE_STRING_LENGTH, "%s [%s]", class_string, day_for_delete); parser.SetDefaultFont(kCurrentMapNameFont, kCurrentMapNameColor); parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); } else { if (current_map_info != NULL) { g_InterfaceManager.GetInterfaceString(current_map_info->dwNCode, character_info_string); parser.SetDefaultFont(kCurrentMapNameFont, kCurrentMapNameColor); parser.Parser(character_info_string, sentence); character_info_text_[list_index].Append(sentence); } } character_info_text_[list_index].convertLineInfo(); } void uiCharacterSelectList::SetSelectedCharacterSlotIndex(int slot_index) { int list_size = static_cast(character_slot_list_.size()); int list_index = -1; for (int index = 0; index < list_size; ++index) { if (character_slot_list_[index] == slot_index) { list_index = index; break; } } SetSelectedCharacterListIndex(list_index); } void uiCharacterSelectList::SetSelectedCharacterListIndex(int list_index) { int list_size = static_cast(character_slot_list_.size()); if (list_size < 1) { list_index = -1; } selected_list_index_ = list_index; for (int index = 0; index < kMaxListSlot; ++index) { DWORD control_id = GetControlID_byPosition(kControl_CheckBT_C000 + index); CCtrlButtonCheckWZ* check_control = static_cast(GetControlWZ(control_id)); if (check_control == NULL || check_control->GetDrawState() == E_DISABLE) { continue; } bool enable_state = (list_index == index) ? true : false; check_control->SetCheckState(enable_state); } g_CharSelectScene.ShowSelectCharacter(GetSelectedCharacterSlotIndex()); } void uiCharacterSelectList::OnSelectPrevCharacter() { --selected_list_index_; selected_list_index_ = max(selected_list_index_, 0); SetSelectedCharacterListIndex(selected_list_index_); } void uiCharacterSelectList::OnSelectNextCharacter() { ++selected_list_index_; selected_list_index_ = min(selected_list_index_, kMaxListSlot); selected_list_index_ = min(selected_list_index_, static_cast(character_slot_list_.size() - 1)) ; if (selected_list_index_ == -1) { selected_list_index_ = 0; } SetSelectedCharacterListIndex(selected_list_index_); } int uiCharacterSelectList::GetSelectedCharacterSlotIndex() { int list_size = static_cast(character_slot_list_.size()); if ((list_size < 1) || (list_size <= selected_list_index_)) { return -1; } int index = character_slot_list_[selected_list_index_]; return index; } //------------------------------------------------------------------------------ int uiCharacterSelectList::GetListIndexFromSlotIndex(int slot_index) { std::vector::iterator begin = character_slot_list_.begin(); std::vector::iterator end = character_slot_list_.end(); for (int index = 0; begin != end; ++begin, ++index) { if ((*begin) == slot_index) { return index; } } return 0; }