/// 2010.11.17 - prodongi #include "stdafx.h" #include #include "SUIWorldDetailMapWnd.h" #include "SUIWorldMapWnd.h" //#include "Util.h" //#include "SGameMessageUI.h" #include "SGameMessage.h" #include "SPlayerInfoMgr.h" #include "KUIControlStatic.h" #include "SGameCamera.h" //#include "SUIUtil.h" /// 2011.03.18 - prodongi #include "SFieldPropResourceDB.h" /// 2011.07.21 - prodongi #include "SGameSystem.h" extern SGameSystem* g_pCurrentGameSystem; /* */ SUIWorldDetailMapWnd::SUIWorldDetailMapWnd(SGameManager* pGameManager) : SUIWnd(pGameManager) { m_rtWorldWnd = NULL; m_playerWnd = NULL; m_isClosed = false; m_playerRadian = 0.0f; m_bPointSign = FALSE; m_dwPlayerPointTime = 0; } /* */ SUIWorldDetailMapWnd::~SUIWorldDetailMapWnd() { m_npcList.clear(); } /* */ bool SUIWorldDetailMapWnd::InitData( bool bReload ) { if (!SUIWnd::InitData(bReload)) return false; m_rtWorldWnd = GetChild("static_temp"); m_playerWnd = GetChild("worldmap_player"); /// 2011.03.16 test - prodongi m_oriWorldRect = m_rtWorldWnd->GetRect(); return true; } /* */ void SUIWorldDetailMapWnd::createNpc(vecNpcInfo const& npcList) { if (!m_rtWorldWnd) return ; std::string iconName; KPoint uiBasisPos(m_rtWorldWnd->GetRect().left, m_rtWorldWnd->GetRect().top); vecNpcInfo::const_iterator it = npcList.begin(); for (; it != npcList.end(); ++it) { if (m_worldRect.IsInRect(it->x, it->y)) { getNpcIconAniName(iconName, it->type, 0); /// 2011.03.18 - prodongi KUIWnd* wnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "iconstatic", it->strName.c_str(), " ", KRect(-1,-1,-1, -1), 0, 0, this, iconName.c_str(), "ui_frame.spr", m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) ); if( wnd ) { wnd->SetShow(true); std::string tooltip; if( g_pCurrentGameSystem->GetLocalPlayerPermission() > 0 ) { XStringUtil::Format( tooltip, "%s(%d,%d)", it->strName.c_str(), it->x, it->y ); } else { tooltip = it->strName; } (( KUIControlIconStatic*)wnd)->SetTooltip( tooltip.c_str() ); setWorldToUiPos(KPoint(it->x, it->y), uiBasisPos, wnd); SNpcResourceDB::NPCRenderInfo npc = *it; npc.wnd = wnd; m_npcList.push_back(npc); } } } SetChildAsTop("worldmap_player"); } /// 2011.07.21 - prodongi void SUIWorldDetailMapWnd::createDungeonGate(vecDungeonGateInfo const& dungeonGateList) { if (!m_rtWorldWnd) return ; std::string iconName; KPoint uiBasisPos(m_rtWorldWnd->GetRect().left, m_rtWorldWnd->GetRect().top); vecDungeonGateInfo::const_iterator it = dungeonGateList.begin(); for (; it != dungeonGateList.end(); ++it) { if (m_worldRect.IsInRect(it->m_x, it->m_y)) { FieldPropResource* prop = GetFieldPropResourceDB().GetFieldPropResource(it->m_id); if (prop) { char const* name = S(prop->text_id); getDungeonGateIconAniName(iconName, 1);//it->m_type); KUIWnd* wnd = m_pManager->CreateControl( KUIWND_CREATE_ARG( "iconstatic", name, " ", KRect(-1,-1,-1, -1), 0, 0, this, iconName.c_str(), "ui_frame.spr", m_pManager, 0, "", KANCHOR_LEFT | KANCHOR_TOP ) ); if( wnd ) { wnd->SetShow(true); std::string tooltip; if( g_pCurrentGameSystem->GetLocalPlayerPermission() > 0 ) { XStringUtil::Format( tooltip, "%s(%d,%d)", name, it->m_x, it->m_y ); } else { tooltip = name; } (( KUIControlIconStatic*)wnd)->SetTooltip(tooltip.c_str()); setWorldToUiPos(KPoint(it->m_x, it->m_y), uiBasisPos, wnd); } } } } } /* /// 2011.03.15 test 코드, 혹시 몰르니 남겨둔다 - prodongi */ /* void SUIWorldDetailMapWnd::refreshNpcPos(KRect const& offset) { KRect r = m_rtWorldWnd->GetRect(); r.left += offset.left; r.right += offset.right; r.top += offset.top; r.bottom += offset.bottom; m_rtWorldWnd->SetRect(r); _oprint("%d, %d, %d, %d / ", r.left, r.top, r.right, r.bottom); _oprint("%d, %d, %d, %d\n", r.left - m_oriWorldRect.left, r.top - m_oriWorldRect.top, r.right - m_oriWorldRect.right, r.bottom - m_oriWorldRect.bottom); KPoint uiBasisPos(m_rtWorldWnd->GetRect().left, m_rtWorldWnd->GetRect().top); vecNpcInfo::iterator it = m_npcList.begin(); for (; it != m_npcList.end(); ++it) { setWorldToUiPos(KPoint(it->x, it->y), uiBasisPos, it->wnd); } } */ /* */ void SUIWorldDetailMapWnd::Process(DWORD dwTime, DWORD elapsedtime) { if (!IsShow()) return ; KUIWnd::Process(dwTime); procNpcPeriodic(); if (m_updateAlpha.m_active) { float e_t = (float)elapsedtime/1000.0f; if (!m_updateAlpha.update(e_t * 2.0f)) { if (true == m_updateAlpha.m_toggleDir) m_isClosed = true; } ChangeAlpha(m_updateAlpha.m_elapsedTime); } if ( dwTime-m_dwPlayerPointTime > WORLDSIGNTIME ) { m_playerWnd->SetShow(m_bPointSign); m_bPointSign = !m_bPointSign; m_dwPlayerPointTime = dwTime; } } /* */ void SUIWorldDetailMapWnd::PumpUpMessage(LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam) { switch(nMessage) { case KUI_MESSAGE::KBUTTON_CLICK: { buttonClick(lpszControlID, lparam, wparam); } break; case KUI_MESSAGE::KFOCUS_ACTIVATED: #ifdef _DEV MoveWorld(KPoint(lparam,wparam)); #else if( GameRule::GetCurrentLocalBitSet() == GameRule::LOCAL_BITSET::KR && g_pCurrentGameSystem->GetLocalPlayerPermission() > 0 ) MoveWorld(KPoint(lparam,wparam)); #endif break; case KUI_MESSAGE::KGENWND_RIGHT_CLICK: { buttonClick("button_home_01", 0, 0); } break; } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } /* */ void SUIWorldDetailMapWnd::ProcMsgAtStatic(SGameMessage* pMsg) { switch(pMsg->nType) { case IMSG_UI_2DPOS_INFO: { SIMSG_UI_2DPOS_INFO* p2DPosMsg = (SIMSG_UI_2DPOS_INFO*)pMsg; switch( p2DPosMsg->nObjType ) { case SIMSG_UI_2DPOS_INFO::TY_MY: { if( !m_PlayerInfoMgr.IsLocalPlayer(p2DPosMsg->handle) ) break; setPlayerWorldPos( p2DPosMsg->nReal_X, p2DPosMsg->nReal_Y ); if( p2DPosMsg->fRadian ) { if( m_playerRadian != p2DPosMsg->fRadian ) { m_playerRadian = p2DPosMsg->fRadian; /// 2011.03.14 - prodongi //((KUIControlStatic*)m_playerWnd)->SetRotate( (SGameCamera::PI/2) - m_playerRadian ); setPlayerRotation(p2DPosMsg->fRadian); } } } break; case SIMSG_UI_2DPOS_INFO::TY_PLAYER: { //if( m_PartyMgr.IsExistMember(p2DPosMsg->handle) ) // refreshPartyPlayerPos(); } break; } pMsg->bUse = true; } break; /* /// 2011.03.14 카메라 방향은 설정 안 하기로 한다 - prodongi case IMSG_UI_MY_DEGREE: { if (IsShow() && m_playerWnd) { SIMSG_UI_MY_DEGREE* pRotateMsg = (SIMSG_UI_MY_DEGREE*)pMsg; /// 2011.03.14 - prodongi //((KUIControlStatic*)m_playerWnd)->SetRotate( (SGameCamera::PI/2) - pRotateMsg->fRadian ); setPlayerRotation(pRotateMsg->fRadian); pMsg->bUse = true; } } break; */ } } /* */ void SUIWorldDetailMapWnd::buttonClick(LPCSTR lpszControlID, DWORD lparam, DWORD wparam) { SUIWorldMapWnd* parentWnd = dynamicCast(GetParent()); if( ::_stricmp( lpszControlID, "button_home_01" ) == 0 ) { parentWnd->readyCloseDetailMap(); } else if (::_stricmp( lpszControlID, "button_map_move_to_01" ) == 0) { SetChildShow(lpszControlID, false); /// 맵이 이동될 때 up 버튼 이미지가 보기 안좋아서 안보이게 설정함 - prodongi parentWnd->readyOpenTownDetailMap(0); } else if (::_stricmp( lpszControlID, "button_map_move_to_02" ) == 0) { SetChildShow(lpszControlID, false); parentWnd->readyOpenTownDetailMap(1); } else if (::_stricmp( lpszControlID, "button_map_move_to_03" ) == 0) { SetChildShow(lpszControlID, false); parentWnd->readyOpenTownDetailMap(2); } else if (::_stricmp( lpszControlID, "button_map_move_to_04" ) == 0) { SetChildShow(lpszControlID, false); parentWnd->readyOpenTownDetailMap(3); } /// 2011.06.02 - prodongi else if (::_stricmp(lpszControlID, "button_zoom_in_village_01") == 0) { parentWnd->readyOpenVillageDetailMap(0); } else if (::_stricmp(lpszControlID, "button_zoom_in_village_03") == 0) { parentWnd->readyOpenVillageDetailMap(2); } else if (::_stricmp(lpszControlID, "button_zoom_in_village_04") == 0) { parentWnd->readyOpenVillageDetailMap(3); } else if (::_stricmp(lpszControlID, "button_zoom_in_village_05") == 0) { parentWnd->readyOpenVillageDetailMap(4); } else if (::_stricmp(lpszControlID, "button_zoom_in_village_06") == 0) { parentWnd->readyOpenVillageDetailMap(5); } else if (::_stricmp( lpszControlID, "button_zoom_in_rondo_village_01" ) == 0) { parentWnd->readyOpenTownDetailMap(0); } else if (::_stricmp( lpszControlID, "button_zoom_in_rondo_village_02" ) == 0) { parentWnd->readyOpenTownDetailMap(1); } else if (::_stricmp( lpszControlID, "button_zoom_in_rondo_village_03" ) == 0) { parentWnd->readyOpenTownDetailMap(2); } else if (::_stricmp( lpszControlID, "button_zoom_in_rondo_village_04" ) == 0) { parentWnd->readyOpenTownDetailMap(3); } else if( ::_stricmp( lpszControlID, "button_zoom_out" ) == 0 ) { int fieldIndex = calcFieldIndex(); if (0 <= fieldIndex) parentWnd->readyOpenFieldDetailMap(fieldIndex); } } /* */ void SUIWorldDetailMapWnd::setPlayerWorldPos(int worldX, int worldY) { m_playerWorldPos.x = worldX; m_playerWorldPos.y = worldY; refreshPlayerPos(); } /* */ void SUIWorldDetailMapWnd::refreshPlayerPos() { KPoint uiBasisPos(m_rtWorldWnd->GetRect().left, m_rtWorldWnd->GetRect().top); setWorldToUiPos(m_playerWorldPos, uiBasisPos, m_playerWnd); checkVisibleIsInRegionPlayer(); /// 2011.03.14 - prodongi } /* */ void SUIWorldDetailMapWnd::setWorldToUiPos(KPoint const& worldPos, KPoint const& uiBasisPos, KUIWnd* wnd) { if (!m_rtWorldWnd) return ; if (!wnd) return ; /// 상대 좌표 KPoint relativeWorldPos; relativeWorldPos.x = worldPos.x - m_worldRect.left; relativeWorldPos.y = worldPos.y - m_worldRect.top; KPoint uiPos; SUIWorldMapWnd::convertWorldToUiPos(relativeWorldPos, uiPos, m_rtWorldWnd->GetRect(), KPoint(m_worldRect.GetWidth(), m_worldRect.GetHeight()), 0, 0); if(m_playerWnd) { wnd->MovePos(uiBasisPos.x + uiPos.x - (wnd->GetRect().GetWidth()/2), uiBasisPos.y + uiPos.y - (wnd->GetRect().GetHeight()/2)); } } /* */ void SUIWorldDetailMapWnd::procNpcPeriodic() { vecNpcInfo::iterator it = m_npcList.begin(); for (; it != m_npcList.end(); ++it) { if ((*it).is_periodic) { time_t nowtime; time(&nowtime); if((*it).begin_of_period > nowtime || (*it).end_of_period < nowtime) it->wnd->SetShow(false); else it->wnd->SetShow(true); } } } /* */ void SUIWorldDetailMapWnd::beginAlpha() { m_updateAlpha.m_toggle = true; m_updateAlpha.m_toggleDir = true; m_updateAlpha.begin(1.0f, false); ChangeAlpha(m_updateAlpha.m_elapsedTime); } /* */ void SUIWorldDetailMapWnd::endAlpha() { m_updateAlpha.m_toggle = true; m_updateAlpha.m_toggleDir = false; m_updateAlpha.begin(1.0f, false); m_updateAlpha.m_elapsedTime = GetAlpha(); } /* /// 2011.03.14 - prodongi */ void SUIWorldDetailMapWnd::checkVisibleIsInRegionPlayer() { SUIWorldMapWnd* parentWnd = dynamicCast(GetParent()); bool isIn = parentWnd->checkVisibleIsInRegionPlayer(m_playerWnd->GetRect()); m_playerWnd->SetShow(isIn); } /* /// 2011.03.14 - prodongi */ void SUIWorldDetailMapWnd::setPlayerRotation(float radian) { float offset = SGameCamera::PI/4.0f; ((KUIControlStatic*)m_playerWnd)->SetRotate( (SGameCamera::PI/2) - radian + offset ); } /// 2011.06.02 - prodongi int SUIWorldDetailMapWnd::calcFieldIndex() { if (FIELD == m_type) { return -1; } else if (VILLAGE == m_type) { switch (m_index) { case 0: return 0; case 2: return 11; case 3: return 13; case 4: return 15; case 5: return 1; } } else if (TOWN == m_type) { return 7; } return -1; } /// 2011.08.30 - prodongi void SUIWorldDetailMapWnd::convertWorldToUiPos(KPoint const& worldPos, KPoint& uiPos) { KPoint uiBasisPos(m_rtWorldWnd->GetRect().left, m_rtWorldWnd->GetRect().top); KPoint relativeWorldPos; relativeWorldPos.x = worldPos.x - m_worldRect.left; relativeWorldPos.y = worldPos.y - m_worldRect.top; SUIWorldMapWnd::convertWorldToUiPos(relativeWorldPos, uiPos, m_rtWorldWnd->GetRect(), KPoint(m_worldRect.GetWidth(), m_worldRect.GetHeight()), 0, 0); uiPos.x += uiBasisPos.x; uiPos.y += uiBasisPos.y; } void SUIWorldDetailMapWnd::changeNpcIconToFinish(const std::vector &changeList) { size_t changeSize = changeList.size(); for (size_t c_i = 0; c_i < changeSize; ++c_i) { int changeId = changeList[c_i]; if (0 == changeId) continue; size_t npcSize = m_npcList.size(); for (size_t n_i = 0; n_i < npcSize; ++n_i) { if (m_npcList[n_i].nID.value() == changeId) { m_npcList[n_i].wnd->SetBack("ui_frame.spr", "common_mark_minimap_npc_quest03"); } } } } void SUIWorldDetailMapWnd::restoreNpcIconToOriginal(const std::vector &restoreList) { std::string iconName; size_t restoreSize = restoreList.size(); for (size_t c_i = 0; c_i < restoreSize; ++c_i) { int changeId = restoreList[c_i]; if (0 == changeId) continue; size_t npcSize = m_npcList.size(); for (size_t n_i = 0; n_i < npcSize; ++n_i) { if (m_npcList[n_i].nID.value() == changeId) { getNpcIconAniName(iconName, m_npcList[n_i].type, 0); /// 2011.03.18 - prodongi m_npcList[n_i].wnd->SetBack("ui_frame.spr", iconName.c_str()); } } } } void SUIWorldDetailMapWnd::MoveWorld(KPoint uiPos) { if( !HIBYTE(GetAsyncKeyState(VK_CONTROL)) ) return; if (!m_rtWorldWnd) return ; /// 상대 좌표 KPoint relativeWorldPos; KPoint offset(m_rtWorldWnd->GetRect().left, m_rtWorldWnd->GetRect().top); uiPos.x -= offset.x; uiPos.y -= offset.y; SUIWorldMapWnd::convertUiToWorldPos(uiPos, relativeWorldPos, m_rtWorldWnd->GetRect(), KPoint(m_worldRect.GetWidth(), m_worldRect.GetHeight()), 0, 0); relativeWorldPos.x = relativeWorldPos.x + m_worldRect.left; relativeWorldPos.y = relativeWorldPos.y + m_worldRect.top; g_pCurrentGameSystem->OnMsgMoveMap ( relativeWorldPos.x, relativeWorldPos.y ); SDEBUGLOG( "[Detail map click pos ui= %d,%d world= %d,%d]", uiPos.x, uiPos.y, relativeWorldPos.x, relativeWorldPos.y); }