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