#include "stdafx.h" #include "SUIMainMenuWnd.h" #include "KUIControlButton.h" #include "SGameManager.h" #include "SGameMessage.h" //#include "SGameMessageUI.h" #include "SStringDB.h" #include "Arena\\ArenaJoinSituationChecker.h" #include "SGameWorldKeymapping.h" #include "Arena\\ArenaRanKInfo.h" #include "Arena\\ArenaSystem.h" #include "SContentsManager.h" #include "SHuntaHolicSystem.h" #include "SGameLocalPlayer.h" #include "KUIControlStatic.h" #include "SGameInterface.h" #include "SGameSystem.h" #include extern SGameSystem * g_pCurrentGameSystem; namespace { //const int c_nButtonClickArea = 14; //const char* c_szStaticMenu = "button_mainmenu"; //const char* c_szStatciMoney = "static_money"; std::string c_szAniFile = ""; }; bool SUIMainMenuWnd::InitControls( KPoint kPos ) { /// 2012.05.16 - prodongi initMenuButtonStatus(); // 버튼 클릭 영역 지정 //SetValidRect( "mainmenu_item" , KRect(0,0,-c_nButtonClickArea,0) ); //SetValidRect( "mainmenu_character", KRect(c_nButtonClickArea,0,-c_nButtonClickArea,0) ); //SetValidRect( "mainmenu_summon" , KRect(c_nButtonClickArea,0,-c_nButtonClickArea,0) ); //SetValidRect( "mainmenu_chat" , KRect(c_nButtonClickArea,0,-c_nButtonClickArea,0) ); //SetValidRect( "mainmenu_skill" , KRect(c_nButtonClickArea,0,-c_nButtonClickArea,0) ); //SetValidRect( "mainmenu_messanger", KRect(c_nButtonClickArea,0,-c_nButtonClickArea,0) ); //SetValidRect( "mainmenu_system" , KRect(c_nButtonClickArea,0,-c_nButtonClickArea,0) ); //SetChildCaption( c_szStaticMenu, GetStringDB().GetString( STRING_MENU ) ); //SetChildCaption( c_szStatciMoney, GetStringDB().GetString( STRING_UI_MENU_TEXT ) ); // #2.1.11 //GetChild("button_mainmenu")-> return SUIWnd::InitControls(kPos); } void SUIMainMenuWnd::initMenuButtonStatus() { /// 2012.05.16 - prodongi m_arenaButton = dynamicCast(GetChild("button_arena_entrance_01")); m_arenaText = dynamicCast(GetChild("text_button_arena_entrance_01")); m_instanceButton = dynamicCast(GetChild("button_instance_entrance_01")); m_exitButton = dynamicCast(GetChild("button_arena_end_01")); m_exitText = dynamicCast(GetChild("text_button_arena_end_01")); m_arenaText->SetEnableColor( "<#ffffff>" ); m_arenaText->SetDisableColor( "<#a0a0a0>" ); m_arenaText->SetEnableOption(true); m_exitText->SetEnableColor( "<#ffffff>" ); m_exitText->SetDisableColor( "<#a0a0a0>" ); m_exitText->SetEnableOption(true); setInstanceArenaButtonStatus(SGameLocalPlayer::IAS_NORMAL); } void SUIMainMenuWnd::setTooltip() { m_instanceButton->SetTooltip(S(2364)); std::string caption; XStringUtil::Format(caption, "<#898989>%s
%s", S(6687), GetGameKeymapping().GetHotKeyStringInfo(HOTKEYCODE::SYSTEM).c_str()); SetChildTooltip("button_option_01", caption.c_str()); XStringUtil::Format(caption, "<#898989>%s
%s", S(6686), GetGameKeymapping().GetHotKeyStringInfo(HOTKEYCODE::HELP).c_str()); SetChildTooltip("button_move_01", caption.c_str()); } void SUIMainMenuWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch(nMessage) { case KUI_MESSAGE::KBUTTON_CLICK: { m_pGameManager->StartSound( "ui_click_menu01.wav" ); if( 0 == ::_stricmp( "button_mainmenu", lpszControlID ) ) m_pGameManager->PostMsgAtDynamic( new SIMSG_TOGGLE_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MAINMENU_SUB ) ); else if (0 == ::_stricmp("button_arena_entrance_01", lpszControlID)) { if (g_pCurrentGameSystem->isInArena()) break; if (checkValidArenaJoinSituationAtEntrance()) { if (m_pGameManager->IsShow(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_MENU)) { showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_MENU, false); } else { showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_MENU, true); showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_INSTANCE_TASKBAR_ENTRANCE, false); } } } else if (0 == ::_stricmp("button_instance_entrance_01", lpszControlID)) { if (g_pCurrentGameSystem->isInArena()) break; if (m_pGameManager->IsShow(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_INSTANCE_TASKBAR_ENTRANCE)) { showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_INSTANCE_TASKBAR_ENTRANCE, false); } else { showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_MENU, false); showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_SELECTION_READY, false); showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_PRACTICE_READY, false); showMenu(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_INSTANCE_TASKBAR_ENTRANCE, true); } } else if (0 == ::_stricmp("button_arena_end_01", lpszControlID)) { clickExitButton(); } else if (0 == ::_stricmp("button_option_01", lpszControlID)) { m_pGameManager->PostMsgAtDynamic( new SIMSG_TOGGLE_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SYSTEM_MAIN)); } else if (0 == ::_stricmp("button_move_01", lpszControlID)) { m_pGameManager->PostMsgAtDynamic( new SMSG_SEND_DATA( "toggle_help" ) ); } } break; } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUIMainMenuWnd::OnPosChangeNofity(int XOffset, int YOffset) { SUIWnd::OnPosChangeNofity(XOffset,YOffset); } DWORD SUIMainMenuWnd::OnMouseMessage(DWORD dwMessage, int x, int y) { DWORD dwRet = SUIWnd::OnMouseMessage(dwMessage,x,y); return dwRet; } void SUIMainMenuWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch(pMsg->nType) { case IMSG_MOUSEMOVE: { SIMSG_MOUSEMOVE* pMouseMove = (SIMSG_MOUSEMOVE* )pMsg; int x = ((int)(short)LOWORD(pMouseMove->lParam)); int y = ((int)(short)HIWORD(pMouseMove->lParam)); OnMouseMessage(KMOUSE_MOVE,x,y); } break; case IMSG_UI_SEND_DATA: { SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg; // _oprint( "GOLD UPDATED:%d\n", pData->m_nNumber ); if( pData->m_strString == "gold" ) { std::string strGold = ""; strGold += S(6425); strGold += CStringUtil::GetCommaNumberString( ((SIMSG_UI_SEND_DATA*)pMsg)->m_nNumber.getAmount() ); SetChildCaption( "static_money_value", strGold.c_str() ); } else if (pData->m_strString == "enable_exit") { enableExitButton(pData->m_dwData == 0 ? false : true); } } break; case IMSG_UI_SYSMENU_HOTKEY: { switch( ((SIMSG_UI_SYSMENU_HOTKEY*)pMsg)->m_nType ) { case SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MAINMENU_SUB: { // m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SYSMENU( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILL, bShow) ); } break; } pMsg->bUse = true; } break; case IMSG_SET_KEYMAPPING: { setTooltip(); } break; case IMSG_UPDATE_MAIN_MENU_BUTTON: { updateInstanceArenaStatus(); } break; } } void SUIMainMenuWnd::showMenu(int wndId, bool show) { SUIWnd* wnd = m_pGameManager->GetSUI(wndId); if (wnd && wnd->IsShow() != show) m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( (SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE)wndId, show)); } void SUIMainMenuWnd::enableExitButton(bool enable) { if (enable) { m_exitButton->Enable(); m_exitText->Enable(); } else { m_exitButton->Disable(); m_exitText->Disable(); } } void SUIMainMenuWnd::showArenaButton(bool show) { m_arenaButton->SetShow(show); m_arenaText->SetShow(show); } void SUIMainMenuWnd::showInstanceButton(bool show) { m_instanceButton->SetShow(show); } void SUIMainMenuWnd::showExitButton(bool show) { m_exitButton->SetShow(show); m_exitText->SetShow(show); } bool SUIMainMenuWnd::checkValidArenaJoinSituationAtEntrance() { sArenaRankInfo rankInfo; int rank = rankInfo.getRank(); if (sArenaUtility::RANK_NONE == rank) { sArenaJoinSituationCondition situationCondition; situationCondition.m_notificationWays = cArenaJoinSituationChecker::WAY_NOTIFICATION_WND; situationCondition.addNone(S(2467)); g_pCurrentGameSystem->isValidArenaJoinSituation(situationCondition); return false; } return true; } int SUIMainMenuWnd::calcInstanceArenaStatus() { SGameLocalPlayer* localPlayer = dynamicCast(g_pCurrentGameSystem->GetLocalPlayer()); if (!localPlayer) return SGameLocalPlayer::IAS_NORMAL; int iasStatus = SGameLocalPlayer::IAS_NORMAL; if(localPlayer->IsInBearroad()) { iasStatus = SGameLocalPlayer::IAS_BEARLOAD; } else if(localPlayer->IsInBearroadLobby()) { iasStatus = SGameLocalPlayer::IAS_BEARLOADLOBBY; } else if(localPlayer->IsInDeathMatch()) { iasStatus = SGameLocalPlayer::IAS_DEATHMATCH; } else { /// 윈도우의 상태를 체크해야 되서 이렇게 했는데, 보기에는 복잡하지만 자주 호출 되는게 아니라서 큰 무리는 없을 것 같음,, /// 좋은 생각이 안남;; SUIWnd* arenaMenuWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_MENU); SUIWnd* selectReadyWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_SELECTION_READY); SUIWnd* practiceReadyWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_PRACTICE_READY); SUIWnd* waitingWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_WAITING); SUIWnd* practiceWaitingWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_PRACTICE_WAITING); SUIWnd* classicWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_GAME_CLASSIC); SUIWnd* slaughterWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_GAME_SLAUGHTER); SUIWnd* bingoWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_GAME_BINGO); SUIWnd* slaughterPracticeWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_ARENA_GAME_SLAUGHTER_PRACTICE); SUIWnd* instanceWnd = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_INSTANCE_TASKBAR_ENTRANCE); /// 동시에 여러 윈도우가 보여질 수 있기 때문에 우선순위를 둬서 체크한다 if ( instanceWnd && instanceWnd->IsShow()) { iasStatus = SGameLocalPlayer::IAS_INSTANCE_MENU; } else if ( practiceWaitingWnd && practiceWaitingWnd->IsShow()) { iasStatus = SGameLocalPlayer::IAS_ARENA_PRACTICE_WAITING; } else if ( waitingWnd && waitingWnd->IsShow()) { iasStatus = SGameLocalPlayer::IAS_ARENA_WAITING; } else if ( slaughterPracticeWnd && slaughterPracticeWnd->IsShow()) { iasStatus = SGameLocalPlayer::IAS_ARENA_PRACTICE; } else if ( (classicWnd&&classicWnd->IsShow()) || (slaughterWnd&&slaughterWnd->IsShow()) || (bingoWnd&&bingoWnd->IsShow()) ) { iasStatus = SGameLocalPlayer::IAS_ARENA_GAME; } else if ( (arenaMenuWnd&&arenaMenuWnd->IsShow()) || (selectReadyWnd&&selectReadyWnd->IsShow()) || (practiceReadyWnd&&practiceReadyWnd->IsShow()) ) { iasStatus = SGameLocalPlayer::IAS_ARENA_MENU; } } return iasStatus; } void SUIMainMenuWnd::setInstanceArenaStatus(int iasStatus) { SGameLocalPlayer* localPlayer = dynamicCast(g_pCurrentGameSystem->GetLocalPlayer()); if (!localPlayer) return ; int curIasStatus = localPlayer->getInstanceArenaStatus(); if (curIasStatus == iasStatus) return ; localPlayer->setInstanceArenaStatus(iasStatus); setInstanceArenaButtonStatus(iasStatus); } void SUIMainMenuWnd::setInstanceArenaButtonStatus(int iasStatus) { if (SGameLocalPlayer::IAS_NORMAL == iasStatus) { showArenaButton(true); showInstanceButton(false); //true showExitButton(false); } else if (SGameLocalPlayer::IAS_ARENA_MENU == iasStatus) { showArenaButton(true); showInstanceButton(false); //true showExitButton(false); } else if (SGameLocalPlayer::IAS_ARENA_WAITING == iasStatus || SGameLocalPlayer::IAS_ARENA_PRACTICE_WAITING == iasStatus || SGameLocalPlayer::IAS_ARENA_PRACTICE == iasStatus || SGameLocalPlayer::IAS_ARENA_GAME == iasStatus || SGameLocalPlayer::IAS_DEATHMATCH == iasStatus || SGameLocalPlayer::IAS_BEARLOAD == iasStatus || SGameLocalPlayer::IAS_BEARLOADLOBBY == iasStatus) { showArenaButton(false); showInstanceButton(false); showExitButton(true); } enableExitButton(true); } void SUIMainMenuWnd::clickExitButton() { SGameLocalPlayer* localPlayer = dynamicCast(g_pCurrentGameSystem->GetLocalPlayer()); if (!localPlayer) return ; int curIasStatus = localPlayer->getInstanceArenaStatus(); sArenaSystem* arenaSystem = g_pCurrentGameSystem->getArenaSystem(); if (SGameLocalPlayer::IAS_ARENA_WAITING == curIasStatus) { int stringId; if (arenaSystem->isRecvBattleInfo()) stringId = 2486; else stringId = 2485; m_pGameManager->GetGameInterface()->OpenMessageBox(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_OKCANCEL, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_ARENA_WAITING_EXIT, false, stringId, "", 0, false); } else if (SGameLocalPlayer::IAS_ARENA_PRACTICE_WAITING == curIasStatus) { m_pGameManager->GetGameInterface()->OpenMessageBox(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_OKCANCEL, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_ARENA_PRACTICE_WAITING_EXIT, true, 2485, "", 0, false); } else if (SGameLocalPlayer::IAS_ARENA_PRACTICE == curIasStatus) { m_pGameManager->GetGameInterface()->OpenMessageBox(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_OKCANCEL, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_ARENA_PRACTICE_EXIT, false, 2422, "", 0, false); } else if (SGameLocalPlayer::IAS_ARENA_GAME == curIasStatus) { m_pGameManager->GetGameInterface()->OpenMessageBox(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_OKCANCEL, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_ARENA_GAME_EXIT, false, 2486, "", 0, false); } else if (SGameLocalPlayer::IAS_DEATHMATCH == curIasStatus) { //게임밖으로.. 나갈지 묻는다. m_pGameManager->PostMsgAtDynamic( new SIMSG_REQ_OPEN_MSGBOX(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_DEATHMATCH_EXIT, S( 9206 ), "deathmatchexit" ) ); } else if (SGameLocalPlayer::IAS_BEARLOAD == curIasStatus) { //베어로드 로비로 나올것 if( g_pCurrentGameSystem->GetContentsMgr().acquire< SHuntaHolicSystem >( "huntaholic" )->isHunting() ) { if( g_pCurrentGameSystem->GetContentsMgr().acquire< SHuntaHolicSystem >( "huntaholic" )->isObjCompleted() ) { m_pGameManager->PostMsgAtDynamic(new SIMSG_REQ_OPEN_MSGBOX(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_HUNTAHOLIC_SCOREBOARD, S( 6671 ), "huntaholic_scoreboard" ) ); } else { m_pGameManager->PostMsgAtDynamic(new SIMSG_REQ_OPEN_MSGBOX(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_HUNTAHOLIC_SCOREBOARD, S( 6670 ), "huntaholic_scoreboard" ) ); } } } else if (SGameLocalPlayer::IAS_BEARLOADLOBBY == curIasStatus) { //베어로드 로비에서 게임으로.. SMSG_INSTANCE_GAME_EXIT *pMsg = new SMSG_INSTANCE_GAME_EXIT(); m_pGameManager->PostMsgAtDynamic( pMsg ); } } void SUIMainMenuWnd::updateInstanceArenaStatus() { int iasStatus = calcInstanceArenaStatus(); setInstanceArenaStatus(iasStatus); }