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.
126 lines
4.0 KiB
126 lines
4.0 KiB
1 year ago
|
#ifndef TILEGEN_ROOM_TEMPLATE_H
|
||
|
#define TILEGEN_ROOM_TEMPLATE_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "missionchooser/iasw_random_missions.h"
|
||
|
|
||
|
class CLevelTheme;
|
||
|
class KeyValues;
|
||
|
|
||
|
enum ExitDirection_t
|
||
|
{
|
||
|
EXITDIR_BEGIN = 0,
|
||
|
EXITDIR_NORTH = 0,
|
||
|
EXITDIR_EAST = 1,
|
||
|
EXITDIR_SOUTH = 2,
|
||
|
EXITDIR_WEST = 3,
|
||
|
EXITDIR_END = 4,
|
||
|
};
|
||
|
|
||
|
ExitDirection_t GetDirectionFromString( const char *pDirectionString );
|
||
|
|
||
|
#define MAX_EXIT_TAG_LENGTH 64
|
||
|
|
||
|
static const int MIN_SPAWN_WEIGHT = 0;
|
||
|
static const int MAX_SPAWN_WEIGHT = 5;
|
||
|
|
||
|
// describes the location and facing of an exit within a room
|
||
|
class CRoomTemplateExit
|
||
|
{
|
||
|
public:
|
||
|
CRoomTemplateExit()
|
||
|
{
|
||
|
m_iXPos = 0;
|
||
|
m_iYPos = 0;
|
||
|
m_ExitDirection = EXITDIR_NORTH;
|
||
|
m_iZChange = 0;
|
||
|
m_szExitTag[0] = 0;
|
||
|
m_bChokepointGrowSource = false;
|
||
|
}
|
||
|
|
||
|
static void GetExitOffset( ExitDirection_t Direction, int *pX, int *pY );
|
||
|
static ExitDirection_t GetOppositeDirection( ExitDirection_t Direction );
|
||
|
|
||
|
int m_iXPos; // exit's position within its room template
|
||
|
int m_iYPos; // note: y-axis is reversed compared to vgui to match hammer's co-ord style
|
||
|
ExitDirection_t m_ExitDirection;
|
||
|
int m_iZChange; // z-change (in number of our fixed z-steps) that this exit is, compared to the room's base z pos (currently unused)
|
||
|
char m_szExitTag[MAX_EXIT_TAG_LENGTH];
|
||
|
bool m_bChokepointGrowSource;
|
||
|
};
|
||
|
|
||
|
// describes a particular room template. Mapper places instances of these over the level to create the desired map layout.
|
||
|
class CRoomTemplate
|
||
|
{
|
||
|
public:
|
||
|
CRoomTemplate(CLevelTheme* pLevelTheme);
|
||
|
~CRoomTemplate();
|
||
|
|
||
|
void Clear();
|
||
|
|
||
|
void LoadFromKeyValues( const char *pRoomName, KeyValues *pKeyValues );
|
||
|
bool SaveRoomTemplate();
|
||
|
|
||
|
const char *GetFullName() const { return m_FullName; }
|
||
|
const char *GetFolderName() const { return m_SubFolder; }
|
||
|
const char *GetDescription() const { return m_Description; }
|
||
|
const char *GetSoundscape() const { return m_Soundscape; }
|
||
|
|
||
|
void SetFullName( const char *pFullName );
|
||
|
void SetDescription( const char *pDescription );
|
||
|
void SetSoundscape( const char *pSoundscape );
|
||
|
|
||
|
// Room type queries
|
||
|
bool IsStartRoom() const;
|
||
|
bool IsEscapeRoom() const;
|
||
|
bool IsBorderRoom() const;
|
||
|
bool ShouldOnlyPlaceByRequest() const;
|
||
|
|
||
|
int GetArea() const { return m_nTilesX * m_nTilesY; }
|
||
|
int GetTilesX() const { return m_nTilesX; }
|
||
|
int GetTilesY() const { return m_nTilesY; }
|
||
|
void SetTileSize( int x, int y ) { m_nTilesX = x; m_nTilesY = y; }
|
||
|
|
||
|
CUtlVector<CRoomTemplateExit*> m_Exits; // list of exits
|
||
|
|
||
|
CLevelTheme* m_pLevelTheme; // pointer to the loaded in theme
|
||
|
|
||
|
// Tag queries
|
||
|
bool HasTag( const char *pTag ) const;
|
||
|
int GetNumTags() const { return m_Tags.Count(); }
|
||
|
const char* GetTag( int i ) const { return m_Tags[i]; }
|
||
|
bool AddTag( const char *pTag );
|
||
|
bool RemoveTag( const char *pTag );
|
||
|
|
||
|
int GetSpawnWeight() const { return m_nSpawnWeight; }
|
||
|
void SetSpawnWeight( int nSpawnWeight ) { m_nSpawnWeight = MAX( MIN( nSpawnWeight, MAX_SPAWN_WEIGHT ), MIN_SPAWN_WEIGHT ); }
|
||
|
|
||
|
// Tile types.
|
||
|
int GetTileType() const { return m_nTileType; }
|
||
|
void SetTileType( int nType ) { Assert( nType >= ASW_TILETYPE_UNKNOWN && nType < ASW_TILETYPE_COUNT ); m_nTileType = nType; }
|
||
|
|
||
|
static const int m_nMaxDescriptionLength = 512;
|
||
|
static const int m_nMaxSoundscapeLength = 64;
|
||
|
|
||
|
private:
|
||
|
|
||
|
CUtlVector< const char* > m_Tags; // List of tags
|
||
|
int m_nSpawnWeight; // The weighting that should be given to this room with respect to spawning (higher means more aliens, 0 means none)
|
||
|
|
||
|
char m_TemplateName[MAX_PATH]; // Filename of this room, without extension (e.g. '8x8_cap_innerSE')
|
||
|
char m_SubFolder[MAX_PATH]; // Folder path, relative to the theme directory. Given a room template located
|
||
|
// at /tilegen/roomtemplates/theme_name/folder1/folder2/foo.vmf, this will be 'folder1/folder2/'
|
||
|
char m_FullName[MAX_PATH]; // The concatenation of m_szSubFolder + m_szTemplateName (also without an extension)
|
||
|
|
||
|
char m_Description[m_nMaxDescriptionLength];
|
||
|
char m_Soundscape[m_nMaxSoundscapeLength];
|
||
|
|
||
|
int m_nTilesX;
|
||
|
int m_nTilesY;
|
||
|
|
||
|
int m_nTileType;
|
||
|
};
|
||
|
|
||
|
#endif TILEGEN_ROOM_TEMPLATE_H
|