worlddef.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #ifndef __WORLDDEF_H
  2. #define __WORLDDEF_H
  3. #include "vobject.h"
  4. #include "tiledef.h"
  5. #include "Soldier Control.h"
  6. #include "structure.h"
  7. #include "Handle Items.h"
  8. #define WORLD_TILE_X 40
  9. #define WORLD_TILE_Y 20
  10. #define WORLD_COLS 160
  11. #define WORLD_ROWS 160
  12. #define WORLD_COORD_COLS 1600
  13. #define WORLD_COORD_ROWS 1600
  14. #define WORLD_MAX 25600
  15. #define CELL_X_SIZE 10
  16. #define CELL_Y_SIZE 10
  17. #define WORLD_BASE_HEIGHT 0
  18. #define WORLD_CLIFF_HEIGHT 80
  19. //A macro that actually memcpy's over data and increments the pointer automatically
  20. //based on the size. Works like a FileRead except with a buffer instead of a file pointer.
  21. //Used by LoadWorld() and child functions.
  22. #include <memory.h>
  23. #define LOADDATA( dst, src, size ) memcpy( dst, src, size ); src += size
  24. #define LANDHEAD 0
  25. #define MAXDIR 8
  26. // Defines for shade levels
  27. #define DEFAULT_SHADE_LEVEL 4
  28. #define MIN_SHADE_LEVEL 4
  29. #define MAX_SHADE_LEVEL 15
  30. // DEFINES FOR LEVELNODE FLAGS
  31. #define LEVELNODE_SOLDIER 0x00000001
  32. #define LEVELNODE_UNUSED2 0x00000002
  33. #define LEVELNODE_MERCPLACEHOLDER 0x00000004
  34. #define LEVELNODE_SHOW_THROUGH 0x00000008
  35. #define LEVELNODE_NOZBLITTER 0x00000010
  36. #define LEVELNODE_CACHEDANITILE 0x00000020
  37. #define LEVELNODE_ROTTINGCORPSE 0x00000040
  38. #define LEVELNODE_BUDDYSHADOW 0x00000080
  39. #define LEVELNODE_HIDDEN 0x00000100
  40. #define LEVELNODE_USERELPOS 0x00000200
  41. #define LEVELNODE_DISPLAY_AP 0x00000400
  42. #define LEVELNODE_ANIMATION 0x00000800
  43. #define LEVELNODE_USEABSOLUTEPOS 0x00001000
  44. #define LEVELNODE_REVEAL 0x00002000
  45. #define LEVELNODE_REVEALTREES 0x00004000
  46. #define LEVELNODE_USEBESTTRANSTYPE 0x00008000
  47. #define LEVELNODE_USEZ 0x00010000
  48. #define LEVELNODE_DYNAMICZ 0x00020000
  49. #define LEVELNODE_UPDATESAVEBUFFERONCE 0x00040000
  50. #define LEVELNODE_ERASEZ 0x00080000
  51. #define LEVELNODE_WIREFRAME 0x00100000
  52. #define LEVELNODE_ITEM 0x00200000
  53. #define LEVELNODE_IGNOREHEIGHT 0x00400000
  54. #define LEVELNODE_DYNAMIC 0x02000000
  55. #define LEVELNODE_LASTDYNAMIC 0x04000000
  56. #define LEVELNODE_PHYSICSOBJECT 0x08000000
  57. #define LEVELNODE_NOWRITEZ 0x10000000
  58. #define LEVELNODE_MULTITILESOLDIER 0x20000000
  59. #define LEVELNODE_EXITGRID 0x40000000
  60. #define LEVELNODE_CAVE 0x80000000
  61. // THE FIRST FEW ( 4 ) bits are flags which are saved in the world
  62. #define MAPELEMENT_REDUNDENT 0x0001
  63. #define MAPELEMENT_REEVALUATE_REDUNDENCY 0x0002
  64. #define MAPELEMENT_ENEMY_MINE_PRESENT 0x0004
  65. #define MAPELEMENT_PLAYER_MINE_PRESENT 0x0008
  66. #define MAPELEMENT_STRUCTURE_DAMAGED 0x0010
  67. #define MAPELEMENT_REEVALUATEBLOOD 0x0020
  68. #define MAPELEMENT_INTERACTIVETILE 0x0040
  69. #define MAPELEMENT_RAISE_LAND_START 0x0080
  70. #define MAPELEMENT_REVEALED 0x0100
  71. #define MAPELEMENT_RAISE_LAND_END 0x0200
  72. #define MAPELEMENT_REDRAW 0x0400
  73. #define MAPELEMENT_REVEALED_ROOF 0x0800
  74. #define MAPELEMENT_MOVEMENT_RESERVED 0x1000
  75. #define MAPELEMENT_RECALCULATE_WIREFRAMES 0x2000
  76. #define MAPELEMENT_ITEMPOOL_PRESENT 0x4000
  77. #define MAPELEMENT_REACHABLE 0x8000
  78. #define MAPELEMENT_EXT_SMOKE 0x01
  79. #define MAPELEMENT_EXT_TEARGAS 0x02
  80. #define MAPELEMENT_EXT_MUSTARDGAS 0x04
  81. #define MAPELEMENT_EXT_DOOR_STATUS_PRESENT 0x08
  82. #define MAPELEMENT_EXT_RECALCULATE_MOVEMENT 0x10
  83. #define MAPELEMENT_EXT_NOBURN_STRUCT 0x20
  84. #define MAPELEMENT_EXT_ROOFCODE_VISITED 0x40
  85. #define MAPELEMENT_EXT_CREATUREGAS 0x80
  86. #define FIRST_LEVEL 0
  87. #define SECOND_LEVEL 1
  88. #define ANY_SMOKE_EFFECT ( MAPELEMENT_EXT_CREATUREGAS | MAPELEMENT_EXT_SMOKE | MAPELEMENT_EXT_TEARGAS | MAPELEMENT_EXT_MUSTARDGAS )
  89. typedef struct TAG_level_node
  90. {
  91. struct TAG_level_node *pNext;
  92. UINT32 uiFlags; // flags struct
  93. UINT8 ubSumLights; // LIGHTING INFO
  94. UINT8 ubMaxLights; // MAX LIGHTING INFO
  95. union
  96. {
  97. struct TAG_level_node *pPrevNode; // FOR LAND, GOING BACKWARDS POINTER
  98. STRUCTURE *pStructureData; // STRUCTURE DATA
  99. INT32 iPhysicsObjectID; // ID FOR PHYSICS ITEM
  100. INT32 uiAPCost; // FOR AP DISPLAY
  101. INT32 iExitGridInfo;
  102. }; // ( 4 byte union )
  103. union
  104. {
  105. struct
  106. {
  107. UINT16 usIndex; // TILE DATABASE INDEX
  108. INT16 sCurrentFrame; // Stuff for animated tiles for a given tile location ( doors, etc )
  109. };
  110. SOLDIERTYPE *pSoldier; // POINTER TO SOLDIER
  111. }; // ( 4 byte union )
  112. union
  113. {
  114. // Some levelnodes can specify relative X and Y values!
  115. struct
  116. {
  117. INT16 sRelativeX; // Relative position values
  118. INT16 sRelativeY; // Relative position values
  119. };
  120. // Some can contains index values into dead corpses
  121. struct
  122. {
  123. INT32 iCorpseID; // Index into corpse ID
  124. };
  125. struct
  126. {
  127. UINT32 uiAnimHitLocationFlags; // Animation profile flags for soldier placeholders ( prone merc hit location values )
  128. };
  129. // Some can contains index values into animated tile data
  130. struct
  131. {
  132. struct TAG_anitile *pAniTile;
  133. };
  134. // Can be an item pool as well...
  135. struct
  136. {
  137. ITEM_POOL *pItemPool; // ITEM POOLS
  138. };
  139. };
  140. INT16 sRelativeZ; // Relative position values
  141. UINT8 ubShadeLevel; // LIGHTING INFO
  142. UINT8 ubNaturalShadeLevel; // LIGHTING INFO
  143. UINT8 ubFakeShadeLevel; // LIGHTING INFO
  144. } LEVELNODE;
  145. #define LAND_START_INDEX 1
  146. #define OBJECT_START_INDEX 2
  147. #define STRUCT_START_INDEX 3
  148. #define SHADOW_START_INDEX 4
  149. #define MERC_START_INDEX 5
  150. #define ROOF_START_INDEX 6
  151. #define ONROOF_START_INDEX 7
  152. #define TOPMOST_START_INDEX 8
  153. typedef struct
  154. {
  155. union
  156. {
  157. struct
  158. {
  159. LEVELNODE *pLandHead; //0
  160. LEVELNODE *pLandStart; //1
  161. LEVELNODE *pObjectHead; //2
  162. LEVELNODE *pStructHead; //3
  163. LEVELNODE *pShadowHead; //4
  164. LEVELNODE *pMercHead; //5
  165. LEVELNODE *pRoofHead; //6
  166. LEVELNODE *pOnRoofHead; //7
  167. LEVELNODE *pTopmostHead; //8
  168. };
  169. LEVELNODE *pLevelNodes[ 9 ];
  170. };
  171. STRUCTURE *pStructureHead;
  172. STRUCTURE *pStructureTail;
  173. UINT16 uiFlags;
  174. UINT8 ubExtFlags[2];
  175. UINT16 sSumRealLights[1];
  176. UINT8 sHeight;
  177. UINT8 ubAdjacentSoldierCnt;
  178. UINT8 ubTerrainID;
  179. UINT8 ubReservedSoldierID;
  180. UINT8 ubBloodInfo;
  181. UINT8 ubSmellInfo;
  182. } MAP_ELEMENT;
  183. // World Data
  184. MAP_ELEMENT *gpWorldLevelData;
  185. // World Movement Costs
  186. UINT8 gubWorldMovementCosts[ WORLD_MAX ][MAXDIR][2];
  187. UINT8 gubCurrentLevel;
  188. INT32 giCurrentTilesetID;
  189. HVOBJECT hRenderVObject;
  190. UINT32 gSurfaceMemUsage;
  191. CHAR8 gzLastLoadedFile[ 260 ];
  192. extern INT16 gsRecompileAreaTop;
  193. extern INT16 gsRecompileAreaLeft;
  194. extern INT16 gsRecompileAreaRight;
  195. extern INT16 gsRecompileAreaBottom;
  196. // Functions
  197. BOOLEAN InitializeWorld( );
  198. void DeinitializeWorld( );
  199. void BuildTileShadeTables( );
  200. void DestroyTileShadeTables( );
  201. void TrashWorld(void);
  202. void TrashMapTile(INT16 MapTile);
  203. BOOLEAN NewWorld( void );
  204. BOOLEAN SaveWorld( UINT8 *puiFilename );
  205. BOOLEAN LoadWorld( UINT8 *puiFilename );
  206. void CompileWorldMovementCosts( );
  207. void RecompileLocalMovementCosts( INT16 sCentreGridNo );
  208. void RecompileLocalMovementCostsFromRadius( INT16 sCentreGridNo, INT8 bRadius );
  209. BOOLEAN LoadMapTileset( INT32 iTilesetID );
  210. BOOLEAN SaveMapTileset( INT32 iTilesetID );
  211. void SetLoadOverrideParams( BOOLEAN fForceLoad, BOOLEAN fForceFile, CHAR8 *zLoadName );
  212. void CalculateWorldWireFrameTiles( BOOLEAN fForce );
  213. void RemoveWorldWireFrameTiles( );
  214. void RemoveWireFrameTiles( INT16 sGridNo );
  215. LEVELNODE *GetAnimProfileFlags( UINT16 sGridNo, UINT16 *usFlags, SOLDIERTYPE **ppTargSoldier, LEVELNODE *pGivenNode );
  216. void ReloadTileset( UINT8 ubID );
  217. BOOLEAN FloorAtGridNo( UINT32 iMapIndex );
  218. BOOLEAN DoorAtGridNo( UINT32 iMapIndex );
  219. BOOLEAN GridNoIndoors( UINT32 iMapIndex );
  220. BOOLEAN OpenableAtGridNo( UINT32 iMapIndex );
  221. void RecompileLocalMovementCostsInAreaWithFlags( void );
  222. void AddTileToRecompileArea( INT16 sGridNo );
  223. #endif