/// 2010.12.17 - prodongi #include "stdafx.h" #include "KUITabControl.h" #include "KUIDragAndDrop.h" #include "KUIControlButton.h" #include "KUIControlStatic.h" #include "KUIControlScroll.h" #include "KUIControlClockBox.h" #include "SGameManager.h" #include "SUISkillWnd.h" #include "SUIDisplayInfo.h" #include "SUILazyTooltip.h" // sonador #2.1.2.4.3 팻 조작 UI 연동 //#include "SUIUtil.h" // 2011.04.29 - servantes #include "SStringDB.h" #include "SSkillDB.h" #include "SExpDB.h" #include "SJobDB.h" #include "SItemDB.h" #include "ErrorCode/ErrorCode.h" #include "SPlayerInfoMgr.h" //#include "SGameMessageUI.h" #include "SInventoryMgr.h" #include "SUISysMsgDefine.h" namespace{ int c_nMaxJobChange = 3; // MJ 2004/11/02 퀄업때까지는 3차까지, 나중에 5차까지 확장 const int c_nMaxHeight = 560; // 최대로 늘릴때 max const int c_nDelta = 38; // 늘어나는 단위 /// 2010.12.16 - prodongi const int c_nMaxLine = 11; const int c_nMinLine = 11; const int c_nSysMenu = 56; // 왼쪽 메뉴 바 width const int c_nChildWnd = 235; // 차일드 width const int c_nTabClickArea = 9; // 탭 클릭 영역 const int c_nButtonClickArea = 20; // 버튼 클릭 영역 const int c_nIconSelectDelta = 6; // 아이콘 선택 static 표시 위치 delta enum{ // 탭 타입 TAB_ACTIVE = 0, TAB_PASSIVE, }; enum{ // 스킬 타입 SKILLTYPE_PASSIVE = 0, SKILLTYPE_ACTIVE, }; enum{ // 카드 슬롯 장착 상태 CARD_NONE = 0, // 카드 없음 CARD_SLOT, // 카드 있음 CARD_DISABLE, // 있지만 사용불가 }; const char* c_szButtonJLVUp = "button_jlvup"; }; using namespace rp; SUISkillWnd::~SUISkillWnd() { FreeSkillList(); } bool SUISkillWnd::InitControls( KPoint kPos ) { /// 2010.12.16 - prodongi SetCustomMovingRect( KRect( 0, 0, 342, 25 ) ); // 타이틀 바 선택 영역, 이동위해 클릭 Area // 리사이즈 할때 단위 설정, ( 세로, 가로, 위드, 헤잇 ) SetResizeUnit( 0, c_nDelta, KSize((GetRect().right-GetRect().left), (GetRect().bottom-GetRect().top)), KSize((GetRect().right-GetRect().left), c_nMaxHeight) ); // // 버튼 클릭 영역 // SetValidRect( "skill_fund", KRect( 0, 0, -c_nButtonClickArea, 0 ) ); CreateControls(); // 컨트롤 생성 /// 2010.12.21 - prodongi m_jobRankButton[JOP_0] = dynamicCast(GetChild("button_skill_sort_basic_01")); m_jobRankButton[JOP_1] = dynamicCast(GetChild("button_skill_sort_first_01")); m_jobRankButton[JOP_2] = dynamicCast(GetChild("button_skill_sort_second_01")); m_jobRankButton[JOP_3] = dynamicCast(GetChild("button_skill_sort_master_01")); m_jobRankButton[JOP_ALL] = dynamicCast(GetChild("button_skill_sort_all_01")); m_jobRankButton[JOP_TP] = dynamicCast(GetChild("button_skill_sort_trait_01")); /// 2011.03.28 - prodongi /// 2010.12.24 - prodongi SetChildShow("skill_card_slot_00", false); /// 2011.03.28 - prodongi KUIControl* wnd = dynamicCast(GetChild("button_skill_tree_01")); if (wnd) wnd->SetTooltip(S(9524)); return SUIWnd::InitControls(kPos); } bool SUISkillWnd::InitData( bool bReload ) { m_nSelSkillPos = -1; m_nSysMenuPosX = -99; m_nSysMenuPosY = -99; m_nScrollPos = 0; m_bIsOpenSkillFund = false; m_nChangeJob = 0; m_bShowChildWnd = true; m_nMaxLine = c_nMinLine; m_nTabType = TAB_ACTIVE; FreeSkillList(); // 모든 리스트 삭제 DisableAllSlot(); // 모든 컨트롤 초기화 HideSelectBar(); // 선택바 초기화 m_nScrollPos = 0; m_nSelectJopIndex = JOP_ALL; m_aniJobLevelUp.init(this); return SUIWnd::InitData(bReload); } void SUISkillWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { SUIWnd::OnNotifyUIWindowOpen( bOpen, false ); if( bOpen ) { m_pGameManager->StartSound( "ui_popup_window01.wav" ); m_aniJobLevelUp.setState(sAniJobLevelUp::END, GetRect()); SetJP(); SetJLevel(); SetJLvHistory(); setSelectedSheetTabItem(m_nTabType); refreshJobRank(); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, GetBoundingRect().right, GetBoundingRect().bottom ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, m_nTabType ) ); } m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, (bOpen && m_bShowChildWnd) ) ); } void* SUISkillWnd::Perform( KID id, KArg& msg ) { _CID( UI_BEGIN_DRAG ); _CID( UI_SEND_DROP ); _CID( UI_RECV_DROP ); if ( id == id_UI_BEGIN_DRAG ) { KUIBeginDragMessage* pBeginMsg = static_cast( &msg ); const char* szControlID = pBeginMsg->sDragControlID.c_str(); KUIWnd* pWnd = GetChild( szControlID ); if( pWnd == NULL ) return NULL; // 스킬 카드 아이템 int nSkillCardIndex = GetCardSlotIndex(szControlID, true); if( nSkillCardIndex != -1 ) { m_pDisplayInfo->SetUIDragInfo( new SUISkillDragInfo( GetSkillID(nSkillCardIndex), GetSkillLevel(nSkillCardIndex), GetSkillCardItem(nSkillCardIndex), m_PlayerInfoMgr.GetPlayerHandle() ) ); m_pDragAndDropIcon->SetStateIcon( pWnd->GetSprName(), pWnd->GetAniName(), pWnd->GetFrameIndex(), STATE_NORMAL ); pBeginMsg->pDragAndDropRenderer = m_pDragAndDropIcon; } else // 스킬 아이콘 { int nSkillID = GetSkillIDByCtrlName( szControlID ); if( (-1) != nSkillID ) { int nUseLevel = GetUseLevel( nSkillID ); if( (-1) != nUseLevel ) { m_pDisplayInfo->SetUIDragInfo( new SUISkillDragInfo( 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( &msg ); SUIDragInfo* pUIDragInfo = m_pDisplayInfo->GetUIDragInfo(); if( NULL != pUIDragInfo ) m_pDisplayInfo->SetUIDragInfo(); return NULL; } else if ( id == id_UI_RECV_DROP ) { // 액티브 스킬만 가능 if( GetTabType() != TAB_ACTIVE ) return NULL; SUIDragInfo* pDragInfo = m_pDisplayInfo->GetUIDragInfo(); if( pDragInfo == NULL ) return NULL; if( pDragInfo->m_type != SUIDragInfo::DRAGTYPE_INVENITEM ) return NULL; KUISendRecvDropMessage* pDropMsg = static_cast( &msg ); //int nCardSlot = GetCardSlotIndex( pDropMsg->sRecvDropControlID.c_str() ); //if( nCardSlot == -1 ) return NULL; SUIInvenItemDragInfo* pInvenInfo = ( SUIInvenItemDragInfo* )pDragInfo; if( pInvenInfo == NULL ) return NULL; if( !IsSkillCard( -1, pInvenInfo->m_hItem) ) return NULL; RequestEquipCard( -1, pInvenInfo->m_hItem ); m_pGameManager->StartSound( m_pDisplayInfo->GetDragMaterialSound() ); return NULL; } return SUIWnd::Perform( id, msg ); } void SUISkillWnd::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_SKILL, false) ); else if( ::_stricmp( lpszControlID, "skill_fund" ) == 0 ) // 스킬투자 { m_bShowChildWnd = !m_bShowChildWnd; m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, m_bShowChildWnd ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, m_nTabType ) ); } else if( ::_stricmp( lpszControlID, c_szButtonJLVUp ) == 0 ) // 잡레벨 업 { /// 2010.12.20 - prodongi if (m_aniJobLevelUp.isState(sAniJobLevelUp::END)) { m_pGameManager->StartSound( "ui_click_jlv01.wav" ); m_aniJobLevelUp.setState(sAniJobLevelUp::READY, GetRect()); RequestJobLvUP(); } } /// 2010.12.21 스킬 사용 - prodongi else if (strstr(lpszControlID, "button_skill_use_")) { RequestUseSkill(lpszControlID + strlen("button_skill_use_")); } /// 2010.12.15 - prodongi else if (_stricmp(lpszControlID, "button_skill_tree_01") == 0) { toggleSkillTreeFundWnd(); } else if (_stricmp(lpszControlID, "tab_active_01") == 0) { selectTabButton(TAB_ACTIVE); } else if (_stricmp(lpszControlID, "tab_passive_01") == 0) { selectTabButton(TAB_PASSIVE); } else { for( int i = 0; i < m_nMaxLine; i++ ) { if( ::_stricmp( lpszControlID, CStringUtil::StringFormat( "skill_icon%02d", i ).c_str() ) == 0 ) // 선택 처리 { ShowSelectBar(i); break; } else if( ::_stricmp( lpszControlID, CStringUtil::StringFormat( "skill_lvinfo_up%02d", i ).c_str() ) == 0 ) // 스킬 업 { SkillUp(m_nScrollPos+i); ShowSelectBar(i); break; } else if( ::_stricmp( lpszControlID, CStringUtil::StringFormat( "skill_lvinfo_down%02d", i ).c_str() ) == 0 ) // 스킬 다운 { SkillDown(m_nScrollPos+i); ShowSelectBar(i); break; } } } } break; case KUI_MESSAGE::KICON_PRESSING: case KUI_MESSAGE::KICON_CLICK: { 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( "skill_icon%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( "skill_icon%02d", i ).c_str() ) == 0 ) // 선택 처리 { ShowSelectBar(i); RequestUseSkill(); break; } } } break; case KUI_MESSAGE::KGENWND_MOVE: // 윈도우 이동 { LimitMoveWnd(); // 게임 외부로 나가지 못하게 제한 m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SYSMENU, GetRect().left, GetRect().top ) ); // 좌측 메뉴도 이동 m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, GetBoundingRect().right, GetBoundingRect().bottom ) ); } break; case KUI_MESSAGE::KSCROLL_SELECT: // 스크롤 선택 { int nPos = int(lparam); nPos = max( nPos, 0 ); m_nScrollPos = nPos; RefreshSkillSlot(); } break; case KUI_MESSAGE::KGENWND_RESIZE: // 윈도우 리사이즈 { int nDelta = GetRect().GetHeight() - static_cast(wparam); KUIWnd * pOutfram = GetChild( "outframe" ); if( pOutfram ) { KRect rcChild = pOutfram->GetRect(); rcChild.bottom += nDelta; pOutfram->Resize( rcChild ); } KUIWnd * pInfram = GetChild( "inframe" ); if( pInfram ) { KRect rcChild = pInfram->GetRect(); rcChild.bottom += nDelta; pInfram->Resize( rcChild ); } ResizeScrollbar( static_cast(wparam) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, GetBoundingRect().right, GetBoundingRect().bottom ) ); } break; case KUI_MESSAGE::KFOCUS_ACTIVATED: { if( GetRect().IsInRect( static_cast(lparam), static_cast(wparam) ) ) { m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_FOCUS(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SYSMENU) ); } } break; /// 2010.12.21 - prodongi case KUI_MESSAGE::KCHECK_CHANGE: { if (_stricmp(lpszControlID, "button_skill_sort_all_01") == 0) { selectJobRankButton(JOP_ALL); } else if (_stricmp(lpszControlID, "button_skill_sort_basic_01") == 0) { selectJobRankButton(JOP_0); } else if (_stricmp(lpszControlID, "button_skill_sort_first_01") == 0) { selectJobRankButton(JOP_1); } else if (_stricmp(lpszControlID, "button_skill_sort_second_01") == 0) { selectJobRankButton(JOP_2); } else if (_stricmp(lpszControlID, "button_skill_sort_master_01") == 0) { selectJobRankButton(JOP_3); } /// 2011.03.28 - prodongi else if (_stricmp(lpszControlID, "button_skill_sort_trait_01") == 0) { selectJobRankButton(JOP_TP); } } break; } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUISkillWnd::Process(DWORD dwTime) { SUIWnd::Process(dwTime); DWORD elapsedtime = dwTime - m_lastTime; m_lastTime = dwTime; if (m_aniJobLevelUp.procedure(this, elapsedtime)) { SetJLvHistory(); } } void SUISkillWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch( pMsg->nType ) { case IMSG_UI_TAB_UPDATE: { SIMSG_UI_TAB_UPDATE* pSkillMsg = ( SIMSG_UI_TAB_UPDATE* )pMsg; setSelectedSheetTabItem(pSkillMsg->m_nTabType); m_nTabType = pSkillMsg->m_nTabType; SelectTab(); pMsg->bUse = true; } break; case IMSG_TOGGLE_UIWINDOW: case IMSG_SHOW_UIWINDOW: { if( m_nSysMenuPosX > -99 && m_nSysMenuPosY > -99 ) { MovePos(m_nSysMenuPosX, m_nSysMenuPosY); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_MOVE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, GetBoundingRect().right, GetBoundingRect().bottom ) ); } pMsg->bUse = true; } break; case MSG_EXP_UPDATE: // jp { SetJP(); SetJLvHistory(); pMsg->bUse = true; } break; case MSG_LEVEL_UPDATE: // 직업레벨 { // SetJLevel(); // SetJLvHistory(); pMsg->bUse = true; } break; case MSG_PROPERTY: { SMSG_PROPERTY* pPropertyMsg = (SMSG_PROPERTY*)pMsg; switch( pPropertyMsg->nPropertyType ) { case SMSG_PROPERTY::PROPERTY_JOB: // 직업아이디 if( ChangeJop() ) SetJName(); break; case SMSG_PROPERTY::PROPERTY_JOB_LEVEL: { SetJLevel(); /// 2010.12.20 - prodongi if (m_aniJobLevelUp.isState(sAniJobLevelUp::READY)) { m_aniJobLevelUp.setState(sAniJobLevelUp::BEGIN, GetRect()); m_aniJobLevelUp.setTopWndCaption(m_PlayerInfoMgr.GetPlayerInfo().GetJLv(), m_nChangeJob); } else if (m_aniJobLevelUp.isState(sAniJobLevelUp::BEGIN)) { } else { SetJLvHistory(); } } break; case SMSG_PROPERTY::PROPERTY_JP: { if( !IsShow() ) break; SetJP(); SPlayerInfo & info = m_PlayerInfoMgr.GetPlayerInfo(); SetCurJLevel( info.GetJLv(), info.GetJP() ); } break; case SMSG_PROPERTY::PROPERTY_JOB_0: case SMSG_PROPERTY::PROPERTY_JOB_1: case SMSG_PROPERTY::PROPERTY_JOB_2: case SMSG_PROPERTY::PROPERTY_JLV_0: case SMSG_PROPERTY::PROPERTY_JLV_1: case SMSG_PROPERTY::PROPERTY_JLV_2: // RefreshSkillSlot( m_nScrollPos ); break; } pMsg->bUse = true; } break; case IMSG_UI_MOVE: { SIMSG_UI_MOVE* pMoveMsg = ( SIMSG_UI_MOVE* )pMsg; m_nSysMenuPosX = pMoveMsg->m_nX; m_nSysMenuPosY = pMoveMsg->m_nY; pMsg->bUse = true; } break; case IMSG_UI_FOCUS: { m_pManager->SetFocus(this); pMsg->bUse = true; } break; case MSG_SKILLCARD_INFO: { if( !IsShow() ) break; RefreshSkillSlot(); pMsg->bUse = true; } break; case MSG_ADDED_SKILL_LIST: { RefreshAddedSkillList(); RefreshSkillSlot(); pMsg->bUse = true; } break; case MSG_SKILL_LIST: { SMSG_SKILL_LIST* pSkillList = (SMSG_SKILL_LIST*)pMsg; /// 2011.07.04 - prodongi if( pSkillList->isRefresh()) FreeSkillList(); UpdateSkillList(); RefreshScrollbar(); RefreshAddedSkillList(); RefreshSkillSlot(); pMsg->bUse = true; } break; case MSG_SKILL_EVENT: { SMSG_SKILL_EVENT* pSkillEvent = (SMSG_SKILL_EVENT*)pMsg; 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*/ ); } 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_SKILL_TIME_UPDATE: { SIMSG_UI_SKILL_TIME_UPDATE* pSkillMsg = ( SIMSG_UI_SKILL_TIME_UPDATE* )pMsg; if( m_PlayerInfoMgr.IsLocalPlayer(pSkillMsg->m_hTarget) ) { // 스킬 업데이트 // UpdateSkill( m_SkillSlotMgr.GetSkillSlot(pSkillMsg->m_nSkillID), true ); RefreshScrollbar(); RefreshSkillSlot(); } pMsg->bUse = true; } break; } } /////////////////////////////////////////////////////////// // 윈도우 /////////////////////////////////////////////////////////// void SUISkillWnd::CreateControls() { RECT rc; rc.left = 0; rc.top = c_nDelta; rc.right = 0; rc.bottom = c_nDelta; // 아이콘 int i; for( i = 0; i < c_nMaxLine-1; i++ ) { CopyControl( CStringUtil::StringFormat("skill_card_bg_%02d", i).c_str(), CStringUtil::StringFormat("skill_card_bg_%02d", i+1).c_str(), rc ); // 2010.12.21 - prodongi CopyControl( CStringUtil::StringFormat("skill_icon%02d", i).c_str(), CStringUtil::StringFormat("skill_icon%02d", i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_card%02d", i).c_str(), CStringUtil::StringFormat("skill_card%02d", i+1).c_str(), rc ); } KUIWnd* pWnd = NULL; for( i = 0; i < c_nMaxLine; i++ ) { pWnd = GetChild( CStringUtil::StringFormat( "skill_icon%02d", i ).c_str() ); if( pWnd ) (( KUIControlIconStatic*)pWnd)->SetCorrectionRect( KRect( 0, 0, 150, 0 ) ); } // 기타 컨트롤 for( i = 0; i < c_nMaxLine-1; i++ ) { CopyControl( CStringUtil::StringFormat("skill_card%02d_count" , i).c_str(), CStringUtil::StringFormat("skill_card%02d_count" , i+1).c_str(), rc ); // CopyControl( CStringUtil::StringFormat("skill_count%02d" , i).c_str(), CStringUtil::StringFormat("skill_count%02d" , i+1).c_str(), rc ); // CopyControl( CStringUtil::StringFormat("skill_lvinfo%02d" , i).c_str(), CStringUtil::StringFormat("skill_lvinfo%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_lvinfo_lv%02d" , i).c_str(), CStringUtil::StringFormat("skill_lvinfo_lv%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_lvinfo_lv%02d_value", i).c_str(), CStringUtil::StringFormat("skill_lvinfo_lv%02d_value", i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_lvinfo_up%02d" , i).c_str(), CStringUtil::StringFormat("skill_lvinfo_up%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_lvinfo_down%02d" , i).c_str(), CStringUtil::StringFormat("skill_lvinfo_down%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_name%02d" , i).c_str(), CStringUtil::StringFormat("skill_name%02d" , i+1).c_str(), rc ); /// 2010.12.16 - prodongi CopyControl( CStringUtil::StringFormat("skill_level_bg_%02d" , i).c_str(), CStringUtil::StringFormat("skill_level_bg_%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_info%02d" , i).c_str(), CStringUtil::StringFormat("skill_info%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("skill_info%02d_max" , i).c_str(), CStringUtil::StringFormat("skill_info%02d_max" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("static_use_mp%02d" , i).c_str(), CStringUtil::StringFormat("static_use_mp%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("static_use_mp_value%02d" , i).c_str(), CStringUtil::StringFormat("static_use_mp_value%02d" , i+1).c_str(), rc ); /// 2010.12.16 - prodongi CopyControl( CStringUtil::StringFormat("button_skill_use_%02d" , i).c_str(), CStringUtil::StringFormat("button_skill_use_%02d" , i+1).c_str(), rc ); CopyControl( CStringUtil::StringFormat("layout_dotline_%02d" , i).c_str(), CStringUtil::StringFormat("layout_dotline_%02d" , i+1).c_str(), rc ); } SetChildAsTop( "skill_icon_select" ); // 아이콘 선택바 처리 // m_pManager->CreateControl( KUIWND_CREATE_ARG( "static", "skill_icon_select", " ", KRect(0,0,48,48), 0, 0, this, "static_common_iconover", c_szDEF_SPR_NAME, m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) ); // 스킬 재사용 시간 컨트롤 for( i = 0; i < c_nMaxLine; i++ ) { KUIWnd* pIcon = GetChild( CStringUtil::StringFormat("skill_icon%02d", i).c_str() ); if( pIcon ) { KUIWnd* pWnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "clockbox", CStringUtil::StringFormat("skill_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 ); } } } //////////////////////////////////////////////// // 잡레벨 ///////////////////////////////////////////////// void SUISkillWnd::RequestJobLvUP() { SIMSG_UI_ACT_JOB_LEVELUP msg; msg.handle = m_PlayerInfoMgr.GetPlayerHandle(); m_pGameManager->ProcMsgAtStatic(&msg); } ///////////////////////////////////////////////// // 스킬사용 //////////////////////////////////////////////// void SUISkillWnd::RequestUseSkill() { if( m_nSelSkillPos < 0 ) return; if( CheckCurrentJobIndex() == false ) return; // 2010.12.20 패시브는 사용 못하는게 맞는 것 같음 - prodongi if (m_nTabType == TAB_PASSIVE) return ; RequestUseSkill(m_nSelSkillPos); } void SUISkillWnd::RequestUseSkill(char const* strID) /// 2010.12.20 - prodongi { if (!strID) return ; if( CheckCurrentJobIndex() == false ) return; // 2010.12.20 인덱스를 추출 - prodongi int index = atoi(strID); if (0 > index || c_nMaxLine <= index) return ; KUIControlVScroll* pScrollBar = dynamicCast(GetChild( "skill_scroll" )); if( NULL != pScrollBar ) index += (pScrollBar->GetPosition()+1); // 스크롤바 만큼 더해져야 한다 RequestUseSkill(index); } /// 2010.12.21 - prodongi void SUISkillWnd::RequestUseSkill(int index) { _oprint("void SUISkillWnd::RequestUseSkill(int index)\n"); // 2010.12.20 패시브는 사용 못하는게 맞는 것 같음 - prodongi if (m_nTabType == TAB_PASSIVE) return ; if( m_nTabType == TAB_ACTIVE ) { if( index-1 >= static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) return; SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][index-1]; if( !pSkill->IsCasting() && !pSkill->IsFire() ) m_pDisplayInfo->UseSkill( pSkill->GetSkillID(), pSkill->GetUseLevel() ); } else if( m_nTabType == TAB_PASSIVE ) { if( index-1 >= static_cast(m_vecPassiveSkillList[m_nSelectJopIndex].size()) ) return; SSkillSlot* pSkill = m_vecPassiveSkillList[m_nSelectJopIndex][index-1]; if( !pSkill->IsCasting() && !pSkill->IsFire() ) m_pDisplayInfo->UseSkill( pSkill->GetSkillID(), pSkill->GetUseLevel() ); } } void SUISkillWnd::ShowClockBox( int nSkillID, bool bDiable ) { if( !IsActiveTab() ) return; if( bDiable ) { for( int i = 0; i < m_nMaxLine; i++ ) { if( GetSkillID( m_nScrollPos+i ) == nSkillID ) { KUIWnd* pWnd = GetChild( CStringUtil::StringFormat("skill_clockbox%02d", i).c_str() ); if( pWnd && m_SkillSlotMgr.IsCastingSkill( nSkillID ) ) ((KUIControlClockBox*)pWnd)->Init(); return; } } return; } for( int i = 0; i < m_nMaxLine; i++ ) { if( GetSkillID( m_nScrollPos+i ) == nSkillID ) { KUIWnd* pWnd = GetChild( CStringUtil::StringFormat("skill_clockbox%02d", i).c_str() ); if( pWnd && m_SkillSlotMgr.IsFireSkill( nSkillID ) ) { ((KUIControlClockBox*)pWnd)->SetMaxTime( m_SkillSlotMgr.GetSkillMaxTime(nSkillID) ); ((KUIControlClockBox*)pWnd)->SetCurTime( m_SkillSlotMgr.GetSkillCurTime(nSkillID) ); ((KUIControlClockBox*)pWnd)->Begin(); } return; } } } //스킬 사용 취소 void SUISkillWnd::CancelSkill( int nSkillID ) { for( int i = 0; i < m_nMaxLine; i++ ) { if( GetSkillID( m_nScrollPos+i ) == nSkillID ) { KUIControlClockBox* pWnd = dynamicCast(GetChild( CStringUtil::StringFormat("skill_clockbox%02d", i).c_str() )); if( pWnd ) { pWnd->SetCurTime(0); pWnd->SetMaxTime(0); pWnd->Begin(); } return; } } } ///////////////////////////////////////////////// // 탭 //////////////////////////////////////////////// const bool SUISkillWnd::IsActiveTab() const { return ( m_nTabType == TAB_ACTIVE ); } void SUISkillWnd::SelectTab() { RefreshScrollbar(); RefreshSkillSlot(); } ///////////////////////////////////////////////// // 스크롤바 //////////////////////////////////////////////// void SUISkillWnd::RefreshScrollbar() { if( CheckCurrentJobIndex() == false ) return; int nCurCount(0); if( IsActiveTab() ) nCurCount = static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()); else nCurCount = static_cast(m_vecPassiveSkillList[m_nSelectJopIndex].size()); int nScrollRange = max(nCurCount - m_nMaxLine, 0); KUIControlVScroll* pScrollBar = dynamicCast(GetChild( "skill_scroll" )); if( NULL != pScrollBar ) { pScrollBar->SetMaxRange( DWORD(nScrollRange)+1 ); m_nScrollPos = pScrollBar->GetPosition(); pScrollBar->SetPosition( m_nScrollPos ); } } void SUISkillWnd::ResizeScrollbar( int nOldHegiht ) { KUIControlVScroll* pScrollBar = dynamicCast(GetChild( "skill_scroll" )); if( NULL != pScrollBar ) { KRect ktBottom; KRect ktTop; KUIWnd* pWnd; pWnd = GetChild( "skill_fund" ); if( pWnd != NULL ) ktBottom = pWnd->GetRect(); pWnd = GetChild( "tab_active_01" ); 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() - nOldHegiht; 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(); // 스킬 슬롯 } } ////////////////////////////////////////////////// // 직업 ///////////////////////////////////////////////// // 히스토리 void SUISkillWnd::SetJLvHistory() { SPlayerInfo & info = m_PlayerInfoMgr.GetPlayerInfo(); SetPrevJLevel( info.GetJLv() ); SetCurJLevel( info.GetJLv(), info.GetJP() ); SetNextJLevel( info.GetJLv() ); } void SUISkillWnd::SetPrevJLevel( int nLevel ) { /// 2010.12.13 - prodongi // sonador #2.1.10 스킬창 'JLv' 및 크리처 편성창 'K' 컨트롤 분리에 따른 클라이언트 수정 SetChildCaption( "joblv_prev_01", CStringUtil::StringFormat("<#707070>%d", nLevel).c_str() ); if( GetExpDB().GetNeedJp(nLevel-1, m_nChangeJob) <= 0 ) { SetChildShow( "jp_prev_01", false ); } else { SetChildShow( "jp_prev_01", true ); std::string strPrevJp; jpToString( GetExpDB().GetNeedJp(nLevel-1, m_nChangeJob), strPrevJp ); SetChildCaption( "jp_prev_01", CStringUtil::StringFormat( "<#707070>%s", strPrevJp.c_str() ).c_str() ); } } /// 2011.04.29 int->__int64 - prodongi void SUISkillWnd::SetCurJLevel( int nLevel, __int64 nJP ) { SetChildShow( "skill_curfont", true ); SetChildShow( "skill_curjlv_master", false ); // sonador #2.1.10 스킬창 'JLv' 및 크리처 편성창 'K' 컨트롤 분리에 따른 클라이언트 수정 SetChildShow( "skill_curjlv_ui", true ); /// 2010.12.13 - prodongi SetChildShow( "joblv_curjlv_01", true ); SetChildShow( "jp_curjlv_01", true ); SetChildShow( "skill_historyselect02", false ); SetChildShow( "skill_selfont", false ); SetChildShow( "skill_seljlv", false ); SetChildShow( "skill_seljp", false ); bool bEnable = false; if( nJP >= GetExpDB().GetNeedJp(nLevel, m_nChangeJob) ) bEnable = ShowCurJLevel( "skill_sel", nLevel ); else bEnable = ShowCurJLevel( "skill_cur", nLevel ); std::string strCurJp; jpToString( GetExpDB().GetNeedJp(nLevel, m_nChangeJob), strCurJp ); if( bEnable ) { SetChildShow( "static_jp_viewbox", true ); /// 2010.12.13 - prodongi SetChildCaption( "jp_curjlv_01", CStringUtil::StringFormat("<#00a99d>%s", strCurJp.c_str()).c_str() ); } else { SetChildShow( "static_jp_viewbox", false ); /// 2010.12.13 - prodongi SetChildCaption( "jp_curjlv_01", CStringUtil::StringFormat("<#ffffff>%s", strCurJp.c_str()).c_str() ); } KUIControlSimpleButton* pButton = dynamicCast(GetChild( c_szButtonJLVUp )); if( pButton ) { if( bEnable ) pButton->Enable(); else pButton->Disable(); } } bool SUISkillWnd::ShowCurJLevel( std::string str, int nLevel ) { // sonador #2.1.10 스킬창 'JLv' 및 크리처 편성창 'K' 컨트롤 분리에 따른 클라이언트 수정 SetChildShow( "skill_curjlv_master", false ); SetChildShow( "skill_curjlv_ui", true ); /// 2010.12.13 - prodongi SetChildShow( "joblv_curjlv_01", true ); bool bEnable = false; __int64 nNeedJP = GetExpDB().GetNeedJp(nLevel, m_nChangeJob); if( m_PlayerInfoMgr.GetPlayerInfo().GetJP() >= nNeedJP && nNeedJP > 0 ) bEnable = true; if( GetExpDB().GetNeedJp(nLevel, m_nChangeJob) > 0 ) { // sonador #2.1.10 스킬창 'JLv' 및 크리처 편성창 'K' 컨트롤 분리에 따른 클라이언트 수정 /// 2010.12.13 - prodongi if( bEnable ) { SetChildCaption( "joblv_curjlv_01", CStringUtil::StringFormat("<#fc4b00>%d", nLevel+1).c_str() ); } else { SetChildCaption( "joblv_curjlv_01", CStringUtil::StringFormat("<#ffffff>%d", nLevel+1).c_str() ); } SetChildShow( "jp_curjlv_01", true ); } else { // sonador #2.1.10 스킬창 'JLv' 및 크리처 편성창 'K' 컨트롤 분리에 따른 클라이언트 수정 SetChildShow( "skill_curjlv_master", true ); SetChildShow( "skill_curjlv_ui", false ); /// 2010.12.13 - prodongi SetChildShow( "joblv_curjlv_01", false ); SetChildShow( "jp_curjlv_01", false ); } //뭐지? if( ::_stricmp(str.c_str(), "skill_sel") == 0 ) { SetChildShow( "skill_historyselect02", true ); SetChildShow ( CStringUtil::StringFormat("%sfont", str.c_str()).c_str(), true ); SetChildShow ( CStringUtil::StringFormat("%sjlv", str.c_str()).c_str(), true ); SetChildCaption( CStringUtil::StringFormat("%sjlv", str.c_str()).c_str(), CStringUtil::StringFormat("%d",nLevel+1).c_str() ); } SetChildShow ( CStringUtil::StringFormat("%sjp", str.c_str()).c_str(), true ); SetChildCaption( CStringUtil::StringFormat("%sjp", str.c_str()).c_str(), CStringUtil::StringFormat("%I64d",GetExpDB().GetNeedJp(nLevel, m_nChangeJob)).c_str() ); return bEnable; } void SUISkillWnd::SetNextJLevel( int nLevel ) { // #2.1.10 /// 2010.12.13 - prodongi SetChildCaption( "joblv_next_01", CStringUtil::StringFormat("<#707070>%d", nLevel+2).c_str() ); // #2.1.10 SetChildShow( "skill_nextjlv_master", false ); if( GetExpDB().GetNeedJp(nLevel+1, m_nChangeJob) <= 0 ) { if( GetExpDB().GetNeedJp(nLevel, m_nChangeJob) > 0 ) { SetChildShow( "skill_nextjlv_master", true ); } SetChildShow( "skill_nextjlv_ui", false ); /// 2010.12.13 - prodongi SetChildShow( "joblv_next_01", false ); SetChildShow( "jp_next_01", false ); } else { SetChildShow( "skill_nextjlv_ui", true ); /// 2010.12.13 - prodongi SetChildShow( "joblv_next_01", true ); SetChildShow( "jp_next_01", true ); std::string strNextJp; jpToString( GetExpDB().GetNeedJp(nLevel+1, m_nChangeJob), strNextJp ); SetChildCaption( "jp_next_01", CStringUtil::StringFormat("<#707070>%s", strNextJp.c_str()).c_str() ); } } void SUISkillWnd::SetJName() { SPlayerInfo & Info = m_PlayerInfoMgr.GetPlayerInfo(); JobInfo * pJobInfo = GetJobDB().GetJobData( Info.GetJobID() ); if( pJobInfo ) { // 잡 아이콘 KUIControlIconStatic* pJobIcon = dynamicCast(GetChild( "icon_job" )); if( pJobIcon ) { pJobIcon->SetIcon( c_szDEF_SPR_NAME, GetJobDB().GetJobIconName(Info.GetJobID()) ); pJobIcon->SetTooltip(NULL); } m_nChangeJob = pJobInfo->job_depth; SetChildCaption( "static_job_name", CStringUtil::StringFormat("%s", Info.GetJobName()).c_str() ); } } void SUISkillWnd::SetJLevel() { SetJName(); SPlayerInfo & info = m_PlayerInfoMgr.GetPlayerInfo(); SetChildCaption( "static_joblv_value", CStringUtil::StringFormat("%d", info.GetJLv()).c_str() ); } void SUISkillWnd::SetJP() { SPlayerInfo & info = m_PlayerInfoMgr.GetPlayerInfo(); /// 2011.04.28 정리 - prodongi std::string strJp; jpToString(info.GetJP(), strJp); /* // K 처리 std::string strJP; int nJP = info.GetJP(); if( nJP > c_nJPKLimit ) { nJP = info.GetJP() / 1000; strJP = CStringUtil::StringFormat( "%dK", nJP ); } else { strJP = CStringUtil::StringFormat( "%d", nJP ); } */ SetChildCaption( "static_jp_value", strJp.c_str() ); } ////////////////////////////////////////////////// // 리스트 ///////////////////////////////////////////////// void SUISkillWnd::FreeSkillList() { for( int i(0); i & vecSkillList = m_SkillSlotMgr.GetSkillList(); std::vector::const_iterator it = vecSkillList.begin(); while( it != vecSkillList.end() ) { SSkillSlot* pSlot = (*it); AddSkillList( pSlot ); it++; } } void SUISkillWnd::RefreshAddedSkillList() { const std::vector & vecSkillList = m_SkillSlotMgr.GetSkillList(); const std::vector & vecAddedSkillList = m_SkillSlotMgr.GetAddedSkillList(); std::vector::const_iterator it = vecSkillList.begin(); while( it != vecSkillList.end() ) { SSkillSlot* pSlot = (*it); int lv = 0; std::vector::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 SUISkillWnd::AddSkillList( SSkillSlot* pSlot ) { if( !pSlot ) return; SkillBaseEx* s_data = GetSkillDB().GetSkillData( pSlot->GetSkillID() ); if( !s_data || s_data->IsSystemSkill() ) return; SPlayerInfo& pPlayerInfo = m_PlayerInfoMgr.GetPlayerInfo(); int nJobRank = m_nJopRank+1; for( int i(0); i < nJobRank; ++i ) { if( iGetSkillID(), pPlayerInfo.GetOldJobID(i) ) ) continue; } else { if( !IsExistSkill( pSlot->GetSkillID(), pPlayerInfo.GetJobID() ) ) continue; } if( i < JOP_CNT ) { /// 2011.03.28 특성 포인트는 필요 잡 포인트가 마이너스 이다 - prodongi if (0 > s_data->GetNeedJopPoint(pSlot->GetCurLevel())) { addSkillList(s_data->IsPassive(), pSlot, JOP_TP); } /* if( !s_data->IsPassive() ) m_vecActiveSkillList[i].push_back( pSlot ); else m_vecPassiveSkillList[i].push_back( pSlot ); */ addSkillList(s_data->IsPassive(), pSlot, i); } } /* if( !s_data->IsPassive() ) m_vecActiveSkillList[JOP_ALL].push_back( pSlot ); else m_vecPassiveSkillList[JOP_ALL].push_back( pSlot ); */ addSkillList(s_data->IsPassive(), pSlot, JOP_ALL); } bool SUISkillWnd::IsExistSkill( int nSkillID, int nJopID ) { if( nJopID == -1 ) return false; const JobInfoEx* pJobDB = GetJobDB().GetJobData( nJopID ); if( pJobDB == NULL ) { return false; } const std::vector< SkillTreeEx >* pSkillTreeList = GetSkillTreeDB().GetSkillTreeData( pJobDB->skill_tree_id ); if( pSkillTreeList == NULL ) return false; std::vector::const_iterator it = pSkillTreeList->begin(); while( it != pSkillTreeList->end() ) { const SkillTreeEx* pTree = &(*it); if( pTree->skill_id == nSkillID ) return true; it++; } return false; } //SMSG_PROPERTY::PROPERTY_JOB: bool SUISkillWnd::ChangeJop() { int nJopRank( GetUserJopRank() ); if( m_nJopRank == nJopRank ) return false; m_nJopRank = GetUserJopRank(); bool bRank_1(m_nJopRank>=JOP_1), bRank_2(m_nJopRank>=JOP_2); // 2011.11.29 - servantes : 옵션 nui에 해당 컨트롤 없음 / 주석처리 //SetControlEnable("common_radiobutton02", bRank_1); //SetControlEnable("static_view_01", bRank_1); //SetControlEnable("common_radiobutton03", bRank_2); //SetControlEnable("static_view_02", bRank_2); return true; } void SUISkillWnd::SetControlEnable( const char * pControlName, bool bEnable ) { KUIControl * pControl = dynamicCast(GetChild(pControlName)); if( !pControl ) return; if( bEnable ) pControl->Enable(); else pControl->Disable(); } void SUISkillWnd::SetControlEnableColor( const char * pControlName, const char* lpColor, bool bEnable ) { KUIControl * pControl = dynamicCast(GetChild(pControlName)); if( !pControl ) return; if( bEnable ) pControl->SetEnableColor(lpColor); else pControl->SetDisableColor(lpColor); } int SUISkillWnd::GetUserJopRank() { JobInfo* pJobInfo = GetJobDB().GetJobData( m_PlayerInfoMgr.GetJobID() ); if( pJobInfo ) return (int)(pJobInfo->job_depth); else return -1; } ////////////////////////////////////////////////// // 슬롯 ///////////////////////////////////////////////// void SUISkillWnd::RefreshSkillSlot() { // by Testors if( !IsShow() ) return; HideSelectBar(); if( IsActiveTab() ) RefreshActiveSkillSlot(); else RefreshPassiveSkillSlot(); } void SUISkillWnd::RefreshActiveSkillSlot() { if( CheckCurrentJobIndex() == false ) return; int nListSize( static_cast(m_vecActiveSkillList[ m_nSelectJopIndex ].size()) ); if( m_nScrollPos >= nListSize ) m_nScrollPos = 0; for( int i = 0; i < c_nMaxLine; i++ ) { if( i >= m_nMaxLine ) { DisableSlot(i); continue; } if( i+m_nScrollPos < nListSize ) { SSkillSlot* pSkill = m_vecActiveSkillList[ m_nSelectJopIndex ][i+m_nScrollPos]; EnableSlot(i, true, TAB_ACTIVE, pSkill->GetSkillID() ); SetSkillData( pSkill, i, true ); } else EnableSlot(i, false, TAB_ACTIVE ); } } void SUISkillWnd::RefreshPassiveSkillSlot() { if( CheckCurrentJobIndex() == false ) return; int nListSize( static_cast(m_vecPassiveSkillList[ m_nSelectJopIndex ].size()) ); if( m_nScrollPos >= nListSize ) m_nScrollPos = 0; for( int i = 0; i < c_nMaxLine; i++ ) { if( i >= m_nMaxLine ) { DisableSlot(i); continue; } if( i+m_nScrollPos < nListSize) { SSkillSlot* pSkill = m_vecPassiveSkillList[ m_nSelectJopIndex ][i+m_nScrollPos]; EnableSlot(i, true, TAB_PASSIVE, pSkill->GetSkillID() ); SetSkillData( pSkill, i, true ); } else EnableSlot(i, false, TAB_PASSIVE ); } } void SUISkillWnd::EnableSlot( int nMode, bool bShow, bool bPassive, int nSkillID ) { KUIControlIconStatic* pIcon = NULL; KUIControlClockBox* pClock = NULL; //// 스킬 아이콘 기본 if( bShow == false ) { pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_icon%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); // 스킬 아이콘은 항상 보여야 한다 } pIcon = NULL; // 카드 슬롯 기본 pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_card%02d", nMode ).c_str() )); if( pIcon ) { /// 2010.12.16 - prodongi pIcon->SetIcon( c_szDEF_SPR_NAME, "common_panel_titanium_slot_skill_card" ); pIcon->SetTooltip(); pIcon->SetShow(true); } } pIcon = NULL; // 스킬 쿨링 타임 검사 pClock = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_clockbox%02d", nMode ).c_str() )); if( pClock ) { if( nSkillID != -1 && m_SkillSlotMgr.IsCastingSkill( nSkillID ) ) pClock->Init(); else if( nSkillID != -1 && m_SkillSlotMgr.IsFireSkill( nSkillID ) ) { pClock->SetMaxTime( m_SkillSlotMgr.GetSkillMaxTime(nSkillID) ); pClock->SetCurTime( m_SkillSlotMgr.GetSkillCurTime(nSkillID) ); pClock->Begin(); } else { pClock->SetCurTime(0); pClock->SetMaxTime(0); pClock->Begin(); } pClock->SetShow(bShow); } // SetChildShow( CStringUtil::StringFormat( "skill_count%02d" , nMode ).c_str(), false ); // SetChildShow( CStringUtil::StringFormat( "skill_lvinfo%02d" , nMode ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_lv%02d", nMode ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", nMode ).c_str(), bShow ); if( bShow ) bPassive = !bPassive; else bPassive = false; SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_up%02d" , nMode ).c_str(), bPassive ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_down%02d" , nMode ).c_str(), bPassive ); SetChildShow( CStringUtil::StringFormat( "skill_card%02d_count" , nMode ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_card_bg_%02d" , nMode ).c_str(), bShow ); /// 2010.12.21 - prodongi SetChildShow( CStringUtil::StringFormat( "skill_card%02d" , nMode ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_name%02d" , nMode ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_info%02d" , nMode ).c_str(), bPassive ); SetChildShow( CStringUtil::StringFormat( "skill_info%02d_max" , nMode ).c_str(), bPassive ); SetChildShow( CStringUtil::StringFormat("static_use_mp%02d" , nMode ).c_str(), bPassive ); SetChildShow( CStringUtil::StringFormat("static_use_mp_value%02d", nMode ).c_str(), bPassive ); /// 2010.12.17 - prodongi SetChildShow( CStringUtil::StringFormat("skill_level_bg_%02d", nMode ).c_str(), bPassive ); KUIControlSimpleButton* useButton = dynamicCast(GetChild( CStringUtil::StringFormat("button_skill_use_%02d", nMode ).c_str())); if( useButton ) { useButton->SetShow(bShow); if( bPassive ) useButton->Enable(); else useButton->Disable(); } } void SUISkillWnd::DisableSlot( int nIndex ) { SetChildShow( CStringUtil::StringFormat( "skill_card%02d_count", nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_icon%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_card_bg_%02d" , nIndex ).c_str(), false ); /// 2010.12.21 - prodongi SetChildShow( CStringUtil::StringFormat( "skill_card%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_clockbox%02d" , nIndex ).c_str(), false ); // SetChildShow( CStringUtil::StringFormat( "skill_count%02d" , nIndex ).c_str(), false ); // SetChildShow( CStringUtil::StringFormat( "skill_lvinfo%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_lv%02d", nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_up%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_down%02d", nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_name%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_info%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_info%02d_max" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat("static_use_mp%02d" , nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat("static_use_mp_value%02d", nIndex ).c_str(), false ); /// 2010.12.17 - prodongi SetChildShow( CStringUtil::StringFormat("skill_level_bg_%02d", nIndex ).c_str(), false ); SetChildShow( CStringUtil::StringFormat("button_skill_use_%02d", nIndex ).c_str(), false ); } // 모두 비활성화, 초기 로드할때만 해주면 된다.. void SUISkillWnd::DisableAllSlot( bool bShow ) { KUIWnd* pWnd = NULL; KUIControlIconStatic* pIcon = NULL; KUIControlClockBox* pClock = NULL; for( int i = 0; i < c_nMaxLine; i++ ) { //pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_icon%02d", i ).c_str() )); //if( pIcon ) //{ // pIcon->SetIcon( 0, "itembackground" ); // pIcon->SetTooltip(); // if( i < m_nMaxLine ) pIcon->SetShow(true); // else pIcon->SetShow(false); //} //pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_card%02d", i ).c_str() )); //if( pIcon ) //{ // pIcon->SetIcon( 0, "skillcardsocket" ); // pIcon->SetTooltip(); // if( i < m_nMaxLine ) pIcon->SetShow(true); // else pIcon->SetShow(false); //} //// 스킬 쿨링 타임 //pClock = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_clockbox%02d", i ).c_str() )); //if( pClock ) //{ // pClock->SetCurTime(0); // pClock->SetMaxTime(0); // pClock->Begin(); //} SetChildShow( CStringUtil::StringFormat( "skill_icon%02d" , i ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_card_bg_%02d" , i ).c_str(), false ); /// 2010.12.21 - prodongi SetChildShow( CStringUtil::StringFormat( "skill_card%02d" , i ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_card%02d_count", i ).c_str(), false ); SetChildShow( CStringUtil::StringFormat( "skill_clockbox%02d" , i ).c_str(), false ); // SetChildShow( CStringUtil::StringFormat( "skill_count%02d" , i ).c_str(), bShow ); // SetChildShow( CStringUtil::StringFormat( "skill_lvinfo%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_lv%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_up%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_lvinfo_down%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_name%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_info%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat( "skill_info%02d_max" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat("static_use_mp%02d" , i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat("static_use_mp_value%02d", i ).c_str(), bShow ); /// 2010.12.17 - prodongi SetChildShow( CStringUtil::StringFormat("skill_level_bg_%02d", i ).c_str(), bShow ); SetChildShow( CStringUtil::StringFormat("button_skill_use_%02d", i ).c_str(), bShow ); } } void SUISkillWnd::SetSkillData( SSkillSlot* pSkill, int nIndex, bool bShow ) { KUIWnd* pWnd = NULL; KUIControlStatic* pStatic = NULL; // KUIControlNumber* pNumber = NULL; SkillBaseEx* s_data = GetSkillDB().GetSkillData( pSkill->GetSkillID() ); if( s_data == NULL ) return; // 스킬 아이콘 KUIControlIconStatic* pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_icon%02d", nIndex ).c_str() )); if( pIcon && bShow ) { pIcon->SetIcon( c_szDEF_SPR_NAME, s_data->GetIconName() ); // sonador 1.2.5 Lazy Tooltip 구현 pIcon->SetLazyTooltip( new KLazySkillTooltip( *m_pDisplayInfo, pSkill->GetSkillID(), pSkill->GetUseLevel(), true ) ); // sonador #2.1.2.4.3 팻 조작 UI 연동 pIcon->SetShow( bShow ); } KUIControlIconStatic* pCardIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_card%02d", nIndex ).c_str() )); // 카드 슬롯 아이콘 if( IsActiveTab() ) { if( pSkill->GetSkillCard() ) // 장착되어 있다면 { if( pCardIcon && bShow ) { SInventorySlot* pSlot = m_InventoryMgr.GetItemInfo( pSkill->GetSkillCard() ); if( pSlot ) { /// 2010.12.16 - prodongi pCardIcon->SetAbleReSizeRes(false); pCardIcon->SetIcon( c_szDEF_SPR_NAME, "static_common_skillcardicon" ); pCardIcon->SetLazyTooltip( new KLazyItemTooltip( *m_pDisplayInfo, pSlot, true ) ); pCardIcon->SetShow( bShow ); // 카운트 SetChildShow ( CStringUtil::StringFormat( "skill_card%02d_count", nIndex ).c_str(), pSlot->GetEnhance() ); SetChildCaption( CStringUtil::StringFormat( "skill_card%02d_count", nIndex ).c_str(), CStringUtil::StringFormat( "<#ffc104>+%d", pSlot->GetEnhance() ).c_str() ); } } } else { if( pCardIcon ) { /// 2010.12.16 - prodongi pCardIcon->SetIcon( c_szDEF_SPR_NAME, "common_panel_titanium_slot_skill_card" ); pCardIcon->SetTooltip(); } SetChildShow( CStringUtil::StringFormat( "skill_card%02d_count", nIndex ).c_str(), false ); } } else { //패시브 스킬은 스킬카드가 없다. if( pCardIcon ) pCardIcon->SetShow( false ); SetChildShow( CStringUtil::StringFormat( "skill_card%02d_count", nIndex ).c_str(), false ); } // 스킬 레벨 if (pSkill->GetAddedLevel()) SetChildCaption( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d", S(6425), pSkill->GetUseLevel() ).c_str() ); else SetChildCaption( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), pSkill->GetUseLevel() ).c_str() ); // 스킬 이름 SetChildCaption( CStringUtil::StringFormat( "skill_name%02d", nIndex ).c_str(), CStringUtil::StringFormat( "%s", GetStringDB().GetString( s_data->GetNameID() ) ).c_str() ); #ifndef NDEBUG _oprint( "Skill name: %s\n", GetStringDB().GetString(s_data->GetNameID()) ); #endif // 스킬 설명 if (pSkill->GetAddedLevel()) { SetChildCaption( CStringUtil::StringFormat( "skill_info%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d /" , S(6425), pSkill->GetUseLevel() ).c_str() ); SetChildCaption( CStringUtil::StringFormat( "skill_info%02d_max", nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel()).c_str() ); } else { SetChildCaption( CStringUtil::StringFormat( "skill_info%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s%d /" , S(6425), pSkill->GetUseLevel() ).c_str() ); SetChildCaption( CStringUtil::StringFormat( "skill_info%02d_max", nIndex ).c_str(), CStringUtil::StringFormat( "%s<#e7fd2e>%d", S(6425), pSkill->GetSkill().base_skill_level).c_str() ); } //소모 MP SetChildCaption( CStringUtil::StringFormat( "static_use_mp_value%02d", nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), s_data->GetCostMP(pSkill->GetUseLevel()) ).c_str() ); } ////////////////////////////////////////////////// // 스킬업/다운 ///////////////////////////////////////////////// void SUISkillWnd::_setSkillLevel( int nIndex, int nLevel, SSkillSlot* pSkill ) { if( pSkill ) { // 정보 갱신해 준다 if (pSkill->GetAddedLevel()) { SetChildCaption( CStringUtil::StringFormat( "skill_info%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d /" , S(6425), nLevel ).c_str() ); SetChildCaption( CStringUtil::StringFormat( "skill_info%02d_max", nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d", S(6425), pSkill->GetSkill().base_skill_level + pSkill->GetAddedLevel() ).c_str() ); } else { SetChildCaption( CStringUtil::StringFormat( "skill_info%02d" , nIndex ).c_str(), CStringUtil::StringFormat( "%s%d /" , S(6425), nLevel ).c_str() ); SetChildCaption( CStringUtil::StringFormat( "skill_info%02d_max", nIndex ).c_str(), CStringUtil::StringFormat( "%s<#e7fd2e>%d", S(6425), pSkill->GetSkill().base_skill_level ).c_str() ); } // 툴팁 정보 갱신해 준다 KUIControlIconStatic* pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_icon%02d", nIndex ).c_str() )); if( pIcon ) { // sonador 1.2.5 Lazy Tooltip 구현 pIcon->SetLazyTooltip( new KLazySkillTooltip( *m_pDisplayInfo, pSkill->GetSkillID(), pSkill->GetUseLevel(), true ) ); // sonador #2.1.2.4.3 팻 조작 UI 연동 } pIcon = dynamicCast(GetChild( CStringUtil::StringFormat( "skill_card%02d", nIndex ).c_str() )); if( pIcon ) { // sonador 1.2.5 Lazy Tooltip 구현 pIcon->SetLazyTooltip( new KLazySkillTooltip( *m_pDisplayInfo, pSkill->GetSkillID(), pSkill->GetUseLevel(), true ) ); // sonador #2.1.2.4.3 팻 조작 UI 연동 } if (pSkill->GetAddedLevel()) SetChildCaption( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", nIndex ).c_str(), CStringUtil::StringFormat( "%s<#ff9900>%d", S(6425), nLevel ).c_str() ); else SetChildCaption( CStringUtil::StringFormat( "skill_lvinfo_lv%02d_value", nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), nLevel ).c_str() ); SkillBaseEx* s_data = GetSkillDB().GetSkillData( pSkill->GetSkillID() ); if( s_data == NULL ) return; //소모 MP SetChildCaption( CStringUtil::StringFormat( "static_use_mp_value%02d", nIndex ).c_str(), CStringUtil::StringFormat( "%s%d", S(6425), s_data->GetCostMP(pSkill->GetUseLevel()) ).c_str() ); } } void SUISkillWnd::SkillUp( int nIndex ) { if( CheckCurrentJobIndex() == false ) return; if( nIndex < 0 ) return; if( nIndex >= static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) return; SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][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-m_nScrollPos, nLevel, pSkill ); } } void SUISkillWnd::SkillDown( int nIndex ) { if( CheckCurrentJobIndex() == false ) return; if( nIndex < 0 ) return; if( nIndex >= static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) return; SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][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-m_nScrollPos, nLevel, pSkill ); } } ////////////////////////////////////////////////// // 선택바 ////////////////////////////////////////////////// // void SUISkillWnd::ShowSelectBar( int nIndex ) { HideSelectBar(); m_nSelSkillPos = nIndex; KUIControlVScroll* pScrollBar = dynamicCast(GetChild( "skill_scroll" )); if( NULL != pScrollBar ) m_nSelSkillPos += (pScrollBar->GetPosition()+1); // 스크롤바 만큼 더해져야 한다 bool bActive = false; if( IsActiveTab() ) bActive = true; if( CheckCurrentJobIndex() == false ) return; if( m_nTabType == TAB_ACTIVE && m_vecActiveSkillList[m_nSelectJopIndex].size() <= m_nSelSkillPos-1 ) return; else if( m_nTabType == TAB_PASSIVE && m_vecPassiveSkillList[m_nSelectJopIndex].size() <= m_nSelSkillPos-1 ) return; // 아이콘 선택 보이기 KUIWnd* pIcon = GetChild( CStringUtil::StringFormat( "skill_icon%02d", nIndex ).c_str() ); if( pIcon ) { SetMovePos( "skill_icon_select", pIcon->GetRect().left/*-c_nIconSelectDelta*/, pIcon->GetRect().top/*-c_nIconSelectDelta*/ ); SetChildShow( "skill_icon_select", true ); } } void SUISkillWnd::HideSelectBar() { m_nSelSkillPos = -1; // 아이콘 선택 감추기 SetChildShow( "skill_icon_select", false ); } /////////////////////////////////////////////// // 드래그앤드랍 ////////////////////////////////////////////// const int SUISkillWnd::GetUseLevel( int nSkillID ) const { if( CheckCurrentJobIndex() == false ) return -1; SKILL_VECTOR::const_iterator it; if( IsActiveTab() ) { it = m_vecActiveSkillList[m_nSelectJopIndex].begin(); while( it != m_vecActiveSkillList[m_nSelectJopIndex].end() ) { SSkillSlot* pSkill = (*it); if( pSkill->GetSkillID() == nSkillID ) return pSkill->GetUseLevel(); it++; } } else { it = m_vecPassiveSkillList[m_nSelectJopIndex].begin(); while( it != m_vecPassiveSkillList[m_nSelectJopIndex].end() ) { SSkillSlot* pSkill = (*it); if( pSkill->GetSkillID() == nSkillID ) return pSkill->GetUseLevel(); it++; } } return -1; } const int SUISkillWnd::GetSkillIDByCtrlName( const char* szCtrlName ) const { if( IsActiveTab() ) return GetActiveSkillID(szCtrlName); else return GetPassiveSkillID(szCtrlName); return -1; } const int SUISkillWnd::GetActiveSkillID( const char* szSprName ) const { if( CheckCurrentJobIndex() == false ) return -1; for( int i = 0; i < m_nMaxLine; i++ ) { if( ::_stricmp( szSprName, CStringUtil::StringFormat( "skill_icon%02d", i ).c_str() ) == 0 ) { if( i+m_nScrollPos < static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) { SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][i+m_nScrollPos]; return pSkill->GetSkillID(); } } } return -1; } const int SUISkillWnd::GetPassiveSkillID( const char* szSprName ) const { if( CheckCurrentJobIndex() == false ) return -1; for( int i = 0; i < m_nMaxLine; i++ ) { if( ::_stricmp( szSprName, CStringUtil::StringFormat( "skill_icon%02d", i ).c_str() ) == 0 ) { if( i+m_nScrollPos < static_cast(m_vecPassiveSkillList[m_nSelectJopIndex].size()) ) { SSkillSlot* pSkill = m_vecPassiveSkillList[m_nSelectJopIndex][i+m_nScrollPos]; return pSkill->GetSkillID(); } } } return -1; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // 카드 장착 const int SUISkillWnd::GetCardSlotIndex( const char* szControl, bool bSend ) const { if( CheckCurrentJobIndex() == false ) return -1; // 해당 슬롯에 카드가 있는지 검사해서 없으면 -1 for( int i = 0; i < m_nMaxLine; i++ ) { if( ::_stricmp( szControl, CStringUtil::StringFormat( "skill_card%02d" , i ).c_str() ) == 0 ) { if( i+m_nScrollPos < static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) { SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][i+m_nScrollPos]; if( !bSend || (bSend && pSkill->GetSkillCard()) ) return (m_nScrollPos + i); } } } return -1; } void SUISkillWnd::RequestEquipCard( int nIndex, AR_HANDLE hItem ) { SIMSG_UI_ACT_INVENTORY invMsg; invMsg.m_nActType = SIMSG_UI_ACT_INVENTORY::ACT_SKILLCARD_BIND; invMsg.m_nHandle = hItem; invMsg.m_TargetHandle = m_PlayerInfoMgr.GetPlayerHandle(); m_pGameManager->ProcMsgAtStatic( &invMsg ); } const bool SUISkillWnd::IsSkillCard( int nIndex, AR_HANDLE hItem ) const { SInventorySlot* pSlot = m_InventoryMgr.GetItemInfo( hItem ); if( pSlot == NULL ) return false; // 장착중이 아니고, 카드일때가 아니면 리턴 if( GetItemDB().GetUseType(pSlot->GetItemCode()) != ItemBase::TYPE_CARD || GetItemDB().IsJoin(pSlot->GetItemCode(), IsInstanceUnstackable(pSlot)) || pSlot->IsEquipItem() ) return false; return true; } const AR_HANDLE SUISkillWnd::GetSkillCardItem( int nIndex ) const { if( CheckCurrentJobIndex() == false ) return 0; if( nIndex < static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) { SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][nIndex]; return pSkill->GetSkillCard(); } return NULL; } bool SUISkillWnd::IsExistSkill( int nSkillID, bool bActive ) { if( CheckCurrentJobIndex() == false ) return false; SKILL_VECTOR::iterator it; if( bActive ) { it = m_vecActiveSkillList[m_nSelectJopIndex].begin(); while( it != m_vecActiveSkillList[m_nSelectJopIndex].end() ) { if( (*it)->GetSkillID() == nSkillID ) return true; it++; } } else { it = m_vecPassiveSkillList[m_nSelectJopIndex].begin(); while( it != m_vecPassiveSkillList[m_nSelectJopIndex].end() ) { if( (*it)->GetSkillID() == nSkillID ) return true; it++; } } return false; } int SUISkillWnd::GetSkillID( int nIndex ) { if( CheckCurrentJobIndex() == false ) return -1; if( nIndex < 0 ) return -1; if( nIndex >= static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) return -1; SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][nIndex]; return pSkill->GetSkillID(); } int SUISkillWnd::GetSkillLevel( int nIndex ) { if( CheckCurrentJobIndex() == false ) return -1; if( nIndex < 0 ) return -1; if( nIndex >= static_cast(m_vecActiveSkillList[m_nSelectJopIndex].size()) ) return -1; SSkillSlot* pSkill = m_vecActiveSkillList[m_nSelectJopIndex][nIndex]; return pSkill->GetUseLevel(); } /// 2010.12.15 - prodongi void SUISkillWnd::toggleSkillTreeFundWnd() { bool show = (m_pGameManager->IsUIWindowOpened(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND)) ? false : true; m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, show) ); } /// 2010.12.16 - prodongi void SUISkillWnd::selectTabButton(int type) { m_pGameManager->StartSound( "ui_button_click.wav" ); m_nTabType = type; SelectTab(); // m_nTabType, RefreshScrollBar, RefreshSlot m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_TAB_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, m_nTabType ) ); /// 2010.12.21 - prodongi SetChildAniName("tab_select_cyan_01", (m_nTabType == TAB_ACTIVE) ? "common_select_titanium_cyan" : "common_select_titanium_brown"); /// 2010.12.22 - prodongi reorderSelectTabLayer(type); } /// 2010.12.17 - prodongi void SUISkillWnd::setSelectedSheetTabItem(int type) { KUITabControlSheet* tabSheet = dynamicCast(GetChild("tab_skill_01")); if (tabSheet) tabSheet->SetSelectHead((DWORD)type); /// 2010.12.22 - prodongi reorderSelectTabLayer(type); } /// 2010.12.22 - prodongi void SUISkillWnd::reorderSelectTabLayer(int type) { if (TAB_ACTIVE == type) { SetChildAsTop("tab_passive_01"); SetChildAsTop("tab_select_cyan_01"); SetChildAsTop("tab_active_01"); } else if (TAB_PASSIVE == type) { SetChildAsTop("tab_active_01"); SetChildAsTop("tab_select_cyan_01"); SetChildAsTop("tab_passive_01"); } } /// 2010.12.17 - prodongi void SUISkillWnd::selectJobRankButton(int rank) { if(rank == m_nSelectJopIndex) { m_jobRankButton[m_nSelectJopIndex]->SetCheck(true); /// 다시 풀려 버리므로 다시 체크 해준다 return ; } m_nSelectJopIndex = rank; m_pGameManager->StartSound( "ui_button_click.wav" ); refreshJobRank(); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SKILL_RADIO_UPDATE( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_SKILLFUND, m_nSelectJopIndex ) ); } /// 2010.12.21 - prodongi void SUISkillWnd::refreshJobRank() { for (int i = 0; i < JOP_CNT; ++i) { m_jobRankButton[i]->SetCheck(false); } m_jobRankButton[m_nSelectJopIndex]->SetCheck(true); int textId = 0; switch (m_nSelectJopIndex) { case JOP_0: textId = 9518; break; case JOP_1: textId = 9519; break; case JOP_2: textId = 9520; break; case JOP_3: textId = 9521; break; case JOP_ALL: textId = 9517; break; case JOP_TP: textId = 9522; break; default: textId = 9517; } SetChildCaption("sort_text_all_01", CStringUtil::StringFormat("<#898989>%s", S(textId)).c_str()); RefreshScrollbar(); RefreshSkillSlot(); } /// 2011.03.28 - prodongi void SUISkillWnd::addSkillList(bool isPassive, SSkillSlot* slot, int listIndex) { if(!isPassive) m_vecActiveSkillList[listIndex].push_back(slot); else m_vecPassiveSkillList[listIndex].push_back(slot); }