1 #ifndef __TILEDEF_H
2 #define __TILEDEF_H
3
4 #include "JA2Types.h"
5 #include "TileDat.h"
6
7
8 // CATEGORY TYPES
9 #define NO_TILE 64000
10 #define REQUIRES_SMOOTHING_TILE 19
11
12 enum TileElementFlags
13 {
14 WALL_TILE = 1U << 0,
15 ANIMATED_TILE = 1U << 1,
16 DYNAMIC_TILE = 1U << 2,
17 IGNORE_WORLD_HEIGHT = 1U << 3,
18 FULL3D_TILE = 1U << 4,
19 MULTI_Z_TILE = 1U << 5,
20 OBJECTLAYER_USEZHEIGHT = 1U << 6,
21 ROOFSHADOW_TILE = 1U << 7,
22 ROOF_TILE = 1U << 8,
23 HAS_SHADOW_BUDDY = 1U << 9,
24 AFRAME_TILE = 1U << 10,
25 CLIFFHANG_TILE = 1U << 11,
26 UNDERFLOW_FILLER = 1U << 12
27 };
28 ENUM_BITSET(TileElementFlags)
29
30
31 #define MAX_ANIMATED_TILES 200
32 #define WALL_HEIGHT 50
33
34
35 enum WallOrientationDefines
36 {
37 NO_ORIENTATION, INSIDE_TOP_LEFT, INSIDE_TOP_RIGHT, OUTSIDE_TOP_LEFT,
38 OUTSIDE_TOP_RIGHT
39 };
40
41 // TERRAIN ID VALUES.
42 enum TerrainTypeDefines
43 {
44 NO_TERRAIN,
45 FLAT_GROUND,
46 FLAT_FLOOR,
47 PAVED_ROAD,
48 DIRT_ROAD,
49 LOW_GRASS,
50 HIGH_GRASS,
51 TRAIN_TRACKS,
52 LOW_WATER,
53 MED_WATER,
54 DEEP_WATER,
55 NUM_TERRAIN_TYPES
56 };
57
58
59 // These structures are placed in a list and used for all tile imagery
60 struct TILE_IMAGERY
61 {
62 HVOBJECT vo;
63 UINT32 fType;
64 AuxObjectData *pAuxData;
65 RelTileLoc *pTileLocData;
66 STRUCTURE_FILE_REF *pStructureFileRef;
67 UINT8 ubTerrainID;
68 BYTE bRaisedObjectType;
69
70 // Reserved for added room and 32-byte boundaries
71 BYTE bReserved[2];
72 };
73
74 struct TILE_ANIMATION_DATA
75 {
76 UINT16 *pusFrames;
77 INT8 bCurrentFrame;
78 UINT8 ubNumFrames;
79 };
80
81
82 // Tile data element
83 struct TILE_ELEMENT
84 {
85 HVOBJECT hTileSurface;
86 DB_STRUCTURE_REF* pDBStructureRef;
87 RelTileLoc* pTileLocData;
88 TileElementFlags uiFlags;
89 UINT16 fType;
90 UINT16 usRegionIndex;
91 INT16 sBuddyNum;
92 UINT8 ubTerrainID;
93 UINT8 ubNumberOfTiles;
94
95 // Land and overlay type
96 UINT16 usWallOrientation;
97 UINT8 ubFullTile;
98
99 // For animated tiles
100 TILE_ANIMATION_DATA* pAnimData;
101 };
102
103
104 // Globals used
105 extern TILE_ELEMENT gTileDatabase[NUMBEROFTILES];
106 extern UINT16 gTileTypeStartIndex[NUMBEROFTILETYPES];
107
TileElemFromTileType(const UINT16 tile_type)108 static inline const TILE_ELEMENT* TileElemFromTileType(const UINT16 tile_type)
109 {
110 return &gTileDatabase[gTileTypeStartIndex[tile_type]];
111 }
112
113 extern UINT16 gusNumAnimatedTiles;
114 extern UINT16 gusAnimatedTiles[MAX_ANIMATED_TILES];
115 extern UINT8 gTileTypeMovementCost[NUM_TERRAIN_TYPES];
116
117 void CreateTileDatabase(void);
118
119
120
121 // Land level manipulation functions
122
123 void SetLandIndex(INT32 iMapIndex, UINT16 usIndex, UINT32 uiNewType);
124
125 bool GetTypeLandLevel(UINT32 map_idx, UINT32 new_type, UINT8* out_level);
126
127
128 // Database access functions
129 UINT16 GetSubIndexFromTileIndex(UINT16 usIndex);
130
131 UINT16 GetTypeSubIndexFromTileIndex(UINT32 uiCheckType, UINT16 usIndex);
132
133 UINT16 GetTileIndexFromTypeSubIndex(UINT32 uiCheckType, UINT16 usSubIndex);
134 UINT32 GetTileType(UINT16 usIndex);
135 UINT32 GetTileFlags(UINT16 usIndex);
136
137 UINT8 GetTileTypeLogicalHeight(UINT32 type);
138 bool AnyHeigherLand(UINT32 map_idx, UINT32 src_type, UINT8* out_last_level);
139 UINT16 GetWallOrientation(UINT16 usIndex);
140
141 void SetSpecificDatabaseValues(UINT16 type, UINT16 database_elem, TILE_ELEMENT&, bool use_raised_object_type);
142
143 void AllocateAnimTileData(TILE_ELEMENT* pTileElem, UINT8 ubNumFrames);
144 void DeallocateTileDatabase(void);
145
146 #endif
147