You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.4 KiB
248 lines
6.4 KiB
#include <vgui/IVGui.h> |
|
#include <vgui/IInput.h> |
|
#include "vgui_controls/Controls.h" |
|
#include <vgui/IScheme.h> |
|
#include <vgui_controls/Scrollbar.h> |
|
#include "vgui/ISurface.h" |
|
#include "vgui/KeyCode.h" |
|
#include "vgui/missionchooser_tgaimagepanel.h" |
|
#include "vgui/npc_spawns_panel.h" |
|
#include "MapLayoutPanel.h" |
|
#include "TileGenDialog.h" |
|
#include "TileSource/RoomTemplate.h" |
|
#include "TileSource/Room.h" |
|
#include "TileSource/MapLayout.h" |
|
#include "PlacedRoomTemplatePanel.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include <tier0/memdbgon.h> |
|
|
|
using namespace vgui; |
|
|
|
CMapLayoutPanel::CMapLayoutPanel( Panel *parent, const char *name ) : BaseClass( parent, name ) |
|
{ |
|
SetPaintBackgroundEnabled(true); |
|
SetMouseInputEnabled(true); |
|
|
|
m_pPlayerStartImagePanel = new CMissionChooserTGAImagePanel(this, "PlayerStartImagePanel"); |
|
m_pPlayerStartImagePanel->SetZPos(10); // make sure it's above the rooms |
|
|
|
m_pSpawnsPanel = new CNPC_Spawns_Panel( this, "SpawnsPanel" ); |
|
m_pSpawnsPanel->SetZPos( 9 ); |
|
} |
|
|
|
CMapLayoutPanel::~CMapLayoutPanel( void ) |
|
{ |
|
} |
|
|
|
void CMapLayoutPanel::PerformLayout() |
|
{ |
|
BaseClass::PerformLayout(); |
|
if (!g_pTileGenDialog) |
|
return; |
|
|
|
// make sure we're big enough to hold the max map size |
|
int w = g_pTileGenDialog->RoomTemplatePanelTileSize() * g_pTileGenDialog->MapLayoutTilesWide(); |
|
SetSize(w, w); |
|
|
|
m_pPlayerStartImagePanel->SetSize(g_pTileGenDialog->RoomTemplatePanelTileSize(), g_pTileGenDialog->RoomTemplatePanelTileSize()); |
|
// position playerstart within the grid |
|
int pos_y = GetMapLayout()->m_iPlayerStartTileY; |
|
pos_y = g_pTileGenDialog->MapLayoutTilesWide() - pos_y; // reverse the Y axis |
|
|
|
int pos_x = GetMapLayout()->m_iPlayerStartTileX * g_pTileGenDialog->RoomTemplatePanelTileSize(); |
|
pos_y *= g_pTileGenDialog->RoomTemplatePanelTileSize(); |
|
m_pPlayerStartImagePanel->SetPos(pos_x, pos_y); |
|
} |
|
|
|
void CMapLayoutPanel::ApplySchemeSettings(vgui::IScheme *pScheme) |
|
{ |
|
BaseClass::ApplySchemeSettings(pScheme); |
|
SetBgColor(Color(0,0,0,255)); |
|
SetPaintBackgroundEnabled(true); |
|
SetPaintBackgroundType(0); |
|
|
|
m_pPlayerStartImagePanel->SetTGA("tilegen/roomtemplates/playerstart.tga"); |
|
} |
|
|
|
void CMapLayoutPanel::Paint() |
|
{ |
|
if ( !g_pTileGenDialog ) |
|
return; |
|
|
|
int iTiles = g_pTileGenDialog->MapLayoutTilesWide(); |
|
int iTileSize = g_pTileGenDialog->RoomTemplatePanelTileSize(); |
|
|
|
// draw dark grid lines |
|
surface()->DrawSetColor(Color(32,32,32,255)); |
|
for (int x=0;x<iTiles;x++) |
|
{ |
|
if (x % 4 != 0) |
|
{ |
|
vgui::surface()->DrawLine(x*iTileSize, 0, x*iTileSize, GetTall()); |
|
} |
|
} |
|
for (int y=0;y<iTiles;y++) |
|
{ |
|
if (y % 4 != 0) |
|
{ |
|
vgui::surface()->DrawLine(0, y*iTileSize, GetWide(), y*iTileSize); |
|
} |
|
} |
|
|
|
// draw brighter grid lines |
|
surface()->DrawSetColor(Color(64,64,64,255)); |
|
for (int x=0;x<iTiles;x++) |
|
{ |
|
if (x % 4 == 0) |
|
{ |
|
vgui::surface()->DrawLine(x*iTileSize, 0, x*iTileSize, GetTall()); |
|
} |
|
} |
|
for (int y=0;y<iTiles;y++) |
|
{ |
|
if (y % 4 == 0) |
|
{ |
|
vgui::surface()->DrawLine(0, y*iTileSize, GetWide(), y*iTileSize); |
|
} |
|
} |
|
|
|
int sx, sy; |
|
if ( g_pTileGenDialog->GetRubberBandStart( sx, sy ) ) |
|
{ |
|
int mx, my; |
|
input()->GetCursorPos(mx, my); |
|
ScreenToLocal(mx, my); |
|
|
|
surface()->DrawSetColor( Color( 255,255,64,255 ) ); |
|
|
|
if ( sx > mx ) |
|
{ |
|
int i = mx; |
|
mx = sx; |
|
sx = i; |
|
} |
|
if ( sy > my ) |
|
{ |
|
int i = my; |
|
my = sy; |
|
sy = i; |
|
} |
|
vgui::surface()->DrawOutlinedRect( sx, sy, mx, my ); |
|
} |
|
} |
|
|
|
void CMapLayoutPanel::GetCursorTile(int &tilex, int &tiley) |
|
{ |
|
if ( !g_pTileGenDialog ) |
|
return; |
|
|
|
// find the tile we clicked in |
|
int mx, my; |
|
input()->GetCursorPos(mx, my); |
|
ScreenToLocal(mx, my); |
|
tilex = mx / g_pTileGenDialog->RoomTemplatePanelTileSize(); |
|
tiley = (my / g_pTileGenDialog->RoomTemplatePanelTileSize()); |
|
// reverse the Y axis |
|
tiley = g_pTileGenDialog->MapLayoutTilesWide() - tiley - 1; |
|
} |
|
|
|
void CMapLayoutPanel::OnMouseReleased(vgui::MouseCode code) |
|
{ |
|
if (g_pTileGenDialog && g_pTileGenDialog->m_pCursorTemplate) // if we're in 'room stamping down' mode |
|
{ |
|
if (code == MOUSE_LEFT) // if we left click with a room to stamp down |
|
{ |
|
int iTileX = 0; |
|
int iTileY = 0; |
|
GetCursorTile(iTileX, iTileY); |
|
|
|
// check our room wouldn't go out of bounds if placed here |
|
if (iTileX < 0 || iTileY < 0 || iTileX >= g_pTileGenDialog->MapLayoutTilesWide() || iTileY >= g_pTileGenDialog->MapLayoutTilesWide()) |
|
return; |
|
|
|
if (iTileX + g_pTileGenDialog->m_pCursorTemplate->GetTilesX() > g_pTileGenDialog->MapLayoutTilesWide() |
|
|| iTileY + g_pTileGenDialog->m_pCursorTemplate->GetTilesY() > g_pTileGenDialog->MapLayoutTilesWide()) |
|
return; |
|
|
|
if ( !GetMapLayout()->TemplateFits( g_pTileGenDialog->m_pCursorTemplate, iTileX, iTileY ) ) |
|
{ |
|
Msg(" Template doesn't fit there!\n" ); |
|
return; |
|
} |
|
|
|
// place the room |
|
AddRoom(g_pTileGenDialog->m_pCursorTemplate, iTileX, iTileY); |
|
Msg( "Manually added room %s at %d,%d\n", g_pTileGenDialog->m_pCursorTemplate->GetFullName(), iTileX, iTileY ); |
|
} |
|
else if ( code == MOUSE_RIGHT ) |
|
{ |
|
// clear the current room attached to the cursor if we right click over the map |
|
g_pTileGenDialog->SetCursorRoomTemplate(NULL); |
|
} |
|
} |
|
else if ( g_pTileGenDialog ) // if we right click over the map without a room to stamp down, then manipulate existing rooms |
|
{ |
|
//g_pTileGenDialog->ClearRoomSelection(); |
|
|
|
int mx, my; |
|
input()->GetCursorPos(mx, my); |
|
ScreenToLocal(mx, my); |
|
|
|
g_pTileGenDialog->EndRubberBandSelection( mx, my ); |
|
} |
|
} |
|
|
|
void CMapLayoutPanel::OnMousePressed(vgui::MouseCode code) |
|
{ |
|
if ( !g_pTileGenDialog ) |
|
return; |
|
|
|
if ( !g_pTileGenDialog->m_pCursorTemplate && ( code == MOUSE_LEFT ) ) |
|
{ |
|
int mx, my; |
|
input()->GetCursorPos(mx, my); |
|
ScreenToLocal(mx, my); |
|
|
|
g_pTileGenDialog->StartRubberBandSelection( mx, my ); |
|
} |
|
} |
|
|
|
void CMapLayoutPanel::AddRoom( const CRoomTemplate *pTemplate, int iTileX, int iTileY ) |
|
{ |
|
if ( !g_pTileGenDialog ) |
|
return; |
|
|
|
CRoom *pRoom = new CRoom( GetMapLayout(), g_pTileGenDialog->m_pCursorTemplate, iTileX, iTileY ); |
|
CreateRoomUIPanel( pRoom ); |
|
} |
|
|
|
void CMapLayoutPanel::RemoveRoom(CRoom *pRoom) |
|
{ |
|
delete pRoom; |
|
} |
|
|
|
void CMapLayoutPanel::CreateAllUIPanels() |
|
{ |
|
if ( !GetMapLayout() ) |
|
return; |
|
|
|
for ( int i=0; i<GetMapLayout()->m_PlacedRooms.Count(); i++ ) |
|
{ |
|
CRoom *pRoom = GetMapLayout()->m_PlacedRooms[i]; |
|
CreateRoomUIPanel( pRoom ); |
|
} |
|
} |
|
|
|
void CMapLayoutPanel::CreateRoomUIPanel( CRoom *pRoom ) |
|
{ |
|
if ( !pRoom->m_pPlacedRoomPanel ) |
|
{ |
|
pRoom->m_pPlacedRoomPanel = new CPlacedRoomTemplatePanel(pRoom, this, "PlacedRoomPanel"); |
|
} |
|
} |
|
|
|
CMapLayout* CMapLayoutPanel::GetMapLayout() |
|
{ |
|
return g_pTileGenDialog ? g_pTileGenDialog->GetMapLayout() : NULL; |
|
} |