Files
2026-06-01 12:46:52 +02:00

1517 lines
53 KiB
C++

#include "stdafx.h"
#include "KUITabControl.h"
#include "KUIDragAndDrop.h"
//#include "KUIControlNumber.h"
#include "KUIControlButton.h"
#include "KUIControlStatic.h"
#include "KUIControlScroll.h"
#include "KUIControlClockBox.h"
#include "SGameManager.h"
//#include "SGameMessageUI.h"
#include "SUICreatureSkillWnd.h"
#include "SUIDisplayInfo.h"
#include "SUILazyTooltip.h" // sonador #2.1.2.4.3 팻 조작 UI 연동
#include "SCreatureDB.h"
#include "SStringDB.h"
#include "SSkillDB.h"
#include "ErrorCode/ErrorCode.h"
#include "SSummonSlotMgr.h"
#include "SSkillSlot.h"
#include "SGameOption.h"
// 2010.05.11 - prodongi
#include "SInventoryMgr.h"
//#include "SUIUtil.h"
#include "Util.h"
using namespace CStringUtil;
namespace{
int c_nMaxJobChange = 3; // MJ 2004/11/02 퀄업때까지는 3차까지, 나중에 5차까지 확장
const int c_nMaxHeight = 590; // 최대로 늘릴때 max
const int c_nDelta = 38; // 늘어나는 단위
const int c_nChildWnd = 219; // 차일드 width
const int c_nTabClickArea = 9; // 탭 클릭 영역
const int c_nButtonClickArea = 20; // 버튼 클릭 영역
const int c_nIconSelectDelta = 6; // 아이콘 선택 static 표시 위치 delta
const int c_nMaxLine = 9;
const int c_nMinLine = 8;
// const char * c_szSKILL_QUICK_SLOT = "static_slot%02d"; // 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리
// const int c_nQUICK_SLOT_CNT = 12; // 2011.11.29 - servantes : 쓰이지 않음
const char * c_szVSCROLL = "vscroll_skill";
enum{ // 탭 타입
TAB_ACTIVE = 0,
TAB_PASSIVE,
};
enum{ // 스킬 타입
SKILLTYPE_PASSIVE = 0,
SKILLTYPE_ACTIVE,
};
enum {
TAB_PARAMETER = 0,
TAB_SKILL,
};
};
using namespace rp;
SUICreatureSkillWnd::~SUICreatureSkillWnd()
{
FreeSkillList();
}
bool SUICreatureSkillWnd::InitControls( KPoint kPos )
{
SetCustomMovingRect( KRect( 0, 0, 310, 20 ) ); // 타이틀 바 선택 영역, 이동위해 클릭 Area
// 리사이즈 할때 단위 설정, ( 세로, 가로, 위드, 헤잇 )
SetResizeUnit( 0, c_nDelta, KSize((GetRect().right-GetRect().left), (GetRect().bottom-GetRect().top)), KSize((GetRect().right-GetRect().left), c_nMaxHeight) );
CreateTab();
CreateControls(); // 컨트롤 생성
// 버튼 클릭 영역
// SetValidRect( "creature02_fund", KRect(20,0,-c_nButtonClickArea,0) );
// SetValidRect( "creature02_use", KRect(0,0,-15,0) );
return SUIWnd::InitControls(kPos);
}
bool SUICreatureSkillWnd::InitData( bool bReload )
{
m_nSelSkillPos = -1;
m_nScrollPos = 0;
m_bIsQuickSlotItem = false;
m_bShowChildWnd = true;
m_nMaxLine = c_nMinLine;
m_nTabType = TAB_ACTIVE;
SetChildShow( "common_usecreaturecardieon", false );
FreeSkillList(); // 모든 리스트 삭제
DisableAllSlot( false ); // 모든 컨트롤 초기화
HideSelectBar(); // 선택바 초기화
InitCreatureQuickSlots(); // 크리처 스킬 퀵슬롯
m_pOverBreed = dynamicCast<KUIControlStatic*>( GetChild( "text_overbreed_01" ) );
if( NULL == m_pOverBreed )
{
SDEBUGLOG( "[크리쳐 스킬] 컨트롤 정보 얻기 실패 - Name[text_overbreed_01]" );
assert( m_pOverBreed );
}
else
{
string strCaption( m_pOverBreed->GetCaption() );
GetTextDecoration( strCaption.c_str(), m_strOverBreedPropertyTag );
m_pOverBreed->SetShow( false );
}
m_pOverBreedIcon = dynamicCast<KUIControlStatic*>( GetChild( "mark_overbreed_01" ) );
if( NULL == m_pOverBreedIcon )
{
SDEBUGLOG( "[크리쳐 스킬] 컨트롤 정보 얻기 실패 - Name[mark_overbreed_01]" );
assert( m_pOverBreedIcon );
}
else
m_pOverBreedIcon->SetShow( false );
m_pEvolutionRankIcon = dynamicCast<KUIControlIconStatic*>( GetChild( "creature_monster_mark_evolution_01" ) );
if( NULL == m_pEvolutionRankIcon )
{
SDEBUGLOG( "[크리쳐 스킬] 컨트롤 정보 얻기 실패 - Name[creature_monster_mark_evolution_01]" );
assert( m_pEvolutionRankIcon );
}
return SUIWnd::InitData(bReload);
}
void SUICreatureSkillWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd )
{
if( !m_CreatureSlotMgr.GetSelectedCreature() ) // 2011.06.03 - servantes // 선택된 크리처가 없으면 크리처 스킬장 열지 않는다
{
SUIWnd::OnNotifyUIWindowOpen( false );
GetGameOption().SetCreautreInfoOpen( false );
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILL, false ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, false ) ); /// 2011.07.12 - prodongi
return;
}
SUIWnd::OnNotifyUIWindowOpen(bOpen);
GetGameOption().SetCreautreInfoOpen(bOpen);
if( bOpen )
{
if( m_CreatureSlotMgr.GetEquipedCreatureCount() <= 0 )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILL, false ) );
}
else
{
m_pGameManager->StartSound( "ui_popup_window01.wav" );
RefreshCreatureInfo();
// SetQuickSlotRect(); // 퀵슬롯 영역 설정 // 2011.11.29 - servantes : 쓰이지 않음
// RefreshCreatureQuickSlots(); // 2011.11.29 - servantes : 쓰이지 않음
RefreshSkillInfo();
// 스킬 탭
KUISimpleTabControl* pTab = dynamicCast<KUISimpleTabControl*>(GetChild( "creature02_tab02" ));
if( pTab ) pTab->SetSelectedItem(TAB_SKILL);
KUIWnd *pInfoWnd = m_pManager->FindWnd( "window_summon_info" );
if( pInfoWnd ) pInfoWnd->MovePos( pInfoWnd->GetRect().right, pInfoWnd->GetRect().bottom - GetRect().GetHeight() );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, GetRect().right, GetRect().bottom ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, m_nTabType ) );
}
}
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, (bOpen && m_bShowChildWnd) ) );
}
void SUICreatureSkillWnd::InitCreatureQuickSlots()
{
}
void* SUICreatureSkillWnd::Perform( KID id, KArg& msg )
{
_CID( UI_BEGIN_DRAG );
_CID( UI_SEND_DROP );
_CID( UI_RECV_DROP );
if ( id == id_UI_BEGIN_DRAG )
{
// 액티브 스킬만 가능
if( !IsActiveTab() ) return NULL;
KUIBeginDragMessage* pBeginMsg = static_cast<KUIBeginDragMessage*>( &msg );
const char* szControlID = pBeginMsg->sDragControlID.c_str();
KUIWnd* pWnd = GetChild( szControlID );
if( pWnd == NULL ) return NULL;
// 장착 해제/설정
if( m_rtQuickSlotRect.IsInRect( pWnd->GetRect().left, pWnd->GetRect().top ) ) m_bIsQuickSlotItem = true;
else m_bIsQuickSlotItem = false;
int nSkillID = GetSkillIDByCtrlName( szControlID );
if( nSkillID == -1 ) return NULL;
int nUseLevel = GetUseLevel( nSkillID );
if( nUseLevel == -1 ) return NULL;
m_pDisplayInfo->SetUIDragInfo( new SUISkillDragInfo( nSkillID, nUseLevel, NULL, m_CreatureSlotMgr.GetSelectedCreature(), SUIDragInfo::DRAGTYPE_CREATURE_QUICKSLOT, 0, false ) );
if( m_bIsQuickSlotItem )
{
const KUIControlMultiIcon::ICON_INFO& rIconInfo = ( ( KUIControlMultiIcon* )pWnd)->GetIconInfoByLayer(0);
m_pDragAndDropIcon->SetStateIcon( pWnd->GetSprName(), rIconInfo.sAniName.c_str(), rIconInfo.nFrameIndex, STATE_NORMAL );
}
else
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( pUIDragInfo == NULL ) return NULL;
SUISkillDragInfo* pSkillDragInfo = ( SUISkillDragInfo* )pUIDragInfo;
if( pSkillDragInfo == NULL ) return NULL;
if( pSkillDragInfo->m_type != SUIDragInfo::DRAGTYPE_CREATURE_QUICKSLOT ) return NULL;
if( pSendMsg->sRecvDropParentID != std::string(GetID()) )
{
// 슬롯을 비운다.
int nDropIndex = GetIndexByCtrlID( pSendMsg->sSendDropControlID.c_str() );
m_CreatureSkillSlotMgr.DelQuickSlot( pSkillDragInfo->m_hTarget, nDropIndex );
UpdateCreatureQuickSlots();
m_pGameManager->StartSound( m_pDisplayInfo->GetDragMaterialSound() );
}
// Drag & Drop 정보 제거
m_pDisplayInfo->SetUIDragInfo();
return NULL;
}
else if ( id == id_UI_RECV_DROP )
{
if( !IsActiveTab() ) return NULL;
KUISendRecvDropMessage* pRecvMsg = static_cast<KUISendRecvDropMessage*>( &msg );
SUIDragInfo* pUIDragInfo = m_pDisplayInfo->GetUIDragInfo(); if( pUIDragInfo == NULL ) return NULL;
SUISkillDragInfo* pSkillDragInfo = ( SUISkillDragInfo* )pUIDragInfo; if( pSkillDragInfo == NULL ) return NULL;
if( pSkillDragInfo->m_type == SUIDragInfo::DRAGTYPE_CREATURE_QUICKSLOT )
{
int nDropIndex = -1;
int nSendDropIndex = -1;
nDropIndex = GetIndexByCtrlID( pRecvMsg->sRecvDropControlID.c_str() );
nSendDropIndex = GetIndexByCtrlID( pRecvMsg->sSendDropControlID.c_str() );
if( nDropIndex == nSendDropIndex ) return NULL;
// 장착
if( m_rtQuickSlotRect.IsInRect( pRecvMsg->ptDropPos.x, pRecvMsg->ptDropPos.y ) )
{
// 소환된 크리처가 이 크리처라면 알트 퀵슬롯창 갱신해준다
m_CreatureSkillSlotMgr.AddQuickSlot( pSkillDragInfo->m_hTarget, pSkillDragInfo->m_nSkillID, pSkillDragInfo->m_nLevel, pSkillDragInfo->m_nState, nDropIndex, nSendDropIndex );
// 퀵 슬롯 설정-크리처창에서만 설정이 된다.
UpdateCreatureQuickSlots();
m_pGameManager->StartSound( m_pDisplayInfo->GetDragMaterialSound(), 50 );
}
// 해제
else
{
// 소환된 크리처가 이 크리처라면 알트 퀵슬롯창 갱신해준다
m_CreatureSkillSlotMgr.DelQuickSlot( pSkillDragInfo->m_hTarget, nSendDropIndex );
// 크리처 창에서 지운다
UpdateCreatureQuickSlots();
}
}
return NULL;
}
return SUIWnd::Perform( id, msg );
}
// quickslot
void SUICreatureSkillWnd::UpdateCreatureQuickSlots()
{
m_pGameManager->ProcMsgAtStatic( &SIMSG_UI_CREATURE_QUICK_UPDATE() );
m_pDisplayInfo->SaveQuickSlots();
}
// 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리
int SUICreatureSkillWnd::GetIndexByCtrlID( const char* szControlID )
{
return -1;
}
void SUICreatureSkillWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam )
{
switch(nMessage)
{
case KUI_MESSAGE::KBUTTON_CLICK:
{
if( _stricmp( lpszControlID, "button_close" ) == 0 )
{
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILL, false) );
}
else if( _stricmp( lpszControlID, "button_add" ) == 0 )
{
m_bShowChildWnd = !m_bShowChildWnd;
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, m_bShowChildWnd ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, m_nTabType ) );
}
else if( _stricmp( lpszControlID, "button_use" ) == 0 )
RequestUseSkill();
else
{
for( int i = 0; i < m_nMaxLine; i++ )
{
if( _stricmp( lpszControlID, CStringUtil::StringFormat( "creature02_lvinfo%02d", i ).c_str() ) == 0 ) // 선택 처리
{
ShowSelectBar(i);
break;
}
else if( _stricmp( lpszControlID, CStringUtil::StringFormat( "creature02_lvinfo_up%02d", i ).c_str() ) == 0 )
{
ShowSelectBar(i);
SkillUp(m_nScrollPos+i);
break;
}
else if( _stricmp( lpszControlID, CStringUtil::StringFormat( "creature02_lvinfo_down%02d", i ).c_str() ) == 0 )
{
ShowSelectBar(i);
SkillDown(m_nScrollPos+i);
break;
}
}
}
}
break;
case KUI_MESSAGE::KICON_PRESSING:
{
if( nMessage == KUI_MESSAGE::KICON_CLICK )
m_pGameManager->StartSound( "ui_button_click.wav" );
for( int i = 0; i < m_nMaxLine; i++ )
{
if( _stricmp( lpszControlID, CStringUtil::StringFormat( "creature02_skillicon%02d", i ).c_str() ) == 0 ) // 선택 처리
{
ShowSelectBar(i);
break;
}
}
}
break;
case KUI_MESSAGE::KICON_DBLCLK:
{
for( int i = 0; i < m_nMaxLine; i++ )
{
if( _stricmp( lpszControlID, CStringUtil::StringFormat( "creature02_skillicon%02d", i ).c_str() ) == 0 ) // 선택 처리
{
m_pGameManager->StartSound( "iconClick_iconmove_target.wav" );
ShowSelectBar(i);
RequestUseSkill();
break;
}
}
}
break;
case KUI_MESSAGE::KGENWND_MOVE: // 윈도우 이동
{
LimitMoveWnd(); // 게임 외부로 나가지 못하게 제한
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, GetRect().right, GetRect().bottom ) );
}
break;
case KUI_MESSAGE::KSCROLL_SELECT: // 스크롤 선택
{
int nPos = int(lparam);
nPos = max( nPos, 0 );
m_nScrollPos = nPos;
RefreshSkillSlot(nPos);
}
break;
case KUI_MESSAGE::KTAB_SELECT: // 탭 변경
{
if( _stricmp( lpszControlID, "creature02_tab02" ) == 0 )
{
// 내 자신이면,, 걍 두고
// 파라미터면.. 닫고 여는 짓을 한다
KUISimpleTabControl* pTab = dynamicCast<KUISimpleTabControl*>(GetChild( "creature02_tab02" ));
if( pTab )
{
if( pTab->GetSelectedItem() == TAB_SKILL ) return;
else
{
// 닫고..
// 스킬 열어준다
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILL, false) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_PAGE, GetRect().left, GetRect().top ) );
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_PAGE, true) );
}
}
}
else if( _stricmp( lpszControlID, "creature02_tab" ) == 0 ) // 액티브/패시브
{
KUISimpleTabControl* pTab = dynamicCast<KUISimpleTabControl*>(GetChild("creature02_tab"));
if( pTab ) m_nTabType = pTab->GetSelectedItem();
SelectTab(); // m_nTabType, RefreshScrollBar, RefreshSlot
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, m_nTabType ) );
}
}
break;
case KUI_MESSAGE::KGENWND_RESIZE: // 윈도우 리사이즈
{
int nDelta = GetRect().GetHeight() - static_cast<int>(wparam);
KUIWnd * pOutfram = GetChild( "outframe" );
if( pOutfram )
{
KRect rcChild = pOutfram->GetRect();
rcChild.bottom += nDelta;
pOutfram->Resize( rcChild );
Resize( rcChild );
}
KUIWnd * pInfram = GetChild( "inframe" );
if( pInfram )
{
KRect rcChild = pInfram->GetRect();
rcChild.bottom += nDelta;
pInfram->Resize( rcChild );
}
m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILLFUND, GetRect().right, GetRect().bottom ) );
}
break;
}
SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam );
}
void SUICreatureSkillWnd::ProcMsgAtStatic( SGameMessage* pMsg )
{
switch( pMsg->nType )
{
case IMSG_UI_TAB_UPDATE:
{
SIMSG_UI_TAB_UPDATE* pSkillMsg = ( SIMSG_UI_TAB_UPDATE* )pMsg;
KUISimpleTabControl* pTab = dynamicCast<KUISimpleTabControl*>(GetChild("creature02_tab"));
if( pTab ) pTab->SetSelectedItem( pSkillMsg->m_nTabType );
m_nTabType = pSkillMsg->m_nTabType;
SelectTab();
pMsg->bUse = true;
}
break;
case IMSG_UI_MOVE:
{
SIMSG_UI_MOVE* pMoveMsg = ( SIMSG_UI_MOVE* )pMsg;
MovePos( pMoveMsg->m_nX, pMoveMsg->m_nY );
pMsg->bUse = true;
}
break;
case MSG_LEVEL_UPDATE:
case MSG_EXP_UPDATE:
{
RefreshCreatureInfo();
pMsg->bUse = true;
}
break;
case MSG_PROPERTY:
{
SMSG_PROPERTY* pPropertyMsg = (SMSG_PROPERTY*)pMsg;
switch( pPropertyMsg->nPropertyType )
{
case SMSG_PROPERTY::PROPERTY_LEVEL:
case SMSG_PROPERTY::PROPERTY_EXP:
case SMSG_PROPERTY::PROPERTY_JP:
RefreshCreatureInfo();
break;
}
pMsg->bUse = true;
}
break;
case MSG_EQUIP_SUMMON:
{
// 크리처 핸들로 카드 해들 알아내어 장착하고 있는 크리처인지 검사
AR_HANDLE hCard = m_CreatureSlotMgr.GetEquipedCreatureCard( m_CreatureSlotMgr.GetSelectedCreature() );
if( !m_CreatureSlotMgr.GetSelectedCreature() || !m_CreatureSlotMgr.IsExistCreatureCard(hCard) )
m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_CREATURE_SKILL, false) );
pMsg->bUse = true;
}
break;
case MSG_ADDED_SKILL_LIST:
// 2010.07.15 - prodongi
RefreshAddedSkillList();
RefreshSkillSlot( m_nScrollPos );
break;
//break;
case MSG_SKILL_LIST:
{
RefreshSkillInfo();
pMsg->bUse = true;
}
break;
case MSG_SKILL_EVENT:
{
RefreshSkillInfo();
SMSG_SKILL_EVENT* pSkillEvent = (SMSG_SKILL_EVENT*)pMsg;
if( pSkillEvent->caster != m_CreatureSlotMgr.GetSelectedCreature() ) break;
if( pSkillEvent->status_type == TS_SC_SKILL::FIRE )
ShowClockBox( pSkillEvent->skill_id );
else if( pSkillEvent->status_type == TS_SC_SKILL::CASTING )
{
if( pSkillEvent->cast.nErrorCode == 0 ) // 캐스팅 성공 쿨링 시계 표시 100%
ShowClockBox( pSkillEvent->skill_id, true );
//else // 실패
//m_pDisplayInfo->SetSysMsg( 0 /*pSkillEvent->count*/ ); //TODO 무엇을 보내는가 확인?
}
else if( pSkillEvent->status_type == TS_SC_SKILL::CANCEL )
{ //TODO Cancel 처리
CancelSkill( pSkillEvent->skill_id );
}
else if( pSkillEvent->status_type == TS_SC_SKILL::CASTING_UPDATE )
{ //TODO CASTING_UPDATE 처리
}
else if( pSkillEvent->status_type == TS_SC_SKILL::REGION_FIRE )
{ //TODO REGION_FIRE 처리
}
else if( pSkillEvent->status_type == TS_SC_SKILL::COMPLETE )
{ //TODO COMPLETE 처리
}
pMsg->bUse = true;
}
break;
case IMSG_UI_CREATURE_QUICK_UPDATE:
// RefreshCreatureQuickSlots(); // 2011.11.29 - servantes : 쓰이지 않음
break;
}
}
///////////////////////////////////////////////////////////
// 윈도우
///////////////////////////////////////////////////////////
void SUICreatureSkillWnd::CreateTab()
{
KUISimpleTabControl* pTabControl = NULL;
// 상위 탭 만들기
pTabControl = dynamicCast<KUISimpleTabControl*>(GetChild("creature02_tab02"));
if( pTabControl )
{
//TODO : 하드 코딩
// pTabControl->SetTabProperty( -19 );
pTabControl->SetTabProperty( 0, false, 2 );
pTabControl->AddTabItem( S(6253)/*"<size:10>파라미터"*/, S(6303)/*"기본 정보"*/ );
pTabControl->AddTabItem( S(6230)/*"<size:10>스킬"*/ , S(6304)/*"스킬 정보"*/ );
// pTabControl->SetCorrectionRect( KRect( c_nTabClickArea, 0, -c_nTabClickArea, 0 ) );
}
// 하위 탭 만들
pTabControl = dynamicCast<KUISimpleTabControl*>(GetChild("creature02_tab"));
if( pTabControl )
{
// pTabControl->SetTabProperty( -19 );
pTabControl->SetTabProperty( 0, false, 2 );
pTabControl->AddTabItem( S(6236)/*"<size:10>액티브"*/, S(6305)/*"액티브 스킬"*/ );
pTabControl->AddTabItem( S(6256)/*"<size:10>패시브"*/, S(6306)/*"패시브 스킬"*/ );
// pTabControl->SetCorrectionRect( KRect( c_nTabClickArea, 0, -c_nTabClickArea, 0 ) );
}
}
void SUICreatureSkillWnd::CreateControls()
{
RECT rc;
rc.left = 0; rc.top = c_nDelta; rc.right = 0; rc.bottom = c_nDelta;
KUIWnd* pIconCtr(NULL);
pIconCtr = GetChild( "creature02_skillicon00" );
if( pIconCtr )
(( KUIControlIconStatic*)pIconCtr)->SetCorrectionRect( KRect( 0, 0, 150, 0 ) );
int i;
for( i = 0; i < c_nMaxLine-1; i++ )
{
pIconCtr = CopyControl( CStringUtil::StringFormat( "creature02_skillicon%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_skillicon%02d" , i+1 ).c_str(), rc );
// CopyControl( CStringUtil::StringFormat( "creature02_lvinfo%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_lvinfo%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_skilllv%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_skilllv%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , i ).c_str(), CStringUtil::StringFormat( "creature02_skilllv%02d_value" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_lvinfo_up%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_lvinfo_up%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_lvinfo_down%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_lvinfo_down%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_skillname_text%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_skillname_text%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , i ).c_str(), CStringUtil::StringFormat( "creature02_skilllv_text%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", i ).c_str(), CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "static_skill_mp%02d" , i ).c_str(), CStringUtil::StringFormat( "static_skill_mp%02d" , i+1 ).c_str(), rc );
CopyControl( CStringUtil::StringFormat( "static_skill_mp_value%02d" , i ).c_str(), CStringUtil::StringFormat( "static_skill_mp_value%02d" , i+1 ).c_str(), rc );
if( pIconCtr )
(( KUIControlIconStatic*)pIconCtr)->SetCorrectionRect( KRect( 0, 0, 150, 0 ) );
}
// 스킬 재사용 시간 컨트롤
for( i = 0; i <= c_nMaxLine; i++ )
{
KUIWnd* pIcon = GetChild( CStringUtil::StringFormat("creature02_skillicon%02d", i).c_str() );
if( pIcon )
{
KUIWnd* pWnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "clockbox", CStringUtil::StringFormat("creature02_clockbox%02d", i).c_str(), " ", pIcon->GetRect(), 0, KFLAG_NO_GET_MESSAGE, this, "", c_szDEF_SPR_NAME, m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) );
if( pWnd ) ((KUIControlClockBox*)pWnd)->SetColor( c_ColorClockControl );
}
}
// init multi_icon
KUIControlMultiIcon* pMultiIcon = dynamicCast<KUIControlMultiIcon*>(GetChild( "creature_faceicon" ));
if( pMultiIcon )
pMultiIcon->SetIconLayer( 4 );
SetChildAsTop( "creature02_skillicon_select" );
}
/////////////////////////////////////////////////
// 스킬사용
////////////////////////////////////////////////
void SUICreatureSkillWnd::RequestUseSkill()
{
if( m_nSelSkillPos < 0 ) return;
if( m_nTabType == TAB_ACTIVE )
{
if( m_nSelSkillPos-1 >= static_cast<int>(m_vecActiveSkillList.size()) ) return;
SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelSkillPos-1];
if( !pSkill->IsCasting() && !pSkill->IsFire() )
m_pDisplayInfo->UseSkill( pSkill->GetSkillID(), pSkill->GetUseLevel(), false, m_CreatureSlotMgr.GetSelectSummonCreature() );
}
else if( m_nTabType == TAB_PASSIVE )
{
if( m_nSelSkillPos-1 >= static_cast<int>(m_vecPassiveSkillList.size()) ) return;
SSkillSlot* pSkill = m_vecPassiveSkillList[m_nSelSkillPos-1];
if( !pSkill->IsCasting() && !pSkill->IsFire() )
m_pDisplayInfo->UseSkill( pSkill->GetSkillID(), pSkill->GetUseLevel(), false, m_CreatureSlotMgr.GetSelectSummonCreature() );
}
}
void SUICreatureSkillWnd::ShowClockBox( int nSkillID, bool bDiable )
{
if( !IsActiveTab() ) return;
if( bDiable )
{
std::vector<int> slotList;
m_CreatureSkillSlotMgr.GetQuickslotID( m_CreatureSlotMgr.GetSelectedCreature(), nSkillID, slotList );
for( int i(0); i<slotList.size(); ++i )
{
KUIWnd* pWnd = GetChild( CStringUtil::StringFormat("creature02_quick_clockbox%02d", slotList[i]).c_str() );
if( pWnd && m_CreatureSkillSlotMgr.IsCastingSkill(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) )
((KUIControlClockBox*)pWnd)->Init();
}
slotList.clear();
for( int i = 0; i < m_nMaxLine; i++ )
{
if( GetSkillID( m_nScrollPos+i ) == nSkillID )
{
KUIWnd* pWnd = GetChild( CStringUtil::StringFormat("creature02_clockbox%02d", i).c_str() );
if( pWnd && m_CreatureSkillSlotMgr.IsCastingSkill(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) )
((KUIControlClockBox*)pWnd)->Init();
{
return;
}
}
}
return;
}
std::vector<int> slotList;
m_CreatureSkillSlotMgr.GetQuickslotID( m_CreatureSlotMgr.GetSelectedCreature(), nSkillID, slotList );
for( int i(0); i<slotList.size(); ++i )
{
KUIWnd* pWnd = GetChild( CStringUtil::StringFormat("creature02_quick_clockbox%02d", slotList[i]).c_str() );
if( pWnd && m_CreatureSkillSlotMgr.IsFireSkill(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) )
{
((KUIControlClockBox*)pWnd)->SetMaxTime( m_CreatureSkillSlotMgr.GetSkillMaxTime(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) );
((KUIControlClockBox*)pWnd)->SetCurTime( m_CreatureSkillSlotMgr.GetSkillCurTime(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) );
((KUIControlClockBox*)pWnd)->Begin();
}
}
slotList.clear();
for( int i = 0; i < m_nMaxLine; i++ )
{
if( GetSkillID( m_nScrollPos+i ) == nSkillID )
{
KUIWnd* pWnd = GetChild( CStringUtil::StringFormat("creature02_clockbox%02d", i).c_str() );
if( pWnd && m_CreatureSkillSlotMgr.IsFireSkill(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) )
{
((KUIControlClockBox*)pWnd)->SetMaxTime( m_CreatureSkillSlotMgr.GetSkillMaxTime(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) );
((KUIControlClockBox*)pWnd)->SetCurTime( m_CreatureSkillSlotMgr.GetSkillCurTime(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) );
((KUIControlClockBox*)pWnd)->Begin();
((KUIControlClockBox*)pWnd)->SetShow(true);
}
return;
}
}
}
//스킬 사용 취소
void SUICreatureSkillWnd::CancelSkill( int nSkillID )
{
for( int i = 0; i < c_nMaxLine; i++ )
{
if( GetSkillID( m_nScrollPos+i ) == nSkillID )
{
KUIControlClockBox* pWnd = dynamicCast<KUIControlClockBox*>(GetChild( CStringUtil::StringFormat("creature02_clockbox%02d", i).c_str() ));
if( pWnd )
{
pWnd->SetMaxTime( 0 );
pWnd->SetCurTime( 0 );
pWnd->Begin();
}
break;
}
}
std::vector<int> slotList;
m_CreatureSkillSlotMgr.GetQuickslotID( m_CreatureSlotMgr.GetSelectedCreature(), nSkillID, slotList );
for( int i(0); i<slotList.size(); ++i )
{
KUIControlClockBox* pWnd = dynamicCast<KUIControlClockBox*>(GetChild( CStringUtil::StringFormat("creature02_quick_clockbox%02d", slotList[i]).c_str() ));
if( pWnd )
{
pWnd->SetMaxTime( 0 );
pWnd->SetCurTime( 0 );
pWnd->Begin();
}
}
slotList.clear();
}
/////////////////////////////////////////////////
// 탭
////////////////////////////////////////////////
bool SUICreatureSkillWnd::IsActiveTab() const
{
return ( m_nTabType == TAB_ACTIVE );
}
void SUICreatureSkillWnd::SelectTab()
{
RefreshScrollbar();
RefreshSkillSlot( m_nScrollPos );
}
/////////////////////////////////////////////////
// 스크롤바
////////////////////////////////////////////////
void SUICreatureSkillWnd::RefreshScrollbar()
{
int nCurCount;
if( IsActiveTab() ) nCurCount = static_cast<int>(m_vecActiveSkillList.size());
else nCurCount = static_cast<int>(m_vecPassiveSkillList.size());
int nScrollRange = max(nCurCount - m_nMaxLine, 0);
KUIControlVScroll* pScrollBar = dynamicCast<KUIControlVScroll*>(GetChild( c_szVSCROLL ));
if( NULL != pScrollBar )
{
pScrollBar->SetMaxRange( DWORD(nScrollRange)+1 );
m_nScrollPos = pScrollBar->GetPosition();
pScrollBar->SetPosition( m_nScrollPos );
}
}
void SUICreatureSkillWnd::ResizeScrollbar( int nOldHeight )
{
KUIControlVScroll* pScrollBar = dynamicCast<KUIControlVScroll*>(GetChild( c_szVSCROLL ));
if( NULL != pScrollBar )
{
KRect ktBottom;
KRect ktTop;
KUIControlStatic* pWnd;
pWnd = dynamicCast<KUIControlStatic*>(GetChild( "button_use" )); if( pWnd != NULL ) ktBottom = pWnd->GetRect();
pWnd = dynamicCast<KUIControlStatic*>(GetChild( "creature02_tab" )); if( pWnd != NULL ) ktTop = pWnd->GetRect();
KRect ktRect = pScrollBar->GetRect();
ktRect.top = ktTop.bottom; ktRect.bottom = ktBottom.top-2;
pScrollBar->Resize( ktRect );
// max 변경
int nDelta = GetRect().GetHeight() - nOldHeight;
if( nDelta > 0 ) m_nMaxLine += nDelta/c_nDelta;
else if( nDelta < 0 ) m_nMaxLine -= ((-1)*nDelta)/c_nDelta;
m_nMaxLine = max( m_nMaxLine, c_nMinLine );
m_nMaxLine = min( m_nMaxLine, c_nMaxLine );
RefreshScrollbar(); // 스크롤 바 갱신
RefreshSkillSlot( m_nScrollPos ); // 스킬 슬롯
}
}
//////////////////////////////////////////////////////////////////////////
// 정보
//////////////////////////////////////////////////////////////////////////
void SUICreatureSkillWnd::RefreshCreatureInfo()
{
if( !m_CreatureSlotMgr.GetSelectedCreature() ) return;
const SCreatureInfo* pInfo = m_CreatureSlotMgr.GetCreatureInfo( m_CreatureSlotMgr.GetSelectedCreature() );
if( pInfo == NULL ) return;
KUIControlMultiIcon* pIcon = dynamicCast<KUIControlMultiIcon*>(GetChild( "creature_faceicon" ));
if( pIcon )
{
//gmpbigsun(20130411): BORDER추가
ResetMultiIcon( pIcon, 0, 4 );
SInventorySlot* slot = m_InventoryMgr.GetItemInfo(m_CreatureSlotMgr.GetSelectedCreatureCard());
char iconName[128];
int enhance = (slot) ? slot->GetEnhance() : 0;
::getEnhanceIconName(iconName, pInfo, enhance);
pIcon->SetIcon( 0, c_szDEF_SPR_NAME, iconName );
std::string strTemp;
int nDurability = (slot) ? slot->GetEtherealDurability() : 0;
getIconNameSummonCard_BORDER( strTemp, pInfo->GetID(), enhance, nDurability );
pIcon->SetIcon( 1, c_szDEF_SPR_NAME, strTemp.c_str() );
}
SetChildShow( "creature_gradenumber_plus", true );
SetChildShow( "creature_gradenumber_number", false );
{ //크리처 등급/오버브리드/이름 쎄팅부분
std::string strRank( "" );
BYTE byRank( GetCreatureDB().GetRate( pInfo->GetID() ) );
if( pInfo )
{
switch( byRank )
{
case SummonBase::RATE_BASIC: strRank = "#@C1R@#"; break;
case SummonBase::RATE_NORMAL_BASIC: strRank = "#@C2R@#"; break;
case SummonBase::RATE_SPECIAL_BASIC: strRank = "#@C3R@#"; break;
case SummonBase::RATE_NORMAL_RARE: strRank = "#@C4R@#"; break;
case SummonBase::RATE_SPECIAL_RARE: strRank = "#@C5R@#"; break;
case SummonBase::RATE_UNIQUE: strRank = "#@C6R@#"; break;
// AziaMafia Pet Rarity
case SummonBase::RATE_VERACRUZ: strRank = "#@C7R@#"; break;
case SummonBase::RATE_PHANTOM: strRank = "#@C8R@#"; break;
case SummonBase::RATE_AURA: strRank = "#@C9R@#"; break;
case SummonBase::RATE_SHINNY: strRank = "#@C10R@#"; break;
case SummonBase::RATE_GALAXY: strRank = "#@C11R@#"; break;
}
}
SetChildCaption( "static_grade_00", strRank.c_str() );
SetChildTooltip( "static_grade_00", GetCreatureDB().GetRateString( byRank ).c_str() );
if( NULL != m_pOverBreed &&
NULL != m_pOverBreedIcon )
{
int nOverBreed( pInfo->GetOverBreed() );
if( nOverBreed )
{
m_pOverBreedIcon->SetShow( true );
m_pOverBreed->SetShow( true );
std::string strOverBreed( m_strOverBreedPropertyTag );
strOverBreed.append( StringFormat( "+%u", nOverBreed ) );
m_pOverBreed->SetCaption( strOverBreed.c_str() );
}
else
{
m_pOverBreedIcon->SetShow( false );
m_pOverBreed->SetShow( false );
}
}
if( m_pEvolutionRankIcon )
{
string strGetEvolutionFormIconFileName( GetCreatureDB().GetEvolutionFormIconFileName( pInfo->GetID() ) );
if( strGetEvolutionFormIconFileName.empty() )
{
m_pEvolutionRankIcon->SetShow( false );
}
else
{
m_pEvolutionRankIcon->SetIcon( c_szDEF_SPR_NAME, strGetEvolutionFormIconFileName.c_str() );
m_pEvolutionRankIcon->SetTooltip( GetCreatureDB().GetEvolutionFormString( pInfo->GetID() ).c_str() );
m_pEvolutionRankIcon->SetShow( true );
}
}
std::string strName( "" );
strName += CStringUtil::StringFormat( "<size:12><left>%s", pInfo->GetName() );
SetChildCaption( "creature_customname_text", strName.c_str() );
}
{ //크리처 class 쎄팅부분
_SUMMON_INFO_FILE * pSummon = GetCreatureDB().GetCreatureData( pInfo->GetID() );
if( pSummon )
SetChildCaption( "creature_name_text", CStringUtil::StringFormat( "<#fcc42f><size:10><left>%s", GetStringDB().GetString( pSummon->name_id ) ).c_str() );
else
SetChildCaption( "creature_name_text", CStringUtil::StringFormat( "<#fcc42f><size:10><left>%s", pInfo->GetName() ).c_str() );
}
// K/M 처리
/// 2011.04.27 정리 - prodongi
/*
int nJP = pInfo->GetJP();
const char* szCaption = m_pDisplayInfo->GetJP( &nJP );
SetChildShow( "static_jp_k_font", ( szCaption != NULL ) );
SetChildCaption( "static_creature_jp_value", CStringUtil::StringFormat( "<right>%s%d", S(6425), nJP ).c_str() );
*/
std::string jpStr;
jpToString(pInfo->GetJP(), jpStr);
SetChildCaption( "static_creature_jp_value", jpStr.c_str());
SetChildCaption( "static_creature_lv_value", CStringUtil::StringFormat( "<vcenter><hcenter>%s%d", S(6425), pInfo->GetLevel() ).c_str() );
}
//////////////////////////////////////////////////
// 스킬리스트
/////////////////////////////////////////////////
void SUICreatureSkillWnd::FreeSkillList()
{
m_vecActiveSkillList.clear();
m_vecPassiveSkillList.clear();
}
bool SUICreatureSkillWnd::IsExistSkill( int nSkillID, bool bActive )
{
SKILL_VECTOR::iterator it;
if( bActive )
{
it = m_vecActiveSkillList.begin();
while( it != m_vecActiveSkillList.end() )
{
if( (*it)->GetSkillID() == nSkillID ) return true;
it++;
}
}
else
{
it = m_vecPassiveSkillList.begin();
while( it != m_vecPassiveSkillList.end() )
{
if( (*it)->GetSkillID() == nSkillID ) return true;
it++;
}
}
return false;
}
void SUICreatureSkillWnd::UpdateSkill( SSkillSlot* pSkill, bool bActive )
{
SKILL_VECTOR::iterator it;
if( bActive )
{
it = m_vecActiveSkillList.begin();
while( it != m_vecActiveSkillList.end() )
{
SSkillSlot* pSkillSlot = (*it);
if( pSkill->GetSkillID() == pSkillSlot->GetSkillID() )
{
(*it)->SetBaseLevel( pSkill->GetSkill().base_skill_level );
(*it)->SetCurLevel( pSkill->GetSkill().current_skill_level );
(*it)->SetUseLevel( pSkill->GetUseLevel() );
(*it)->SetSkillCard( pSkill->GetSkillCard() );
(*it)->SetCasting( pSkill->IsCasting() );
(*it)->SetFire( pSkill->IsFire() );
break;
}
it++;
}
}
else
{
it = m_vecPassiveSkillList.begin();
while( it != m_vecPassiveSkillList.end() )
{
SSkillSlot* pSkillSlot = (*it);
if( pSkill->GetSkillID() == pSkillSlot->GetSkillID() )
{
(*it)->SetBaseLevel( pSkill->GetSkill().base_skill_level );
(*it)->SetCurLevel( pSkill->GetSkill().current_skill_level );
(*it)->SetUseLevel( pSkill->GetUseLevel() );
(*it)->SetSkillCard( pSkill->GetSkillCard() );
(*it)->SetCasting( pSkill->IsCasting() );
(*it)->SetFire( pSkill->IsFire() );
break;
}
it++;
}
}
}
void SUICreatureSkillWnd::RefreshSkillInfo()
{
FreeSkillList();
const std::vector<SSkillSlot*> & vecSkillList = m_CreatureSkillSlotMgr.GetSkillList();
std::vector<SSkillSlot*>::const_iterator it = vecSkillList.begin();
while( it != vecSkillList.end() )
{
SSkillSlot* pSlot( (*it) );
if( NULL == pSlot )
{
SDEBUGLOG( "[크리쳐 스킬] 스킬 정보 포인터가 유효하지 않습니다." );
assert( pSlot );
it++;
continue;
}
if( NULL == pSlot->GetCurLevel() )
{
it++;
continue; // 현재 스킬 레벨이 0 이라면 등록하지 않는다
}
if( pSlot->GetTarget() == m_CreatureSlotMgr.GetSelectedCreature() )
{
SkillBaseEx* s_data = GetSkillDB().GetSkillData( pSlot->GetSkillID() );
if( s_data && !s_data->IsSystemSkill() )
{
if( IsExistSkill(pSlot->GetSkillID(), !s_data->IsPassive() ) )
UpdateSkill( pSlot, !s_data->IsPassive() );
else
{
if( !s_data->IsPassive() )
m_vecActiveSkillList.push_back( pSlot );
else
m_vecPassiveSkillList.push_back( pSlot );
}
}
}
it++;
}
RefreshScrollbar();
// 2010.07.15 - prodongi
RefreshAddedSkillList();
RefreshSkillSlot( m_nScrollPos );
// RefreshCreatureQuickSlots(); // 2011.11.29 - servantes : 쓰이지 않음
}
void SUICreatureSkillWnd::SetSkillData( SSkillSlot* pSkill, int nIndex, bool bShow )
{
SkillBaseEx* s_data = GetSkillDB().GetSkillData( pSkill->GetSkillID() );
if( s_data == NULL ) return;
// 스킬 아이콘
KUIControlIconStatic* pIcon = dynamicCast<KUIControlIconStatic*>(GetChild( CStringUtil::StringFormat( "creature02_skillicon%02d", nIndex ).c_str() ));
if( pIcon && bShow )
{
pIcon->SetIcon( c_szDEF_SPR_NAME, s_data->icon_file_name );
// sonador 1.2.5 Lazy Tooltip 구현
pIcon->SetLazyTooltip( new KLazyCreatureSkillTooltip( *m_pDisplayInfo, pSkill->GetSkillID(), pSkill->GetUseLevel(), true ) ); // sonador #2.1.2.4.3 팻 조작 UI 연동
}
// 2010.07.21 - prodongi
// 스킬 레벨
//SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), pSkill->GetUseLevel() ).c_str() );
if (pSkill->GetAddedLevel())
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d", S(6425), pSkill->GetUseLevel() ).c_str() );
else
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), pSkill->GetUseLevel() ).c_str() );
// 스킬 이름
SetChildCaption( CStringUtil::StringFormat( "creature02_skillname_text%02d", nIndex ).c_str(), GetStringDB().GetString( s_data->GetNameID() ) );
// 2010.07.21 - prodongi
// 스킬 설명
//SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s<right>%d / " , S(6425), pSkill->GetUseLevel() ).c_str() );
//SetChildCaption( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex ).c_str(), CStringUtil::StringFormat( "%s<shadow><left><#e6fd30>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel() ).c_str() );
if (pSkill->GetAddedLevel())
{
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900><right>%d / " , S(6425), pSkill->GetUseLevel() ).c_str() );
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex ).c_str(), CStringUtil::StringFormat( "%s<shadow><left><#ff9900>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel() ).c_str() );
}
else
{
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s<right>%d / " , S(6425), pSkill->GetUseLevel() ).c_str() );
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex ).c_str(), CStringUtil::StringFormat( "%s<shadow><left><#e6fd30>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel() ).c_str() );
}
// 소모 MP
SetChildCaption( CStringUtil::StringFormat( "static_skill_mp_value%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), s_data->GetCostMP( pSkill->GetUseLevel() ) ).c_str() );
}
int SUICreatureSkillWnd::GetSkillID( int nIndex )
{
if( nIndex < 0 ) return -1;
if( nIndex >= static_cast<int>(m_vecActiveSkillList.size()) ) return -1;
SSkillSlot* pSkill = m_vecActiveSkillList[nIndex];
return pSkill->GetSkillID();
}
// 2010.07.15 - prodongi
void SUICreatureSkillWnd::RefreshAddedSkillList()
{
const std::vector<SSkillSlot*> & vecSkillList = m_CreatureSkillSlotMgr.GetSkillList();
const std::vector<SAddedSkillInfo*> & vecAddedSkillList = m_CreatureSkillSlotMgr.GetAddedSkillList();
std::vector<SSkillSlot*>::const_iterator it = vecSkillList.begin();
while( it != vecSkillList.end() )
{
SSkillSlot* pSlot = (*it);
int lv = 0;
std::vector<SAddedSkillInfo*>::const_iterator pit = vecAddedSkillList.begin();
while (pit != vecAddedSkillList.end() )
{
SAddedSkillInfo * pInfo = (*pit);
lv += pInfo->GetLevel( pSlot->GetSkillID(), pSlot->GetTarget() );
pit ++;
}
int mlv = pSlot->GetBaseLevel() + lv;
pSlot->SetUseLevel(mlv);
pSlot->SetCurLevel(mlv);
pSlot->SetAddedLevel(lv);
it++;
}
}
//////////////////////////////////////////////////
// 스킬슬롯
/////////////////////////////////////////////////
void SUICreatureSkillWnd::RefreshSkillSlot( int nRange )
{
HideSelectBar();
if( IsActiveTab() ) RefreshActiveSkillSlot(nRange);
else RefreshPassiveSkillSlot(nRange);
}
void SUICreatureSkillWnd::RefreshActiveSkillSlot( int nRange )
{
for( int i = 0; i < c_nMaxLine; i++ )
{
if( i >= m_nMaxLine )
{
DisableSlot(i);
continue;
}
if( i+nRange < static_cast<int>(m_vecActiveSkillList.size()) )
{
SSkillSlot* pSkill = m_vecActiveSkillList[nRange+i];
EnableSlot(i, true, TAB_ACTIVE, pSkill->GetSkillID() );
SetSkillData( pSkill, i, true );
}
else
EnableSlot(i, false, TAB_ACTIVE );
}
}
void SUICreatureSkillWnd::RefreshPassiveSkillSlot( int nRange )
{
for( int i = 0; i < c_nMaxLine; i++ )
{
if( i >= m_nMaxLine )
{
DisableSlot(i);
continue;
}
if( i+nRange < static_cast<int>(m_vecPassiveSkillList.size()) )
{
SSkillSlot* pSkill = m_vecPassiveSkillList[i+nRange];
EnableSlot(i, true, TAB_PASSIVE, pSkill->GetSkillID() );
SetSkillData( pSkill, i, true );
}
else
EnableSlot(i, false, TAB_PASSIVE );
}
}
void SUICreatureSkillWnd::EnableSlot( int nMode, bool bShow, bool bPassive, int nSkillID )
{
KUIControlIconStatic* pIcon = NULL;
KUIControlClockBox* pClock = NULL;
// 스킬 아이콘 기본
if( bShow == false )
{
pIcon = dynamicCast<KUIControlIconStatic*>(GetChild( CStringUtil::StringFormat( "creature02_skillicon%02d", nMode ).c_str() )) ;
if( pIcon )
{
pIcon->SetIcon( c_szDEF_SPR_NAME, "static_common_itemslot" );
// sonador 1.2.5 Lazy Tooltip 구현
pIcon->SetLazyTooltip();
pIcon->SetShow(true); // 스킬 아이콘은 항상 보여야 한다
}
}
// 스킬 쿨링 타임 검사
pClock = dynamicCast<KUIControlClockBox*>(GetChild( CStringUtil::StringFormat( "creature02_clockbox%02d", nMode ).c_str() ));
if( pClock )
{
if( nSkillID != -1 && m_CreatureSkillSlotMgr.IsCastingSkill( nSkillID, m_CreatureSlotMgr.GetSelectedCreature() ) )
pClock->Init();
else if( nSkillID != -1 && m_CreatureSkillSlotMgr.IsFireSkill( nSkillID, m_CreatureSlotMgr.GetSelectedCreature() ) )
{
pClock->SetMaxTime( m_CreatureSkillSlotMgr.GetSkillMaxTime(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) );
pClock->SetCurTime( m_CreatureSkillSlotMgr.GetSkillCurTime(nSkillID, m_CreatureSlotMgr.GetSelectedCreature()) );
pClock->Begin();
}
else
{
pClock->SetCurTime(0);
pClock->SetMaxTime(0);
pClock->Begin();
}
}
// SetChildShow( CStringUtil::StringFormat( "creature02_lvinfo%02d" , nMode ).c_str(), bShow );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllv%02d" , nMode ).c_str(), bShow );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllv%02d_value", nMode ).c_str(), bShow );
if( bShow ) bPassive = !bPassive;
else bPassive = false;
SetChildShow( CStringUtil::StringFormat( "creature02_lvinfo_up%02d" , nMode ).c_str(), bPassive );
SetChildShow( CStringUtil::StringFormat( "creature02_lvinfo_down%02d" , nMode ).c_str(), bPassive );
SetChildShow( CStringUtil::StringFormat( "creature02_skillname_text%02d" , nMode ).c_str(), bShow );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nMode ).c_str(), bShow );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nMode ).c_str(), bShow );
SetChildShow( CStringUtil::StringFormat( "static_skill_mp%02d" , nMode ).c_str(), bShow );
SetChildShow( CStringUtil::StringFormat( "static_skill_mp_value%02d" , nMode ).c_str(), bShow );
}
void SUICreatureSkillWnd::DisableSlot( int nIndex )
{
SetChildShow( CStringUtil::StringFormat( "creature02_skillicon%02d" , nIndex ).c_str(), false );
// SetChildShow( CStringUtil::StringFormat( "creature02_lvinfo%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllv%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_lvinfo_up%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_lvinfo_down%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_skillname_text%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "creature02_clockbox%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "static_skill_mp%02d" , nIndex ).c_str(), false );
SetChildShow( CStringUtil::StringFormat( "static_skill_mp_value%02d" , nIndex ).c_str(), false );
}
void SUICreatureSkillWnd::DisableAllSlot( bool bShow )
{
for( int i = 0; i < c_nMaxLine; i++ )
{
if( i < m_nMaxLine )
EnableSlot( i, false, m_nTabType, -1 );
else
DisableSlot(i);
}
SetChildCaption( "creature_customname_text", "" );
SetChildCaption( "creature_name_text", "" );
SetChildShow( "creature_gradenumber_plus", false );
SetChildShow( "creature_gradenumber_number", false );
}
//////////////////////////////////////////////////
// 선택바
//////////////////////////////////////////////////
void SUICreatureSkillWnd::ShowSelectBar( int nIndex )
{
HideSelectBar();
m_nSelSkillPos = nIndex;
KUIControlVScroll* pScrollBar = dynamicCast<KUIControlVScroll*>(GetChild( c_szVSCROLL ));
if( NULL != pScrollBar ) m_nSelSkillPos += (pScrollBar->GetPosition()+1); // 스크롤바 만큼 더해져야 한다
bool bActive = false;
if( IsActiveTab() ) bActive = true;
if( m_nTabType == TAB_ACTIVE && m_vecActiveSkillList.size() <= m_nSelSkillPos-1 ) return;
else if( m_nTabType == TAB_PASSIVE && m_vecPassiveSkillList.size() <= m_nSelSkillPos-1 ) return;
// 선택바 보이기
KUIWnd* pBg = GetChild( CStringUtil::StringFormat( "creature02_skillicon%02d", nIndex ).c_str() );
if( pBg )
{
SetMovePos( "creature02_selectbar", pBg->GetRect().left-c_nIconSelectDelta, pBg->GetRect().top-4 );
SetChildShow( "creature02_selectbar", true );
}
// 아이콘 선택 보이기
KUIWnd* pIcon = GetChild( CStringUtil::StringFormat( "creature02_skillicon%02d", nIndex ).c_str() );
if( pIcon )
{
SetMovePos ( "creature02_selectbar_back", pIcon->GetRect().left-c_nIconSelectDelta, pIcon->GetRect().top );
SetChildShow( "creature02_selectbar_back", true );
SetMovePos ( "creature02_skillicon_select", pIcon->GetRect().left/*-c_nIconSelectDelta*/, pIcon->GetRect().top );
SetChildShow( "creature02_skillicon_select", true );
}
}
void SUICreatureSkillWnd::HideSelectBar()
{
m_nSelSkillPos = -1;
// 아이콘 선택 감추기
SetChildShow( "creature02_skillicon_select", false );
// 선택바 감추기
SetChildShow( "creature02_selectbar", false );
SetChildShow( "creature02_selectbar_back", false );
}
///////////////////////////////////////////////
// 드래그앤드랍
//////////////////////////////////////////////
int SUICreatureSkillWnd::GetUseLevel( int nSkillID ) const
{
SKILL_VECTOR::const_iterator it;
if( IsActiveTab() )
{
it = m_vecActiveSkillList.begin();
while( it != m_vecActiveSkillList.end() )
{
SSkillSlot* pSkill = (*it);
if( pSkill->GetSkillID() == nSkillID )
return pSkill->GetUseLevel();
it++;
}
}
else
{
it = m_vecPassiveSkillList.begin();
while( it != m_vecPassiveSkillList.end() )
{
SSkillSlot* pSkill = (*it);
if( pSkill->GetSkillID() == nSkillID )
return pSkill->GetUseLevel();
it++;
}
}
return -1;
}
int SUICreatureSkillWnd::GetSkillIDByCtrlName( const char* szCtrlName ) const
{
if( IsActiveTab() )
return GetActiveSkillID(szCtrlName);
else
return GetPassiveSkillID(szCtrlName);
return -1;
}
int SUICreatureSkillWnd::GetActiveSkillID( const char* szSprName ) const
{
// 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리
//if( m_bIsQuickSlotItem ) // 장착된 스킬이라면 퀵슬롯 정보에서
//{
// for( int i = 0; i < c_nQUICK_SLOT_CNT; i++ )
// {
// if( _stricmp( szSprName, CStringUtil::StringFormat( c_szSKILL_QUICK_SLOT, i ).c_str() ) == 0 )
// {
// QUICK_SKILL* pSlot = m_CreatureSkillSlotMgr.FindQuickSlot( m_CreatureSlotMgr.GetSelectedCreature(), i );
// if( pSlot )
// return pSlot->m_nSkillID;
// }
// }
//}
//else
//{
for( int i = 0; i < m_nMaxLine; i++ )
{
if( _stricmp( szSprName, CStringUtil::StringFormat( "creature02_skillicon%02d", i ).c_str() ) == 0 )
{
if( i+m_nScrollPos < static_cast<int>(m_vecActiveSkillList.size()) )
{
SSkillSlot* pSkill = m_vecActiveSkillList[i+m_nScrollPos];
return pSkill->GetSkillID();
}
}
}
//}
return -1;
}
int SUICreatureSkillWnd::GetPassiveSkillID( const char* szSprName ) const
{
for( int i = 0; i < m_nMaxLine; i++ )
{
if( _stricmp( szSprName, CStringUtil::StringFormat( "creature02_skillicon%02d", i ).c_str() ) == 0 )
{
if( i+m_nScrollPos < static_cast<int>(m_vecPassiveSkillList.size()) )
{
SSkillSlot* pSkill = m_vecPassiveSkillList[i+m_nScrollPos];
return pSkill->GetSkillID();
}
}
}
return -1;
}
QUICK_SKILL* SUICreatureSkillWnd::GetQuickSkillDByCtrlName( const char* szCtrlName ) const
{
// if( IsActiveTab() )
// return GetActiveQuickSkill(szCtrlName);
return NULL;
}
QUICK_SKILL* SUICreatureSkillWnd::GetActiveQuickSkill( const char* szSprName ) const
{
// 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리
//if( m_bIsQuickSlotItem ) // 장착된 스킬이라면 퀵슬롯 정보에서
//{
// for( int i = 0; i < c_nQUICK_SLOT_CNT; i++ )
// {
// if( _stricmp( szSprName, CStringUtil::StringFormat( c_szSKILL_QUICK_SLOT, i ).c_str() ) == 0 )
// {
// QUICK_SKILL* pSlot = m_CreatureSkillSlotMgr.FindQuickSlot( m_CreatureSlotMgr.GetSelectedCreature(), i );
// if( pSlot ) return pSlot;
// }
// }
//}
return NULL;
}
void SUICreatureSkillWnd::SkillUp( int nIndex )
{
if( nIndex < 0 ) return;
if( nIndex >= static_cast<int>(m_vecActiveSkillList.size()) ) return;
SSkillSlot* pSkill = m_vecActiveSkillList[nIndex];
if( pSkill )
{
int lv = pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel();
if( lv == 1 ) return;
if( lv < pSkill->GetUseLevel() + 1 ) return;
int nLevel = pSkill->GetUseLevel() + 1;
pSkill->SetUseLevel( nLevel );
_setSkillLevel( nIndex, nLevel, pSkill );
}
}
void SUICreatureSkillWnd::SkillDown( int nIndex )
{
if( nIndex < 0 ) return;
if( nIndex >= static_cast<int>(m_vecActiveSkillList.size()) ) return;
SSkillSlot* pSkill = m_vecActiveSkillList[nIndex];
if( pSkill )
{
int lv = pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel();
if( lv == 1 ) return;
if( pSkill->GetUseLevel() - 1 < 1 ) return;
int nLevel = pSkill->GetUseLevel() - 1;
pSkill->SetUseLevel( nLevel );
_setSkillLevel( nIndex, nLevel, pSkill );
}
}
void SUICreatureSkillWnd::_setSkillLevel( int nIndex, int nLevel, SSkillSlot* pSkill )
{
if( pSkill )
{
SkillBaseEx* s_data = GetSkillDB().GetSkillData( pSkill->GetSkillID() );
if( s_data == NULL ) return;
// 2010.07.21 - prodongi
//SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), nLevel ).c_str() );
// 정보 갱신해 준다
//SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<right>%d / " , S(6425), nLevel ).c_str() ) ;
//SetChildCaption( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<shadow><left><#e6fd30>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel()).c_str() );
if (pSkill->GetAddedLevel())
{
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d", S(6425), nLevel ).c_str() );
// 정보 갱신해 준다
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<#ff9900><right>%d / " , S(6425), nLevel ).c_str() ) ;
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<shadow><left><#ff9900>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel()).c_str() );
}
else
{
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv%02d_value" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), nLevel ).c_str() );
// 정보 갱신해 준다
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllv_text%02d" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<right>%d / " , S(6425), nLevel ).c_str() ) ;
SetChildCaption( CStringUtil::StringFormat( "creature02_skilllvmax_text%02d", nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s<shadow><left><#e6fd30>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel()).c_str() );
}
SetChildCaption( CStringUtil::StringFormat( "static_skill_mp_value%02d" , nIndex-m_nScrollPos ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), s_data->GetCostMP( nLevel ) ).c_str() );
// 툴팁 정보 갱신해 준다
KUIControlIconStatic* pIcon = dynamicCast<KUIControlIconStatic*>(GetChild( CStringUtil::StringFormat( "creature02_skillicon%02d", nIndex-m_nScrollPos ).c_str() ));
if( pIcon )
{
// sonador 1.2.5 Lazy Tooltip 구현
pIcon->SetLazyTooltip( new KLazyCreatureSkillTooltip( *m_pDisplayInfo, pSkill->GetSkillID(), pSkill->GetUseLevel(), true ) ); // sonador #2.1.2.4.3 팻 조작 UI 연동
}
}
}