#include "stdafx.h" #include "stdafx.h" #include "KUIWndManager.h" #include "KUIControlStatic.h" #include "KUIControlScroll.h" #include "KUIControlButton.h" #include "KUIControlClockBox.h" #include "KUIControlScroll.h" #include "KUITabControl.h" #include "SNetMessage.h" #include "SGameManager.h" //#include "SGameMessageUI.h" #include "SStringDB.h" //#include "Util.h" #include "SGameInterface.h" #include "SGameVM.h" #include #include "SGame.h" #include "SContents.h" #include "KUITipControl.h" //#include "SUIUtil.h" #include "SUIDisplayInfo.h" #include "ItemEffectResource.h" #include "SItemEffectResourceDB.h" #include "SUITitleWnd.h" #include "STitleMgr.h" #include "SGameAvatarEx.h" #include "SGameSystem.h" extern SGameSystem* g_pCurrentGameSystem; extern bool g_bRenderUI; int SUITitleWnd::m_iSelectedSlot = -1; int SUITitleWnd::m_iSelectedKind = -1; int SUITitleWnd::m_iSelcetedID= -1; /*namespace{*/ ////////////////// 전체 호칭 리스트 컨트롤 //////////////// const size_t ALL_TITLE_MAX = 13; // 전체 호칭 const size_t ALL_TITLE_DELTA_Y = 30; const size_t ALL_SLOT_CONTROL_NUM = 5; const size_t INFO_TEXT_LINE_NUM = 9; const size_t INFO_TEXT_DELTA_Y = 15; const size_t LIMITED_LANK = 6; const int MAX_COOLTIME = 30000; static char *s_szAllSlotControlName[ ALL_SLOT_CONTROL_NUM ] // 전체호칭 슬롯 = { "line_title_list_", "check_favorite_", "title_name_gain_text_", "button_title_equip_", "new_title_mark_", }; static char *s_szInfoSlotControlName[ ALL_SLOT_CONTROL_NUM ] // 호칭 정보 슬롯 = { "line_title_list_view_", "mark_favorite_able_view_", "title_name_gain_view_text_", "equip_title_mark_", "mark_title_gain_view_", }; ////////////////// 사용중인 호칭 리스트 컨트롤 //////////////// const size_t SUB_TITLE_MAX = 5; // 장착된 부호칭 리스트 const size_t SUB_TITLE_DELTA_Y = 32; const size_t USING_SLOT_CONTROL_NUM = 4; static char *s_szMainSlotControlName[ USING_SLOT_CONTROL_NUM ] // 주호칭 슬롯 = { "line_main_title_equip_", "mark_main_favorite_able_", "main_title_name_equip_text_", "button_main_title_unequip_", }; static char *s_szSubSlotControlName[ USING_SLOT_CONTROL_NUM ] // 부호칭 슬롯 = { "line_sub_title_equip_", "mark_sub_favorite_disable_", "sub_title_name_equip_text_", "button_sub_title_unequip_", }; ///////////////////// sprite 이름 //////////////////// // 배경이 되는 바가 6종류가 있다 -_-;;; 초기화는 initcontrol에서... ㅎㄷㄷ std::string c_strSelectBar; std::string c_strMainEquip; std::string c_strMainUnEquip; std::string c_strSubEquip; std::string c_strSubUnEquip; std::string c_strAllEquip; std::string c_strAllUnEquip; std::string c_strInfoUnEquip; std::string c_strEquipBtn; // 장착 버튼 활성화 ani std::string c_strUnEquipBtn; // 장착 버튼 비활성화 ani std::string c_strNew; // 새로운 호칭 ani std::string c_strBookmark; // 즐겨찾기 std::string c_strNoBookmark; // 비즐겨찾기 std::string c_strInfoBack; // 호칭정보 백 KColor c_CoolTimeColor = KColor(163, 163, 163, 30); /*};*/ extern std::string ParserTitleText( const char *sz, int id ); // GameVM.cpp bool CutButtonID( std::string& str, LPCSTR lpszID ,int& nID) { if( str.find(lpszID) != -1 ) { std::string strNumber = str.substr(str.size()-2,2); // "xxxxxxx_xxxxxxxx_10" 에서 숫자부분만 자른다. nID = atoi(strNumber.c_str()); return true; } else return false; } SUITitleWnd::SUITitleWnd( SGameManager* pGameManager ,SUIDisplayInfo* pDisplayInfo ) :SUIWnd(pGameManager), m_pDisplayInfo(pDisplayInfo), m_bScrollRefresh(false), m_ScrollPos(0), m_InfoScrollPos(0), m_CooltimeCheck(false), m_MouseX(0), m_MouseY(0), m_bFirstOpen(true), m_dwBeforeTime(0) { //m_iSelectedKind = -1; //m_iSelectedSlot = -1; //m_iSelcetedID = -1; m_uiReceivedTime = 0; } void SUITitleWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd /* = true */ ) { if(bOpen) { if(m_bFirstOpen) { InitList(); m_bFirstOpen = false; } } SUIWnd::OnNotifyUIWindowOpen( bOpen ); } void SUITitleWnd::ProcMsgAtStatic(SGameMessage *pMsg) { m_msgFp.call(pMsg->nType, this, pMsg); } void SUITitleWnd::InitList() { m_InfoSlot.SetShow(false); // 기본정렬 m_pStaticSortAse->SetShow(false); // 정렬상태 표식 없애고 m_pStaticSortDes->SetShow(false); Refresh(); // 슬롯 리프레쉬 SetInstallSlot(); // 장착가능 슬롯 표시 설정 } void SUITitleWnd::Refresh() { m_TitleMgr.Refresh(); RefreshAllSlot(); RefreshEquipSlot(); } void SUITitleWnd::RefreshEquipSlot() { stTitleUsingID EquipList = m_TitleMgr.GetEquipList(); // 메인 stTitleUI *title = m_TitleMgr.GetTitleUiByID(EquipList.nMain); if(title) m_vMainSlot.at(0).SetSlot(title->bBookMark,title->bUsing, EquipList.nMain, title->iStringID); else m_vMainSlot.at(0).SetShowSlot(false); // 서브 std::vector::iterator it = m_vSubSlot.begin(); for( int i=0 ; it != m_vSubSlot.end() ; ++it ,++i ) { stTitleUI *sTitle = m_TitleMgr.GetTitleUiByID(EquipList.nSub[i]); if(sTitle) it->SetSlot(sTitle->bBookMark,sTitle->bUsing, EquipList.nSub[i], sTitle->iStringID); else it->SetShowSlot(false); } } void SUITitleWnd::stSubSlot::SetShowSlot(bool bEnable) { if(bEnable == false) SetTitleIDReset(); m_pBookMark->SetShow(bEnable); m_pName->SetShow(bEnable); m_pUsing->SetShow(bEnable); m_pBack->SetAniName( (bEnable)?c_strSubEquip.c_str() : c_strSubUnEquip.c_str() ); } void SUITitleWnd::SetInstallSlot() { if( m_vMainSlot.at(0).GetTitleID() == SLOT_KIND::NONE_SLOT) { MoveInstallSloat(SLOT_KIND::MAIN_SLOT); SetSubTitleString(-1); return; } else { std::vector::iterator it = m_vSubSlot.begin(); for(int i= 0 ; itGetTitleID() == SLOT_KIND::NONE_SLOT) { MoveInstallSloat(SLOT_KIND::SUB_SLOT, i); SetSubTitleString(i); return; } } } m_pStaticInstallSlot->SetShow(false); /// 여기까지 왔다면 빈슬롯이 없다 SetSubTitleString(-1); m_iEmptySlotKind = -1; m_iEmptySlotKind = -1; } void SUITitleWnd::MoveInstallSloat(int nKind, int nSlotNum /* = 0 */ ) { m_pStaticInstallSlot->SetShow(true); KRect rc; if(nKind == SLOT_KIND::MAIN_SLOT) rc = m_vMainSlot.at(0).GetRect(); else rc = m_vSubSlot.at(nSlotNum).GetRect(); m_pStaticInstallSlot->MovePos(rc.left -14 , rc.top -3); // 기준점보다 14, 3 만큼 이동해야한다. // 빈슬롯 정보 저장 m_iEmptySlotKind = nKind; m_iEmptySlotIndex = nSlotNum; } void SUITitleWnd::stMainSlot::SetShowSlot(bool bEnable) { if(bEnable == false) SetTitleIDReset(); m_pBookMark->SetShow(bEnable); m_pName->SetShow(bEnable); m_pUsing->SetShow(bEnable); m_pBack->SetAniName( (bEnable)?c_strMainEquip.c_str() : c_strMainUnEquip.c_str() ); } void SUITitleWnd::stMainSlot::SetSlot(bool bBookmark, bool bUsing, int nId, int nStringID) { SetShowSlot(true); m_iID = nId; ChangeBar(bUsing); // 배경 SetBookmark(bBookmark); // 북마크 상태 ChangeTitleName(S(nStringID)); // 호칭 이름 변경 } void SUITitleWnd::stSubSlot::SetSlot(bool bBookmark, bool bUsing, int nId, int nStringID) { if(bUsing) { m_iID = nId; SetShowSlot(true); // show ChangeBar(bUsing); // 배경 SetBookmark(bBookmark); // 북마크 상태 ChangeTitleName(S(nStringID)); // 호칭 이름 변경 } else m_iID = -1; } void SUITitleWnd::RefreshAllSlot() { std::vector title = m_TitleMgr.GetTitleUI(); std::vector::iterator it= title.begin(); int nSlotCount = ( title.size() < ALL_TITLE_MAX )? title.size() : ALL_TITLE_MAX; for(int i=0 ; ibAchieve, it->bBookMark, it->bUsing, it->nID, it->iStringID, it->bIsNew); ++it; } else { m_vAllSlot.at(i).SetEmptySlot(); } } // 획득 카운트 텍스트 SetAchieveCountText(); // 스크롤 재설정 SetListScrollRange(title.size()); } void SUITitleWnd::SetAchieveCountText() { std::string strToolTip = (S(690000006)); // "획득한 호칭 #@num@#개" std::string strText = CStringUtil::StringFormat( "%s",S(690000024) ); // "#@num:0#@ 개" std::string strCount = CStringUtil::StringFormat( "%d",m_TitleMgr.GetAchieveTitleCount() ); // 툴팁 CStringUtil::ReplacePhrase( strToolTip,"#@num@#", strCount ); m_pAchieveCount->SetTooltip( strToolTip.c_str() ); // 텍스트 CStringUtil::ReplacePhrase( strText, "#@num:0#@", strCount ); m_pAchieveCount->SetCaption( strText.c_str() ); } void SUITitleWnd::SetSubTitleString(int index) { for(size_t i=0 ; i= 0) && ( index GetRect() ); InitAllSlot(); // 전체 호칭 목록 컨트롤 생성 및 초기화 InitUsingSlot(); // 사용중인 호칭 목록 컨트롤 생성 및 초기화 initInfoSlot(); // 호칭정보 슬롯 초기화 InitAniName(); // 스프라이트셋 이름을 저장.. InitCoolTime(); // 쿨타임 컨트롤 초기화 InitToolTip(); // 툴팁 초기화 m_msgFp.add(IMSG_UI_TITLE_SET_MAIN, &SUITitleWnd::fpSetMainTitle); m_msgFp.add(IMSG_UI_TITLE_SET_SUB, &SUITitleWnd::fpSetSubTitle); m_msgFp.add(IMSG_UI_TITLE_SET_ACHIEVE, &SUITitleWnd::fpSetAchieveTitle); m_msgFp.add(IMSG_UI_TITLE_SET_OPEN, &SUITitleWnd::fpSetOpenTitle); m_msgFp.add(IMSG_UI_TITLE_SET_BOOKMARK, &SUITitleWnd::fpSetBookmarkTitle); m_msgFp.add(IMSG_UI_TITLE_SET_CONDITION, &SUITitleWnd::fpSetConditionTitle); m_msgFp.add(IMSG_UI_TITLE_SET_COOLTIME, &SUITitleWnd::fpSetCooltime); m_msgFp.add(IMSG_MOUSEMOVE, &SUITitleWnd::fpMouseMove); m_msgFp.add(IMSG_UI_TITLE_NEW_ALRAM, &SUITitleWnd::fpNewTitleNotify); m_msgFp.add(IMSG_UI_TITLE_WND_OPEN, &SUITitleWnd::fpWndOpen); m_msgFp.add(IMSG_UI_SEND_DATA, &SUITitleWnd::fpReset ); return SUIWnd::InitControls(kPos); } void SUITitleWnd::InitToolTip() { SetChildTooltip("button_lineup_title_gain",S(690000003)); // 획득 / 미획득 호칭 정렬 SetChildTooltip("button_lineup_title_favorite",S(690000004)); //즐겨찾기 호칭 정렬 //SetChildTooltip("button_lineup_title_favorite_01",S(690000005)); //장착된 호칭 정렬 SetChildTooltip("button_default_view_01",S(690000007)); //기본 정렬 } void SUITitleWnd::fpSetMainTitle(SGameMessage *pMsg) { SIMSG_UI_TITLE_SET_MAIN *pTitleMsg = dynamicCast(pMsg); if(pTitleMsg) { SGameAvatarEx* localPlayer = g_pCurrentGameSystem->GetLocalPlayer(); if( !localPlayer || (localPlayer->GetArID() != pTitleMsg->handle) ) // 내꺼가 아니면 패스 return; } else return; // 메인 슬롯 장착, 해제 stTitleUsingID usingList = m_TitleMgr.GetEquipList(); stTitleUI *title = m_TitleMgr.GetTitleUiByID(usingList.nMain); if(title) m_vMainSlot.at(0).SetSlot(title->bBookMark,title->bUsing, title->nID, title->iStringID); else { m_vMainSlot.at(0).SetShowSlot(false); title = m_TitleMgr.GetTitleUiByID(usingList.nBeforeMain); // 해제된 아이디를 얻어온다. } // 전체 슬롯에서 해당아이디 리프레시 if(title) { int nID = title->nID; std::vector::iterator it = m_vAllSlot.begin(); for( ; it != m_vAllSlot.end() ; ++it ) { if(it->m_iID == nID) it->SetSlot(title->bAchieve,title->bBookMark,title->bUsing,title->nID,title->iStringID, title->bIsNew); } SetInstallSlot(); } SetSlotInfo(m_iSelectedKind,m_iSelectedSlot,true); } void SUITitleWnd::fpSetSubTitle(SGameMessage *pMsg) { SIMSG_UI_TITLE_SET_SUB *titleMsg = dynamicCast(pMsg); int index = titleMsg->index; int id = titleMsg->id; if(id == 0) // 해제 { id = m_vSubSlot[index].m_iID; m_vSubSlot[index].SetShowSlot(false); } else // 장착 { stTitleUI *title = m_TitleMgr.GetTitleUiByID(id); if(title == NULL) return; m_vSubSlot[index].SetSlot(title->bBookMark,title->bUsing,title->nID,title->iStringID); } RefreshAllSlotUnit(id); SetInstallSlot(); SetSlotInfo(m_iSelectedKind,m_iSelectedSlot,true); } void SUITitleWnd::RefreshAllSlotUnit(int id) { stTitleUI *title = m_TitleMgr.GetTitleUiByID(id); if(title == NULL) return; for(int i=0 ; ibAchieve,title->bBookMark,title->bUsing,title->nID,title->iStringID, title->bIsNew); break; } } } void SUITitleWnd::fpSetAchieveTitle(SGameMessage *pMsg) { SIMSG_UI_TITLE_SET_ACHIEVE * titleMsg = dynamicCast(pMsg); std::vector::iterator it = m_vAllSlot.begin(); for( ; it != m_vAllSlot.end() ; ++it ) { if(it->m_iID == titleMsg->id ) { it->ChangeGain(true,true); break; } } SetSlotInfo(m_iSelectedKind,m_iSelectedSlot,true); } void SUITitleWnd::fpSetOpenTitle(SGameMessage *pMsg) { SIMSG_UI_TITLE_SET_OPEN* titleMsg = dynamicCast(pMsg); stTitleUI *titleUI = m_TitleMgr.GetTitleUiByID(titleMsg->id); if(titleUI) { m_TitleMgr.Refresh(); RefreshAllSlot(); } } void SUITitleWnd::fpSetBookmarkTitle(SGameMessage *pMsg) { SIMSG_UI_TITLE_SET_BOOKMARK* titleMsg = dynamicCast(pMsg); // 전체 호칭쪽 리프레시 std::vector::iterator it = m_vAllSlot.begin(); for( ; it != m_vAllSlot.end() ; ++it ) { if(it->m_iID == titleMsg->id ) it->ChangeBookmark( titleMsg->equip ); } // 장착쪽 리프레시 if(m_vMainSlot.at(0).m_iID == titleMsg->id) m_vMainSlot.at(0).SetBookmark( titleMsg->equip ); else { for(size_t i=0 ; iid) { m_vSubSlot[i].SetBookmark( titleMsg->equip ); break; } } } SetSlotInfo(m_iSelectedKind,m_iSelectedSlot,true); } void SUITitleWnd::fpSetConditionTitle(SGameMessage *pMsg ) { int pos = m_pScrollInfo->GetPosition(); // 기존의 스크롤 위치를 저장하고 SetSlotInfo(m_iSelectedKind,m_iSelectedSlot,true); // 갱신된 스트링을 셋팅하고 m_InfoSlot.SetShowText(pos); // 원래의 스크롤 위치로 복원한다. m_pScrollInfo->SetPosition(pos); } void SUITitleWnd::fpSetCooltime(SGameMessage *pMsg ) { SIMSG_UI_TITLE_SET_COOLTIME* titleMsg = dynamicCast(pMsg); if(titleMsg) SetCoolTime(MAX_COOLTIME*10, ((int)titleMsg->time)*10 ); } void SUITitleWnd::fpMouseMove(SGameMessage *pMsg) { SIMSG_MOUSEMOVE* pMouse = dynamicCast(pMsg); if(pMsg) { m_MouseX = ((int)(short)LOWORD(pMouse->lParam)); m_MouseY = ((int)(short)HIWORD(pMouse->lParam)); } } void SUITitleWnd::fpNewTitleNotify(SGameMessage *pMsg) { SetSorting(SORTKIND::BASE,std::string("button_default_view_01")); // 기본정렬 시킨다. } void SUITitleWnd::fpWndOpen(SGameMessage *pMsg) { OpenTitleWnd(); } void SUITitleWnd::fpReset(SGameMessage *pMsg) { SIMSG_UI_SEND_DATA* pData = (SIMSG_UI_SEND_DATA *)pMsg; if(pData->m_strString == "refresh") // 리프레시 한다. { m_bFirstOpen = true; m_dwBeforeTime = 0; m_TitleMgr.ResetTitle(); } } void SUITitleWnd::InitCoolTime() { KUIControlSimpleButton *pBtn = dynamicCast(GetChild("button_main_title_unequip_00")); if(pBtn) { KUIWND_CREATE_ARG ClockArg( "clockbox", "main_title_cooltime_99", " ", pBtn->GetRect(), 0, KFLAG_NO_GET_MESSAGE, this, "", "ui_frame.spr", m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ); KUIWnd* pWnd = m_pManager->CreateControl( ClockArg ); m_pCooltime = dynamicCast(pWnd); m_pCooltime->SetColor( c_CoolTimeColor ); m_pCooltime->OnAlphaChangeNotify(0.5f); } } void SUITitleWnd::SetCoolTime(int nMaxTime, int nRemain) { //! 여기서 클라 시간을 기록해 놓고 창을 다시 열때 시간을 보정해준다. if( nRemain > 100 ) //0.1초 m_uiReceivedTime = GetSafeTickCount(); if(m_pCooltime) { m_dwCooltimeRemain = nRemain; m_pCooltime->SetMaxTime( nMaxTime ); m_pCooltime->SetCurTime( nMaxTime - nRemain ); m_pCooltime->Begin(); m_pCooltime->SetShow(true); m_vMainSlot.at(0).SetBtnState( false ); // 쿨타임이 돌면 버튼이 비활성화 되어야 한다. m_CooltimeCheck = true; } } void SUITitleWnd::Process(DWORD dwTime) { SUIWnd::Process( dwTime ); if(m_dwBeforeTime == 0) m_dwBeforeTime = dwTime; // 쿨타임 체크 if(m_CooltimeCheck) { //gmpbigsun( 20130305, #26393 ) : 호칭쿨타임 버그, 쿨타임표현 UI의 쿨타임과 this의 쿨타임 2개가 존재한다. 통합하고싶지만 담기회에... if( m_uiReceivedTime > 0 ) //server로부터 시간을 받은후 최초Process { int nVal = GetSafeTickCount() - m_uiReceivedTime; if( nVal > 0 ) { //해당 윈도우가 활성화될때 Process가 불리기때문에 이때! 시간을 보정함. if( nVal > m_dwCooltimeRemain ) m_dwCooltimeRemain = 0; else m_dwCooltimeRemain -= nVal; } m_uiReceivedTime = 0; //sync if( m_pCooltime ) m_pCooltime->SetCurTime( m_pCooltime->GetMaxTime() - m_dwCooltimeRemain ); } //end_sun---------------------------------- if( m_dwCooltimeRemain <= (dwTime-m_dwBeforeTime) ) { m_CooltimeCheck = false; m_vMainSlot.at(0).SetBtnState( true ); m_vMainSlot.at(0).m_pUsing->SetTooltip( S(690000002) ); } else { m_dwCooltimeRemain -= (dwTime-m_dwBeforeTime); DWORD min = m_dwCooltimeRemain/60000; DWORD sec = (m_dwCooltimeRemain%60000)/1000; std::string strTime = S(690000001); CStringUtil::ReplacePhrase(strTime,"#@minutes@#", CStringUtil::StringFormat("%02d",min)); CStringUtil::ReplacePhrase(strTime,"#@seconds@#", CStringUtil::StringFormat("%02d",sec)); m_vMainSlot.at(0).m_pUsing->SetTooltip( strTime.c_str() ); } } m_dwBeforeTime = dwTime; // 스크롤 리프레시 if(m_bScrollRefresh) { std::vector title = m_TitleMgr.GetTitleUI(); std::vector::iterator it= title.begin(); int start = m_ScrollPos; for(int i=0; i(GetChild("vscroll_title_list")); m_pScrollInfo = dynamicCast(GetChild("vscroll_title_info")); m_pStaticSortDes = dynamicCast(GetChild("mark_sort_up_01")); m_pStaticSortAse = dynamicCast(GetChild("mark_sort_down_01")); m_pStaticInstallSlot = dynamicCast(GetChild("equip_railbox_01")); m_pListAreaCheck = dynamicCast(GetChild("select_list_cyan")); m_pInfoAreaCheck = dynamicCast(GetChild("select_list_cyan_01")); m_pEquipAeraCheck = dynamicCast(GetChild("inframe_rail")); m_pAchieveCount = dynamicCast(GetChild("text_title_gain_num_01")); c_strSelectBar = GetChild("title_list_select_00")->GetAniName(); c_strMainEquip = GetChild("line_main_title_equip_00")->GetAniName(); c_strMainUnEquip = GetChild("line_main_title_unequip_00")->GetAniName(); c_strSubEquip = GetChild("line_sub_title_equip_00")->GetAniName(); c_strSubUnEquip = GetChild("line_sub_title_unequip_00")->GetAniName(); c_strAllEquip = GetChild("line_title_list_equip_00")->GetAniName(); c_strAllUnEquip = GetChild("line_title_list_00")->GetAniName(); c_strEquipBtn = GetChild("button_title_equip_00")->GetAniName(); c_strUnEquipBtn = GetChild("button_main_title_unequip_00")->GetAniName(); c_strNew = GetChild("new_title_mark_00")->GetAniName(); c_strBookmark = GetChild("mark_main_favorite_able_00")->GetAniName(); c_strNoBookmark = GetChild("mark_sub_favorite_disable_00")->GetAniName(); c_strInfoUnEquip = GetChild("line_title_list_view_00")->GetAniName(); c_strInfoBack = GetChild("line_title_list_view_00")->GetAniName(); } bool SUITitleWnd::stBaseSlot::IsInRect(int x, int y) {return m_pBack->IsInRect(x, y); } // 뒷배경 안에 클릭이 됐는지 확인 bool SUITitleWnd::stBaseSlot::IsSelectSlot() {return m_bSelected;} void SUITitleWnd::stBaseSlot::SetSelectFlag(bool bFlag) { m_bSelected = bFlag; } bool SUITitleWnd::stAllSlot::IsSelectSlot() { // 스크롤바 때문에 다른 슬롯과는 다른 처리가 필요 // 슬롯 타입이 같고, 아이디가 같아야 선택된놈이다. return (SUITitleWnd::m_iSelectedKind == SLOT_KIND::ALL_SLOT) && (SUITitleWnd::m_iSelcetedID == m_iID) ; } int SUITitleWnd::stBaseSlot::SelectBar(bool bSelect ,bool bEquip /* = false */) { SetSelectFlag(bSelect); ChangeBar(bEquip); return m_iID; } void SUITitleWnd::stAllSlot::ChangeBar( bool bEquip ) { if( IsSelectSlot() ) m_pBack->SetAniName( c_strSelectBar.c_str() ); else m_pBack->SetAniName( bEquip ? c_strAllEquip.c_str() : c_strAllUnEquip.c_str() ); } void SUITitleWnd::stMainSlot::ChangeBar( bool bEquip ) { if( IsSelectSlot() ) m_pBack->SetAniName( c_strSelectBar.c_str() ); else m_pBack->SetAniName( bEquip ? c_strMainEquip.c_str() : c_strMainUnEquip.c_str() ); } void SUITitleWnd::stSubSlot::ChangeBar( bool bEquip ) { if( IsSelectSlot() ) m_pBack->SetAniName( c_strSelectBar.c_str() ); else m_pBack->SetAniName( bEquip ? c_strSubEquip.c_str() : c_strSubUnEquip.c_str() ); } void SUITitleWnd::stSubSlot::SetBookmark(bool bBookmark) { if(bBookmark) m_pBookMark->SetAniName( c_strBookmark.c_str() ); else m_pBookMark->SetAniName( c_strNoBookmark.c_str() ); } void SUITitleWnd::stSubSlot::SetStringInfo(bool bShow) { std::string str = (bShow)? CStringUtil::StringFormat("<#265445>%s",S(690000028)).c_str() : ""; m_pBack->SetCaption( str.c_str() ); } void SUITitleWnd::stBaseSlot::ChangeEquipBtn( bool bEquip ) { if(bEquip) // 장착 { m_pUsing->DisableAndButtonState(KUIControlSimpleButton::KBUTTON_DOWN); } else // 비장착 { m_pUsing->Enable(); m_pUsing->SetButtonState(KUIControlSimpleButton::KBUTTON_NORMAL); } } void SUITitleWnd::stAllSlot::ChangeBookmark(bool bCheck) { m_pBookMark->SetCheck(bCheck); } void SUITitleWnd::stAllSlot::ChangeGain(bool bGain, bool bNew) { if(bNew) { m_pGain->SetAniName(c_strNew.c_str()); m_pGain->SetTooltip(S(690000023)); //새로운 호칭 } else { m_pGain->SetTooltipOff(); } m_pGain->SetShow(bNew); ChangeControlState(bGain); } void SUITitleWnd::stAllSlot::ChangeControlState(bool bEnable) { if(bEnable) { m_pGain->Enable(); if(!m_pUsing->IsDisable()) m_pUsing->Enable(); // 장착되서 비활성화 일경우에는 활성화되지 않게 한다.. m_pName->Enable(); } else { m_pGain->Disable(); m_pUsing->Disable(); m_pName->Disable(); } } void SUITitleWnd::stAllSlot::ShowControl(bool bShow) { m_pGain->SetShow(bShow); m_pUsing->SetShow(bShow); m_pName->SetShow(bShow); m_pBookMark->SetShow(bShow); } void SUITitleWnd::stAllSlot::SetSlot(bool bGain, bool bBookmark, bool bUsing, int nId, int nStringID, bool bNew) { m_iID = nId; ShowControl(true); ChangeEquipBtn(bUsing); // 장착 버튼 ChangeBar(bUsing); // 배경 ChangeBookmark(bBookmark);; // 북마크 상태 ChangeGain(bGain,bNew); // 획득 상태 ChangeTitleName(S(nStringID)); // 호칭 이름 변경 } void SUITitleWnd::stAllSlot::SetEmptySlot() { m_iID = -1; ShowControl(false); ChangeEquipBtn(false); // 장착 버튼 ChangeBar(false); // 배경 ChangeBookmark(false);; // 북마크 상태 ChangeGain(false,false); // 획득 상태 ChangeTitleName(""); // 호칭 이름 변경 } void SUITitleWnd::PumpUpTitleBtn(LPCSTR lpszID) { std::string strID = lpszID; int nID = -1; if( CutButtonID(strID, "button_title_equip_", nID) ) // 1. 장착 버튼 { if( m_TitleMgr.IsAllEquip() ) return; if(m_iEmptySlotIndex == -1 && m_iEmptySlotKind == -1) // 장착할 슬롯 없음.. return; if(m_iEmptySlotKind == SLOT_KIND::MAIN_SLOT) // 메인 슬롯 장착 m_TitleMgr.RequestSetUpMainTitle( m_vAllSlot.at(nID).GetTitleID() ); else // 부 슬롯 장착 m_TitleMgr.RequestSetUpSubtitle( m_vAllSlot.at(nID).GetTitleID() , m_iEmptySlotIndex ); } else if(CutButtonID(strID, "button_main_title_unequip_", nID) ) // 2. 메인 해제 버튼 m_TitleMgr.RequestSetDownMainTitle(); else if(CutButtonID(strID, "button_sub_title_unequip_", nID) ) // 3. 서브 해제 버튼 m_TitleMgr.RequestSetDownSubtitle( m_vAllSlot.at(nID).GetTitleID() , nID ); else if(CutButtonID(strID, "check_favorite_", nID) ) // 4. 즐겨찾기 장착 해제 m_TitleMgr.RequestSetBookmark( m_vAllSlot.at(nID).GetTitleID() ); } void SUITitleWnd::SetListScrollRange(int count) { m_pScrollAll->SetScrollRange( ALL_TITLE_MAX, count ); } void SUITitleWnd::OpenTitleWnd() { bool bOpen = this->IsShow(); if(bOpen) { m_TitleMgr.SetNewTitleClose(); // 닫힐 때 새로운 호칭 체크를 없애야 한다. } m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TITLE_MAIN, !bOpen ) ); } void SUITitleWnd::PumpUpMessage(LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam) { switch( nMessage ) { case KUI_MESSAGE::KFOCUS_ACTIVATED: // 영역 판정을 해야 한다. 주호칭(1개)부호칭(5개)전체호칭(13개).. { IsSlotClick(lparam,wparam); }break; case KUI_MESSAGE::KBUTTON_CLICK: { if( ::_stricmp( lpszControlID, "button_close" ) == 0 ) OpenTitleWnd(); else PumpUpTitleBtn(lpszControlID); // 장착, 해제 버튼 처리 } break; case KUI_MESSAGE::KCHECK_CHANGE: { PumpUpTitleBtn(lpszControlID); }break; case KUI_MESSAGE::KBUTTON_PRESSING: { if( ::_stricmp( lpszControlID, "button_lineup_title_gain" ) == 0 ) // 획득 순 SetSorting( SORTKIND::GAIN, std::string("button_lineup_title_gain") ); else if( ::_stricmp( lpszControlID, "button_lineup_title_favorite" ) == 0 ) // 즐겨찾기 순 SetSorting(SORTKIND::BOOKMARK, std::string("button_lineup_title_favorite")); else if( ::_stricmp( lpszControlID, "button_lineup_title_name" ) == 0 ) // 이름 순 SetSorting(SORTKIND::NAME, std::string("button_lineup_title_name")); //else if( ::_stricmp( lpszControlID, "button_lineup_title_favorite_01" ) == 0 ) // 장착 순 -- 없어짐.. // SetSorting(SORTKIND::USING,std::string("button_lineup_title_favorite_01")); else if( ::_stricmp( lpszControlID, "button_default_view_01" ) == 0 ) // 기본 정렬.. SetSorting(SORTKIND::BASE,std::string("button_default_view_01")); }break; case KUI_MESSAGE::KGENWND_MOVE: { LimitMoveWnd(); }break; case KUI_MESSAGE::KSCROLL_SELECT: { SetScroll(lpszControlID, lparam); }break; } } void SUITitleWnd::SetScroll(LPCSTR lpszControlID, DWORD lparam) { if( ::_stricmp( lpszControlID, "vscroll_title_list" ) == 0 ) { if(m_pListAreaCheck->IsInRect(m_MouseX,m_MouseY) == false) { m_pScrollAll->SetPosition(m_ScrollPos); return; } std::vector title = m_TitleMgr.GetTitleUI(); std::vector::iterator it= title.begin(); if(title.size() < ALL_TITLE_MAX) return; int nPos = int(lparam); // 스크롤 리프레시는 process에서 m_ScrollPos = max( nPos, 0 ); m_bScrollRefresh = true; } else if( ::_stricmp( lpszControlID, "vscroll_title_info" ) == 0 ) { if(m_pInfoAreaCheck->IsInRect(m_MouseX,m_MouseY) == false) { m_pScrollInfo->SetPosition(m_InfoScrollPos); return; } int nPos = int(lparam); m_InfoScrollPos = max( nPos, 0 ); m_InfoSlot.SetShowText(nPos); } } void SUITitleWnd::SetSorting( int nKind, std::string strCtrl ) { int nState = m_TitleMgr.ReQuestSorting(nKind); RefreshAllSlot(); ChangeSmall(nKind, nState, strCtrl); m_pScrollAll->SetPosition(0); } void SUITitleWnd::ChangeSmall(int nKind, int nState, std::string strCtrl) { m_pStaticSortAse->SetShow(false); m_pStaticSortDes->SetShow(false); if(nKind != SORTKIND::BASE && nState != SORTSTATE::NONE) { KRect rc = GetChild(strCtrl.c_str())->GetRect(); if( nState == SORTSTATE::DES) { m_pStaticSortDes->SetShow(true); m_pStaticSortDes->MovePos(rc.left, rc.top); } else { m_pStaticSortAse->SetShow(true); m_pStaticSortAse->MovePos(rc.right - m_pStaticSortAse->GetRect().GetWidth() , rc.bottom - m_pStaticSortAse->GetRect().GetHeight() ); } } } DWORD SUITitleWnd::OnMouseMessage(DWORD dwMessage, int x, int y) { switch( dwMessage ) { case KMOUSE_MOVE : { IsSlotOver( x, y ); }break; } return SUIWnd::OnMouseMessage(dwMessage, x, y); } void SUITitleWnd::InitAllSlot() { // 전체호칭 리스트 컨트롤을 만들고 위치 설정을 한다. KRect pos[ALL_SLOT_CONTROL_NUM]; for(size_t i=0 ; i(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BACK],i).c_str())); slot.m_pBookMark = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BOOKMARK],i).c_str())); slot.m_pGain = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::GAIN],i).c_str())); slot.m_pName = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::NAME],i).c_str())); slot.m_pUsing = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::USING],i).c_str())); pos[TITLE_SLOT::BACK] = slot.m_pBack->GetRect(); pos[TITLE_SLOT::BOOKMARK] = slot.m_pBookMark->GetRect(); pos[TITLE_SLOT::GAIN] = slot.m_pGain->GetRect(); pos[TITLE_SLOT::NAME] = slot.m_pName->GetRect(); pos[TITLE_SLOT::USING] = slot.m_pUsing->GetRect(); } else { CopyControl( CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BACK],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BACK],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BOOKMARK],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BOOKMARK],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::GAIN],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::GAIN],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::NAME],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::NAME],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::USING],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::USING],i).c_str() ,KRect(0,0,0,0) ); slot.m_pBack = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BACK],i).c_str())); slot.m_pBookMark = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::BOOKMARK],i).c_str())); slot.m_pGain = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::GAIN],i).c_str())); slot.m_pName = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::NAME],i).c_str())); slot.m_pUsing = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szAllSlotControlName[TITLE_SLOT::USING],i).c_str())); slot.m_pBack->MovePos( pos[TITLE_SLOT::BACK].left, pos[TITLE_SLOT::BACK].top + i*ALL_TITLE_DELTA_Y ); slot.m_pBookMark->MovePos( pos[TITLE_SLOT::BOOKMARK].left, pos[TITLE_SLOT::BOOKMARK].top + i*ALL_TITLE_DELTA_Y ); slot.m_pGain->MovePos( pos[TITLE_SLOT::GAIN].left, pos[TITLE_SLOT::GAIN].top + i*ALL_TITLE_DELTA_Y ); slot.m_pName->MovePos( pos[TITLE_SLOT::NAME].left, pos[TITLE_SLOT::NAME].top + i*ALL_TITLE_DELTA_Y ); slot.m_pUsing->MovePos( pos[TITLE_SLOT::USING].left, pos[TITLE_SLOT::USING].top + i*ALL_TITLE_DELTA_Y ); } slot.m_pUsing->SetTooltip(S(690000008)); //호칭 장착 slot.m_pBookMark->SetTooltip(S(690000009)); //즐겨찾기 m_vAllSlot.push_back(slot); } } void SUITitleWnd::InitUsingSlot() { // 주호칭 컨트롤 포인터를 저장 stMainSlot mainSlot; mainSlot.m_pBack = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szMainSlotControlName[TITLE_SLOT::BACK],0).c_str())); mainSlot.m_pBookMark = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szMainSlotControlName[TITLE_SLOT::BOOKMARK],0).c_str())); mainSlot.m_pName = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szMainSlotControlName[TITLE_SLOT::NAME],0).c_str())); mainSlot.m_pUsing = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szMainSlotControlName[TITLE_SLOT::USING],0).c_str())); mainSlot.m_pUsing->SetTooltip(S(690000002)); //장착된 호칭 해제 m_vMainSlot.push_back(mainSlot); // 부호칭 컨트롤 을 만들고 위치설정을 해준다. KRect pos[USING_SLOT_CONTROL_NUM]; for(size_t i=0 ; i(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BACK],i).c_str())); slot.m_pBookMark = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BOOKMARK],i).c_str())); slot.m_pName = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::NAME],i).c_str())); slot.m_pUsing = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::USING],i).c_str())); // 첫번째 슬롯의 위치를 기준으로 나머지 위치를 정해주므로 저장해둔다. pos[TITLE_SLOT::BACK] = slot.m_pBack->GetRect(); pos[TITLE_SLOT::BOOKMARK] = slot.m_pBookMark->GetRect(); pos[TITLE_SLOT::NAME] = slot.m_pName->GetRect(); pos[TITLE_SLOT::USING] = slot.m_pUsing->GetRect(); } else { CopyControl( CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BACK],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BACK],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BOOKMARK],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BOOKMARK],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::NAME],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::NAME],i).c_str() ,KRect(0,0,0,0) ); CopyControl( CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::USING],0 ).c_str(), CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::USING],i).c_str() ,KRect(0,0,0,0) ); slot.m_pBack = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BACK],i).c_str())); slot.m_pBookMark = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::BOOKMARK],i).c_str())); slot.m_pName = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::NAME],i).c_str())); slot.m_pUsing = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szSubSlotControlName[TITLE_SLOT::USING],i).c_str())); slot.m_pBack->MovePos( pos[TITLE_SLOT::BACK].left, pos[TITLE_SLOT::BACK].top + i*SUB_TITLE_DELTA_Y ); slot.m_pBookMark->MovePos( pos[TITLE_SLOT::BOOKMARK].left, pos[TITLE_SLOT::BOOKMARK].top + i*SUB_TITLE_DELTA_Y ); slot.m_pName->MovePos( pos[TITLE_SLOT::NAME].left, pos[TITLE_SLOT::NAME].top + i*SUB_TITLE_DELTA_Y ); slot.m_pUsing->MovePos( pos[TITLE_SLOT::USING].left, pos[TITLE_SLOT::USING].top + i*SUB_TITLE_DELTA_Y ); } slot.m_pUsing->SetTooltip(S(690000002)); //장착된 호칭 해제 m_vSubSlot.push_back(slot); } } void SUITitleWnd::initInfoSlot() { m_InfoSlot.m_pBack = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szInfoSlotControlName[TITLE_SLOT::BACK],0).c_str())); m_InfoSlot.m_pBookMark = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szInfoSlotControlName[TITLE_SLOT::BOOKMARK],0).c_str())); m_InfoSlot.m_pName = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szInfoSlotControlName[TITLE_SLOT::NAME],0).c_str())); m_InfoSlot.m_pUsing = dynamicCast(GetChild(CStringUtil::StringFormat("%s%02d",s_szInfoSlotControlName[TITLE_SLOT::USING],0).c_str())); m_InfoSlot.m_pScrollInfo = dynamicCast(GetChild("vscroll_title_info")); m_InfoSlot.m_pText = dynamicCast(GetChild("info_text_01")); m_InfoSlot.m_pEmptyText = dynamicCast(GetChild("info_empty_text_01")); m_InfoSlot.m_pText->SetCaption(""); } void SUITitleWnd::stInfoSlot::SetDetailText(std::string _str) { int pos = 0; m_vString.clear(); std::string str = ""; str += _str; SetTextList(INFO_TEXT_LINE_NUM, str,std::string(),"font_01" ,(KUIControl*)m_pText, (KUIControlScrollBase*)m_pScrollInfo,pos, m_vString, true); } void SUITitleWnd::stInfoSlot::SetShowText(int pos) { SetTextList(INFO_TEXT_LINE_NUM, std::string(),std::string(),"font_01" ,(KUIControl*)m_pText, (KUIControlScrollBase*)m_pScrollInfo,pos, m_vString, false); } bool SUITitleWnd::stInfoSlot::IsSameId(int id) { if(m_curID == id) return true; else { m_curID = id; return false; } } void SUITitleWnd::IsSlotClick(DWORD _x, DWORD _y) { int nKind = SLOT_KIND::NONE_SLOT; int nSlotNum = SLOT_KIND::NONE_SLOT; if( IsInSlotRect(_x,_y,nKind,nSlotNum)) MoveSelectBar(nKind, nSlotNum); } void SUITitleWnd::IsSlotOver(DWORD x, DWORD y) { if( (m_pEquipAeraCheck->IsInRect(x,y) == false) && (m_pListAreaCheck->IsInRect(x,y) == false ) &&(m_pInfoAreaCheck->IsInRect(x,y) == false) ) // 체크영역이 아닐경우 리턴 return; int nKind = SLOT_KIND::NONE_SLOT; int nSlotNum = SLOT_KIND::NONE_SLOT; if( IsInSlotRect( x, y, nKind, nSlotNum )) SetSlotInfo( nKind, nSlotNum ); else { if(m_iSelectedKind == SLOT_KIND::MAIN_SLOT) SetSlotInfo(m_iSelectedKind,m_iSelectedSlot); else if(m_iSelectedKind == SLOT_KIND::SUB_SLOT) SetSlotInfo(m_iSelectedKind,m_iSelectedSlot); else if(m_iSelectedKind == SLOT_KIND::ALL_SLOT) SetSlotInfoWithID(m_iSelcetedID); } } void SUITitleWnd::SetSlotInfo(int _nKind, int _nSlotNum, bool refresh /* = false */) { static int nKind = -1; static int nSlotNum = -1; if(refresh == false) // 리프레시가 아니고 { if(nKind == _nKind && nSlotNum == _nSlotNum) // 동일한 슬롯은 리턴 return; } // 종류,인덱스 저장 nKind = _nKind; nSlotNum = _nSlotNum; // 호칭 아이디 얻고 int nId = GetTitleID(nKind,nSlotNum); SetSlotInfoWithID(nId,refresh); } void SUITitleWnd::SetSlotInfoWithID(int nId, bool refresh /* = false */) { if(!refresh) { if(m_InfoSlot.IsSameId(nId)) return; } // 슬롯 정보 stTitleUI *pTitle = NULL; pTitle = m_TitleMgr.GetTitleUiByID(nId); if(pTitle) { m_InfoSlot.SetShow(true); m_InfoSlot.SetInfo(pTitle); // 선택된 호칭 상세 정보 std::string strDetailInfo; if( GetDetailInfoString( nId,strDetailInfo ) ) { // 스트링을 잘라서 넣어줘야 한다.... m_InfoSlot.SetDetailText( strDetailInfo ); } } else { m_InfoSlot.SetShow(false); m_pScrollInfo->SetScrollRange( 0,0 ); } } // 호칭 정보 상세 스트링 얻기 bool SUITitleWnd::GetDetailInfoString(int nID, std::string& strDetailInfo) { stTitleRes titleRes; if( m_TitleMgr.getTitleRes(nID, titleRes) ) { strDetailInfo += CStringUtil::StringFormat("<#898989>[%s]
",S(690000021) ); // 효과 strDetailInfo += "<#ffffff>"; strDetailInfo += getOptionString(titleRes); // 추가 성능 strDetailInfo += CStringUtil::StringFormat( "

