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.
174 lines
4.4 KiB
174 lines
4.4 KiB
1 year ago
|
#include "asw_random_missions.h"
|
||
|
#include "MapLayout.h"
|
||
|
#include "LevelTheme.h"
|
||
|
#include "TileGenDialog.h"
|
||
|
#include "filesystem.h"
|
||
|
#include "Room.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
CASW_Random_Missions::CASW_Random_Missions() :
|
||
|
m_pCurrentMapLayout( NULL ),
|
||
|
m_bDirtyLayoutForMinimap( false )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CASW_Random_Missions::~CASW_Random_Missions()
|
||
|
{
|
||
|
delete m_pCurrentMapLayout;
|
||
|
}
|
||
|
|
||
|
vgui::Panel* CASW_Random_Missions::CreateTileGenFrame( vgui::Panel *parent )
|
||
|
{
|
||
|
if ( g_pTileGenDialog == NULL )
|
||
|
{
|
||
|
// add our main window
|
||
|
new CTileGenDialog( parent, "TileGenDialog" );
|
||
|
}
|
||
|
|
||
|
return g_pTileGenDialog;
|
||
|
}
|
||
|
|
||
|
void CASW_Random_Missions::LevelInitPostEntity( const char *pszMapName )
|
||
|
{
|
||
|
delete m_pCurrentMapLayout;
|
||
|
|
||
|
// try to load the layout for this map
|
||
|
char filename[128];
|
||
|
|
||
|
Q_snprintf( filename, sizeof( filename ), "maps/%s", pszMapName );
|
||
|
Q_SetExtension( filename, "layout", sizeof( filename ) );
|
||
|
|
||
|
char fullpath[MAX_PATH];
|
||
|
g_pFullFileSystem->RelativePathToFullPath( filename, "GAME", fullpath, sizeof( fullpath ) );
|
||
|
|
||
|
if ( g_pFullFileSystem->FileExists( filename ) )
|
||
|
{
|
||
|
CLevelTheme::LoadLevelThemes();
|
||
|
|
||
|
m_pCurrentMapLayout = new CMapLayout();
|
||
|
if ( !m_pCurrentMapLayout->LoadMapLayout( filename ) )
|
||
|
{
|
||
|
delete m_pCurrentMapLayout;
|
||
|
m_pCurrentMapLayout = NULL;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pCurrentMapLayout = NULL;
|
||
|
}
|
||
|
|
||
|
m_bDirtyLayoutForMinimap = true;
|
||
|
}
|
||
|
|
||
|
bool CASW_Random_Missions::ValidMapLayout()
|
||
|
{
|
||
|
return m_pCurrentMapLayout != NULL;
|
||
|
}
|
||
|
|
||
|
KeyValues* CASW_Random_Missions::GetGenerationOptions()
|
||
|
{
|
||
|
if ( !m_pCurrentMapLayout || !m_pCurrentMapLayout->GetGenerationOptions() )
|
||
|
return NULL;
|
||
|
|
||
|
return m_pCurrentMapLayout->GetGenerationOptions();
|
||
|
}
|
||
|
|
||
|
IASW_Room_Details* CASW_Random_Missions::GetRoomDetails( const Vector &vecPos )
|
||
|
{
|
||
|
if ( !m_pCurrentMapLayout )
|
||
|
return NULL;
|
||
|
|
||
|
// convert vecPos to a tile
|
||
|
int half_map_size = MAP_LAYOUT_TILES_WIDE * 0.5f; // shift back so the middle of our grid is the origin
|
||
|
int iTileX = vecPos.x / ASW_TILE_SIZE + half_map_size;
|
||
|
int iTileY = vecPos.y / ASW_TILE_SIZE + half_map_size;
|
||
|
|
||
|
if ( iTileX < 0 || iTileY < 0 || iTileX >= MAP_LAYOUT_TILES_WIDE || iTileY >= MAP_LAYOUT_TILES_WIDE )
|
||
|
return NULL;
|
||
|
|
||
|
return (IASW_Room_Details*) m_pCurrentMapLayout->m_pRoomGrid[ iTileX ][ iTileY ];
|
||
|
}
|
||
|
|
||
|
IASW_Room_Details* CASW_Random_Missions::GetStartRoomDetails()
|
||
|
{
|
||
|
if ( m_pCurrentMapLayout == NULL )
|
||
|
return NULL;
|
||
|
|
||
|
int iRooms = m_pCurrentMapLayout->m_PlacedRooms.Count();
|
||
|
for ( int i = 0; i < iRooms; i++ )
|
||
|
{
|
||
|
CRoom *pRoom = m_pCurrentMapLayout->m_PlacedRooms[ i ];
|
||
|
if ( !pRoom || !pRoom->m_pRoomTemplate->IsStartRoom() )
|
||
|
continue;
|
||
|
|
||
|
return (IASW_Room_Details*) pRoom;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
IASW_Room_Details* CASW_Random_Missions::GetRoomDetails( int iRoomIndex )
|
||
|
{
|
||
|
if ( iRoomIndex < 0 || iRoomIndex >= m_pCurrentMapLayout->m_PlacedRooms.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return (IASW_Room_Details*) m_pCurrentMapLayout->m_PlacedRooms[ iRoomIndex ];
|
||
|
}
|
||
|
|
||
|
int CASW_Random_Missions::GetNumRooms()
|
||
|
{
|
||
|
return m_pCurrentMapLayout->m_PlacedRooms.Count();
|
||
|
}
|
||
|
|
||
|
int CASW_Random_Missions::GetNumEncounters()
|
||
|
{
|
||
|
return m_pCurrentMapLayout->m_Encounters.Count();
|
||
|
}
|
||
|
|
||
|
IASW_Encounter* CASW_Random_Missions::GetEncounter( int i )
|
||
|
{
|
||
|
if ( i < 0 || i >= m_pCurrentMapLayout->m_Encounters.Count() )
|
||
|
return NULL;
|
||
|
|
||
|
return (IASW_Encounter*) m_pCurrentMapLayout->m_Encounters[ i ];
|
||
|
}
|
||
|
|
||
|
void CASW_Random_Missions::GetMapBounds( Vector *vecWorldMins, Vector *vecWorldMaxs )
|
||
|
{
|
||
|
if ( !m_pCurrentMapLayout )
|
||
|
return;
|
||
|
|
||
|
// find world bounds
|
||
|
vecWorldMins->x = 65535;
|
||
|
vecWorldMins->y = 65535;
|
||
|
vecWorldMins->z = 65535;
|
||
|
vecWorldMaxs->x = -65535;
|
||
|
vecWorldMaxs->y = -65535;
|
||
|
vecWorldMaxs->z = -65535;
|
||
|
|
||
|
Vector vecRoomMins = vec3_origin, vecRoomMaxs = vec3_origin;
|
||
|
int iNumRooms = GetNumRooms();
|
||
|
for ( int i = 0 ; i < iNumRooms ; i++ )
|
||
|
{
|
||
|
IASW_Room_Details* pRoom = GetRoomDetails( i );
|
||
|
if ( !pRoom )
|
||
|
continue;
|
||
|
|
||
|
pRoom->GetWorldBounds( &vecRoomMins, &vecRoomMaxs );
|
||
|
vecWorldMins->x = MIN( vecWorldMins->x, vecRoomMins.x );
|
||
|
vecWorldMins->y = MIN( vecWorldMins->y, vecRoomMins.y );
|
||
|
vecWorldMins->z = MIN( vecWorldMins->z, vecRoomMins.z );
|
||
|
vecWorldMaxs->x = MAX( vecWorldMaxs->x, vecRoomMaxs.x );
|
||
|
vecWorldMaxs->y = MAX( vecWorldMaxs->y, vecRoomMaxs.y );
|
||
|
vecWorldMaxs->z = MAX( vecWorldMaxs->z, vecRoomMaxs.z );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CASW_Random_Missions::CheckAndCleanDirtyLayout( void )
|
||
|
{
|
||
|
bool bDirty = m_bDirtyLayoutForMinimap;
|
||
|
m_bDirtyLayoutForMinimap = false;
|
||
|
|
||
|
return bDirty;
|
||
|
}
|