Files
Leviathan/Client/Game/game/Interface/Skill/SUISkillTreeFundWnd.cpp
T
2026-06-01 12:46:52 +02:00

1127 lines
40 KiB
C++

/// 2010.12.17 - prodongi
#include "stdafx.h"
#include "SUISkillWnd.h"
#include "KUITabControl.h"
//#include "KUIControlButton.h"
#include "KUIControlStatic.h"
//#include "KUIControlScroll.h"
#include "KUIDragAndDrop.h"
#include "SGameManager.h"
//#include "SGameMessageUI.h"
#include "SUIDisplayInfo.h"
#include "SSkillDB.h"
#include "SStringDB.h"
//#include "SJobDB.h"
#include "SSkillSlot.h"
#include "SPlayerInfoMgr.h"
#include "ErrorCode/ErrorCode.h"
#include "SUILazyTooltip.h" // sonador #2.1.2.4.3 팻 조작 UI 연동
#include "SUISkillTreeFundWnd.h" /// 2010.12.03 - prodongi
//#include "SUIUtil.h" /// 2010.12.17 - prodongi
//
//struct SkillTreeDisplay
//{
// int job_id; //잡 ID
// int slot_v; //슬롯 위치1~9
// int skill1_id; //스킬 ID
// int skill2_id; //스킬 ID
// int skill3_id; //스킬 ID
// int skill4_id; //스킬 ID
// int skill5_id; //스킬 ID
//};
const int c_nSkillWidthCnt = 5;
const int c_nSkillHeightCnt = 9;
//const int c_nDelta = 63;
const int c_nDelta = 64; /// 2011.04.20 - prodongi
//const float c_ftabSize = (342-8)/4;
const char* c_lpSkillEmptyAni = "static_common_itemslot";
const char* c_lpPassiveAni = "static_treeslot_passive";
const char* c_lpSkillSlotCtrName = "skillslot";
const char* c_lpPassiveSlotCtrName = "passiveslot";
const char* c_lpSlotDisableCtrName = "icondisable";
const char* c_lpSkillLvBackCtrName = "skill_lv_back";
const char* c_lpSkillLvTextCtrName = "skill_lv";
const char* c_lpSkillUpCtrName = "buttonskillup";
const char* c_lpSkillAbleUpCtrName = "skillslotableup";
/// 2011.02.24 - prodongi
/*
const char* c_lpAsura_0 = "static_player_skilltree_asura_00_bb"; //스테퍼
const char* c_lpAsura_1_mgc = "static_player_skilltree_asura_01_pp"; //매지션
const char* c_lpAsura_1_smr = "static_player_skilltree_asura_01_ss"; //서모너
const char* c_lpAsura_1_std = "static_player_skilltree_asura_01_ww"; //스트라이더
const char* c_lpAsura_2_rgr = "static_player_skilltree_asura_02_hh"; //레인저
const char* c_lpAsura_2_dmg = "static_player_skilltree_asura_02_pd"; //다크매지션
const char* c_lpAsura_2_ssr = "static_player_skilltree_asura_02_pp"; //소서러
const char* c_lpAsura_2_bsm = "static_player_skilltree_asura_02_ss"; //배틀서모너
const char* c_lpAsura_2_asn = "static_player_skilltree_asura_02_ww"; //어쌔신
const char* c_lpDeva_0 = "static_player_skilltree_deva_00_bb"; //가이드
const char* c_lpDeva_1_clr = "static_player_skilltree_deva_01_pp"; //클레릭
const char* c_lpDeva_1_tmr = "static_player_skilltree_deva_01_ss"; //테이머
const char* c_lpDeva_1_ptr = "static_player_skilltree_deva_01_ww"; //파이터
const char* c_lpDeva_2_mge = "static_player_skilltree_deva_02_pm"; //메이지
const char* c_lpDeva_2_prt = "static_player_skilltree_deva_02_pp"; //프리스트
const char* c_lpDeva_2_brd = "static_player_skilltree_deva_02_ss"; //브리더
const char* c_lpDeva_2_nit = "static_player_skilltree_deva_02_wn"; //나이트
const char* c_lpDeva_2_wr = "static_player_skilltree_deva_02_ww"; //워리어
const char* c_lpGaia_0 = "static_player_skilltree_gaia_00_bb"; //방랑자
const char* c_lpGaia_1_jss = "static_player_skilltree_gaia_01_pp"; //주술사
const char* c_lpGaia_1_yss = "static_player_skilltree_gaia_01_ss"; //야수사
const char* c_lpGaia_1_tsa = "static_player_skilltree_gaia_01_ww"; //투사
const char* c_lpGaia_2_gsa = "static_player_skilltree_gaia_02_hh"; //궁사
const char* c_lpGaia_2_mds = "static_player_skilltree_gaia_02_pp"; //마도사
const char* c_lpGaia_2_mts = "static_player_skilltree_gaia_02_pw"; //마투사
const char* c_lpGaia_2_mss = "static_player_skilltree_gaia_02_ss"; //마수사
const char* c_lpGaia_2_js = "static_player_skilltree_gaia_02_ww"; //전사
*/
using namespace rp;
SUISkillTreeFundWnd::SUISkillTreeFundWnd( SGameManager* pGameManager, SUIDisplayInfo* pDisplayInfo )
: SUIWnd( pGameManager ), m_pDisplayInfo(pDisplayInfo), m_nTabType(0), m_nJopPoint(0), m_bCreateInfo(false)
{
::memset( m_nJopID, 0x00, sizeof(m_nJopID) );
::memset( m_nJopLv, 0x00, sizeof(m_nJopLv) );
}
SUISkillTreeFundWnd::~SUISkillTreeFundWnd()
{
ClearSkillTreeList();
m_treeImageList.clear();
}
void SUISkillTreeFundWnd::ClearSkillTreeList()
{
int nSize(m_SkillTreeList.size());
for( int i(0); i<nSize; ++i )
SAFE_DELETE(m_SkillTreeList[i]);
m_SkillTreeList.clear();
}
void SUISkillTreeFundWnd::CreateSkillTreeLists()
{
ClearSkillTreeList();
for( int i(0); i<c_nJopCnt; ++i )
CreateSkillTreeList( i );
}
/// 2011.02.24 - prodongi
void SUISkillTreeFundWnd::initTreeImageList()
{
m_treeImageList[100] = "game_panel_skill_skilltree_gaia_basic_bangrangza"; //방랑자
m_treeImageList[101] = "game_panel_skill_skilltree_gaia_01_toosa"; //투사
m_treeImageList[102] = "game_panel_skill_skilltree_gaia_01_joosulsa"; //주술사
m_treeImageList[103] = "game_panel_skill_skilltree_gaia_01_yasoosa"; //야수사
m_treeImageList[110] = "game_panel_skill_skilltree_gaia_02_zeonsa"; //전사
m_treeImageList[111] = "game_panel_skill_skilltree_gaia_02_gungsa"; //궁사
m_treeImageList[112] = "game_panel_skill_skilltree_gaia_02_madosa"; //마도사
m_treeImageList[113] = "game_panel_skill_skilltree_gaia_02_matoosa"; //마투사
m_treeImageList[114] = "game_panel_skill_skilltree_gaia_02_masoosa"; //마수사
m_treeImageList[120] = "game_panel_skill_skilltree_gaia_master_tooshin"; //투신
m_treeImageList[121] = "game_panel_skill_skilltree_gaia_master_shingung"; //신궁
m_treeImageList[122] = "game_panel_skill_skilltree_gaia_master_hyunza"; //현자
m_treeImageList[123] = "game_panel_skill_skilltree_gaia_master_gumgang"; //금강
m_treeImageList[124] = "game_panel_skill_skilltree_gaia_master_nachal"; //나찰
m_treeImageList[200] = "game_panel_skill_skilltree_deva_basic_guide"; //가이드
m_treeImageList[201] = "game_panel_skill_skilltree_deva_01_fighter"; //파이터
m_treeImageList[202] = "game_panel_skill_skilltree_deva_01_cleric"; //클레릭
m_treeImageList[203] = "game_panel_skill_skilltree_deva_01_tamer"; //테이머
m_treeImageList[210] = "game_panel_skill_skilltree_deva_02_knight"; //나이트
m_treeImageList[211] = "game_panel_skill_skilltree_deva_02_warrior"; //워리어
m_treeImageList[212] = "game_panel_skill_skilltree_deva_02_mage"; //메이지
m_treeImageList[213] = "game_panel_skill_skilltree_deva_02_priest"; //프리스트
m_treeImageList[214] = "game_panel_skill_skilltree_deva_02_breeder"; //브리더
m_treeImageList[220] = "game_panel_skill_skilltree_deva_master_godsknight"; //가나이트
m_treeImageList[221] = "game_panel_skill_skilltree_deva_master_hero"; //히어로
m_treeImageList[222] = "game_panel_skill_skilltree_deva_master_arcmage"; //아크메이지
m_treeImageList[223] = "game_panel_skill_skilltree_deva_master_saint"; //세인트
m_treeImageList[224] = "game_panel_skill_skilltree_deva_master_maestro"; //마에스트로
m_treeImageList[300] = "game_panel_skill_skilltree_asura_basic_staffer"; //스테퍼
m_treeImageList[301] = "game_panel_skill_skilltree_asura_01_strider"; //스트라이더
m_treeImageList[302] = "game_panel_skill_skilltree_asura_01_magician"; //매지션
m_treeImageList[303] = "game_panel_skill_skilltree_asura_01_summoner"; //서모너
m_treeImageList[310] = "game_panel_skill_skilltree_asura_02_assassin"; //어쌔신
m_treeImageList[311] = "game_panel_skill_skilltree_asura_02_ranger"; //레인저
m_treeImageList[312] = "game_panel_skill_skilltree_asura_02_sorcerer"; //소서러
m_treeImageList[313] = "game_panel_skill_skilltree_asura_02_darkmagician"; //다크매지션
m_treeImageList[314] = "game_panel_skill_skilltree_asura_02_battlesummoner"; //배틀서모너
m_treeImageList[320] = "game_panel_skill_skilltree_asura_master_spectre"; //스펙터
m_treeImageList[321] = "game_panel_skill_skilltree_asura_master_shadowstalker"; //섀도우스토커
m_treeImageList[322] = "game_panel_skill_skilltree_asura_master_doomsayer"; //둠세이어
m_treeImageList[323] = "game_panel_skill_skilltree_asura_master_soulriver"; //소울리버
m_treeImageList[324] = "game_panel_skill_skilltree_asura_master_gilgamesh"; //길가메쉬
}
bool SUISkillTreeFundWnd::InitControls( KPoint kPos )
{
CreateControls();
SetChildAsTop( "skillfund_select" );
// KUIControlMultiIcon* pSlot = (KUIControlMultiIcon*)GetChild( CStringUtil::StringFormat( "%s_00_00", c_lpSkillSlotCtrName ).c_str() );
// if( pSlot ) pSlot->SetIconLayer( 2 );
return SUIWnd::InitControls(kPos);
}
void SUISkillTreeFundWnd::UpdateTab( int nCnt )
{
/// 2010.12.17 탭 버튼 개수는 변하지 않으므로, enable/disable로 설정해 준다 - prodngi
/*
KUISimpleTabControl* pTabControl = (KUISimpleTabControl*)GetChild("skillfund_tab00");
if( pTabControl )
{
pTabControl->RemoveTabAllItem();
KRect rt = pTabControl->GetRect();
rt.right = rt.left + ( c_ftabSize * (float)nCnt );
pTabControl->SetRect(rt);
pTabControl->SetTabProperty( 0, false, nCnt );
if( nCnt > 0 ) pTabControl->AddTabItem( S(6471), S(6471) );
if( nCnt > 1 ) pTabControl->AddTabItem( S(6472), S(6472) );
if( nCnt > 2 ) pTabControl->AddTabItem( S(6473), S(6473) );
if( nCnt > 3 ) pTabControl->AddTabItem( S(6474), S(6474) );
pTabControl->SetSelectedItem( m_nTabType );
}
*/
/// 2011.05.30 - prodongi
KUITabControlSheet* tabSheet = dynamicCast<KUITabControlSheet*>(GetChild("skill_tree_tab01"));
if (tabSheet) tabSheet->SetSelectHead((DWORD)m_nTabType);
int i = 0;
char const* childId[] = { "skill_tree_tab_basic_01", "skill_tree_tab_first_01", "skill_tree_tab_second_01", "skill_tree_tab_master_01"};
for (;i < nCnt; ++i)
{
setChildControlEnable(this, childId[i], true);
}
for (; i < 4; ++i)
{
setChildControlEnable(this, childId[i], false);
}
}
/////////////////////////////////////////////
// 스킬투자윈도우
/////////////////////////////////////////////
void SUISkillTreeFundWnd::CreateControls()
{
RECT rcHeight;
rcHeight.left = 0; rcHeight.top = c_nDelta; rcHeight.right = 0; rcHeight.bottom = c_nDelta;
RECT rcWidth;
rcWidth.left = c_nDelta; rcWidth.top = 0; rcWidth.right = c_nDelta; rcWidth.bottom = 0;
KUIControlMultiIcon* pSlot(NULL);
for( int i(0); i<c_nSkillWidthCnt-1; ++i )
{
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillSlotCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillSlotCtrName, i+1 ).c_str(), rcWidth );
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillAbleUpCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillAbleUpCtrName, i+1 ).c_str(), rcWidth );
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpSlotDisableCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpSlotDisableCtrName, i+1 ).c_str(), rcWidth );
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillLvBackCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillLvBackCtrName, i+1 ).c_str(), rcWidth );
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillLvTextCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillLvTextCtrName, i+1 ).c_str(), rcWidth );
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillUpCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpSkillUpCtrName, i+1 ).c_str(), rcWidth );
CopyControl( CStringUtil::StringFormat( "%s_00_%02d", c_lpPassiveSlotCtrName, i ).c_str(), CStringUtil::StringFormat( "%s_00_%02d", c_lpPassiveSlotCtrName, i+1 ).c_str(), rcWidth );
}
for( int i(0); i<c_nSkillWidthCnt; ++i )
{
for( int j(0); j<c_nSkillHeightCnt-1; ++j )
{
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, j+1, i ).c_str(), rcHeight );
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillAbleUpCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillAbleUpCtrName, j+1, i ).c_str(), rcHeight );
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSlotDisableCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSlotDisableCtrName, j+1, i ).c_str(), rcHeight );
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvBackCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvBackCtrName, j+1, i ).c_str(), rcHeight );
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvTextCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvTextCtrName, j+1, i ).c_str(), rcHeight );
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillUpCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillUpCtrName, j+1, i ).c_str(), rcHeight );
CopyControl( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpPassiveSlotCtrName, j, i ).c_str(), CStringUtil::StringFormat( "%s_%02d_%02d", c_lpPassiveSlotCtrName, j+1, i ).c_str(), rcHeight );
}
}
}
void SUISkillTreeFundWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
{
if( bOpen )
{
// if( !m_bCreateInfo )
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
}
}
void SUISkillTreeFundWnd::Create_N_Init_AllData()
{
InitPlayerJopInfo();
CreateSkillTreeLists();
RefreshMasterBoxImage( m_nTabType ); // AziaMafia MasterskillBox
RefreshSkillData( m_nTabType );
RefreshJopTreeImage( m_nTabType );
refreshTP(); /// 2011.03.28 - prodongi
InitClickIconData();
}
bool SUISkillTreeFundWnd::InitData( bool bReload )
{
/// 2011.02.24 - prodongi
initTreeImageList();
return SUIWnd::InitData(bReload);
}
void SUISkillTreeFundWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
switch(nMessage)
{
case KUI_MESSAGE::KBUTTON_CLICK:
{
std::string strCtrName = lpszControlID;
if( ::strcmp( lpszControlID, "button_close" ) == 0 )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, false ) );
}
else if( strCtrName.find(c_lpSkillUpCtrName) != -1 )
{
SkillUP( m_nTabType, lpszControlID );
m_pGameManager->StartSound( "skillup.wav" );
}
else if (strcmp(lpszControlID, "skill_tree_tab_basic_01") == 0)
{
m_pGameManager->StartSound( "ui_button_click.wav" );
SelectTab(0);
}
else if (strcmp(lpszControlID, "skill_tree_tab_first_01") == 0)
{
m_pGameManager->StartSound( "ui_button_click.wav" );
SelectTab(1);
}
else if (strcmp(lpszControlID, "skill_tree_tab_second_01") == 0)
{
m_pGameManager->StartSound( "ui_button_click.wav" );
SelectTab(2);
}
else if (strcmp(lpszControlID, "skill_tree_tab_master_01") == 0)
{
m_pGameManager->StartSound( "ui_button_click.wav" );
SelectTab(3);
}
// 2011.05.24 도움말 윈도우.(가방창에서 갖고 옴) - prodongi
else if( !::_stricmp( lpszControlID, "button_help" ) )
{
const KRect & rt = GetChild( "button_help" )->GetRect();
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HELP_WND, false ) ); // 닫기.
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HELP_WND, rt.left, rt.top ) ); // 위치전달.
m_pGameManager->PostMsgAtDynamic( new SIMSG_HELP_TEXT( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HELP_WND, std::string( S( 9795 ) ) ) ); // 텍스트전달.
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HELP_WND, true ) ); // 열기.
}
}
break;
case KUI_MESSAGE::KICON_CLICK:
{
SetClickIcon( lpszControlID );
}
break;
/// 2010.12.17 - prodongi
/*
case KUI_MESSAGE::KTAB_SELECT: // 탭 변경
{
m_pGameManager->StartSound( "ui_button_click.wav" );
SelectTab( (int)lparam );
// m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILL, m_nTabType ) );
}
break;
*/
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
void SUISkillTreeFundWnd::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch(pMsg->nType)
{
case IMSG_UI_MOVE:
{
SIMSG_UI_MOVE* pMoveMsg = ( SIMSG_UI_MOVE* )pMsg;
MovePos( pMoveMsg->m_nX, pMoveMsg->m_nY-GetBoundingRect().GetHeight() );
pMsg->bUse = true;
}
break;
case MSG_ADDED_SKILL_LIST:
//break;
case MSG_SKILL_LIST:
{
pMsg->bUse = true;
}
break;
case IMSG_UI_SEND_DATA:
{
/// 2012.01.26 skill_reset은 안 쓰이는 것 같다, 문법도 틀렸다,, prodongi
SIMSG_UI_SEND_DATA* msg = ( SIMSG_UI_SEND_DATA* )pMsg;
if (msg->m_strString == "refresh")
{
if (IsShow())
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
}
pMsg->bUse = true;
}
break;
case MSG_EXP_UPDATE:
{
//if( m_bCreateInfo )
//{
// if( m_pMgr && m_pPlayerInfoMgr )
// {
// SPlayerInfo & info = m_PlayerInfoMgr.GetPlayerInfo();
// m_nJopPoint = info.GetJP();
// }
// CreateSkillTreeLists();
// RefreshSkillData( m_nTabType ); //InitPlayerJopInfo(); RefreshJopTreeImage( 0 ); InitClickIconData(); -> 잡포와 무관
//}
//else
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
pMsg->bUse = true;
}
break;
case IMSG_UI_TAB_UPDATE:
{
/*SIMSG_UI_TAB_UPDATE* pTabMsg = ( SIMSG_UI_TAB_UPDATE* )pMsg;
KUISimpleTabControl* pTab = ( KUISimpleTabControl* )GetChild("skillfund_tab00");
if( pTab ) pTab->SetSelectedItem( pTabMsg->m_nTabType );
SelectTab( pTabMsg->m_nTabType );*/
pMsg->bUse = true;
}
break;
case MSG_RESULT:
{
SMSG_RESULT* pMsgResult = (SMSG_RESULT*)pMsg;
switch(pMsgResult->request_msg_id)
{
case TM_CS_LEARN_SKILL:
{
if( pMsgResult->result == RESULT_SUCCESS )
{
if( !IsShow() ) break;
if( m_bCreateInfo )
{
CreateSkillTreeLists();
RefreshSkillData( m_nTabType ); //InitPlayerJopInfo(); RefreshJopTreeImage( 0 ); InitClickIconData(); -> 스킬배움과 무관
}
else
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
}
}
break;
}
pMsg->bUse = true;
}
break;
case MSG_PROPERTY:
{
if( !IsShow() ) break;
SMSG_PROPERTY* pPropertyMsg = (SMSG_PROPERTY*)pMsg;
switch( pPropertyMsg->nPropertyType )
{
case SMSG_PROPERTY::PROPERTY_JOB:
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
break;
case SMSG_PROPERTY::PROPERTY_JOB_LEVEL:
{
if( m_bCreateInfo )
{
InitPlayerJopInfo();
CreateSkillTreeLists();
RefreshSkillData( m_nTabType ); //RefreshJopTreeImage( m_nTabType ); InitClickIconData(); -> 잡렙업과 무관
}
else
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
}
break;
case SMSG_PROPERTY::PROPERTY_JP:
{
if( m_bCreateInfo )
{
SPlayerInfo & info = m_PlayerInfoMgr.GetPlayerInfo();
m_nJopPoint = info.GetJP();
CreateSkillTreeLists();
RefreshSkillData( m_nTabType ); //InitPlayerJopInfo(); RefreshJopTreeImage( 0 ); InitClickIconData(); -> 잡포와 무관
}
else
{
Create_N_Init_AllData();
m_bCreateInfo = true;
}
}
break;
/// 2011.03.28 - prodongi
case SMSG_PROPERTY::PROPERTY_TP:
{
refreshTP();
}
break;
}
pMsg->bUse = true;
}
break;
}
}
void* SUISkillTreeFundWnd::Perform( KID id, KArg& msg )
{
_CID( UI_BEGIN_DRAG );
_CID( UI_SEND_DROP );
if ( id == id_UI_BEGIN_DRAG )
{
KUIBeginDragMessage* pBeginMsg = static_cast<KUIBeginDragMessage*>( &msg );
const char* szControlID = pBeginMsg->sDragControlID.c_str();
KUIWnd* pWnd = GetChild( szControlID );
if( pWnd == NULL ) return NULL;
SetClickIcon( szControlID );
if( 0 < m_sClickData.nSkillID )
{
SkillBaseEx* s_data = GetSkillDB().GetSkillData( m_sClickData.nSkillID );
if( s_data->IsPassive() ) return NULL;
int nUseLevel(1);
SSkillSlot* pCrrSkill = m_SkillSlotMgr.GetSkillSlot( m_sClickData.nSkillID );
if( pCrrSkill )
nUseLevel = pCrrSkill->GetUseLevel();
if( 0 < nUseLevel )
{
m_pDisplayInfo->SetUIDragInfo( new SUISkillDragInfo( m_sClickData.nSkillID, nUseLevel, NULL, m_PlayerInfoMgr.GetPlayerHandle() ) );
m_pDragAndDropIcon->SetStateIcon( pWnd->GetSprName(), pWnd->GetAniName(), pWnd->GetFrameIndex(), STATE_NORMAL );
pBeginMsg->pDragAndDropRenderer = m_pDragAndDropIcon;
}
}
return NULL;
}
else if ( id == id_UI_SEND_DROP )
{
KUISendRecvDropMessage* pSendMsg = static_cast<KUISendRecvDropMessage*>( &msg );
SUIDragInfo* pUIDragInfo = m_pDisplayInfo->GetUIDragInfo();
if( NULL != pUIDragInfo ) m_pDisplayInfo->SetUIDragInfo();
return NULL;
}
return SUIWnd::Perform( id, msg );
}
void SUISkillTreeFundWnd::SelectTab( int TabIndex )
{
if( TabIndex < 0 || TabIndex >= c_nJopCnt ) return;
m_nTabType = TabIndex;
// InitPlayerJopInfo();
RefreshMasterBoxImage( m_nTabType ); // AziaMafia MasterskillBox
RefreshSkillData( TabIndex );
InitClickIconData();
RefreshJopTreeImage( TabIndex );
}
void SUISkillTreeFundWnd::InitPlayerJopInfo()
{
if( !IsShow() ) return;
int i(0), nJopID(0), nJopLv(0);
for( ; i<c_nOldJopCnt; ++i )
{
nJopID = m_PlayerInfoMgr.GetOldJobID(i);
nJopLv = m_PlayerInfoMgr.GetOldJobLv(i);
if( nJopID )
{
m_nJopID[i] = nJopID;
m_nJopLv[i] = nJopLv;
}
else break;
}
/// 2011.02.24 test - prodongi
//m_nJopID[3] = 221;
//m_nJopLv[3] = 300;
m_nJopID[i] = m_PlayerInfoMgr.GetJobID();
m_nJopLv[i] = m_PlayerInfoMgr.GetJLv();
m_nJopPoint = m_PlayerInfoMgr.GetJP();
if( m_nTabType>i )
m_nTabType = i;
UpdateTab(i+1);
}
void SUISkillTreeFundWnd::CreateSkillTreeList( int nJopIndex )
{
if( nJopIndex >= 0 && nJopIndex < c_nJopCnt && m_nJopID[nJopIndex] )
{
const JobInfoEx* pJobDB = GetJobDB().GetJobData( m_nJopID[nJopIndex] );
if( pJobDB == NULL )
{
return;
}
m_SkillTreeDisplay[nJopIndex].clear();
//ClearSkillTreeList( nJopIndex );
GetSkillTreeDisplayDB().GetSkillTree( m_nJopID[nJopIndex], m_SkillTreeDisplay[nJopIndex] );
const std::vector< SkillTreeEx >* pSkillTreeList;
pSkillTreeList = GetSkillTreeDB().GetSkillTreeData( pJobDB->skill_tree_id );
if( pSkillTreeList == NULL ) return;
SSkillSlot* pSkillSlot(NULL);
SSkillSlot* pNeedSkill(NULL);
SSkillSlot* pLearnSkill(NULL);
int nLearnSkillLV(0);
std::vector<SkillTreeEx>::const_iterator it = pSkillTreeList->begin();
while( it != pSkillTreeList->end() )
{
const SkillTreeEx* pTree = &(*it);
SkillBaseEx* s_data = GetSkillDB().GetSkillData(pTree->skill_id);
if( s_data == NULL ) { it++; continue; }
if( s_data->IsSystemSkill() ) { it++; continue; }
if( CheckSkillTreeListData( nJopIndex, pTree ) )
{
_SkillSlotInfo* pInfo = new _SkillSlotInfo;
pInfo->nID = pTree->skill_id;
pInfo->nMaxLv[nJopIndex] = pTree->max_skill_lv;
pInfo->lv = pTree->lv; /// 2011.04.04 - prodongi
pLearnSkill = m_SkillSlotMgr.GetSkillSlot( pInfo->nID );
pInfo->nLearnNextMaxLv = pTree->max_skill_lv;
if( pLearnSkill )
{
nLearnSkillLV = pLearnSkill->GetSkill().base_skill_level;
if( nLearnSkillLV >= pTree->max_skill_lv )
pInfo->nLearnNextMaxLv = nLearnSkillLV;
}
// pInfo->nLearnNextMaxLv = pTree->max_skill_lv;
if( m_nJopLv[nJopIndex] < pTree->jop_lv )
pInfo->nEnoughJLv = pTree->jop_lv;
else pInfo->nEnoughJLv = 0;
pNeedSkill = m_SkillSlotMgr.GetSkillSlot( pTree->need_skill_id[0] );
if( pNeedSkill && pNeedSkill->GetSkill().base_skill_level >= pTree->need_skill_lv[0] )
{
pInfo->nNeedSkillID = 0;
pInfo->nNeedSkillLv = 0;
}
else
{
pInfo->nNeedSkillID = pTree->need_skill_id[0];
pInfo->nNeedSkillLv = pTree->need_skill_lv[0];
}
pSkillSlot = m_SkillSlotMgr.GetSkillSlot( s_data->GetID() );
if( pSkillSlot ) pInfo->nCrrLv = pSkillSlot->GetSkill().base_skill_level;
else pInfo->nCrrLv = 0;
GetSkillDisplayPos( m_SkillTreeDisplay[nJopIndex], pInfo->nID, pInfo->nX, pInfo->nY );
m_SkillTreeList.push_back(pInfo);
}
it++;
}
}
}
void SUISkillTreeFundWnd::GetSkillDisplayPos( const std::vector<SkillTreeDisplay*>& rSkillTree, int nSkillID, int& rX, int& rY )
{
int nSize( rSkillTree.size() );
for( int i(0); i<nSize; ++i )
{
if( nSkillID == rSkillTree[i]->skill1_id ) { rX = 0; rY = i; return; }
else if( nSkillID == rSkillTree[i]->skill2_id ) { rX = 1; rY = i; return; }
else if( nSkillID == rSkillTree[i]->skill3_id ) { rX = 2; rY = i; return; }
else if( nSkillID == rSkillTree[i]->skill4_id ) { rX = 3; rY = i; return; }
else if( nSkillID == rSkillTree[i]->skill5_id ) { rX = 4; rY = i; return; }
}
}
bool SUISkillTreeFundWnd::CheckSkillTreeListData( int nJopIndex, const SkillTreeEx* pTree )
{
if( nJopIndex < 0 || nJopIndex >= c_nJopCnt || !m_nJopID[nJopIndex] ) return false;
bool bChangeData(false);
int nLearnSkillLV(0);
_SkillSlotInfo* pInfo(NULL);
SSkillSlot* pLearnSkill(NULL);
SSkillSlot* pNeedSkill(NULL);
int nSize( m_SkillTreeList.size() );
for( int i(0); i<nSize; ++i )
{
pInfo = m_SkillTreeList[i];
if( pInfo->nID == pTree->skill_id )
{
if( pInfo->nMaxLv[nJopIndex] < pTree->max_skill_lv )
pInfo->nMaxLv[nJopIndex] = pTree->max_skill_lv;
//이미 배운스킬이 있다면 배운 스킬보다 높아야 요구조건에 충족된다.
pLearnSkill = m_SkillSlotMgr.GetSkillSlot( pInfo->nID );
if( pLearnSkill ) nLearnSkillLV = pLearnSkill->GetSkill().base_skill_level;
else nLearnSkillLV = 0;
for( int k(nJopIndex-1); k>=0; --k )
{
if( nLearnSkillLV < pInfo->nMaxLv[k] )
return false;
}
if( nLearnSkillLV < pTree->max_skill_lv ) //배운스킬보다 max가높으니 조건체크 시작
{
//현재 등록된 스킬의 max레벨이 배운 스킬보다큰데 새로 넣을 max레벨이 등록되있는거보다 높으면 pass
//스킬상의 배우는 조건은 당연히 렙이 낮은게 우선순위가 높다...
// if( pInfo->nLearnNextMaxLv == 0 )
// bChangeData = true;
// else
{
if( nLearnSkillLV < pTree->max_skill_lv && pInfo->nLearnNextMaxLv > pTree->max_skill_lv )
{
bChangeData = true;
}
else
{
if( nLearnSkillLV >= pInfo->nLearnNextMaxLv )
bChangeData = true;
else bChangeData = false;
}
}
if( bChangeData )
{
pInfo->nLearnNextMaxLv = pTree->max_skill_lv;
if( m_nJopLv[nJopIndex] < pTree->jop_lv )
{
pInfo->nEnoughJLv = pTree->jop_lv;
}
else
{
pInfo->nEnoughJLv = 0;
}
/// 2011.04.07 - prodongi
pInfo->lv = pTree->lv;
pNeedSkill = m_SkillSlotMgr.GetSkillSlot( pTree->need_skill_id[0] );
if( pNeedSkill && pNeedSkill->GetSkill().base_skill_level >= pTree->need_skill_lv[0] )
{
pInfo->nNeedSkillID = 0;
pInfo->nNeedSkillLv = 0;
}
else
{
pInfo->nNeedSkillID = pTree->need_skill_id[0];
pInfo->nNeedSkillLv = pTree->need_skill_lv[0];
}
}
}
return false;
}
}
return true;
}
void SUISkillTreeFundWnd::RefreshSkillData( int nJopIndex )
{
if( nJopIndex < 0 || nJopIndex >= c_nJopCnt ) return;
if( m_nJopID[nJopIndex] == 0 || m_SkillTreeDisplay[nJopIndex].empty() )
{
for( int nX(0); nX<c_nSkillWidthCnt; ++nX )
{
for( int nY(0); nY<c_nSkillHeightCnt; ++nY )
{
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillAbleUpCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSlotDisableCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvBackCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvTextCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillUpCtrName, nY, nX ).c_str() , false );
}
}
}
else
{
for( int i(0); i<m_SkillTreeDisplay[nJopIndex].size(); ++i )
{
SetSkillData( 0, i, nJopIndex, m_SkillTreeDisplay[nJopIndex][i]->skill1_id, GetSkillTreeInfo( m_SkillTreeDisplay[nJopIndex][i]->skill1_id ) );
SetSkillData( 1, i, nJopIndex, m_SkillTreeDisplay[nJopIndex][i]->skill2_id, GetSkillTreeInfo( m_SkillTreeDisplay[nJopIndex][i]->skill2_id ) );
SetSkillData( 2, i, nJopIndex, m_SkillTreeDisplay[nJopIndex][i]->skill3_id, GetSkillTreeInfo( m_SkillTreeDisplay[nJopIndex][i]->skill3_id ) );
SetSkillData( 3, i, nJopIndex, m_SkillTreeDisplay[nJopIndex][i]->skill4_id, GetSkillTreeInfo( m_SkillTreeDisplay[nJopIndex][i]->skill4_id ) );
SetSkillData( 4, i, nJopIndex, m_SkillTreeDisplay[nJopIndex][i]->skill5_id, GetSkillTreeInfo( m_SkillTreeDisplay[nJopIndex][i]->skill5_id ) );
}
}
}
void SUISkillTreeFundWnd::RefreshMasterBoxImage( int nJobIndex )
{
KUIControlStatic* pTreeImageCtr = dynamicCast<KUIControlStatic*>( GetChild( "job_tree_master" ) );
if( nJobIndex == 3 )
pTreeImageCtr->SetShow( true ); //false
else
pTreeImageCtr->SetShow( false );
}
_SkillSlotInfo* SUISkillTreeFundWnd::GetSkillTreeInfo( int nSkillID ) // sonador #2.1.2.4.3 팻 조작 UI 연동
{
int nSize( m_SkillTreeList.size() );
for( int i(0); i<nSize; ++i )
{
if( m_SkillTreeList[i]->nID == nSkillID )
return m_SkillTreeList[i];
}
return NULL;
}
void SUISkillTreeFundWnd::RefreshJopTreeImage( int nJopIndex )
{
if( nJopIndex < 0 || nJopIndex >= c_nJopCnt ) return;
const char* lpJopTreeImage = GetJopTreeImage( m_nJopID[nJopIndex] );
lpJopTreeImage = NULL;
// AziaMafia SkilltreeDisplay
//if (lpJopTreeImage == NULL)
// lpJopTreeImage = "game_panel_skill_skilltree_" + m_nJopID[nJopIndex];
KUIControlStatic* pTreeImageCtr = dynamicCast<KUIControlStatic*>(GetChild( "jop_tree_image" ));
if( pTreeImageCtr )
{
if( lpJopTreeImage )
{
pTreeImageCtr->SetAniName( lpJopTreeImage );
pTreeImageCtr->SetCaption( "" );
}
else
{
pTreeImageCtr->SetAniName( "" );
pTreeImageCtr->SetCaption("");
// pTreeImageCtr->SetCaption( "[!!! ERR !!!] can't search [JopTree]..." );
}
}
}
void SUISkillTreeFundWnd::SetSkillData( int nX, int nY, int nJopIndex, int nSkillID, _SkillSlotInfo* pInfo )
{
SkillBaseEx* s_data = GetSkillDB().GetSkillData( nSkillID );
if( s_data )
{
if( pInfo == NULL )
{
assert(false && "Database data does not match");
return;
}
SetSkillSlotTooltip( dynamicCast<KUIControlIconStatic*>(GetChild( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, nY, nX ).c_str() )), s_data, pInfo, nJopIndex );
int nLv( ::min(pInfo->nCrrLv, pInfo->nMaxLv[nJopIndex]) );
std::string strCaption = CStringUtil::StringFormat( "<font:font_02><hcenter><size:8>%d/%d", nLv, pInfo->nMaxLv[nJopIndex] );
SetChildCaption( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvTextCtrName, nY, nX ).c_str() , strCaption.c_str() );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, nY, nX ).c_str() , true );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvBackCtrName, nY, nX ).c_str() , true );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvTextCtrName, nY, nX ).c_str() , true );
int nNeedJp(0);
SkillBaseEx* s_data = GetSkillDB().GetSkillData( pInfo->nID );
if( s_data ) nNeedJp = s_data->GetNeedJopPoint(pInfo->nCrrLv+1);
/// 2011.03.30 - prodongi
bool bShowDis;
if (0 > nNeedJp) /// tp
{
int playerTp = m_PlayerInfoMgr.GetTP();
int needTp = abs(nNeedJp);
bShowDis = ( pInfo->nEnoughJLv || playerTp < needTp || pInfo->nNeedSkillID );
}
else
{
bShowDis = ( pInfo->nEnoughJLv || m_nJopPoint < nNeedJp || pInfo->nNeedSkillID );
}
if( pInfo->nCrrLv >= pInfo->nMaxLv[nJopIndex] )
bShowDis = false;
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSlotDisableCtrName, nY, nX ).c_str() , bShowDis );
//gmpbigsun( 20130405 ) : 레벨검사 추가
bool bShowUp( !bShowDis && pInfo->nCrrLv < pInfo->nMaxLv[nJopIndex] && m_PlayerInfoMgr.GetLevel() >= pInfo->lv );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillUpCtrName, nY, nX ).c_str() , bShowUp );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillAbleUpCtrName, nY, nX ).c_str() , bShowUp );
/// 2010.12.21 - prodongi
//SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpPassiveSlotCtrName, nY, nX ).c_str() , !bShowUp && s_data->IsPassive() );
KUIWnd* passiveWnd = GetChild(CStringUtil::StringFormat( "%s_%02d_%02d", c_lpPassiveSlotCtrName, nY, nX ).c_str());
if (passiveWnd)
{
passiveWnd->SetShow(true);
if (s_data->IsPassive()) passiveWnd->SetBack(m_sSprName.c_str(), "game_panel_titanium_slot_skill_passive");
else passiveWnd->SetBack(m_sSprName.c_str(), "game_panel_titanium_slot_skill_active");
}
}
else
{
SetSkillSlotTooltip( dynamicCast<KUIControlIconStatic*>(GetChild( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, nY, nX ).c_str() )), s_data, NULL, nJopIndex );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillSlotCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillAbleUpCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSlotDisableCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvBackCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillLvTextCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpSkillUpCtrName, nY, nX ).c_str() , false );
SetChildShow( CStringUtil::StringFormat( "%s_%02d_%02d", c_lpPassiveSlotCtrName, nY, nX ).c_str() , false );
}
}
void SUISkillTreeFundWnd::SetSkillSlotTooltip( KUIControlIconStatic* pIcon, SkillBaseEx* s_data, _SkillSlotInfo* pInfo, int nJopIndex )
{
if( pIcon == NULL ) return;
if( s_data )
{
if( pInfo->nCrrLv == 0 )
pIcon->SetIcon( c_szDEF_SPR_NAME, "common_mark_icon_unknown_middle" ); /// 2011.01.10 - prodongi
else pIcon->SetIcon( c_szDEF_SPR_NAME, s_data->GetIconName() );
if( !pInfo ) pIcon->SetTooltip( "아니 어떻게 스킬트리에 데이터가 없냐??" );
else
{
// sonador 1.2.5 Lazy Tooltip 구현
pIcon->SetLazyTooltip( new KLazySkillTreeFundTooltip( *m_pDisplayInfo, *s_data, *pInfo, nJopIndex, m_nJopPoint, m_PlayerInfoMgr.GetTP(), m_PlayerInfoMgr.GetLevel() ) ); // sonador #2.1.2.4.3 팻 조작 UI 연동
}
}
else
{
pIcon->SetIcon( c_szDEF_SPR_NAME, c_lpSkillEmptyAni );
}
}
int SUISkillTreeFundWnd::GetSkillData( int nJopIndex, int nX, int nY )
{
if( nJopIndex < 0 || nJopIndex >= c_nJopCnt || !m_nJopID[nJopIndex] ) return 0;
for( int i(0); i<m_SkillTreeDisplay[nJopIndex].size(); ++i )
{
if( m_nJopID[nJopIndex] == m_SkillTreeDisplay[nJopIndex][i]->job_id )
{
if( nY = m_SkillTreeDisplay[nJopIndex][i]->slot_v )
{
switch( nX )
{
case 0: return m_SkillTreeDisplay[nJopIndex][i]->skill1_id; break;
case 1: return m_SkillTreeDisplay[nJopIndex][i]->skill2_id; break;
case 2: return m_SkillTreeDisplay[nJopIndex][i]->skill3_id; break;
case 3: return m_SkillTreeDisplay[nJopIndex][i]->skill4_id; break;
case 4: return m_SkillTreeDisplay[nJopIndex][i]->skill5_id; break;
}
}
}
}
return 0;
}
void SUISkillTreeFundWnd::SetClickIcon( const char* lpCtrName )
{
SetClickIconData( m_nTabType, lpCtrName );
KUIWnd* pWnd = GetChild( lpCtrName );
if( pWnd )
{
KRect rt = pWnd->GetRect();
KUIWnd* pSelectWnd = GetChild( "skillfund_select" );
if( pSelectWnd )
{
pSelectWnd->MovePos( rt.left, rt.top );
pSelectWnd->SetShow( true );
}
}
}
void SUISkillTreeFundWnd::SetClickIconData( int nJopIndex, const char* lpCtrName )
{
int nX(0), nY(0);
GetIndex_X_Y( nJopIndex, lpCtrName, nX, nY );
if( nY < 0 || nY >= c_nSkillHeightCnt ) return;
m_sClickData.strCtrName = lpCtrName;
m_sClickData.nX = nX;
m_sClickData.nY = nY;
m_sClickData.nSkillID = GetSkillID( nJopIndex, nX, nY );
}
void SUISkillTreeFundWnd::GetIndex_X_Y( int nJopIndex, const char* lpCtrName, int& nX, int& nY )
{
std::string strCtrName = lpCtrName;
int nPos = strCtrName.find("_");
if( nPos != -1 )
{
strCtrName.erase(0, nPos+1);
std::string strTemp_X( strCtrName.c_str() ), strTemp_Y( strCtrName.c_str() );
int _nPos = strCtrName.rfind("_");
if( _nPos != -1 )
{
strTemp_X.erase(0, _nPos+1);
strTemp_Y.erase(_nPos, strTemp_Y.size());
nX = ::atoi( strTemp_X.c_str() );
nY = ::atoi( strTemp_Y.c_str() );
}
}
}
int SUISkillTreeFundWnd::GetSkillID( int nJopIndex, int nX, int nY )
{
if( nY < 0 || nY >= c_nSkillHeightCnt ) return -1;
switch( nX )
{
case 0: return m_SkillTreeDisplay[nJopIndex][nY]->skill1_id; break;
case 1: return m_SkillTreeDisplay[nJopIndex][nY]->skill2_id; break;
case 2: return m_SkillTreeDisplay[nJopIndex][nY]->skill3_id; break;
case 3: return m_SkillTreeDisplay[nJopIndex][nY]->skill4_id; break;
case 4: return m_SkillTreeDisplay[nJopIndex][nY]->skill5_id; break;
}
return -1;
}
void SUISkillTreeFundWnd::InitClickIconData()
{
m_sClickData.strCtrName.clear();
m_sClickData.nSkillID = 0;
m_sClickData.nX = 0;
m_sClickData.nY = 0;
KUIWnd* pSelectWnd = GetChild( "skillfund_select" );
if( pSelectWnd )
pSelectWnd->SetShow( false );
}
const char* SUISkillTreeFundWnd::GetJopTreeImage( int nJopID )
{
/// 2011.02.24 - prodongi
/*
switch( nJopID )
{
case 300: return c_lpAsura_0; break; //= "static_player_skilltree_asura_00_bb"; //스테퍼
case 302: return c_lpAsura_1_mgc; break; //= "static_player_skilltree_asura_01_pp"; //매지션
case 303: return c_lpAsura_1_smr; break; //= "static_player_skilltree_asura_01_ss"; //서모너
case 301: return c_lpAsura_1_std; break; //= "static_player_skilltree_asura_01_ww"; //스트라이더
case 311: return c_lpAsura_2_rgr; break; //= "static_player_skilltree_asura_02_hh"; //레인저
case 313: return c_lpAsura_2_dmg; break; //= "static_player_skilltree_asura_02_pd"; //다크매지션
case 312: return c_lpAsura_2_ssr; break; //= "static_player_skilltree_asura_02_pp"; //소서러
case 314: return c_lpAsura_2_bsm; break; //= "static_player_skilltree_asura_02_ss"; //배틀서모너
case 310: return c_lpAsura_2_asn; break; //= "static_player_skilltree_asura_02_ww"; //어쌔신
case 200: return c_lpDeva_0; break; //= "static_player_skilltree_deva_00_bb"; //가이드
case 202: return c_lpDeva_1_clr; break; //= "static_player_skilltree_deva_01_pp"; //클레릭
case 203: return c_lpDeva_1_tmr; break; //= "static_player_skilltree_deva_01_ss"; //테이머
case 201: return c_lpDeva_1_ptr; break; //= "static_player_skilltree_deva_01_ww"; //파이터
case 212: return c_lpDeva_2_mge; break; //= "static_player_skilltree_deva_02_pm"; //메이지
case 213: return c_lpDeva_2_prt; break; //= "static_player_skilltree_deva_02_pp"; //프리스트
case 214: return c_lpDeva_2_brd; break; //= "static_player_skilltree_deva_02_ss"; //브리더
case 210: return c_lpDeva_2_nit; break; //= "static_player_skilltree_deva_02_wn"; //나이트
case 211: return c_lpDeva_2_wr; break; //= "static_player_skilltree_deva_02_ww"; //워리어
case 100: return c_lpGaia_0; break; //= "static_player_skilltree_gaia_00_bb"; //방랑자
case 102: return c_lpGaia_1_jss; break; //= "static_player_skilltree_gaia_01_pp"; //주술사
case 103: return c_lpGaia_1_yss; break; //= "static_player_skilltree_gaia_01_ss"; //야수사
case 101: return c_lpGaia_1_tsa; break; //= "static_player_skilltree_gaia_01_ww"; //투사
case 111: return c_lpGaia_2_gsa; break; //= "static_player_skilltree_gaia_02_hh"; //궁사
case 112: return c_lpGaia_2_mds; break; //= "static_player_skilltree_gaia_02_pp"; //마도사
case 113: return c_lpGaia_2_mts; break; //= "static_player_skilltree_gaia_02_pw"; //마투사
case 114: return c_lpGaia_2_mss; break; //= "static_player_skilltree_gaia_02_ss"; //마수사
case 110: return c_lpGaia_2_js; break; //= "static_player_skilltree_gaia_02_ww"; //전사
}
*/
std::map<int, char const*>::iterator it = m_treeImageList.find(nJopID);
if (it == m_treeImageList.end())
return NULL;
return it->second;
}
void SUISkillTreeFundWnd::SkillUP( int nJopIndex, const char* lpCtrName )
{
int nX(0), nY(0);
GetIndex_X_Y( nJopIndex, lpCtrName, nX, nY );
if( nY < 0 || nY >= c_nSkillHeightCnt ) return;
SIMSG_UI_ACT_LEARN_SKILL msg;
msg.handle = m_PlayerInfoMgr.GetPlayerHandle();
msg.nSkillID = GetSkillID( nJopIndex, nX, nY );
msg.nSkillLv = m_SkillSlotMgr.GetBaseSkillLevel( msg.nSkillID, msg.handle ) + 1;
m_pGameManager->ProcMsgAtStatic(&msg);
}
void SUISkillTreeFundWnd::refreshTP()
{
KUIWnd* child = GetChild("skill_trait_00");
if (child)
{
SetChildCaption( "skill_trait_point", CStringUtil::StringFormat( "<font:font_02><size:9><hcenter>%d", m_PlayerInfoMgr.GetTP()).c_str() );
std::string aniName;
if ( m_PlayerInfoMgr.GetTP() > 5 )
aniName = CStringUtil::StringFormat("game_panel_titanium_skill_trait_point_0%d", 5);
else
aniName = CStringUtil::StringFormat("game_panel_titanium_skill_trait_point_0%d", m_PlayerInfoMgr.GetTP());
child->SetBack(c_szDEF_SPR_NAME, aniName.c_str());
}
}