#include "stdafx.h" #include "SGameManager.h" #include "SUIDungeonUnitWnd.h" //#include "SGameMessageUI.h" #include "KUIControlList.h" #include "KUIControlStatic.h" #include "KUIControlButton.h" #include "KUIControlEdit.h" #include "SDungeonResourceDB.h" #include "SGameManager.h" #include "SPlayerInfoMgr.h" #include "SGameMessage.h" #include "SChatType.h" #include "SStringDB.h" #include "SJobDB.h" #include "SMessengerMgr.h" #include const char* lpMercenaryOutLine = "static_dungeon_party00"; namespace { const int g_LimitText = 20; // Edit 컨트롤 최대 텍스트. bool g_bButtonState[MAXPARTYCOUNT] = {0,0,0,0,0,0,0,0}; void ButtonReSet() { for(int i=0; i(GetChild("text_dungeon_01")); if(pDungeonName) { std::string strDungeonName; strDungeonName.append( GetStringDB().GetString( m_RaidMgr.getAimDungeonID() ) ); pDungeonName->SetCaption( CStringUtil::StringFormat( "<#f7941d>%s", strDungeonName.c_str() ).c_str() ); } // 공대장 체크 // std::string strAttackUnitLeader = m_RaidMgr.getAttackUnitLeaderName(); m_bItsMeMaster = false; SPartyMgr* pParty = m_PartyMgr.FindPartyByPlayerName( &std::string(m_PlayerInfoMgr.GetName()) ); if(pParty) { std::string strPartyName = pParty->GetPartyName(); size_t nPos = strPartyName.find_first_of("_"); if(nPos == -1) // 공대장 파티.. { SPlayerSlot* pPlayer = pParty->FindMember(m_PlayerInfoMgr.GetName()); if(pPlayer) { if( pPlayer->IsLeader() ) m_bItsMeMaster = true; else m_bItsMeMaster = false; } } } // 던전스톤에 참여가능한 최대 파티수 m_nMaxPartyNum = m_RaidMgr.GetMaxGuildPartyNum(); // 공대 이름 출력 KUIControlStatic* pTitle = dynamicCast(GetChild("titlebar_text")); // Up 버튼 if(pTitle) { std::string strName = m_RaidMgr.getAttackUnitName(); pTitle->SetCaption( CStringUtil::StringFormat("<#FFFFFF>'%s' %s",strName.c_str(), S(12000)).c_str() ); } if(m_bIsInitAttackUnit == false) // 공대장 체크는 변하지 않으므로 한번만 한다. { // 레이드 매니저에서 얻어온 정보 컨트롤에 매칭.. SetRaidInfo(); // 공대파티들 초기화.. InitParty(m_nCurPartyCount,m_nMyPartyNum); m_bIsInitAttackUnit = true; // 더이상 안들어오게 막자... } else { SetRaidInfo(); SetButtonStateAll(); } } void SUIDungeonUnitWnd::SetMyPartyNum() { std::string nMyName = m_PlayerInfoMgr.GetName(); SPartyMgr* pPartyMgr = m_PartyMgr.FindPartyByPlayerName(&nMyName); if(pPartyMgr == NULL) // 2011. 12 .21 - marine 파티정보가 채워지기전에 들어올때가 있음.. return; std::string partyName = pPartyMgr->GetPartyName(); m_nMyPartyNum = m_RaidMgr.getNumUseAttackUnit(partyName); //파티이름으로 공대창에서 순번을 얻음.. assert( m_nMyPartyNum >= m_nCurPartyCount || "현재 공대파티 수보다 내 파티 번호가 큼.."); } void SUIDungeonUnitWnd::SetRaidInfo() { // 파티 이름, 파티 인원 std::vector< SRaidInfo* > PartyList = m_RaidMgr.GetRaidInfoList(); m_nCurPartyCount = PartyList.size(); // 각 파티의 인원 설정 for(int i=0 ; iSetCaption(CStringUtil::StringFormat("<#FFFFFF>%d/8", pParty->GetMemberCount() ).c_str()); // 공대 이름 int Partynum = 12001 + PartyList[i]->GetPartyNum(); // 이번호는 전체공대중에서 내가 몇번째인지를 나타내고 m_pPartyName[i]->SetCaption(CStringUtil::StringFormat("<#FFFFFF>%s",S(Partynum) ).c_str() ) ; // 마크 설정 int nPartyRealNum = m_RaidMgr.getNumberAtPartyName(pParty->GetPartyName())+1; // 이번호는 실제 사용되는 파티이름의 번호이다.(예로 공대가 5개인데 2,3번 공대가 없을 경우 위의 번호와 다르다.) m_pPartyMarkStatic[i]->SetAniName(CStringUtil::StringFormat("common_mark_titanium_attackteam_%02d", nPartyRealNum ).c_str()); } } // 자신의 파티번호 설정 SetMyPartyNum(); if( (m_nPrePartyCount != m_nCurPartyCount) && m_bIsInitAttackUnit ) // 공대 파티수가 변했다면.. { InitParty(m_nCurPartyCount, m_nMyPartyNum); m_nPrePartyCount = m_nCurPartyCount; } } void SUIDungeonUnitWnd::SaveButtonState() { for(int i=0 ; i< m_nCurPartyCount ; ++i) g_bButtonState[i] = m_pPartyButton[i][DOWN_BTN_STATE]->IsShow(); } void SUIDungeonUnitWnd::SetButtonStateAll() { for(int i=0 ; i< m_nCurPartyCount ; ++i) SetButtonState(i); } void SUIDungeonUnitWnd::SetButtonState(int nNumber) { // 각 파티별로 버튼 상태 설정 if( nNumber == m_nMyPartyNum) // 내파티 일경우 { SetShowMyParty(nNumber); } else // 내파티가 아닐 경우 { if(g_bButtonState[nNumber] == UP_BUTTON_STATE) { m_pPartyButton[nNumber][UP_BUTTON_STATE]->SetShow(true); m_pPartyButton[nNumber][DOWN_BTN_STATE]->SetShow(false); } else { m_pPartyButton[nNumber][UP_BUTTON_STATE]->SetShow(false); m_pPartyButton[nNumber][DOWN_BTN_STATE]->SetShow(true); } } } void SUIDungeonUnitWnd::InitPartyControlPackage() { // 1. 기준 위치.. 버튼의 위치 저장.. 자신의 파티는 스태틱타입이므로 위치를 얻어 써야 하므로 한번 저장한다. KUIControlButton *pBaseButton = dynamicCast(GetChild("button_attack_team_01")); // 요 버튼이 기준임.. if(!pBaseButton) return; KRect rcBaseRect = pBaseButton->GetRect(); KPoint ptBasePoint; ptBasePoint.x = pBaseButton->GetRect().left; ptBasePoint.y = pBaseButton->GetRect().top; for(int i=0 ; i(GetChild(CStringUtil::StringFormat("button_attack_team_%02d", i+1).c_str())); // Up 버튼 m_pPartyButton[i][DOWN_BTN_STATE] = dynamicCast(GetChild(CStringUtil::StringFormat("button_attack_team_release_%02d", i+1).c_str())); // Down 버튼 m_pPartyNumStatic[i] = dynamicCast(GetChild(CStringUtil::StringFormat("text_number_%02d", i+1).c_str())); // 공대 순번 m_pPartyMarkStatic[i] = dynamicCast(GetChild(CStringUtil::StringFormat("mark_attack_party_%02d", i+1).c_str())); // 공대 표시 마크 m_pPartyName[i] = dynamicCast(GetChild(CStringUtil::StringFormat("text_partyname_%02d", i+1).c_str())); // 공대 이름 m_pPartyUserCount[i] = dynamicCast(GetChild(CStringUtil::StringFormat("text_total_%02d", i+1).c_str())); // 공대 인원 } m_pMyPartyStatic = dynamicCast(GetChild("panel_attack_my_team_01")); // 자신의 공대 m_pInvitePartyButton = dynamicCast(GetChild("button_invite_01")); // 공대 초대 m_pInvitePartyStatic[0] = dynamicCast(GetChild("text_attack_team_invite_01")); // 더하기 m_pInvitePartyStatic[1] = dynamicCast(GetChild("text_attack_team_invite_02")); // 공대 초대 text m_pInvitePartyStatic[1]->SetCaption( CStringUtil::StringFormat("<#FFFFFF>%s",S(12014)).c_str()); m_pMyPartyMark = dynamicCast(GetChild("mark_attack_my_team_01")); // 내파티 마크 // 5. 위치 저장 및 캡션 설정 // y좌표는 공유, x좌표는 각각(단 공대 마크의 위치는 y좌표가 다르다) KRect rcPartyNum = m_pPartyNumStatic[0]->GetRect(); // 파티 번호 int nPartyNumX = rcBaseRect.left; KRect rcPartyMark = m_pPartyMarkStatic[0]->GetRect(); // 파티 마크 int nPartyMarkX = rcPartyMark.left; int nPartymarkY = rcPartyMark.top; KRect rcPartyName = m_pPartyName[0]->GetRect(); // 파티 이름 int nPartyNameX = rcPartyName.left; KRect rcPartyUserCount = m_pPartyUserCount[0]->GetRect(); // 파티 유저 수 int nPartyUserCountX = rcPartyUserCount.left; for(int i=0 ; i< ATTACK_UNIT::MAXPARTYCOUNT ; ++i) { m_pPartyButton[i][UP_BUTTON_STATE]->MovePos(m_ptCheckButtonPos[i].x, m_ptCheckButtonPos[i].y); // 업버튼 m_pPartyButton[i][DOWN_BTN_STATE]->MovePos(m_ptCheckButtonPos[i].x, m_ptCheckButtonPos[i].y); // 다운버튼 m_pPartyNumStatic[i]->MovePos(nPartyNumX,m_ptCheckButtonPos[i].y); // 파티 번호 m_pPartyNumStatic[i]->SetCaption(CStringUtil::StringFormat("<#FFFFFF>%d", i+1).c_str()); // 파티번호는 바뀌지 않으므로 지금 넣는다. m_pPartyMarkStatic[i]->MovePos(nPartyMarkX,m_ptCheckButtonPos[i].y+8); // 파티표시 마크 m_pPartyName[i]->MovePos(nPartyNameX,m_ptCheckButtonPos[i].y); // 이름 m_pPartyUserCount[i]->MovePos(nPartyUserCountX,m_ptCheckButtonPos[i].y);// 파티 유저 수 } // 6. 모두 비활성화.. for(int i=0 ; i< ATTACK_UNIT::MAXPARTYCOUNT ; ++i) { SetShowParty(i,false); } // 공대 초대 관련 컨트롤 disable m_pInvitePartyButton->SetShow(false); m_pInvitePartyStatic[0]->SetShow(false); m_pInvitePartyStatic[1]->SetShow(false); // 툴팁 KUIControlStatic* pLeader = dynamicCast(GetChild("mark_siegeleader_01")); if(pLeader) pLeader->SetTooltip(S(5130)); //"5130:공대장 마크" KUIControlSimpleButton *pMin = dynamicCast(GetChild("button_transform_min")); if(pMin) pMin->SetTooltip(S(5128)); //"5128:간략 보기 버튼" } void SUIDungeonUnitWnd::SetPartyButtonToggle(int nPartyNum, bool bCurButtonState ) { if(nPartyNum == m_nMyPartyNum) { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(false); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(false); } else if(bCurButtonState == BUTTON_STATE::UP_BUTTON_STATE) //버튼Up상태면 버튼Down상태로 { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(false); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(true); g_bButtonState[nPartyNum] = BUTTON_STATE::DOWN_BTN_STATE; } else //버튼Down상태면 버튼UP상태로 { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(true); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(false); g_bButtonState[nPartyNum] = BUTTON_STATE::UP_BUTTON_STATE; } // 버튼이 외부메시지로 바뀌면 Select 상태로 변화 되는데 노멀상태로 강제 변환 시킨다.. m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetButtonState(KUIControlButton::KBUTTON_NORMAL); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetButtonState(KUIControlButton::KBUTTON_NORMAL); } void SUIDungeonUnitWnd::InitParty(int nPartyCount, int nMyPartNum) { // 현재 파티수 만큼 컨트롤 설정하고 for( int i=0 ; iSetShow(!g_bButtonState[nPartyNum]); // Up 버튼 m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(g_bButtonState[nPartyNum]); // Down 버튼 } else { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(false); // Up 버튼 m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(false); // Down 버튼 } m_pPartyNumStatic[nPartyNum]->SetShow(bShow); // 공대 순번 m_pPartyMarkStatic[nPartyNum]->SetShow(bShow); // 공대 표시 마크 m_pPartyName[nPartyNum]->SetShow(bShow); // 공대 이름 m_pPartyUserCount[nPartyNum]->SetShow(bShow); // 공대 인원 } void SUIDungeonUnitWnd::SetShowMyParty(int nMyPartyNum) { // 컨트롤들 보이기,안보이기 설정 m_pPartyButton[nMyPartyNum][UP_BUTTON_STATE]->SetShow(false); // Up 버튼 m_pPartyButton[nMyPartyNum][DOWN_BTN_STATE]->SetShow(false); // Down 버튼 m_pPartyNumStatic[nMyPartyNum]->SetShow(true); // 공대 순번 m_pPartyMarkStatic[nMyPartyNum]->SetShow(false); // 공대 표시 마크 m_pMyPartyMark->SetShow(true); // 내 파티 마크 m_pPartyName[nMyPartyNum]->SetShow(true); // 공대 이름 m_pPartyUserCount[nMyPartyNum]->SetShow(true); // 공대 인원 // 내파티 스태틱 컨트롤 위치 변경 m_pMyPartyStatic->SetShow(true); KRect rc = m_pPartyButton[nMyPartyNum][UP_BUTTON_STATE]->GetRect(); m_pMyPartyStatic->MovePos(rc.left,rc.top); rc = m_pPartyMarkStatic[nMyPartyNum]->GetRect(); m_pMyPartyMark->MovePos(rc.left,rc.top); } void SUIDungeonUnitWnd::SetShowInviteControls(int nPartyCount, bool bShow ) { if(bShow) { m_pInvitePartyButton->SetShow(true); m_pInvitePartyStatic[0]->SetShow(true); m_pInvitePartyStatic[1]->SetShow(true); // 위치 설정 KRect rcRect = m_pPartyButton[nPartyCount][UP_BUTTON_STATE]->GetRect(); m_pInvitePartyButton->MovePos(rcRect.left,rcRect.top); // 버튼 위치 설정 rcRect = m_pPartyNumStatic[nPartyCount]->GetRect(); m_pInvitePartyStatic[0]->MovePos(rcRect.left,rcRect.top); // "+" 스태틱 위치 설정 rcRect = m_pPartyName[nPartyCount]->GetRect(); m_pInvitePartyStatic[1]->MovePos(rcRect.left,rcRect.top); // "공대 초대" 스태틱 위치 설정 } else { m_pInvitePartyButton->SetShow(false); m_pInvitePartyStatic[0]->SetShow(false); m_pInvitePartyStatic[1]->SetShow(false); } } void SUIDungeonUnitWnd::SetResizeFrame(int nPartyCount) { // 2011. 10. 13 - marine // 공대 숫자에 맞춰서 창의 크기를 조절하는데 // 처음에 공대 숫자가 Max라고 가정하고 // nPreCount 에서 현재 파티의 숫자를 뺀만큼을 bottom에서 빼서 창크기를 조절.. // 공대장일 경우에는 공대숫자를 하나 더 늘려서 계산(공대추가버튼) //static nPreCount = ATTACK_UNIT::MAXPARTYCOUNT; // 리사이즈 하기전의 버튼의 갯수 int nCurrentCount; // 현재 창의 갯수 if(m_bIsFirstResize) // 처음 리사이즈 할때는 파티의 갯수를 증가 { nCurrentCount = nPartyCount; m_bIsFirstResize = false; } else nCurrentCount = nPartyCount; // 리사이즈 할때의 버튼 갯수 if( m_bItsMeMaster && (nCurrentCount != m_nMaxPartyNum) ) ++nCurrentCount; int nFixCount = m_nPreCount-nCurrentCount; // 리사이즈 하기전,후의 차이 // 렉트 수정 KRect rcRect[3]; KUIControlStatic* pStatic1 = dynamicCast(GetChild("outframe")); KUIControlStatic* pStatic2 = dynamicCast(GetChild("inframe")); rcRect[0] = pStatic1->GetRect(); rcRect[1] = pStatic2->GetRect(); rcRect[2] = GetRect(); for( int i=0 ; i<3 ; ++i ) rcRect[i].bottom -= (nFixCount * NOMAL_UI_GAP); pStatic1->Resize(rcRect[0]); pStatic2->Resize(rcRect[1]); Resize(rcRect[2]); m_nPreCount = nCurrentCount; } void SUIDungeonUnitWnd::AddParty() { if(m_nCurPartyCount == MAXPARTYCOUNT) return; SetShowParty(m_nCurPartyCount,true); if( m_nCurPartyCount == MAXPARTYCOUNT-1 ) // 공격대가 Max가 되는 경우 SetShowInviteControls(m_nCurPartyCount,false); else { SetShowInviteControls(m_nCurPartyCount+1,true); SetResizeFrame(m_nCurPartyCount); } ++m_nCurPartyCount; } bool SUIDungeonUnitWnd::InitControls( KPoint kPos ) { SetCustomMovingRect( KRect( 0, 0, m_rcRegion.GetWidth(), 20 ) ); InitPartyControlPackage(); return SUIWnd::InitControls( kPos ); } bool SUIDungeonUnitWnd::InitData( bool bReload /*= false*/ ) { return SUIWnd::InitData( bReload ); } void SUIDungeonUnitWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { if( bOpen ) { if( m_RaidMgr.GetPartyCount() ) { m_pGameManager->StartSound( "ui_popup_window01.wav" ); KRect rc = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_MINI)->GetRect(); // 2011. 11. 15 - marine this->MovePos(rc.left, rc.top); InitControl(); return; } else m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT, false ) ); } } void SUIDungeonUnitWnd::findSelectedSlotPartyName( int nNum, std::string &strName ) { std::string strPartyName = ""; for(int j=0 ; j< m_nCurPartyCount ; ++j) { SRaidInfo* pRaidInfo = m_RaidMgr.GetRaidInfo(j); if(pRaidInfo) { strPartyName = pRaidInfo->GetPartyName(); strName = strPartyName; size_t nPos = strPartyName.find_first_of("_")+ 2; size_t nEndPos = strPartyName.size() - 1; if(nPos < 3 ) // _가 없는경우니까 공대장 파티 { if(nNum == 0) return; else continue; } std::string strNumber = strPartyName.substr(nPos, nEndPos); int nNumber = atoi( strNumber.c_str())+1; if(nNumber == nNum) { return; } } } assert(true&&"공대창 슬롯에 해당하는 파티이름을 찾을 수 없다.."); } int SUIDungeonUnitWnd::findSelectedSltotPartyNumber( std::string &PartyName ) { if(m_nCurPartyCount != (int)m_RaidMgr.GetPartyCount()) return -1; // 1. 파티 이름으로 내 공대 번호를 찾고 std::string strPartyName = PartyName; size_t nPos = strPartyName.find_first_of("_")+ 2; size_t nEndPos = strPartyName.size() - 1; if(nPos < 3 ) // _가 없는경우니까 공대장 파티 return 0; std::string strNumber = strPartyName.substr(nPos, nEndPos); int nPartyNum = atoi( strNumber.c_str())+1; // 2. 찾은 번호로 공대UI상에서의 순서를 찾는다. std::vector< SRaidInfo* > PartyList = m_RaidMgr.GetRaidInfoList(); for(int i=0 ; iGetPartyNum() == nPartyNum) ) nPartyNum = i; } return nPartyNum; } void SUIDungeonUnitWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch( nMessage ) { case KUI_MESSAGE::KBUTTON_CLICK: { if( ::_stricmp( lpszControlID, "button_transform_min" ) == 0 ) //2011. 10 .10 - marine 미니창 전환 { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT , false) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_MINI , true) ); SaveButtonState(); // 현재 버튼 상태 저장 } else if( ::_stricmp( lpszControlID, "button_invite_01" ) == 0 ) // 공대 파티 초대 { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION , true) ); } else { std::vector< SRaidInfo* > PartyList = m_RaidMgr.GetRaidInfoList(); int nCurPartyNum = 0; for( int i=0 ; iGetPartyNum(); SetPartyButtonToggle(i,BUTTON_STATE::UP_BUTTON_STATE); findSelectedSlotPartyName(nCurPartyNum,strPartyName); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd2", strPartyName.c_str() ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MINIMAP, "show_party_wnd2", strPartyName.c_str() ) ); break; } if(::_stricmp( lpszControlID, CStringUtil::StringFormat("button_attack_team_release_%02d", i+1).c_str() ) == 0) //Down버튼일 경우 { SRaidInfo *pParty = PartyList[i]; if(pParty) nCurPartyNum = pParty->GetPartyNum(); SetPartyButtonToggle(i,BUTTON_STATE::DOWN_BTN_STATE); findSelectedSlotPartyName(nCurPartyNum,strPartyName); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "hide_party_wnd2", strPartyName.c_str() ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MINIMAP, "hide_party_wnd2", strPartyName.c_str() ) ); break; } } } } break; case KUI_MESSAGE::KGENWND_MOVE: { LimitMoveWnd(); } } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUIDungeonUnitWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch(pMsg->nType) { case IMSG_UI_SEND_DATA: { SIMSG_UI_SEND_DATA* pData = (SIMSG_UI_SEND_DATA *)pMsg; int nPartyNum = findSelectedSltotPartyNumber( pData->m_strText ); if(nPartyNum == -1) return; if(pData->m_strString == "hide_party_wnd2") { SetPartyButtonToggle( nPartyNum, BUTTON_STATE::DOWN_BTN_STATE ); } if(pData->m_strString == "open_party_wnd2") { SetPartyButtonToggle( nPartyNum, BUTTON_STATE::UP_BUTTON_STATE ); } pMsg->bUse = true; } break; case IMSG_UI_DUNGEONUNIT_UPDATE: { pMsg->bUse = true; SIMSG_UI_DUNGEONUNIT_UPDATE* msg = dynamicCast(pMsg); if (!msg) return ; if (msg->m_initAttackUnitMember) m_bIsInitAttackUnit = false; if( m_RaidMgr.GetPartyCount() == 0 ) { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT , false) ); ButtonReSet(); } else { InitControl(); } } break; } } SUIDungeonUnitMiniWnd::~SUIDungeonUnitMiniWnd() { ButtonReSet(); } bool SUIDungeonUnitMiniWnd::InitControls( KPoint kPos ) { SetCustomMovingRect( KRect( 0, 0, m_rcRegion.GetWidth(), 20 ) ); InitPartyControlPackage(); return SUIWnd::InitControls( kPos ); } bool SUIDungeonUnitMiniWnd::InitData( bool bReload /*= false*/ ) { return SUIWnd::InitData( bReload ); } void SUIDungeonUnitMiniWnd::findSelectedSlotPartyName( int nNum, std::string &strName ) { std::string strPartyName = ""; for(int j=0 ; j< m_nCurPartyCount ; ++j) { SRaidInfo* pRaidInfo = m_RaidMgr.GetRaidInfo(j); if(pRaidInfo) { strPartyName = pRaidInfo->GetPartyName(); strName = strPartyName; size_t nPos = strPartyName.find_first_of("_")+ 2; size_t nEndPos = strPartyName.size() - 1; if(nPos < 3 ) // _가 없는경우니까 공대장 파티 { if(nNum == 0) return; else continue; } std::string strNumber = strPartyName.substr(nPos, nEndPos); int nNumber = atoi( strNumber.c_str())+1; if(nNumber == nNum) { return; } } } assert(true&&"공대창 슬롯에 해당하는 파티이름을 찾을 수 없다.."); } int SUIDungeonUnitMiniWnd::findSelectedSltotPartyNumber( std::string &PartyName ) { if(m_nCurPartyCount != (int)m_RaidMgr.GetPartyCount()) return -1; // 1. 파티 이름으로 내 공대 번호를 찾고 std::string strPartyName = PartyName; size_t nPos = strPartyName.find_first_of("_")+ 2; size_t nEndPos = strPartyName.size() - 1; if(nPos < 3 ) // _가 없는경우니까 공대장 파티 return 0; std::string strNumber = strPartyName.substr(nPos, nEndPos); int nPartyNum = atoi( strNumber.c_str())+1; // 2. 찾은 번호로 공대UI상에서의 순서를 찾는다. std::vector< SRaidInfo* > PartyList = m_RaidMgr.GetRaidInfoList(); for(int i=0 ; iGetPartyNum() == nPartyNum) ) nPartyNum = i; } return nPartyNum; } void SUIDungeonUnitMiniWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch( nMessage ) { case KUI_MESSAGE::KBUTTON_CLICK: { if( ::_stricmp( lpszControlID, "button_transform_max" ) == 0 ) { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT , true) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_MINI , false) ); SaveButtonState(); // 버튼 상태 저장 } else if( ::_stricmp( lpszControlID, "button_invite_01" ) == 0 ) m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION , true) ); else { std::vector< SRaidInfo* > PartyList = m_RaidMgr.GetRaidInfoList(); int nCurPartyNum = 0; for( int i=0 ; iGetPartyNum(); SetPartyButtonToggle(i,BUTTON_STATE::UP_BUTTON_STATE); findSelectedSlotPartyName(nCurPartyNum,strPartyName); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "show_party_wnd2", strPartyName.c_str() ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MINIMAP, "show_party_wnd2", strPartyName.c_str() ) ); break; } if(::_stricmp( lpszControlID, CStringUtil::StringFormat("button_attack_team_release_%02d", i+1).c_str() ) == 0) //Down버튼일 경우 { SRaidInfo *pParty = PartyList[i]; if(pParty) nCurPartyNum = pParty->GetPartyNum(); SetPartyButtonToggle(i,BUTTON_STATE::DOWN_BTN_STATE); findSelectedSlotPartyName(nCurPartyNum,strPartyName); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY, "hide_party_wnd2", strPartyName.c_str() ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_MINIMAP, "hide_party_wnd2", strPartyName.c_str() ) ); break; } } } } break; case KUI_MESSAGE::KGENWND_MOVE: { LimitMoveWnd(); } } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUIDungeonUnitMiniWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch(pMsg->nType) { case IMSG_UI_SEND_DATA: { SIMSG_UI_SEND_DATA* pData = (SIMSG_UI_SEND_DATA *)pMsg; int nPartyCount = findSelectedSltotPartyNumber(pData->m_strText); if(nPartyCount == -1) return; if(pData->m_strString == "hide_party_wnd2") { SetPartyButtonToggle( nPartyCount ,BUTTON_STATE::DOWN_BTN_STATE ); } if(pData->m_strString == "open_party_wnd2") { SetPartyButtonToggle( nPartyCount ,BUTTON_STATE::UP_BUTTON_STATE ); } pMsg->bUse = true; } break; case IMSG_MOUSEMOVE: { if(IsShow() == false) break; SIMSG_MOUSEMOVE* pMouseMove = (SIMSG_MOUSEMOVE* )pMsg; m_ptMousePos.x = ((int)(short)LOWORD(pMouseMove->lParam)); m_ptMousePos.y = ((int)(short)HIWORD(pMouseMove->lParam)); } break; case IMSG_UI_DUNGEONUNIT_UPDATE: { if( m_RaidMgr.GetPartyCount() == 0) // 공대가 없어졌을 때 { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_MINI , false) ); ButtonReSet(); } else { InitControl(); } } break; } } void SUIDungeonUnitMiniWnd::Process(DWORD dwTime) { SUIWnd::Process( dwTime ); // 2011. 10 .17 - marine 마우스 오버/언오버 상태 체크 bool b_IsMouseOverBefore = m_bIsMouseOver; (GetRect().IsInRect(m_ptMousePos.x,m_ptMousePos.y))? m_bIsMouseOver = true : m_bIsMouseOver = false; if(b_IsMouseOverBefore == m_bIsMouseOver) // 이전 상태와 비교 { if(m_nFaidFlag == FAID_INOUT::FAID_NONE) return; else FaidInOutProcess(dwTime); } else { if(m_bIsMouseOver) { if( m_nFaidFlag == FAID_INOUT::FAID_NONE ) // 2011. 11. 15 - marine 페이드 인/아웃이 진행되고 있을 때가 아닌경우에만 초기화 m_fAlpha = 0.0f; m_nFaidFlag = FAID_INOUT::FAID_IN; } else { if( m_nFaidFlag == FAID_INOUT::FAID_NONE ) m_fAlpha = 1.0f; m_nFaidFlag = FAID_INOUT::FAID_OUT; } m_lastTime = dwTime; } } void SUIDungeonUnitMiniWnd::FaidInOutProcess(DWORD dwTime) { DWORD elapsedtime = dwTime - m_lastTime; m_lastTime = dwTime; float t = (float)elapsedtime/1000.0f; float v = 3.0f; /// 2012.01.16 속도를 3.0으로 수정함 - prodongi float ca = t*v; if(m_nFaidFlag == FAID_INOUT::FAID_IN) { m_fAlpha += ca; if(m_fAlpha >= 1.0f) { m_fAlpha = 1.0f; m_nFaidFlag = FAID_INOUT::FAID_NONE; } } else { m_fAlpha -= ca; if(m_fAlpha <= 0.0f) { m_fAlpha = 0.0f; m_nFaidFlag = FAID_INOUT::FAID_NONE; } } SetFaidCtrlAlpha(m_fAlpha); } void SUIDungeonUnitMiniWnd::SetFaidCtrlAlpha(float fScale) { for(int i=0 ; i< MOUSEOVER_CTRL ; ++i) m_pMouseOverShow[i]->ChangeAlpha(m_fAlpha); } void SUIDungeonUnitMiniWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { if( bOpen ) { if( m_RaidMgr.GetPartyCount() ) { KRect rc = m_pGameManager->GetSUI(SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT)->GetRect(); // 2011. 11. 15 - marine this->MovePos(rc.left, rc.top); m_pGameManager->StartSound( "ui_popup_window01.wav" ); InitControl(); return; } else m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT, false ) ); } } void SUIDungeonUnitMiniWnd::InitControl() { // 공대장 체크 m_bItsMeMaster = false; SPartyMgr* pParty = m_PartyMgr.FindPartyByPlayerName( &std::string(m_PlayerInfoMgr.GetName()) ); if(pParty) { std::string strPartyName = pParty->GetPartyName(); size_t nPos = strPartyName.find_first_of("_"); if(nPos == -1) // 공대장 파티.. { SPlayerSlot* pPlayer = pParty->FindMember(m_PlayerInfoMgr.GetName()); if(pPlayer) { if( pPlayer->IsLeader() ) m_bItsMeMaster = true; else m_bItsMeMaster = false; } } } // 던전스톤에 참여가능한 최대 파티수 m_nMaxPartyNum = m_RaidMgr.GetMaxGuildPartyNum(); KUIControlStatic* pTitle = dynamicCast(GetChild("titlebar_text")); // Up 버튼 if(pTitle) { std::string strName = m_RaidMgr.getAttackUnitName(); pTitle->SetCaption( CStringUtil::StringFormat("<#FFFFFF>'%s' %s",strName.c_str(), S(12000)).c_str() ); } if(m_bIsInitAttackUnit == false) // 공대이름, 공대장 체크는 변하지 않으므로 한번만 한다. { // 레이드 매니저에서 얻어온 정보 컨트롤에 매칭.. SetRaidInfo(); // 공대파티들 초기화.. InitParty(m_nCurPartyCount,m_nMyPartyNum); m_bIsInitAttackUnit = true; // 더이상 안들어오게 막자... } else { SetRaidInfo(); } SetButtonStateAll(); SetToolTip(); } void SUIDungeonUnitMiniWnd::SetMyPartyNum() { std::string nMyName = m_PlayerInfoMgr.GetName(); SPartyMgr* pPartyMgr = m_PartyMgr.FindPartyByPlayerName(&nMyName); if(pPartyMgr == NULL) // 2011. 12 .21 - marine 파티정보가 채워지기전에 들어올때가 있음.. return; std::string partyName = pPartyMgr->GetPartyName(); m_nMyPartyNum = m_RaidMgr.getNumUseAttackUnit(partyName); //파티이름으로 공대창에서 순번을 얻음.. assert( m_nMyPartyNum >= m_nCurPartyCount || "현재 공대파티 수보다 내 파티 번호가 큼.."); } void SUIDungeonUnitMiniWnd::SetRaidInfo() { // 파티 이름, 파티 인원 std::vector< SRaidInfo* > PartyList = m_RaidMgr.GetRaidInfoList(); // 파티 카운트 설정 m_nCurPartyCount = PartyList.size(); // 파티 수만큼 툴팁,번호 설정 for(int i=0 ; iGetMemberCount()); // 공대 이름 int Partynum = PartyList[i]->GetPartyNum()+1; // 이번호는 전체 공대 파티중에서 몇번째인지를 나타내고 m_pPartyNumStatic[i]->SetCaption(CStringUtil::StringFormat("<#FFFFFF>%d",Partynum ).c_str() ) ; // 마크 설정 int nPartyRealNum = m_RaidMgr.getNumberAtPartyName(pParty->GetPartyName())+1; // 이번호는 실제 사용되는 파티이름의 번호이다. m_pPartyMarkStatic[i]->SetAniName(CStringUtil::StringFormat("common_mark_titanium_attackteam_%02d", nPartyRealNum ).c_str()); } // 내파티 번호 찾기 SetMyPartyNum(); if( (m_nPrePartyCount != m_nCurPartyCount) && m_bIsInitAttackUnit ) // 공대 파티수가 변했다면.. { InitParty(m_nCurPartyCount,m_nMyPartyNum); m_nPrePartyCount = m_nCurPartyCount; } } void SUIDungeonUnitMiniWnd::InitPartyControlPackage() { // 1. 컨트롤들 만들기. for(int i=0 ; i< ATTACK_UNIT::MAXPARTYCOUNT-1 ; ++i) { // 버튼 생성 - Up버튼 CopyControl(CStringUtil::StringFormat("button_attack_team_01").c_str(), CStringUtil::StringFormat("button_attack_team_%02d", i+2).c_str(), KRect(0,0,0,0)); // 버튼 생성 - Down버튼 CopyControl(CStringUtil::StringFormat("button_attack_team_release_01").c_str(), CStringUtil::StringFormat("button_attack_team_release_%02d", i+2).c_str(), KRect(0,0,0,0)); // 공대 순번 CopyControl(CStringUtil::StringFormat("text_number_01").c_str(), CStringUtil::StringFormat("text_number_%02d", i+2).c_str(), KRect(0,0,0,0)); } // 2. UI팀에서 제작한 컨트롤들의 레이어 순서 조절 // UI팀에서 만든 한세트 컨트롤과 파티마크의 레이어가 아래로 깔려서 안보이므로 조정.. SetChildAsTop("text_number_01"); // 공대번호 1번 SetChildAsTop("text_attack_team_invite_01"); // 공대 초대 스태틱 SetChildAsTop("mark_siegeleader_01"); // 공대장 마크 for(int i=0 ; i< ATTACK_UNIT::MAXPARTYCOUNT ; ++i) SetChildAsTop(CStringUtil::StringFormat("mark_attack_party_%02d", i+1).c_str()); //공대 파티 마크 // 3. 컨트롤 포인터 저장 for(int i=0 ; i< ATTACK_UNIT::MAXPARTYCOUNT ; ++i) { m_pPartyButton[i][UP_BUTTON_STATE] = dynamicCast(GetChild(CStringUtil::StringFormat("button_attack_team_%02d", i+1).c_str())); // Up 버튼 m_pPartyButton[i][DOWN_BTN_STATE] = dynamicCast(GetChild(CStringUtil::StringFormat("button_attack_team_release_%02d", i+1).c_str())); // Down 버튼 m_pPartyNumStatic[i] = dynamicCast(GetChild(CStringUtil::StringFormat("text_number_%02d", i+1).c_str())); // 공대 순번 m_pPartyMarkStatic[i] = dynamicCast(GetChild(CStringUtil::StringFormat("mark_attack_party_%02d", i+1).c_str())); // 공대 표시 마크 } m_pMyPartyStatic = dynamicCast(GetChild("panel_attack_my_team_01")); // 자신의 공대 m_pInvitePartyButton = dynamicCast(GetChild("button_invite_01")); // 공대 초대 m_pInvitePartyStatic = dynamicCast(GetChild("text_attack_team_invite_01")); // "+"스태틱 // 마우스 오버/ 언오버에 따라 show/unshow 될 컨트롤 들 m_pMouseOverShow[0] = dynamicCast(GetChild("titlebar_text")); m_pMouseOverShow[1] = dynamicCast(GetChild("titlebar_deco")); m_pMouseOverShow[2] = dynamicCast(GetChild("titlebar")); m_pMouseOverShow[3] = dynamicCast(GetChild("inframe")); m_pMouseOverShow[4] = dynamicCast(GetChild("outframe")); m_pMyPartyMark = dynamicCast(GetChild("mark_attack_my_team_01")); // 내파티 마크 // 4. 컨트롤 들 위치 설정 KRect rcButton = m_pPartyButton[0][UP_BUTTON_STATE]->GetRect(); // 버튼 KRect rcNumber = m_pPartyNumStatic[0]->GetRect(); // 번호 KRect rcMark = m_pPartyMarkStatic[0]->GetRect(); // 마크 for(int i=0 ; i< H_NUM ; ++i) { for(int j=0 ; jMovePos(rcButton.left + j*H_SIZE, rcButton.top + i*V_SIZE); // 업버튼 m_pPartyButton[k][DOWN_BTN_STATE]->MovePos(rcButton.left + j*H_SIZE, rcButton.top + i*V_SIZE); // 다운버튼 m_pPartyNumStatic[k]->MovePos(rcNumber.left + j*H_SIZE, rcNumber.top + i*V_SIZE); // 파티 번호 m_pPartyNumStatic[k]->SetCaption(CStringUtil::StringFormat("<#FFFFFF>%d", k+1).c_str()); // 파티번호는 바뀌지 않으므로 지금 넣는다. m_pPartyMarkStatic[k]->MovePos(rcMark.left + j*H_SIZE, rcMark.top + i*V_SIZE); // 파티표시 마크 } } // 공대 초대 관련 컨트롤 disable m_pInvitePartyButton->SetShow(false); m_pInvitePartyStatic->SetShow(false); m_pMyPartyStatic->SetShow(false); m_pInvitePartyButton->SetShow(false); m_pInvitePartyStatic->SetShow(false); // 업버튼이 보이도록 처리 for(int i=0 ; i< ATTACK_UNIT::MAXPARTYCOUNT ; ++i) { m_pPartyButton[i][UP_BUTTON_STATE]->SetShow(true); m_pPartyButton[i][DOWN_BTN_STATE]->SetShow(false); } // 툴팁 KUIControlStatic* pLeader = dynamicCast(GetChild("mark_siegeleader_01")); if(pLeader) pLeader->SetTooltip(S(5130)); //"5130:공대장 마크" KUIControlSimpleButton *pMax = dynamicCast(GetChild("button_transform_max")); if(pMax) pMax->SetTooltip(S(5129)); //"5129:기본 보기 버튼" KUIControlButton *pInvite = dynamicCast(GetChild("button_invite_01")); if(pInvite) pInvite->SetTooltip(S(12014)); // "12014:공대 파티장 초대" } void SUIDungeonUnitMiniWnd::SetPartyButtonToggle(int nPartyNum, bool bCurButtonState ) { if(nPartyNum == m_nMyPartyNum) { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(false); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(false); } else if(bCurButtonState == BUTTON_STATE::UP_BUTTON_STATE) //버튼Up상태면 버튼Down상태로 { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(false); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(true); g_bButtonState[nPartyNum] = BUTTON_STATE::DOWN_BTN_STATE; } else //버튼Down상태면 버튼UP상태로 { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(true); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(false); g_bButtonState[nPartyNum] = BUTTON_STATE::UP_BUTTON_STATE; } // 버튼이 외부메시지로 바뀌면 Select 상태로 변화 되는데 노멀상태로 강제 변환 시킨다.. m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetButtonState(KUIControlButton::KBUTTON_NORMAL); m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetButtonState(KUIControlButton::KBUTTON_NORMAL); } void SUIDungeonUnitMiniWnd::InitParty(int nPartyCount, int nMyPartNum) { // 현재 파티수 만큼 컨트롤 설정하고 for( int i=0 ; iSetShow(!g_bButtonState[nPartyNum]); // Up 버튼 m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(g_bButtonState[nPartyNum]); // Down 버튼 } else { m_pPartyButton[nPartyNum][UP_BUTTON_STATE]->SetShow(false); // Up 버튼 m_pPartyButton[nPartyNum][DOWN_BTN_STATE]->SetShow(false); // Down 버튼 } m_pPartyNumStatic[nPartyNum]->SetShow(bShow); // 공대 순번 m_pPartyMarkStatic[nPartyNum]->SetShow(bShow); // 공대 표시 마크 } void SUIDungeonUnitMiniWnd::SetShowMyParty() { // 컨트롤들 보이기,안보이기 설정 m_pPartyButton[m_nMyPartyNum][UP_BUTTON_STATE]->SetShow(false); // Up 버튼 m_pPartyButton[m_nMyPartyNum][DOWN_BTN_STATE]->SetShow(false); // Down 버튼 m_pPartyNumStatic[m_nMyPartyNum]->SetShow(true); // 공대 순번 m_pPartyMarkStatic[m_nMyPartyNum]->SetShow(false); // 공대 표시 마크 m_pMyPartyMark->SetShow(true); // 내파티 스태틱 컨트롤 위치 변경 m_pMyPartyStatic->SetShow(true); KRect rc = m_pPartyButton[m_nMyPartyNum][UP_BUTTON_STATE]->GetRect(); m_pMyPartyStatic->MovePos(rc.left,rc.top); rc = m_pPartyMarkStatic[m_nMyPartyNum]->GetRect(); m_pMyPartyMark->MovePos(rc.left,rc.top); } void SUIDungeonUnitMiniWnd::SetShowInviteControls(int nPartyCount, bool bShow ) { if(bShow) { m_pInvitePartyButton->SetShow(true); m_pInvitePartyStatic->SetShow(true); // 위치 설정 KRect rcRect = m_pPartyButton[nPartyCount][UP_BUTTON_STATE]->GetRect(); m_pInvitePartyButton->MovePos(rcRect.left,rcRect.top); // 버튼 위치 설정 rcRect = m_pPartyNumStatic[nPartyCount]->GetRect(); m_pInvitePartyStatic->MovePos(rcRect.left,rcRect.top); // "+" 스태틱 위치 설정 } else { m_pInvitePartyButton->SetShow(false); m_pInvitePartyStatic->SetShow(false); } } void SUIDungeonUnitMiniWnd::SetResizeFrame(int nPartyCount) { // 2011. 10. 17 - marine // 공대 숫자에 맞춰서 창의 크기를 조절하는데 // 처음에 공대 숫자가 Max라고 가정하고 // nPreCount 에서 현재 파티의 숫자를 뺀만큼을 bottom에서 빼서 창크기를 조절.. // 공대장일 경우에는 공대숫자를 하나 더 늘려서 계산(공대추가버튼) //static int m_nPreCount = MAXPARTYCOUNT; // 리사이즈 하기전의 버튼의 갯수 int nCurrentCount; // 현재 창의 갯수 if(m_bIsFirstResize) // 처음 리사이즈 할때는 파티의 갯수를 증가 { nCurrentCount = nPartyCount; m_bIsFirstResize = false; } else nCurrentCount = nPartyCount; // 리사이즈 할때의 버튼 갯수 if(m_bItsMeMaster && (nCurrentCount != m_nMaxPartyNum)) // 공대마스터일 경우 초대 버튼이 있으므로 하나 증가 ++nCurrentCount; //////////////// 2. 라인수 계산 //////////////// int nPreLine = m_nPreCount/V_NUM; // 라인수 계산 if(m_nPreCount%V_NUM) ++nPreLine; int nCurLine = nCurrentCount/V_NUM; if(nCurrentCount%V_NUM) ++nCurLine; int nFixCount = nPreLine - nCurLine; // 리사이즈 하기전,후의 차이 if(nFixCount == 0) { m_nPreCount = nCurrentCount; return; } /////////////////// 3. 렉트 수정 //////////////// KRect rcRect[3]; KUIControlStatic* pStatic1 = dynamicCast(GetChild("outframe")); KUIControlStatic* pStatic2 = dynamicCast(GetChild("inframe")); rcRect[0] = pStatic1->GetRect(); rcRect[1] = pStatic2->GetRect(); rcRect[2] = GetRect(); for( int i=0 ; i<3 ; ++i ) rcRect[i].bottom -= (nFixCount * V_SIZE); pStatic1->Resize(rcRect[0]); pStatic2->Resize(rcRect[1]); Resize(rcRect[2]); m_nPreCount = nCurrentCount; } void SUIDungeonUnitMiniWnd::AddParty() { if(m_nCurPartyCount == MAXPARTYCOUNT) return; SetShowParty(m_nCurPartyCount,true); if( m_nCurPartyCount == MAXPARTYCOUNT-1 ) // 공격대가 Max가 되는 경우 SetShowInviteControls(m_nCurPartyCount,false); else { SetShowInviteControls(m_nCurPartyCount+1,true); SetResizeFrame(m_nCurPartyCount); } ++m_nCurPartyCount; } void SUIDungeonUnitMiniWnd::SetMouseOver(bool bIsMouseOver) { if(bIsMouseOver) { for(int i=0 ; iSetShow(m_bIsMouseOver); } else { for(int i=0 ; iSetShow(m_bIsMouseOver); } } void SUIDungeonUnitMiniWnd::SaveButtonState() { for(int i=0 ; i< m_nCurPartyCount ; ++i) g_bButtonState[i] = m_pPartyButton[i][DOWN_BTN_STATE]->IsShow(); } void SUIDungeonUnitMiniWnd::SetButtonStateAll() { // 전체 버튼 설정 for(int i=0 ; i< m_nCurPartyCount ; ++i) SetButtonState(i); } void SUIDungeonUnitMiniWnd::SetButtonState(int nNumber) { // 각 파티별로 버튼 상태 설정 if( nNumber == m_nMyPartyNum) // 내파티 일경우 { SetShowMyParty(); } else // 내파티가 아닐 경우 { if(g_bButtonState[nNumber] == UP_BUTTON_STATE) { m_pPartyButton[nNumber][UP_BUTTON_STATE]->SetShow(true); m_pPartyButton[nNumber][DOWN_BTN_STATE]->SetShow(false); } else { m_pPartyButton[nNumber][UP_BUTTON_STATE]->SetShow(false); m_pPartyButton[nNumber][DOWN_BTN_STATE]->SetShow(true); } } } void SUIDungeonUnitMiniWnd::SetToolTip() { for(int i=0 ; i< m_nCurPartyCount ; ++i ) { if( i == m_nMyPartyNum) // 내파티일경우 { m_pMyPartyStatic->SetTooltip( m_strToolTip[i].c_str()); } else // 다른파티일경우 { m_pPartyButton[i][UP_BUTTON_STATE]->SetTooltip(m_strToolTip[i].c_str()); // 버튼 상태가 변하면 다시 설정해야 해서 둘다 하자.. m_pPartyButton[i][DOWN_BTN_STATE]->SetTooltip(m_strToolTip[i].c_str()); } } } SUIDungeonUnitInvitation::~SUIDungeonUnitInvitation() { } bool SUIDungeonUnitInvitation::InitControls( KPoint kPos ) { KUIControlEdit * pEdit = dynamicCast< KUIControlEdit * >( GetChild( "box_edit_01" ) ); if( pEdit ) { pEdit->SetLimitation( g_LimitText ); pEdit->SetLineChange( false ); pEdit->SetText(""); pEdit->SetCaption(""); pEdit->UseEmoticonFilter( false ); pEdit->SetFont( "font_02" ); } m_EditName = pEdit; return SUIWnd::InitControls( kPos ); } bool SUIDungeonUnitInvitation::InitData( bool bReload /*= false*/ ) { return SUIWnd::InitData( bReload ); } void SUIDungeonUnitInvitation::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch( nMessage ) { case KUI_MESSAGE::KBUTTON_CLICK: { if( ::_stricmp( lpszControlID, "button_ok" ) == 0 ) { // 초대 메시지 보내자.... // 공대결성 메세지 전송. SMSG_CHATTING_REQUEST msg; msg.type = CHAT_TYPE::CHAT_NORMAL; msg.strText = "/rp_ginvite "; msg.strText.append( m_EditName->GetText() ); m_pGameManager->ProcMsgAtStatic( &msg ); } else if( ::_stricmp( lpszControlID, "button_cancel" ) == 0 ) // 닫기 버튼 { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION , false) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MEMBER_LIST, false ) ); } else if( ::_stricmp( lpszControlID, "button_close_trim_01" ) == 0 ) // 닫기 버튼(x) { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_DUNGEON_UNIT_INVITATION , false) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MEMBER_LIST, false ) ); } else if( ::_stricmp( lpszControlID, "button_close_trim_02" ) == 0 ) // 길드원 리스트 { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_GUILD_MEMBER_LIST , true) ); } break; } break; case KUI_MESSAGE::KGENWND_MOVE: { LimitMoveWnd(); } } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } DWORD SUIDungeonUnitInvitation::OnMouseMessage(DWORD dwMessage, int x, int y) { switch( dwMessage ) { case KLBUTTON_DOWN : { if( m_EditName->GetRect().IsInRect( x, y ) ) m_EditName->SetFocus( true ); }break; } return SUIWnd::OnMouseMessage(dwMessage, x, y); } void SUIDungeonUnitInvitation::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { if( bOpen ) { m_EditName->SetText(""); } } void SUIDungeonUnitInvitation::ProcMsgAtStatic( SGameMessage* pMsg ) { switch( pMsg->nType ) { case IMSG_UI_SEND_DATA: { // 2011. 10. 26 - marine 길드창에서 선택된 길드원 이름을 얻는다. SIMSG_UI_SEND_DATA *pData = (SIMSG_UI_SEND_DATA *)pMsg; m_EditName->SetText(""); m_EditName->SetText(pData->m_strString.c_str()); } } }