1 #ifndef __WORLDDEF_H 2 #define __WORLDDEF_H 3 4 #include "Types.h" 5 #include "World_Tileset_Enums.h" 6 7 #include <string_theory/string> 8 9 struct ANITILE; 10 struct ITEM_POOL; 11 struct LIGHT_SPRITE; 12 struct SOLDIERTYPE; 13 struct STRUCTURE; 14 15 #define WORLD_TILE_X 40 16 #define WORLD_TILE_Y 20 17 #define WORLD_COLS 160 18 #define WORLD_ROWS 160 19 #define WORLD_COORD_COLS 1600 20 #define WORLD_COORD_ROWS 1600 21 #define WORLD_MAX 25600 22 #define CELL_X_SIZE 10 23 #define CELL_Y_SIZE 10 24 25 #define HALF_TILE_WIDTH ((WORLD_TILE_X / CELL_X_SIZE) / 2) // equals to 2 26 #define HALF_TILE_HEIGHT ((WORLD_TILE_Y / CELL_Y_SIZE) / 2) // equals to 1 27 28 #define CENTER_GRIDNO (WORLD_ROWS / 2 * WORLD_COLS + WORLD_COLS / 2) 29 30 #define WORLD_CLIFF_HEIGHT 80 31 32 //A macro that actually memcpy's over data and increments the pointer automatically 33 //based on the size. Works like a FileRead except with a buffer instead of a file pointer. 34 //Used by LoadWorld() and child functions. 35 #define LOADDATA( dst, src, size ) memcpy( dst, src, size ); src += size 36 37 38 #define LANDHEAD 0 39 #define MAXDIR 8 40 41 // Defines for shade levels 42 #define DEFAULT_SHADE_LEVEL 4 43 44 45 // DEFINES FOR LEVELNODE FLAGS 46 enum LevelnodeFlags 47 { 48 LEVELNODE_NONE = 0, 49 LEVELNODE_SOLDIER = 0x00000001, 50 LEVELNODE_MERCPLACEHOLDER = 0x00000004, 51 LEVELNODE_SHOW_THROUGH = 0x00000008, 52 LEVELNODE_NOZBLITTER = 0x00000010, 53 LEVELNODE_CACHEDANITILE = 0x00000020, 54 LEVELNODE_ROTTINGCORPSE = 0x00000040, 55 LEVELNODE_BUDDYSHADOW = 0x00000080, 56 LEVELNODE_HIDDEN = 0x00000100, 57 LEVELNODE_USERELPOS = 0x00000200, 58 LEVELNODE_DISPLAY_AP = 0x00000400, 59 LEVELNODE_ANIMATION = 0x00000800, 60 LEVELNODE_USEABSOLUTEPOS = 0x00001000, 61 LEVELNODE_REVEAL = 0x00002000, 62 LEVELNODE_REVEALTREES = 0x00004000, 63 LEVELNODE_USEZ = 0x00010000, 64 LEVELNODE_DYNAMICZ = 0x00020000, 65 LEVELNODE_UPDATESAVEBUFFERONCE = 0x00040000, 66 LEVELNODE_WIREFRAME = 0x00100000, 67 LEVELNODE_ITEM = 0x00200000, 68 LEVELNODE_IGNOREHEIGHT = 0x00400000, 69 LEVELNODE_DYNAMIC = 0x02000000, 70 LEVELNODE_LASTDYNAMIC = 0x04000000, 71 LEVELNODE_PHYSICSOBJECT = 0x08000000, 72 LEVELNODE_EXITGRID = 0x40000000, 73 LEVELNODE_CAVE = 0x80000000 74 }; 75 ENUM_BITSET(LevelnodeFlags) 76 77 78 // THE FIRST FEW ( 4 ) bits are flags which are saved in the world 79 #define MAPELEMENT_REDUNDENT 0x0001 80 #define MAPELEMENT_REEVALUATE_REDUNDENCY 0x0002 81 #define MAPELEMENT_ENEMY_MINE_PRESENT 0x0004 82 #define MAPELEMENT_PLAYER_MINE_PRESENT 0x0008 83 #define MAPELEMENT_STRUCTURE_DAMAGED 0x0010 84 #define MAPELEMENT_REEVALUATEBLOOD 0x0020 85 #define MAPELEMENT_INTERACTIVETILE 0x0040 86 #define MAPELEMENT_RAISE_LAND_START 0x0080 87 #define MAPELEMENT_REVEALED 0x0100 88 #define MAPELEMENT_RAISE_LAND_END 0x0200 89 #define MAPELEMENT_REDRAW 0x0400 90 #define MAPELEMENT_REVEALED_ROOF 0x0800 91 #define MAPELEMENT_MOVEMENT_RESERVED 0x1000 92 #define MAPELEMENT_RECALCULATE_WIREFRAMES 0x2000 93 #define MAPELEMENT_ITEMPOOL_PRESENT 0x4000 94 #define MAPELEMENT_REACHABLE 0x8000 95 96 #define MAPELEMENT_EXT_SMOKE 0x01 97 #define MAPELEMENT_EXT_TEARGAS 0x02 98 #define MAPELEMENT_EXT_MUSTARDGAS 0x04 99 #define MAPELEMENT_EXT_DOOR_STATUS_PRESENT 0x08 100 #define MAPELEMENT_EXT_RECALCULATE_MOVEMENT 0x10 101 #define MAPELEMENT_EXT_NOBURN_STRUCT 0x20 102 #define MAPELEMENT_EXT_ROOFCODE_VISITED 0x40 103 #define MAPELEMENT_EXT_CREATUREGAS 0x80 104 105 #define FIRST_LEVEL 0 106 #define SECOND_LEVEL 1 107 108 #define FIRST_LEVEL_Z_OFFET 0.0 109 #define SECOND_LEVEL_Z_OFFSET 58.0 110 111 #define ANY_SMOKE_EFFECT ( MAPELEMENT_EXT_CREATUREGAS | MAPELEMENT_EXT_SMOKE | MAPELEMENT_EXT_TEARGAS | MAPELEMENT_EXT_MUSTARDGAS ) 112 113 114 struct LEVELNODE 115 { 116 LEVELNODE* pNext; 117 LevelnodeFlags uiFlags; 118 119 UINT8 ubSumLights; // LIGHTING INFO 120 UINT8 ubMaxLights; // MAX LIGHTING INFO 121 122 union 123 { 124 LEVELNODE *pPrevNode; // FOR LAND, GOING BACKWARDS POINTER 125 STRUCTURE *pStructureData; // STRUCTURE DATA 126 INT32 uiAPCost; // FOR AP DISPLAY 127 INT32 iExitGridInfo; 128 }; // ( 4 byte union ) 129 130 union 131 { 132 struct 133 { 134 UINT16 usIndex; // TILE DATABASE INDEX 135 INT16 sCurrentFrame; // Stuff for animated tiles for a given tile location ( doors, etc ) 136 }; 137 138 SOLDIERTYPE *pSoldier; // POINTER TO SOLDIER 139 140 }; // ( 4 byte union ) 141 142 union 143 { 144 // Some levelnodes can specify relative X and Y values! 145 struct 146 { 147 INT16 sRelativeX; // Relative position values 148 INT16 sRelativeY; // Relative position values 149 }; 150 151 struct 152 { 153 UINT32 uiAnimHitLocationFlags; // Animation profile flags for soldier placeholders ( prone merc hit location values ) 154 }; 155 156 // Some can contains index values into animated tile data 157 struct 158 { 159 ANITILE* pAniTile; 160 }; 161 162 // Can be an item pool as well... 163 struct 164 { 165 ITEM_POOL *pItemPool; // ITEM POOLS 166 }; 167 168 169 }; 170 171 INT16 sRelativeZ; // Relative position values 172 UINT8 ubShadeLevel; // LIGHTING INFO 173 UINT8 ubNaturalShadeLevel; // LIGHTING INFO 174 UINT8 ubFakeShadeLevel; // LIGHTING INFO 175 }; 176 177 178 #define LAND_START_INDEX 1 179 #define OBJECT_START_INDEX 2 180 #define STRUCT_START_INDEX 3 181 #define SHADOW_START_INDEX 4 182 #define MERC_START_INDEX 5 183 #define ROOF_START_INDEX 6 184 #define ONROOF_START_INDEX 7 185 #define TOPMOST_START_INDEX 8 186 187 188 struct MAP_ELEMENT 189 { 190 union 191 { 192 struct 193 { 194 LEVELNODE *pLandHead; //0 195 LEVELNODE *pLandStart; //1 196 197 LEVELNODE *pObjectHead; //2 198 199 LEVELNODE *pStructHead; //3 200 201 LEVELNODE *pShadowHead; //4 202 203 LEVELNODE *pMercHead; //5 204 205 LEVELNODE *pRoofHead; //6 206 207 LEVELNODE *pOnRoofHead; //7 208 209 LEVELNODE *pTopmostHead; //8 210 }; 211 212 LEVELNODE *pLevelNodes[ 9 ]; 213 }; 214 215 STRUCTURE *pStructureHead; 216 STRUCTURE *pStructureTail; 217 218 UINT16 uiFlags; 219 UINT8 ubExtFlags[2]; 220 UINT8 sHeight; 221 UINT8 ubAdjacentSoldierCnt; 222 UINT8 ubTerrainID; 223 224 UINT8 ubReservedSoldierID; 225 UINT8 ubBloodInfo; 226 UINT8 ubSmellInfo; 227 }; 228 229 /** 230 * Specifies where to load a tile surface. 231 */ 232 struct TILE_SURFACE_RESOURCE 233 { 234 ST::string resourceFileName; // the exact resource file name on the VFS 235 TileSetID tilesetID; // the actual Tileset ID, after considering default tileset 236 237 // whether or not the default tileset is being used isDefaultTilesetTILE_SURFACE_RESOURCE238 BOOLEAN isDefaultTileset() 239 { 240 return (tilesetID == GENERIC_1 || tilesetID == DEFAULT_JA25_TILESET); 241 } 242 }; 243 244 // World Data 245 extern MAP_ELEMENT* gpWorldLevelData; 246 247 #define FOR_EACH_WORLD_TILE(iter) \ 248 for (MAP_ELEMENT* iter = gpWorldLevelData, * const iter##__end = gpWorldLevelData + WORLD_MAX; iter != iter##__end; ++iter) 249 250 // World Movement Costs 251 extern UINT8 gubWorldMovementCosts[WORLD_MAX][MAXDIR][2]; 252 253 254 extern TileSetID giCurrentTilesetID; 255 256 extern INT16 gsRecompileAreaTop; 257 extern INT16 gsRecompileAreaLeft; 258 extern INT16 gsRecompileAreaRight; 259 extern INT16 gsRecompileAreaBottom; 260 261 void InitializeWorld(void); 262 void DeinitializeWorld(void); 263 264 void BuildTileShadeTables(void); 265 void DestroyTileShadeTables(void); 266 267 268 void TrashWorld(void); 269 270 /* Deletes everything then re-creates the world with simple ground tiles */ 271 void NewWorld(void); 272 273 BOOLEAN SaveWorld(const char *puiFilename); 274 275 void LoadWorld(char const* filename); 276 void CompileWorldMovementCosts(void); 277 void RecompileLocalMovementCosts( INT16 sCentreGridNo ); 278 void RecompileLocalMovementCostsFromRadius( INT16 sCentreGridNo, INT8 bRadius ); 279 280 TileSetID GetDefaultTileset(); 281 // Tilesets may not provide all tile types.If a tile type is not available in a tileset, we fall back and use the surface in the default tileset. 282 TILE_SURFACE_RESOURCE GetAdjustedTilesetResource(TileSetID tilesetID, UINT32 uiTileType, ST::string const& filePrefix = ""); 283 284 void LoadMapTileset(TileSetID); 285 286 void CalculateWorldWireFrameTiles( BOOLEAN fForce ); 287 288 void ReloadTileset(TileSetID); 289 290 bool FloorAtGridNo(UINT32 map_idx); 291 BOOLEAN DoorAtGridNo( UINT32 iMapIndex ); 292 BOOLEAN GridNoIndoors( UINT32 iMapIndex ); 293 294 295 BOOLEAN OpenableAtGridNo( UINT32 iMapIndex ); 296 297 void RecompileLocalMovementCostsInAreaWithFlags( void ); 298 void AddTileToRecompileArea( INT16 sGridNo ); 299 300 void InitLoadedWorld(void); 301 302 BOOLEAN IsSoldierLight(const LIGHT_SPRITE* l); 303 304 void FreeLevelNodeList(LEVELNODE** const head); 305 306 void SetAllNewTileSurfacesLoaded(BOOLEAN fNew); 307 308 void RecompileLocalMovementCostsForWall(INT16 sGridNo, UINT8 ubOrientation); 309 310 #endif 311