#include "stdafx.h" #include #include "KUIControlGauge.h" #include "KUIControlExpGauge.h" #include "KUIControlFuryGauge.h" #include "KUIControlStatic.h" #include "SUIMainFrameWnd.h" #include "SUIDisplayInfo.h" #include "SGameManager.h" #include "SGameMessage.h" //#include "SGameMessageUI.h" #include "SGameAvatarEx.h" #include "SGameSystem.h" #include "Util.h" #include "SGame.h" #include "SJobDB.h" //#include "SUIUtil.h" #include "SStringDB.h" #include "SPlayerInfoMgr.h" #include "Arena\\ArenaSystem.h" #include "ContentStruct.h" #include "SGameLobbyDefine.h" extern SGameSystem * g_pCurrentGameSystem; using namespace CStringUtil; namespace { const DWORD c_dwGaugeFillTime = 1000; const char* c_szFURY_BAR = "mainframe_furybar"; const char* c_szHP_BAR = "mainframe_hpbar"; const char* c_szMP_BAR = "mainframe_mpbar"; const char* c_szEXP_BAR = "mainframe_expbar"; const char* c_szPlayName = "static_name"; const char* c_szLevel = "mainframe_level"; const char* c_szJLV_NUM = "mainframe_jlv_number"; const char* c_szJOB_NAME = "player_text_job_01"; const char* c_szK_FONT = "mainframe_k_font"; const char* c_szJP = "mainframe_jp"; const char* c_szHP_VALUE = "static_hp_value"; const char* c_szMP_VALUE = "static_mp_value"; const char* c_szClan = "playert_text_clan_01"; const char* c_szServerName = "static_server_text_01"; #ifdef _COUNTRY_CN_ const char * c_szGage_Stress = "static_gage_stress"; const char * c_szGageOff01 = "gage_off_01"; const char * c_szGage_green_01 = "gage_green_01"; const char * c_szGage_em_01 = "gage_em_01"; const unsigned short c_nMaxGageOff = 20; const char * c_szGageOff[c_nMaxGageOff] = { "gage_off_02", "gage_off_03", "gage_off_04", "gage_off_05", "gage_off_06", "gage_off_07", "gage_off_08", "gage_off_09", "gage_off_10", "gage_off_11", "gage_off_12", "gage_off_13", "gage_off_14", "gage_off_15", "gage_off_16", "gage_off_17", "gage_off_18", "gage_off_19", "gage_off_20", "gage_off_21", }; const AR_TIME c_arLimitTime_LV1 = 1080000; const AR_TIME c_arLimitTime_LV2 = 1800000; #endif }; //----------------------------------------------------------------------------------------------------------------- // 생성자 //----------------------------------------------------------------------------------------------------------------- SUIMainFrameWnd::SUIMainFrameWnd( SGameManager* pGameManager, SUIDisplayInfo* pDisplayInfo ) : SUIWnd( pGameManager ) , m_pDisplayInfo( pDisplayInfo ) , m_pMarkState( NULL ) , m_pPlayerClan( NULL ) , m_strPlayerClanPropertyTag( "" ) , m_bIsInFreePassMarkIcon( false ) { } //----------------------------------------------------------------------------------------------------------------- // 파괴자 //----------------------------------------------------------------------------------------------------------------- SUIMainFrameWnd::~SUIMainFrameWnd() { SAFE_DELETE(m_pMarkState); } //----------------------------------------------------------------------------------------------------------------- // 컨트롤 초기화 //----------------------------------------------------------------------------------------------------------------- bool SUIMainFrameWnd::InitControls(KPoint kPos) { m_pMarkState = new sui::sMarkState; if( m_pMarkState ) { hideAllMark(); m_pMarkState->hideAll(); } return SUIWnd::InitControls(kPos); } //----------------------------------------------------------------------------------------------------------------- // 데이터 초기화 //----------------------------------------------------------------------------------------------------------------- bool SUIMainFrameWnd::InitData( bool bReload /*= false*/ ) { m_pPlayerClan = dynamicCast( GetChild( c_szClan ) ); if( NULL == m_pPlayerClan ) { SDEBUGLOG( "[캐릭터 정보 메인 윈도우] 컨트롤 정보 얻기 실패 - Name[%s]", c_szClan ); assert( m_pPlayerClan ); } else { string strCaption( m_pPlayerClan->GetCaption() ); GetTextDecoration( strCaption.c_str(), m_strPlayerClanPropertyTag ); } return SUIWnd::InitData(bReload); } //----------------------------------------------------------------------------------------------------------------- // 메시지 처리 //----------------------------------------------------------------------------------------------------------------- void SUIMainFrameWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch(nMessage) { case KUI_MESSAGE::KGENWND_RIGHT_CLICK: { //메뉴 활성화 하자 m_pGameManager->StartSound( "ui_button_click.wav" ); } break; case KUI_MESSAGE::KBUTTON_CLICK: { if( 0 == ::_stricmp( "mainframe_name", lpszControlID ) ) { SIMSG_UI_ACT_TARGET msg; msg.m_nTargetHandle = m_PlayerInfoMgr.GetPlayerHandle(); m_pGameManager->ProcMsgAtStatic(&msg); } else if( 0 == ::_stricmp( "button_jobinfohide", lpszControlID ) ) { //Job Info 숨기기 KUIWnd * pButtonView = GetChild( lpszControlID ); if( pButtonView ) pButtonView->SetShow(false); KUIWnd * pButtonHide = GetChild( "button_jobinfoview" ); if( pButtonHide ) pButtonHide->SetShow(true); } else if( 0 == ::_stricmp( "button_jobinfoview", lpszControlID ) ) { //Job Info 보이기 KUIWnd * pButtonView = GetChild( lpszControlID ); if( pButtonView ) pButtonView->SetShow(false); KUIWnd * pButtonHide = GetChild( "button_jobinfohide" ); if( pButtonHide ) pButtonHide->SetShow(true); } } break; case KUI_MESSAGE::KFOCUS_ACTIVATED: { if( GetRect().IsInRect( static_cast(lparam), static_cast(wparam) ) ) { SIMSG_UI_ACT_TARGET msg; msg.m_nTargetHandle = m_PlayerInfoMgr.GetPlayerHandle(); m_pGameManager->ProcMsgAtStatic(&msg); } } break; } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } //----------------------------------------------------------------------------------------------------------------- // 시쿠르트 이용권 ( FREEPASS )의 남은 시간 툴팁 갱신 // - 시쿠르트의 남은 시간은 서버에서 특정 상황에만 시간 갱신 패킷을 보내준다 ( 캐쉬 아이템 사용, PK 모드 변경 등... ) // 이에 시쿠르트 남은 시간을 서버로 부터 받았을 때로 부터 시간을 계산하여 클라이언트에서 출력해준다. //----------------------------------------------------------------------------------------------------------------- void SUIMainFrameWnd::UpdateFreePassEndTimeTooltip() { if( NULL == m_pMarkState ) return ; m_pMarkState->UpdateFreePassEndTimeTooltip( this, m_pDisplayInfo ); } //----------------------------------------------------------------------------------------------------------------- // Idle 처리 //----------------------------------------------------------------------------------------------------------------- void SUIMainFrameWnd::Process( DWORD dwTime ) { if( m_bIsInFreePassMarkIcon ) UpdateFreePassEndTimeTooltip(); SUIWnd::Process( dwTime ); } //----------------------------------------------------------------------------------------------------------------- // 마우스 메시지 처리 //----------------------------------------------------------------------------------------------------------------- DWORD SUIMainFrameWnd::OnMouseMessage(DWORD dwMessage, int x, int y) { if( m_pMarkState ) m_bIsInFreePassMarkIcon = m_pMarkState->IsInRectFreePass( this, KPoint( x, y ) ); ; return SUIWnd::OnMouseMessage(dwMessage, x, y); } //----------------------------------------------------------------------------------------------------------------- // 정적 메시지 처리 //----------------------------------------------------------------------------------------------------------------- void SUIMainFrameWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { if( NULL == pMsg ) { SDEBUGLOG( "[캐릭터 메인 윈도우] 메시지가 유효하지 않습니다." ); assert( NULL ); return ; } switch(pMsg->nType) { case MSG_CHANGE_NAME : { updateName(); pMsg->bUse = true; } break; case MSG_LOGIN: { SMSG_LOGIN* pLoginMsg( dynamicCast(pMsg) ); if( pLoginMsg ) { updateName(); RefreshHP( pLoginMsg->hp, pLoginMsg->max_hp ); RefreshMP( pLoginMsg->mp, pLoginMsg->max_mp ); updateMarkStateList(); SetClan(); pMsg->bUse = true; } } break; case IMSG_UI_TARGET_STAT: { SIMSG_UI_TARGET_STAT* pUIMsg( dynamicCast(pMsg) ); if( pUIMsg ) { RefreshHP( pUIMsg->m_nVar1, pUIMsg->m_nVar3 ); RefreshMP( pUIMsg->m_nVar2, pUIMsg->m_nVar4 ); pMsg->bUse = true; } } break; case MSG_LEVEL_UPDATE: { SetClan(); SetLevel(); SetJLevel(); RefreshExp(); pMsg->bUse = true; } break; case MSG_EXP_UPDATE: { RefreshExp(); SetJP(); pMsg->bUse = true; } break; case MSG_PROPERTY: { SMSG_PROPERTY* pPropertyMsg = (SMSG_PROPERTY*)pMsg; switch( pPropertyMsg->nPropertyType ) { case SMSG_PROPERTY::PROPERTY_NAME: { updateName(); } break; case SMSG_PROPERTY::PROPERTY_JOB: case SMSG_PROPERTY::PROPERTY_JOB_LEVEL: { SetJLevel(); SetClan(); } break; case SMSG_PROPERTY::PROPERTY_EXP: RefreshExp(); break; case SMSG_PROPERTY::PROPERTY_LEVEL: SetLevel(); break; case SMSG_PROPERTY::PROPERTY_JP: SetJP(); break; case SMSG_PROPERTY::PROPERTY_STAMINA: RefreshExp(); break; case SMSG_PROPERTY::PROPERTY_STAMINA_REGEN_RATE: RefreshExp(); break; case SMSG_PROPERTY::PROPERTY_PLAYTIME: case SMSG_PROPERTY::PROPERTY_PLAYTIME_LIMIT1: case SMSG_PROPERTY::PROPERTY_PLAYTIME_LIMIT2: { RefreshGageStress(); } break; } pMsg->bUse = true; } break; /// 2011.01.14 - prodongi case IMSG_UI_STATE_LIST_UPDATE: { SIMSG_UI_STATE_LIST_UPDATE* pStateMsg = (SIMSG_UI_STATE_LIST_UPDATE*)pMsg; if (SIMSG_UI_STATE_LIST_UPDATE::STATE_UPDATE_MARK == pStateMsg->nUpdateType) { updateMarkStateList(); pMsg->bUse = true; } } break; /// 2011.01.17 - prodongi case IMSG_MARK_STATUS_CHANGE: { SMSG_MARK_STATUS_CHANGE* pStatusMsg = dynamicCast(pMsg); if( pStatusMsg ) { updateMarkStatusList( pStatusMsg->m_status ); pMsg->bUse = true; } } break; case MSG_BATTLE_ARENA_BATTLE_INFO: case MSG_BATTLE_ARENA_LEAVE: { updateName(); pMsg->bUse = true; } break; } } extern struct USER_INFO g_UserInfo; void SUIMainFrameWnd::SetName(char const* name) { /// 2011.01.12 - prodongi SetChildCaption( c_szPlayName, CStringUtil::StringFormat("<#ffffff>%s", name ).c_str() ); // gmpbigsun( 20130614 ) SetChildCaption( c_szServerName, CStringUtil::StringFormat("<#a1826b>%s", g_UserInfo.GetSelServerName() ).c_str() ); } void SUIMainFrameWnd::SetLevel() { std::string str; /// 2011.01.12 - prodongi XStringUtil::Format( str, "<#FFFFFF>%d", m_PlayerInfoMgr.GetLevel() ); SetChildCaption( c_szLevel, str.c_str() ); } void SUIMainFrameWnd::SetJLevel() { /// 2011.01.12 - prodongi SetChildCaption( c_szJLV_NUM , CStringUtil::StringFormat( "%d", m_PlayerInfoMgr.GetJLv() ).c_str() ); //기존 size:10 에서 기획팀 요청으로 9로 줄임 SetChildCaption( c_szJOB_NAME, CStringUtil::StringFormat( "<#ffffff>%s", m_PlayerInfoMgr.GetJobName() ).c_str() ); // 잡 아이콘 KUIControlIconStatic* pJobIcon = dynamicCast(GetChild( "icon_job" )); if( pJobIcon ) { pJobIcon->SetIcon( c_szDEF_SPR_NAME, GetJobDB().GetJobIconName(m_PlayerInfoMgr.GetJobID()) ); pJobIcon->SetTooltip(NULL); } } //----------------------------------------------------------------------------------------------------------------- // 종족 설정 //----------------------------------------------------------------------------------------------------------------- void SUIMainFrameWnd::SetClan() { if( NULL == m_pGameManager ) return ; SGame* pGame( m_pGameManager->GetActiveGame() ); if( NULL == pGame ) return ; SGameAvatarEx* pPlayer( dynamicCast( pGame->GetGameObject( m_PlayerInfoMgr.GetPlayerHandle() ) ) ); if( NULL == pPlayer ) { SDEBUGLOG( "[캐릭터 정보 메인 윈도우] 플레이어 포인터가 유효하지 않습니다." ); assert( pPlayer ); return ; } if( NULL == m_pPlayerClan ) { SDEBUGLOG( "[캐릭터 정보 메인 윈도우] 종족 컨트롤 정보가 유효하지 않습니다.." ); assert( m_pPlayerClan ); return ; } string strPlayerClan( m_strPlayerClanPropertyTag ); CLAN eClan( (CLAN)pPlayer->GetRace() ); switch( eClan ) { case CLAN::GCLAN_GAIA: strPlayerClan.append( S( 1 ) ); break; case CLAN::GCLAN_DEVA: strPlayerClan.append( S( 2 ) ); break; case CLAN::GCLAN_ASURA: strPlayerClan.append( S( 3 ) ); break; default: strPlayerClan.append( "Unknown Race" ); break; }; strPlayerClan.append( " : " ); BYTE byJobClass( static_cast( GetJobDB().GetJobClass( m_PlayerInfoMgr.GetJobID() ) ) ); switch( byJobClass ) { case JobInfo::FIGHTER: strPlayerClan.append( S( 690000043 ) ); break; case JobInfo::HUNTER: strPlayerClan.append( S( 690000044 ) ); break; case JobInfo::MAGICIAN: strPlayerClan.append( S( 690000045 ) ); break; case JobInfo::SUMMONER: strPlayerClan.append( S( 690000046 ) ); break; default: strPlayerClan.append( "Unknown Job Class" ); break; }; m_pPlayerClan->SetCaption( strPlayerClan.c_str() ); } void SUIMainFrameWnd::SetJP() { std::string jpStr; jpToString(m_PlayerInfoMgr.GetJP(), jpStr); SetChildCaption( c_szJP, jpStr.c_str()); } void SUIMainFrameWnd::RefreshExp() // 소수점 둘째 자리 { double fPer = ((double)(m_PlayerInfoMgr.GetCurExp())/m_PlayerInfoMgr.GetMaxExp())*100.f; SetChildCaption( "static_exp_value", CStringUtil::StringFormat( "%02.02f%s", fPer, "%" ).c_str() ); /// 2011.01.12 - prodongi KUIControlGauge* pGauge = dynamicCast(GetChild( c_szEXP_BAR )); if( pGauge ) { int nStringID = -1; std::string strGuageName; /// 2010.11.24 - prodongi if( m_PlayerInfoMgr.GetStamina() >= 130000 ) { strGuageName = "common_gauge_titanium_player_stamina5000"; nStringID = 6338; } else if( m_PlayerInfoMgr.GetStamina() >= 10000 && m_PlayerInfoMgr.GetStamina() < 130000 ) { strGuageName = "common_gauge_titanium_player_stamina1300"; nStringID = 6339; } else { strGuageName = "common_gauge_titanium_player_stamina100"; nStringID = 6340; } #ifdef _COUNTRY_CN_ if( m_PlayerInfoMgr.GetContinuousPlayTime() >= c_arLimitTime_LV1 ) { strGuageName = "guage_creature_sp00"; } #endif if( stricmp( pGauge->GetAniName(), strGuageName.c_str() ) != 0 ) pGauge->SetBack( c_szDEF_SPR_NAME, strGuageName.c_str() ); std::string strTooltip = SR( nStringID, "#@regen_rate@#", m_PlayerInfoMgr.GetStaminaRegen(), "#@stamina@#", (m_PlayerInfoMgr.GetStamina()/100), "#@max_stamina@#", (m_PlayerInfoMgr.GetMax_stamina()/100) ); pGauge->SetTooltip( strTooltip.c_str() ); m_pDisplayInfo->RefreshGaugeAndStaticByPercentage( pGauge, (int)fPer, 0 ); } } void SUIMainFrameWnd::RefreshHP( int nHP, int nMaxHP ) { // per int nPer = static_cast(m_pDisplayInfo->GetPercent( nHP, nMaxHP )); std::string str; XStringUtil::Format( str, "%d/%d", nHP, nMaxHP ); SetChildCaption( c_szHP_VALUE, str.c_str() ); KUIControlGauge* pGaugeHP = dynamicCast(GetChild( c_szHP_BAR )); if( pGaugeHP ) { m_pDisplayInfo->RefreshGaugeAndStatic( pGaugeHP, nHP, nMaxHP, nPer, c_dwGaugeFillTime ); { // 게이지 남은 양에 따라 텍스처 바꿔줌 // 2012.02.03 - servantes setHPGaugeTexture( nPer, pGaugeHP, 11 ); } } } void SUIMainFrameWnd::RefreshMP( int nMP, int nMaxMP ) { int nPer = static_cast(m_pDisplayInfo->GetPercent( nMP, nMaxMP )); std::string str; XStringUtil::Format( str, "%d/%d", nMP, nMaxMP ); SetChildCaption( c_szMP_VALUE, str.c_str() ); KUIControlGauge* pGaugeMP = dynamicCast(GetChild( c_szMP_BAR )); if( pGaugeMP ) m_pDisplayInfo->RefreshGaugeAndStatic( pGaugeMP, nMP, nMaxMP, nPer, c_dwGaugeFillTime ); } void SUIMainFrameWnd::RefreshGageStress() { #ifdef _COUNTRY_CN_ AR_TIME arCurTime = m_PlayerInfoMgr.GetContinuousPlayTime(); AR_TIME arMaxTime = m_PlayerInfoMgr.GetMaxContinuousPlayTime(); if( arMaxTime == 0 ) { // assert( false ); //서버팀에 문의 해야 한다 return; } float fPer = (float)arCurTime / arMaxTime; int nShowGageOff = c_nMaxGageOff - (int)(fPer * c_nMaxGageOff); if( nShowGageOff > c_nMaxGageOff ) { assert( false ); return; } KUIControlStatic* pGageGreen = dynamicCast(GetChild( c_szGage_green_01 )); KUIControlStatic* pGageEm = dynamicCast(GetChild( c_szGage_em_01 )); if( pGageGreen ) pGageGreen->SetShow( false ); if( pGageEm ) pGageEm->SetShow( false ); for( int i = 0; i < c_nMaxGageOff; ++i ) { KUIControlStatic* pGageOffStatic = dynamicCast(GetChild( c_szGageOff[i] )); if( pGageOffStatic ) { if( (i+1) == nShowGageOff ) { const KRect& rc = pGageOffStatic->GetRect(); pGageOffStatic->SetShow( false ); //3시간 경과시 에메랄드 색 표시 if( arCurTime >= c_arLimitTime_LV1 ) { if( pGageEm ) { pGageEm->SetShow( true ); SetMovePos( c_szGage_em_01, rc.left-1, rc.top-1 ); } } else { if( pGageGreen ) { pGageGreen->SetShow( true ); SetMovePos( c_szGage_green_01, rc.left-1, rc.top-1 ); } } } else if( i < nShowGageOff ) pGageOffStatic->SetShow( false ); else pGageOffStatic->SetShow( true ); } } KUIControlStatic* pGageOffStatic = dynamicCast(GetChild( c_szGageOff01 )); if( pGageOffStatic ) { if( nShowGageOff == 0 ) pGageOffStatic->SetShow( false ); else pGageOffStatic->SetShow( true ); } KUIControlStatic* pGageStressStatic = dynamicCast(GetChild( c_szGage_Stress )); if( pGageStressStatic ) { AR_TIME hour = arCurTime / 360000; //100*60*60 1/100초 기준 AR_TIME minute = 0; if( hour > 0 ) { minute = arCurTime - ( hour * 360000 ); minute = minute / 6000; } else { minute = arCurTime / 6000; } // sonador 3.4.2 소지금 최대 한도 증가 관련 시스템 변경 std::string str = SR(550, "#@hour@#", static_cast< int >( hour ), "#@minute@# ", static_cast< int >( minute ) ); if( arCurTime >= c_arLimitTime_LV2 ) //5시간 경과시 플레이 타임 미 표시 str = CStringUtil::StringFormat( "%s", S( 549 ) ); else if( arCurTime >= c_arLimitTime_LV1 ) //3시간 경과 str += CStringUtil::StringFormat( "
%s", S( 548 ) ); else str += CStringUtil::StringFormat( "
%s", S( 547 ) ); pGageStressStatic->SetTooltip( str.c_str() ); } RefreshExp(); #endif } /// 2011.01.13 - prodongi void SUIMainFrameWnd::hideAllMark() { m_pMarkState->hideAllControl(this); } /// 2011.01.14 - prodongi void SUIMainFrameWnd::updateMarkStateList() { m_pMarkState->updateMarkStateList(this, m_pDisplayInfo, g_pCurrentGameSystem->GetLocalPlayer()); } /// 2011.01.17 - prodongi void SUIMainFrameWnd::updateMarkStatusList(int status) { m_pMarkState->updateMarkStatusList(this, m_pDisplayInfo, status); } void SUIMainFrameWnd::updateName() { sArenaSystem* arenaSystem = g_pCurrentGameSystem->getArenaSystem(); SetName(arenaSystem->getPlayerName(&m_PlayerInfoMgr)); }