<#898989>[%s]
", S(9543) ) ; // 9543 획득 조건 strDetailInfo += "<#ffffff>"; strDetailInfo += getGainConditionString(titleRes); // 획득 조건 return true; } return false; } // 추가 성능 스트링 얻기 std::string SUITitleWnd::getOptionString(stTitleRes res) { TitleResource titleRes = res.m_title; std::string strRet = ""; // 추가 성능 값 넣고 bool isBeforeOpt = false; for(int i=0 ; i<8 ; ++i) // TitleResource 의 추가 성능이 8개이다.. { if(titleRes.opt_type[i] == 0) break; if(isBeforeOpt) strRet += "
"; // 옵션이 여러가지일 경우 줄바꿈이 안되므로 체크해서 넣자. std::string strGet = "#@bitset_text@#"; m_pDisplayInfo->getTitleEffectInfo( strGet, titleRes.opt_type[i], titleRes.opt_var1[i], titleRes.opt_var2[i] ); strGet = " " + strGet; CStringUtil::ReplacePhrase(strGet,"/","
"); strRet += ""; strRet += strGet; isBeforeOpt = true; } if( titleRes.rate >= c_Available_SUbTitle_Max_Rank ) // 6랭크 이상은 부호칭으로 사용 불가 메세지를 뿌린다. { strRet += "
"; strRet += S(690000013); } // 특수 성능 넣는다. if(titleRes.effect_id) { SItemEffectResourceDB::FoundResult found; GetItemEffectResourceDB().Find( titleRes.effect_id, found ); SItemEffectResourceDB::FoundResult::iterator it = found.begin(); ItemEffectResource const* reso = *it; strRet += S(reso->tooltip_id); CStringUtil::ReplacePhrase(strRet,"
","
"); CStringUtil::ReplacePhrase(strRet,"
","
"); } return strRet; } // 획득 조건 스트링 얻기 std::string SUITitleWnd::getGainConditionString(stTitleRes _res) { stTitleRes res = _res; std::string strDescripton = ""; strDescripton += S(res.m_title.tooltip_id); // 획득 조건 설명 strDescripton += "
"; strDescripton +=""; if(res.m_title.status_id != 82010204 ) // 상태 text가 비어 있는 경우 { for( size_t i=0 ; i res.vCondition[i].nCount )? res.vCondition[i].nCount: res.vCondition[i].nCurCount; // 2234/1000 일경우 2234를 1000으로 출력 CStringUtil::ReplacePhrase(tag,"#@num:0@#", CStringUtil::StringFormat("%I64d",res.vCondition[i].nCount) ); CStringUtil::ReplacePhrase(tag,"#@m_status:0@#", CStringUtil::StringFormat("%I64d", curCount ) ); CStringUtil::ReplacePhrase(tag,"#@i_item:0@#","#@i_name:0@#"); std::string strCondition = ParserTitleText( tag.c_str(), res.vCondition[i].nTypeID ); // 상세 조건 strDescripton += strCondition; strDescripton += "
"; } } } return strDescripton; } int SUITitleWnd::GetTitleID(int _nKind, int _nSlotNum) { int nID; if(_nKind == SLOT_KIND::MAIN_SLOT) nID = m_vMainSlot.at(0).GetTitleID(); else if(_nKind == SLOT_KIND::SUB_SLOT) nID = m_vSubSlot.at(_nSlotNum).GetTitleID(); else if(_nKind == SLOT_KIND::ALL_SLOT) nID = m_vAllSlot.at(_nSlotNum).GetTitleID(); else nID = -1; return nID; } void SUITitleWnd::stInfoSlot::SetInfo(const TITLEMGR::stTitleUI *ptitle) { // 아이디가 없다면 빈슬롯 if(ptitle == NULL) SetShow(false); else { SetShow(true); m_pName->Enable(); m_pBack->SetAniName( (ptitle->bUsing)? c_strAllEquip.c_str() : c_strInfoUnEquip.c_str() ); m_pBookMark->SetAniName( (ptitle->bBookMark)? c_strBookmark.c_str() : c_strNoBookmark.c_str() ); m_pName->SetCaption( CStringUtil::StringFormat( "<#ffffff>%s",S(ptitle->iStringID) ).c_str() ); (ptitle->bUsing)? m_pUsing->SetShow(true) : m_pUsing->SetShow(false); (ptitle->bAchieve)? m_pName->Enable() : m_pName->Disable(); } } void SUITitleWnd::stInfoSlot::SetShow(bool bShow) { if(bShow == false) m_pBack->SetAniName( c_strInfoBack.c_str() ); m_pEmptyText->SetShow(!bShow); m_pBack->SetShow(bShow); m_pBookMark->SetShow(bShow); m_pName->SetShow(bShow); m_pUsing->SetShow(bShow); m_pText->SetShow(bShow); } bool SUITitleWnd::IsInSlotRect(DWORD _x, DWORD _y, int &nKind, int &nSlotNum) { int x = (int)_x; int y = (int)_y; if( m_pListAreaCheck->IsInRect(x,y) ) // 전체 호칭 리스트 안인가? { for(int i=0 ; iIsInRect(x,y)) // 사용중인 호칭 리스트 안인가? { if( m_vMainSlot.at(0).IsInRect(x,y) ) // 주 호칭 { nKind = SLOT_KIND::MAIN_SLOT; nSlotNum = 0; } else // 부 호칭 { for(int i=0 ; i(GetChild("title_gain_text_01")); m_pOutFrame = dynamicCast(GetChild("outframe")); return SUIWnd::InitData(bReload); } void SUITitleGainResultWnd::MovePosCustom(KSize size) { // 가로 중앙위치, 세로 2/3 정도 위치 this->MovePos( (size.width-GetRect().GetWidth())/2 , size.height*3/5 ); } void SUITitleGainResultWnd::SetAlpha(int type, DWORD dwTime) { switch( type ) { case TITLE_ALPHA::ALPHA_1: { m_fTitleAlpha = 1.0f; }break; case TITLE_ALPHA::ALPHA_DEC: { m_fTitleAlpha -= AlphaTimeCal(dwTime); }break; } if(m_pOutFrame) m_pOutFrame->ChangeAlpha(m_fTitleAlpha); if(m_pShowText) m_pShowText->ChangeAlpha(m_fTitleAlpha); } float SUITitleGainResultWnd::AlphaTimeCal(DWORD dwTime) { std::vector::iterator it = m_vTitle.begin(); DWORD elapsedtime = dwTime - it->dwBeforeTime; it->dwBeforeTime = dwTime; float t = (float)elapsedtime/1000.0f; return t*c_fFadeSpeed; } bool SUITitleGainResultWnd::IsTitleRemain() { return !m_vTitle.empty(); } void SUITitleGainResultWnd::Process(DWORD dwTime) { if( g_bRenderUI == false ) // UI가 그려지고 있지 않을 때는 process를 돌리지 않는다. return; SUIWnd::Process( dwTime ); if(IsTitleRemain()) { std::vector::iterator it = m_vTitle.begin(); // 무조건 첫번째 놈이 그려지고 있어야 하므로 switch ( it->nState ) { case TITLE_DATA::STATE_WAIT: // 대기 상태 { SetAlpha(TITLE_ALPHA::ALPHA_1); m_dwStartTime = dwTime; m_pShowText->SetCaption(it->strTitleName.c_str()); it->nState = TITLE_DATA::STATE_SHOW; } break; case TITLE_DATA::STATE_SHOW: // 보여지고 있는 상태 { // showtime 이 넘어가면 상태 변경 if( ( dwTime - m_dwStartTime ) > c_dwShowTime ) { it->dwBeforeTime = dwTime; it->nState = TITLE_DATA::STATE_FADE; } }break; case TITLE_DATA::STATE_FADE: // 페이드 아웃 되고 있는 상태 { SetAlpha(TITLE_ALPHA::ALPHA_DEC,dwTime); // 페이드 아웃이 끝났으면 삭제 if( m_fTitleAlpha < 0.0f ) { m_vTitle.erase(it); if(IsTitleRemain() == false) m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TITLE_GAIN_RESULT, false ) ); } } } } } //2012. 4. 5 - marine 해당스트링을 만들어서 벡터에 넣어두자. void SUITitleGainResultWnd::PushTitle( std::string str ) { stTitleList title; title.strTitleName = c_strTitleNotifyTag + str; m_vTitle.push_back(title); } void SUITitleGainResultWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch( pMsg->nType ) { case IMSG_UI_TITLE_GAIN_NOTIFY: { SIMSG_UI_TITLE_GAIN_NOTIFY* msg = dynamicCast(pMsg); if(msg) { PushTitle(msg->str); if(m_pGameManager->IsShow(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TITLE_GAIN_RESULT) == false) m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_TITLE_GAIN_RESULT, true ) ); } }break; } }