#include "SunClientPrecompiledHeader.h" #include "InterfaceManager.h" #include "uiMissionObject/uiMissionObject.h" #include "uiMissionObjectMan/uiMissionObjectMan.h" #include "GlobalFunc.h" #include "MissionInfoParser.h" #include "MissionTextInfoParser.h" #include "Mouse.h" #include "uiToolTipMan/uiToolTipMan.h" #include "../SoundEffect.h" const DWORD MISSION_MAPCODE_RANGE = 10000; // ¹Ì¼Ç ¸Ê ÄÚµå ¹üÀ§, ¸¸¾à ¹Ì¼Ç ¿Ü¿¡µµ ¸ñÀû ¸®½ºÆ®¸¦ »ç¿ëÇÏ°í ½Í´Ù¸é º¯°æ ÇØ¾ß ÇÕ´Ï´Ù. const DWORD IM_MISSION_OBJECT_MANAGER::MISSION_OBJECT = StrToWzID("0504"); WzID uiMissionObject::wz_control_id_[DLGPOS_MAX] = { StrToWzID("L001"), //eDIALOG_MISSION_OBJECT_LIST StrToWzID("B999"), //eDIALOG_EXIT StrToWzID("VS00"), //eDIALOG_VSCROLL StrToWzID("T000"), //eDIALOG_TITTLE StrToWzID("B000"), //eDIALOG_ALL_BUTTON, StrToWzID("B001"), //eDIALOG_PLAY_BUTTON, StrToWzID("B002"), //eDIALOG_COMPLETE_BUTTON, }; uiMissionObject::uiMissionObject(InterfaceManager* ui_manager) : uiBase(ui_manager) { vertical_scroll_ = NULL; mission_title_ = NULL; line_update_ = false; tooltip_string_code = 0; mission_delay_tick_count_ = 0; reflash_line_convert_ = false; } uiMissionObject::~uiMissionObject() { Release(); } //------------------------------------------------------------------------------ /** */ void uiMissionObject::Init(CDrawBase* draw_base) { uiBase::Init(draw_base); mission_object_list_ = (CCtrlListWZ*) get_control(eDIALOG_MISSION_OBJECT_LIST); assert(mission_object_list_); mission_title_ = (CCtrlStaticWZ*) get_control(eDIALOG_TITTLE); assert(mission_title_); vertical_scroll_ = (CCtrlVScrollWZ*) get_control(eDIALOG_VSCROLL); assert(vertical_scroll_); for(int i = TYPE_ALL; i < TYPE_BUTTON_MAX; ++i) { type_button_[i] = (CCtrlButtonWZ*) get_control(eDIALOG_ALL_BUTTON+i); assert(type_button_[i]); } name_code_ = 0; display_type_ = TYPE_ALL; ResetButton(); SetMissionObjectMapCode(0,0); InitMissionList(); } //------------------------------------------------------------------------------ /** */ void uiMissionObject::InitLineText() { MissionTextInfo *line_string = NULL; // MissionText (1): ¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ line_string = MissionTextInfoParser::Instance()->GetMissionTextInfo(1); if (!line_string || !line_string->mission_text) { sprintf(line_string_, "UnKnown Mission Text ID(1)"); } else { sprintf(line_string_, line_string->mission_text); } line_string = MissionTextInfoParser::Instance()->GetMissionTextInfo(2); // MissionText (2): %s(¿Ï·á)%s if (!line_string || !line_string->mission_text) { sprintf(complete_string_, "UnKnown Mission Text ID(2)"); } else { sprintf(complete_string_, line_string->mission_text); } } //------------------------------------------------------------------------------ /** */ void uiMissionObject::InitMissionList() { if (!mission_object_list_) { assert(!"¿Ö ¸®½ºÆ®°¡ ¾ø¾î!!"); return; } RECT list_rect = mission_object_list_->GetSizeRect(); ftext_render_.Init(GetDrawBase(), list_rect); mission_object_list_->SetSellHeight(15); mission_object_list_->DeleteItemAll(); vertical_scroll_ = (CCtrlVScrollWZ *)get_control(eDIALOG_VSCROLL); vertical_scroll_->SetScrollRangeWZ(0,0); vertical_scroll_->SetScrollPosWZ(0); if (mission_title_ != NULL) { TCHAR title_string[INTERFACE_STRING_LENGTH] = {0,}; TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; name_code_ = 0; // 2173: %s ¹Ì¼Ç ÁøÇà Á¤º¸, %s = "" g_InterfaceManager.GetInterfaceString(mission_title_->GetTextID(), temp_string); sprintf(title_string, temp_string, ""); mission_title_->SetTextWZ(title_string); } _MissionObject* data = NULL; MISSION_OBJECT_LIST_ITR itr; MISSION_OBJECT_LIST_ITR end = mission_object_all_.end(); if (mission_object_all_.size() > 0) { for(itr = mission_object_all_.begin(); itr != end; ++itr) { data = (*itr); delete data; } } mission_object_all_.clear(); ftext_render_.SetMargin(0,0,0,-12); ftext_render_.SetGap(0,-2); ftext_render_.convertLineInfo(); } //------------------------------------------------------------------------------ /** */ void uiMissionObject::SetMissionObjectMapCode(DWORD map_code, DWORD field_code) { if (map_code_ != map_code) { if (mission_object_all_.size() > 0) { InitMissionList();//ÃʱâÈ­ } if (map_code < MISSION_MAPCODE_RANGE) { InitLineText(); name_code_ = MissionInfoParser::Instance()->GetMissionInfo(&mission_object_all_, map_code); // 2173: %s ¹Ì¼Ç ÁøÇà Á¤º¸, %s = name_code if (mission_title_ != NULL) { TCHAR title_string[INTERFACE_STRING_LENGTH] = {0,}; TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; TCHAR map_string[INTERFACE_STRING_LENGTH] = {0,}; // 2173: %s ¹Ì¼Ç ÁøÇà Á¤º¸, %s = "" g_InterfaceManager.GetInterfaceString(mission_title_->GetTextID(), temp_string); g_InterfaceManager.GetInterfaceString(name_code_, map_string); sprintf(title_string, temp_string, map_string); mission_title_->SetTextWZ(title_string); } } } map_code_ = map_code; field_code_ = field_code; } //------------------------------------------------------------------------------ /** */ void uiMissionObject::Release() { _MissionObject* data = NULL; MISSION_OBJECT_LIST_ITR itr; MISSION_OBJECT_LIST_ITR end = mission_object_all_.end(); if (mission_object_all_.size() > 0) { for(itr = mission_object_all_.begin(); itr != end; ++itr) { data = (*itr); delete data; } } mission_object_all_.clear(); } //------------------------------------------------------------------------------ /** */ void uiMissionObject::OnUpdateSolarDialog() { ftext_render_.SetRect(mission_object_list_->GetSizeRect()); updateMouseWheel(); UpdateToolTip(); } //------------------------------------------------------------------------------ /** */ void uiMissionObject::OnRenderSolarDialog() { if (reflash_line_convert_) { ftext_render_.SetRect(mission_object_list_->GetSizeRect()); ftext_render_.convertLineInfo(); reflash_line_convert_ = false; } ftext_render_.Render(); if (line_update_) { line_update_ = false; ftext_render_.SetBeginLineIndex(ftext_render_.GetMaxLine() - ftext_render_.GetDrawLineInRect()); } } //------------------------------------------------------------------------------ /** */ void uiMissionObject::Process(DWORD tick_count) { } //------------------------------------------------------------------------------ /** */ void uiMissionObject::OnShowWindow(BOOL open_value) { SolarDialog::OnShowWindow(open_value); if(open_value) { MissionDataReflash(); keyMsg msg; ZeroMemory(&msg,sizeof(msg)); msg.dwType=eDoType_dialog_mission_object; msg.wParam=IM_MISSION_OBJECT_MANAGER::MISSION_OBJECT; msg.DoSomething=GlobalFunc::DoShowWindowEx; g_KeyQueueManager.PushBack(msg); } else { g_KeyQueueManager.DeleteMsg(eDoType_dialog_mission_object); } } //------------------------------------------------------------------------------ /** */ void uiMissionObject::UpdateToolTip() { int iMouseX = Mouse::Instance()->GetMouseX(); int iMouseY = Mouse::Instance()->GetMouseY(); // ½ºÅµÃ³¸® // ÀÎÅÍÆäÀ̽º¿¡¼­ Dialog ¹ÙÅÁ¿¡¼­´Â Mouse Over°¡ ¿ÀÁö ¾Ê´Â´Ù. bool is_mouse_over = false; int loop_end = DLGPOS_MAX; for (POSTYPE position = 0; position < loop_end; ++position) { CControlWZ* control = get_control(position); if(control) { RECT control_rect = control->GetSizeRect(); if (control_rect.left <= iMouseX && control_rect.right >= iMouseX) { if (control_rect.top <= iMouseY && control_rect.bottom >= iMouseY) { is_mouse_over = true; break; } } } } if (!is_mouse_over) { tooltip_string_code = 0; m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX; } else { if (tooltip_string_code > 0) { uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP); if (tooltip_manager) { tooltip_manager->RegisterTooltipForWareNInventoryLock(tooltip_string_code); tooltip_manager->SetTooltipDialogID(GetDialogKey()); } } } int b = ftext_render_.GetBeginLineIndex(); } //------------------------------------------------------------------------------ /** */ void uiMissionObject::MissionDataReflash() { MISSION_OBJECT_LIST *current_list = NULL; ftext_render_.SetVCenterAlign(false); ftext_render_.ClearSentence(); current_list = &mission_object_all_; int complete_count = 0; int process_count = 0; int total_count = 0; _MissionObject* data = NULL; MISSION_OBJECT_LIST_ITR itr; MISSION_OBJECT_LIST_ITR end = current_list->end(); TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; bool push_data = false; // µ¥ÀÌÅÍ »ðÀÔ ¿©ºÎ MissionTextInfo *mission_text_infomation = NULL; for(itr = current_list->begin(); itr != end; ++itr) { ftext_parser_.SetDefaultFont(StrToWzID("mn12"), 0xFFFFFFFF); //ARGB data = (*itr); mission_text_infomation = MissionTextInfoParser::Instance()->GetMissionTextInfo(data->mission_text_code); if (!mission_text_infomation || !mission_text_infomation->mission_text) { return; } if (data->is_show == false) { continue;// º¸ÀÌ´Â »óŰ¡ ¾Æ´Ï¸é ½ºÅµ } push_data = false; switch(display_type_) { case TYPE_ALL: push_data = true; break; case TYPE_PLAYING: if (data->is_complete == false) { push_data = true; } break; case TYPE_COMPLETE: if (data->is_complete == true) { push_data = true; } break; } if (data->is_complete == true) { //ftext_render_.SetAlphaValue(128); sprintf(temp_string, "%s%s%s", mission_text_infomation->mission_text, complete_string_, line_string_); ++complete_count; } else { sprintf(temp_string, "%s%s", mission_text_infomation->mission_text, line_string_); ++process_count; } ++total_count; if (push_data == true) { AddFormatText(temp_string); } } ftext_render_.convertLineInfo(); if (vertical_scroll_ != NULL) { int scroll_range = ftext_render_.GetMaxLine() - ftext_render_.GetDrawLineInRect(); vertical_scroll_->SetScrollRangeWZ(0,scroll_range); vertical_scroll_->SetScrollPosWZ(scroll_range); } if (mission_title_ != NULL && name_code_ != 0) { TCHAR title_string[INTERFACE_STRING_LENGTH] = {0,}; TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; TCHAR map_string[INTERFACE_STRING_LENGTH] = {0,}; // 2173: %s ¹Ì¼Ç ÁøÇà Á¤º¸, %s = "" g_InterfaceManager.GetInterfaceString(mission_title_->GetTextID(), temp_string); g_InterfaceManager.GetInterfaceString(name_code_, map_string); sprintf(title_string, temp_string, map_string); switch(display_type_) { case TYPE_ALL: sprintf(temp_string, "%s(%d/%d)", title_string, complete_count, total_count); break; case TYPE_PLAYING: sprintf(temp_string, "%s(%d/%d)", title_string, process_count, total_count); break; case TYPE_COMPLETE: sprintf(temp_string, "%s(%d/%d)", title_string, complete_count, total_count); default: mission_title_->SetTextWZ(title_string); } mission_title_->SetTextWZ(temp_string); } } //------------------------------------------------------------------------------ /** */ bool uiMissionObject::MissionObjectComplete(DWORD trigger_id) { bool is_new_change = false; MISSION_OBJECT_LIST *current_list = &mission_object_all_; _MissionObject* data = NULL; MISSION_OBJECT_LIST_ITR itr; MISSION_OBJECT_LIST_ITR end = current_list->end(); TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; if (current_list->size() <= 0) { return false; } for(itr = current_list->begin(); itr != end; ++itr) { data = (*itr); if(data->is_complete == true) { continue; } else if (data->complete_field_code == field_code_ && data->complete_trigger_id == trigger_id)// ¹Ì¿Ï·á ¸®½ºÆ®¿¡¼­ ã±â { data->is_complete = true; is_new_change = true; } } if (is_new_change) { MissionNotice(); // ¹Ì¼Ç º¯°æ ¾Ë¸² °øÁö } return is_new_change; } //------------------------------------------------------------------------------ /** */ void uiMissionObject::MissionNotice() { DWORD current_tick = clock_function::GetTickCount(); if (current_tick >= mission_delay_tick_count_) { mission_delay_tick_count_ = current_tick + MISSION_OBJECT_DELAY; TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; // ¹Ì¼Ç ÁøÇà Á¤º¸°¡ °»½ÅµÇ¾ú½À´Ï´Ù. "O"۸¦ ´­·¯ È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù. g_InterfaceManager.GetInterfaceString(2177, temp_string, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, temp_string); // »ç¿îµå Ãâ·Â g_SoundEffect.PlayUI(UI_SOUND_MISSION_OBJECT); } } //------------------------------------------------------------------------------ /** */ void uiMissionObject::CheckMissionObjectShow(DWORD trigger_id) { bool is_new_change = false; bool is_complete_change = false; _MissionObject* data = NULL; MISSION_OBJECT_LIST_ITR itr; MISSION_OBJECT_LIST_ITR end = mission_object_all_.end(); if (mission_object_all_.size() <= 0) { return; } for(itr = mission_object_all_.begin(); itr != end; ++itr) { data = (*itr); if (data->is_show == false) { data->show_count = 0; for (int i = 0; i < _MissionObject::MAX_OPEN_TRIGGER_ID; ++i) { if (data->field_code != field_code_) { continue; } if (data->open_trigger_id[i] == 0) { data->show_count = data->show_count + 1; } else if (data->open_trigger_id[i] == trigger_id) { data->open_trigger_id[i] = 0; data->show_count = data->show_count + 1; } if (data->show_count >= _MissionObject::MAX_OPEN_TRIGGER_ID) { data->is_show = true; is_new_change = true; } } } } if (is_new_change) { MissionNotice(); // ¹Ì¼Ç ¾Ë¸² °øÁö } is_complete_change= MissionObjectComplete(trigger_id); if (is_new_change || is_complete_change) { MissionDataReflash();// °»½ÅÇÏ°í ¸®ÅÏ } line_update_ = true; } //------------------------------------------------------------------------------ /** */ void uiMissionObject::ResetButton() { for (int i = TYPE_ALL; i < TYPE_BUTTON_MAX; ++i) { type_button_[i]->ShowWindowWZ(WZ_HIDE); } switch(display_type_) { case TYPE_ALL: if (type_button_[TYPE_ALL]) { type_button_[TYPE_ALL]->ShowWindowWZ(WZ_SHOW); } break; case TYPE_PLAYING: if (type_button_[TYPE_PLAYING]) { type_button_[TYPE_PLAYING]->ShowWindowWZ(WZ_SHOW); } break; case TYPE_COMPLETE: if (type_button_[TYPE_COMPLETE]) { type_button_[TYPE_COMPLETE]->ShowWindowWZ(WZ_SHOW); } break; } } //------------------------------------------------------------------------------ /** */ void uiMissionObject::MessageProc(SI_MESSAGE* message) { switch (message->eResultMsg) { case RT_MSG_LBUTTONCLICK: { switch (get_control_id_to_pos(message->dwCtrlID)) { case eDIALOG_EXIT: { this->ShowInterface(FALSE); } break; case eDIALOG_ALL_BUTTON: case eDIALOG_PLAY_BUTTON: case eDIALOG_COMPLETE_BUTTON: { ++display_type_; if (display_type_ > TYPE_COMPLETE) { display_type_ = TYPE_ALL; } ResetButton(); MissionDataReflash(); } break; } } break; case RT_MSG_SB_LINETOP: { //.À­ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù. // if (eDIALOG_VSCROLL == get_control_id_to_pos(message->dwCtrlID)) { int index = vertical_scroll_->GetScrollPosWZ(); --index; index = max(0, index); ftext_render_.SetBeginLineIndex( index ); vertical_scroll_->SetScrollPosWZ( index ); } } break; case RT_MSG_SB_LINEBOTTOM: { //.¾Æ·§ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù if (eDIALOG_VSCROLL == get_control_id_to_pos(message->dwCtrlID)) { int index = vertical_scroll_->GetScrollPosWZ(); ++index; index = min((int)ftext_render_.GetMaxLine(), index); ftext_render_.SetBeginLineIndex( index ); vertical_scroll_->SetScrollPosWZ( index ); } } break; case RT_MSG_SB_THUMBPOSITION: //. ½æÀ» µå·¡±×ÇÑÈÄ ¸¶¿ì½º¸¦ ³õ¾Ò´Ù. case RT_MSG_SB_ENDSCROLL: //. ½ºÅ©·ÑÀÌ Á¾·á µÇ¾ú´Ù. case RT_MSG_SB_THUMBTRACK: { //.½æÀ» µå·¡±× Çϰí ÀÖ´Ù. if (eDIALOG_VSCROLL == get_control_id_to_pos(message->dwCtrlID)) { int index = vertical_scroll_->GetScrollPosWZ(); ftext_render_.SetBeginLineIndex(index); } } break; default: { SolarDialog::MessageProc(message); } } } //------------------------------------------------------------------------------ /** */ void uiMissionObject::NetworkProc(MSG_BASE* message) { } //---------------------------------------------------------------------------- /** */ bool uiMissionObject::AddFormatText(const TCHAR* message) { // Á¤±ÔÈ­ ÅØ½ºÆ® ¼¼ÆÃ static int posnumber = 0; TCHAR value_string[1024] = {0,}; Snprintf(value_string, 1024 , _T("%s"), message); BOOL result = FALSE; result = ftext_parser_.Parser(value_string, ftext_sentence_); if(result) { ftext_render_.Append(ftext_sentence_); } //ftext_render_.SetBeginLineIndex(0); return true; } void uiMissionObject::updateMouseWheel() { if(mission_object_list_ == NULL || vertical_scroll_ == NULL) { return; } RECT list_rect = mission_object_list_->GetSizeRect(); switch (GetMouseWheelStatus(&list_rect)) { case MOUSE_WHEEL_UP: { int index = vertical_scroll_->GetScrollPosWZ(); --index; index = max(0, index); ftext_render_.SetBeginLineIndex(index); vertical_scroll_->SetScrollPosWZ(index); } break; case MOUSE_WHEEL_DOWN: { int index = vertical_scroll_->GetScrollPosWZ(); ++index; index = min((int)ftext_render_.GetMaxLine(), index); ftext_render_.SetBeginLineIndex(index); vertical_scroll_->SetScrollPosWZ(index); } break; default: break; } } //---------------------------------------------------------------------------- /** */ void uiMissionObject::MouseOver_MsgProc(SI_MESSAGE* message) { switch (message->eResultMsg) { case RT_MSG_MOUSEOVER: { POSTYPE position = get_control_id_to_pos(message->dwCtrlID); switch (position) { case eDIALOG_ALL_BUTTON: tooltip_string_code = 2174; break; case eDIALOG_PLAY_BUTTON: tooltip_string_code = 2176; break; case eDIALOG_COMPLETE_BUTTON: tooltip_string_code = 2175; break; default: tooltip_string_code = 0; } } break; } } void uiMissionObject::UpdatePosition() { //SolarDialog::UpdatePosition(); reflash_line_convert_ = true; }