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