1 #include "TileDat.h"
2 #include "TileDef.h"
3 #include "WorldDef.h"
4 
5 
6 INT16 const gOpenDoorList[] =
7 {
8 	FIRSTDOOR1,
9 	SECONDDOOR1,
10 	THIRDDOOR1,
11 	FOURTHDOOR1,
12 	FIRSTDOOR6,
13 	SECONDDOOR6,
14 	THIRDDOOR6,
15 	FOURTHDOOR6,
16 	FIRSTDOOR11,
17 	SECONDDOOR11,
18 	THIRDDOOR11,
19 	FOURTHDOOR11,
20 	FIRSTDOOR16,
21 	SECONDDOOR16,
22 	THIRDDOOR16,
23 	FOURTHDOOR16,
24 	-1
25 };
26 
27 
28 static INT16 const gOpenDoorShadowList[] =
29 {
30 	FIRSTDOORSH1,
31 	SECONDDOORSH1,
32 	THIRDDOORSH1,
33 	FOURTHDOORSH1,
34 	FIRSTDOORSH6,
35 	SECONDDOORSH6,
36 	THIRDDOORSH6,
37 	FOURTHDOORSH6,
38 	FIRSTDOORSH11,
39 	SECONDDOORSH11,
40 	THIRDDOORSH11,
41 	FOURTHDOORSH11,
42 	FIRSTDOORSH16,
43 	SECONDDOORSH16,
44 	THIRDDOORSH16,
45 	FOURTHDOORSH16,
46 	-1
47 };
48 
49 
50 INT16 const gClosedDoorList[] =
51 {
52 	FIRSTDOOR5,
53 	SECONDDOOR5,
54 	THIRDDOOR5,
55 	FOURTHDOOR5,
56 	FIRSTDOOR10,
57 	SECONDDOOR10,
58 	THIRDDOOR10,
59 	FOURTHDOOR10,
60 	FIRSTDOOR15,
61 	SECONDDOOR15,
62 	THIRDDOOR15,
63 	FOURTHDOOR15,
64 	FIRSTDOOR20,
65 	SECONDDOOR20,
66 	THIRDDOOR20,
67 	FOURTHDOOR20,
68 	-1
69 };
70 
71 
72 static INT16 const gClosedDoorShadowList[] =
73 {
74 	FIRSTDOORSH5,
75 	SECONDDOORSH5,
76 	THIRDDOORSH5,
77 	FOURTHDOORSH5,
78 	FIRSTDOORSH10,
79 	SECONDDOORSH10,
80 	THIRDDOORSH10,
81 	FOURTHDOORSH10,
82 	FIRSTDOORSH15,
83 	SECONDDOORSH15,
84 	THIRDDOORSH15,
85 	FOURTHDOORSH15,
86 	FIRSTDOORSH20,
87 	SECONDDOORSH20,
88 	THIRDDOORSH20,
89 	FOURTHDOORSH20,
90 	-1
91 };
92 
93 
94 struct ShadowBuddies
95 {
96 	INT16 structure;
97 	INT16 shadow;
98 	INT16 first_structure;
99 	INT16 first_shadow;
100 };
101 
102 
103 // Bidirectional mapping between structs and shadows
104 static ShadowBuddies const g_shadow_buddies[] =
105 {
106 	{ FIRSTCLIFF,           FIRSTCLIFFSHADOW,           FIRSTCLIFF1,           FIRSTCLIFFSHADOW1           },
107 
108 	{ FIRSTOSTRUCT,         FIRSTSHADOW,                FIRSTOSTRUCT1,         FIRSTSHADOW1                },
109 	{ SECONDOSTRUCT,        SECONDSHADOW,               SECONDOSTRUCT1,        SECONDSHADOW1               },
110 	{ THIRDOSTRUCT,         THIRDSHADOW,                THIRDOSTRUCT1,         THIRDSHADOW1                },
111 	{ FOURTHOSTRUCT,        FOURTHSHADOW,               FOURTHOSTRUCT1,        FOURTHSHADOW1               },
112 	{ FIFTHOSTRUCT,         FIFTHSHADOW,                FIFTHOSTRUCT1,         FIFTHSHADOW1                },
113 	{ SIXTHOSTRUCT,         SIXTHSHADOW,                SIXTHOSTRUCT1,         SIXTHSHADOW1                },
114 	{ SEVENTHOSTRUCT,       SEVENTHSHADOW,              SEVENTHOSTRUCT1,       SEVENTHSHADOW1              },
115 	{ EIGHTOSTRUCT,         EIGHTSHADOW,                EIGHTOSTRUCT1,         EIGHTSHADOW1                },
116 
117 	{ FIRSTFULLSTRUCT,      FIRSTFULLSHADOW,            FIRSTFULLSTRUCT1,      FIRSTFULLSHADOW1            },
118 	{ SECONDFULLSTRUCT,     SECONDFULLSHADOW,           SECONDFULLSTRUCT1,     SECONDFULLSHADOW1           },
119 	{ THIRDFULLSTRUCT,      THIRDFULLSHADOW,            THIRDFULLSTRUCT1,      THIRDFULLSHADOW1            },
120 	{ FOURTHFULLSTRUCT,     FOURTHFULLSHADOW,           FOURTHFULLSTRUCT1,     FOURTHFULLSHADOW1           },
121 
122 	{ FIRSTDOOR,            FIRSTDOORSHADOW,            FIRSTDOOR1,            FIRSTDOORSH1                },
123 	{ SECONDDOOR,           SECONDDOORSHADOW,           SECONDDOOR1,           SECONDDOORSH1               },
124 	{ THIRDDOOR,            THIRDDOORSHADOW,            THIRDDOOR1,            THIRDDOORSH1                },
125 	{ FOURTHDOOR,           FOURTHDOORSHADOW,           FOURTHDOOR1,           FOURTHDOORSH1               },
126 
127 	// Fence
128 	{ FENCESTRUCT,          FENCESHADOW,                FENCESTRUCT1,          FENCESHADOW1                },
129 
130 	// Vehicles
131 	{ FIRSTVEHICLE,         FIRSTVEHICLESHADOW,         FIRSTVEHICLE1,         FIRSTVEHICLESHADOW1         },
132 	{ SECONDVEHICLE,        SECONDVEHICLESHADOW,        SECONDVEHICLE1,        SECONDVEHICLESHADOW1        },
133 
134 	// DebrisSTRUCT
135 	{ FIRSTDEBRISSTRUCT,    FIRSTDEBRISSTRUCTSHADOW,    FIRSTDEBRISSTRUCT1,    FIRSTDEBRISSTRUCTSHADOW1    },
136 	{ SECONDDEBRISSTRUCT,   SECONDDEBRISSTRUCTSHADOW,   SECONDDEBRISSTRUCT1,   SECONDDEBRISSTRUCTSHADOW1   },
137 
138 	{ NINTHOSTRUCT,         NINTHOSTRUCTSHADOW,         NINTHOSTRUCT1,         NINTHOSTRUCTSHADOW1         },
139 	{ TENTHOSTRUCT,         TENTHOSTRUCTSHADOW,         TENTHOSTRUCT1,         TENTHOSTRUCTSHADOW1         },
140 
141 	{ FIRSTLARGEEXPDEBRIS,  FIRSTLARGEEXPDEBRISSHADOW,  FIRSTLARGEEXPDEBRIS1,  FIRSTLARGEEXPDEBRISSHADOW1  },
142 	{ SECONDLARGEEXPDEBRIS, SECONDLARGEEXPDEBRISSHADOW, SECONDLARGEEXPDEBRIS1, SECONDLARGEEXPDEBRISSHADOW1 },
143 };
144 
145 
146 // Global variable used to initialize tile database with full tile spec
147 static UINT8 const gFullBaseTileValues[] =
148 {
149 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // First Texture
150 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
151 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
152 	0, 0, 0, 0, 0,
153 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Second Texture
154 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
155 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
156 	0, 0, 0, 0, 0,
157 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Third Texture
158 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
159 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
160 	0, 0, 0, 0, 0,
161 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Forth Texture
162 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
163 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
164 	0, 0, 0, 0, 0,
165 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Fifth Texture
166 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
167 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168 	0, 0, 0, 0, 0,
169 
170 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Sixth Texture
171 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
173 	0, 0, 0, 0, 0, 0, 1,
174 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Seventh Texture
175 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
176 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
177 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
178 	0, 0, 0, 0, 0, 0, 0, 0, 0,
179 
180 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Water1 Texture
181 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
182 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
183 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
184 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
185 
186 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // Water2 Texture
187 };
188 
189 
190 const ST::string gTileSurfaceName[NUMBEROFTILETYPES] =
191 {
192 	"TEXTURE1",
193 	"TEXTURE2",
194 	"TEXTURE3",
195 	"TEXTURE4",
196 	"TEXTURE5",
197 	"TEXTURE6",
198 	"TEXTURE7",
199 	"WATER1",
200 	"DEEP WATER",
201 	"FIRSTCLIFFHANG",
202 	"FIRSTCLIFF",
203 	"FIRSTCLIFFSHADOW",
204 	"OSTRUCT1",
205 	"OSTRUCT2",
206 	"OSTRUCT3",
207 	"OSTRUCT4",
208 	"OSTRUCT5",
209 	"OSTRUCT6",
210 	"OSTRUCT7",
211 	"OSTRUCT8",
212 	"OFSTRUCT1",
213 	"OFSTRUCT2",
214 	"PLACEHOLDER1",
215 	"PLACEHOLDER2",
216 
217 	"SHADOW1",
218 	"SHADOW2",
219 	"SHADOW3",
220 	"SHADOW4",
221 	"SHADOW5",
222 	"SHADOW6",
223 	"SHADOW7",
224 	"SHADOW8",
225 	"FSHADOW1",
226 	"FSHADOW2",
227 	"PLACEHOLDER3",
228 	"PLACEHOLDER4",
229 
230 	"WALL1",
231 	"WALL2",
232 	"WALL3",
233 	"WALL4",
234 	"DOOR1",
235 	"DOOR2",
236 	"DOOR3",
237 	"DOOR4",
238 	"DOORSH1",
239 	"DOORSH2",
240 	"DOORSH3",
241 	"DOORSH4",
242 	"SLANTFLATPEICE",
243 	"ANOTHERDEBRIS",
244 	"ROADPIECES",
245 	"WINDOW4",
246 	"DECORATIONS1",
247 	"DECORATIONS2",
248 	"DECORATIONS3",
249 	"DECORATIONS4",
250 	"WALLDECAL1",
251 	"WALLDECAL2",
252 	"WALLDECAL3",
253 	"WALLDECAL4",
254 	"FLOOR1",
255 	"FLOOR2",
256 	"FLOOR3",
257 	"FLOOR4",
258 	"ROOF1",
259 	"ROOF2",
260 	"ROOF3",
261 	"ROOF4",
262 	"SROOF1",
263 	"SROOF2",
264 	"ONROOF1",
265 	"ONROOF2",
266 	"MOCKF1",
267 
268 	"ISTRUCT1",
269 	"ISTRUCT2",
270 	"ISTRUCT3",
271 	"ISTRUCT4",
272 
273 	"FIRSTCISTRCUT",
274 
275 	"FIRSTROAD",
276 
277 	"ROCKS",
278 	"WOOD",
279 	"WEEDS",
280 	"GRASS",
281 	"SAND",
282 	"MISC",
283 
284 	"ANIOSTRUCT",
285 	"FENCESTRUCT",
286 	"FENCESHADOW",
287 
288 	"FIRSTVEHICLE",
289 	"SECONDVEHICLE",
290 	"FIRSTVEHICLESHADOW",
291 	"SECONDVEHICLESHADOW",
292 	"MISC2",
293 	"FIRSTDEBRISSTRUCT",
294 	"SECONDDEBRISSTRUCT",
295 	"FIRSTDEBRISSTRUCTSHADOW",
296 	"SECONDDEBRISSTRUCTSHADOW",
297 	"NINTHOSTRUCT",
298 	"TENTHOSTRUCT",
299 	"NINTHOSTRUCTSHADOW",
300 	"TENTHOSTRUCTSHADOW",
301 
302 	"FIRSTEXPLODEDEBRIS",
303 	"SECONDEXPLODEDEBRIS",
304 	"FIRSTLARGEEXPLODEDEBRIS",
305 	"SECONDLARGEEXPLODEDEBRIS",
306 	"FIRSTLARGEEXPLODEDEBRISSHADOW",
307 	"SECONDLARGEEXPLODEDEBRISSHADOW",
308 
309 	"FIFTHISTRUCT",
310 	"SIXTHISTRUCT",
311 	"SEVENTHISTRUCT",
312 	"EIGHTISTRUCT",
313 
314 	"FIRSTHIGHROOF",
315 	"SECONDHIGHROOF",
316 
317 	"WALLDECAL5",
318 	"WALLDECAL6",
319 	"WALLDECAL7",
320 	"WALLDECAL8",
321 
322 	"HUMANBLOOD",
323 	"CREATUREBLOOD",
324 	"FIRSTSWITCHES",
325 
326 	// ABSOLUTELY NO STUFF PAST HERE!
327 	// CAN BE SAVED IN THE MAP DIRECTLY!
328 	"REVEALEDSLANTROOF",
329 	"1stREVEALEDHIGHROOF",
330 	"2ndREVEALEDHIGHROOF",
331 
332 	"GUNS",
333 	"ITEMS",
334 	"ITEMS2",
335 
336 	"GLASSSHATTER",
337 	"ITEMS3",
338 	"BODYBLOW",
339 
340 	"EXITTEXTURE",
341 	"FOOTPRINTS",
342 	"POINTERS",
343 	"POINTERS2",
344 	"POINTERS3",
345 
346 	"GOODRUN",
347 	"GOODWALK",
348 	"GOODSWAT",
349 	"GOODSCOOT",
350 	"CONFIRMMOVE",
351 	"VEHICLEMOVE",
352 	"ACTIONTWO",
353 	"BADMARKER",
354 	"GRING",
355 	"ROTATINGKEY",
356 	"SELRING",
357 	"SPECIAL",
358 	"BULLET",
359 	"MISS1",
360 	"MISS2",
361 	"MISS3",
362 	"WIREFRAME"
363 };
364 
365 
366 UINT16 const gNumTilesPerType[NUMBEROFTILETYPES] =
367 {
368 	FIRSTTEXTURE35 - FIRSTTEXTURE1 + 1,
369 	SECONDTEXTURE35 - SECONDTEXTURE1 + 1,
370 	THIRDTEXTURE35 - THIRDTEXTURE1 + 1,
371 	FOURTHTEXTURE35 - FOURTHTEXTURE1 + 1,
372 	FIFTHTEXTURE35 - FIFTHTEXTURE1 + 1,
373 	SIXTHTEXTURE37 - SIXTHTEXTURE1 + 1,
374 	SEVENTHTEXTURE49 - SEVENTHTEXTURE1 + 1,
375 	REGWATERTEXTURE50 - REGWATERTEXTURE1 + 1,
376 	DEEPWATERTEXTURE37 - DEEPWATERTEXTURE1 + 1,
377 	FIRSTCLIFFHANG17 - FIRSTCLIFFHANG1 + 1,
378 	FIRSTCLIFF17 - FIRSTCLIFF1 + 1,
379 	FIRSTCLIFFSHADOW17 - FIRSTCLIFFSHADOW1 + 1,// Med hill
380 
381 	FIRSTOSTRUCT12 - FIRSTOSTRUCT1 + 1,
382 	SECONDOSTRUCT12 - SECONDOSTRUCT1 + 1,
383 	THIRDOSTRUCT12 - THIRDOSTRUCT1 + 1,
384 	FOURTHOSTRUCT12 - FOURTHOSTRUCT1 + 1, // Fourth OSTRUCT
385 	FIFTHOSTRUCT12 - FIFTHOSTRUCT1 + 1, // Fifth OSTRUCT
386 	SIXTHOSTRUCT12 - SIXTHOSTRUCT1 + 1, // Sixth OSTRUCT
387 	SEVENTHOSTRUCT12 - SEVENTHOSTRUCT1 + 1, // Seventh OSTRUCT
388 	EIGHTOSTRUCT12 - EIGHTOSTRUCT1 + 1, // Eigth OSTRUCT
389 	FIRSTFULLSTRUCT12 - FIRSTFULLSTRUCT1 + 1,
390 	SECONDFULLSTRUCT12 - SECONDFULLSTRUCT1 + 1,
391 	THIRDFULLSTRUCT2 - THIRDFULLSTRUCT1 + 1,
392 	FOURTHFULLSTRUCT2 - FOURTHFULLSTRUCT1 + 1,
393 
394 	FIRSTSHADOW12 - FIRSTSHADOW1 + 1,
395 	SECONDSHADOW12 - SECONDSHADOW1 + 1,
396 	THIRDSHADOW12 - THIRDSHADOW1 + 1,
397 	FOURTHSHADOW12 - FOURTHSHADOW1 + 1,
398 	FIFTHSHADOW12 - FIFTHSHADOW1 + 1,
399 	SIXTHSHADOW12 - SIXTHSHADOW1 + 1,
400 	SEVENTHSHADOW12 - SEVENTHSHADOW1 + 1,
401 	EIGHTSHADOW12 - EIGHTSHADOW1 + 1,
402 	FIRSTFULLSHADOW12 - FIRSTFULLSHADOW1 + 1,
403 	SECONDFULLSHADOW12 - SECONDFULLSHADOW1 + 1,
404 	THIRDFULLSHADOW2 - THIRDFULLSHADOW1 + 1,
405 	FOURTHFULLSHADOW2 - FOURTHFULLSHADOW1 + 1,
406 
407 
408 	FIRSTWALL65 - FIRSTWALL1 + 1,
409 	SECONDWALL65 - SECONDWALL1 + 1,
410 	THIRDWALL65 - THIRDWALL1 + 1,
411 	FOURTHWALL65 - FOURTHWALL1 + 1,
412 
413 	FIRSTDOOR20 - FIRSTDOOR1 + 1,
414 	SECONDDOOR20 - SECONDDOOR1 + 1,
415 	THIRDDOOR20 - THIRDDOOR1 + 1,
416 	FOURTHDOOR20 - FOURTHDOOR1 + 1,
417 
418 	FIRSTDOORSH20 - FIRSTDOORSH1 + 1,
419 	SECONDDOORSH20 - SECONDDOORSH1 + 1,
420 	THIRDDOORSH20 - THIRDDOORSH1 + 1,
421 	FOURTHDOORSH20 - FOURTHDOORSH1 + 1,
422 
423 	SLANTROOFCEILING2 - SLANTROOFCEILING1 + 1,
424 	ANOTHERDEBRIS10 - ANOTHERDEBRIS1 + 1,
425 	ROADPIECES400 - ROADPIECES001 + 1,
426 	FOURTHWINDOW2 - FOURTHWINDOW1 + 1,
427 
428 	FIRSTDECORATIONS10 - FIRSTDECORATIONS1 + 1,
429 	SECONDDECORATIONS10 - SECONDDECORATIONS1 + 1,
430 	THIRDDECORATIONS10 - THIRDDECORATIONS1 + 1,
431 	FOURTHDECORATIONS10 - FOURTHDECORATIONS1 + 1,
432 
433 	FIRSTWALLDECAL10 - FIRSTWALLDECAL1 + 1,
434 	SECONDWALLDECAL10 - SECONDWALLDECAL1 + 1,
435 	THIRDWALLDECAL10 - THIRDWALLDECAL1 + 1,
436 	FOURTHWALLDECAL10 - FOURTHWALLDECAL1 + 1,
437 
438 	FIRSTFLOOR8 - FIRSTFLOOR1 + 1,
439 	SECONDFLOOR8 - SECONDFLOOR1 + 1,
440 	THIRDFLOOR8 - THIRDFLOOR1 + 1,
441 	FOURTHFLOOR8 - FOURTHFLOOR1 + 1,
442 
443 	FIRSTROOF14 - FIRSTROOF1 + 1,
444 	SECONDROOF14 - SECONDROOF1 + 1,
445 	THIRDROOF14 - THIRDROOF1 + 1,
446 	FOURTHROOF14 - FOURTHROOF1 + 1,
447 	FIRSTSLANTROOF20 - FIRSTSLANTROOF1 + 1,
448 	SECONDSLANTROOF20 - SECONDSLANTROOF1 + 1,
449 
450 	FIRSTONROOF12 - FIRSTONROOF1 + 1,
451 	SECONDONROOF12 - SECONDONROOF1 + 1,
452 
453 	1,
454 
455 	FIRSTISTRUCT24 - FIRSTISTRUCT1 + 1,
456 	SECONDISTRUCT24 - SECONDISTRUCT1 + 1,
457 	THIRDISTRUCT24 - THIRDISTRUCT1 + 1,
458 	FOURTHISTRUCT24 - FOURTHISTRUCT1 + 1,
459 	FIRSTCISTRUCT24 - FIRSTCISTRUCT1 + 1,
460 
461 	FIRSTROAD35 - FIRSTROAD1 + 1,
462 
463 	DEBRISROCKS10 - DEBRISROCKS1 + 1,
464 	DEBRISWOOD10 - DEBRISWOOD1 + 1,
465 	DEBRISWEEDS10 - DEBRISWEEDS1 + 1,
466 	DEBRISGRASS10 - DEBRISGRASS1 + 1,
467 	DEBRISSAND10 - DEBRISSAND1 + 1,
468 	DEBRISMISC10 - DEBRISMISC1 + 1,
469 
470 	ANIOSTRUCT20 - ANIOSTRUCT1 + 1,
471 	FENCESTRUCT23 - FENCESTRUCT1 + 1,
472 	FENCESHADOW23 - FENCESHADOW1 + 1,
473 	FIRSTVEHICLE12- FIRSTVEHICLE1 + 1,
474 	SECONDVEHICLE12- SECONDVEHICLE1 + 1,
475 	FIRSTVEHICLESHADOW12- FIRSTVEHICLESHADOW1 + 1,
476 	SECONDVEHICLESHADOW12- SECONDVEHICLESHADOW1 + 1,
477 	DEBRIS2MISC10 - DEBRIS2MISC1 + 1,
478 
479 	FIRSTDEBRISSTRUCT10- FIRSTDEBRISSTRUCT1 + 1,
480 	SECONDDEBRISSTRUCT10- SECONDDEBRISSTRUCT1 + 1,
481 	FIRSTDEBRISSTRUCTSHADOW10- FIRSTDEBRISSTRUCTSHADOW1 + 1,
482 	SECONDDEBRISSTRUCTSHADOW10- SECONDDEBRISSTRUCTSHADOW1 + 1,
483 
484 	NINTHOSTRUCT12- NINTHOSTRUCT1 + 1,
485 	TENTHOSTRUCT12- TENTHOSTRUCT1 + 1,
486 	NINTHOSTRUCTSHADOW12- NINTHOSTRUCTSHADOW1 + 1,
487 	TENTHOSTRUCTSHADOW12- TENTHOSTRUCTSHADOW1 + 1,
488 
489 	FIRSTEXPLDEBRIS40- FIRSTEXPLDEBRIS1 + 1,
490 	SECONDEXPLDEBRIS40- SECONDEXPLDEBRIS1 + 1,
491 	FIRSTLARGEEXPDEBRIS10- FIRSTLARGEEXPDEBRIS1 + 1,
492 	SECONDLARGEEXPDEBRIS10- SECONDLARGEEXPDEBRIS1 + 1,
493 	FIRSTLARGEEXPDEBRISSHADOW10- FIRSTLARGEEXPDEBRISSHADOW1 + 1,
494 	SECONDLARGEEXPDEBRISSHADOW10- SECONDLARGEEXPDEBRISSHADOW1 + 1,
495 
496 	FIFTHISTRUCT24- FIFTHISTRUCT1 + 1,
497 	SIXTHISTRUCT24- SIXTHISTRUCT1 + 1,
498 	SEVENTHISTRUCT24- SEVENTHISTRUCT1 + 1,
499 	EIGHTISTRUCT24- EIGHTISTRUCT1 + 1,
500 
501 	FIRSTHIGHROOF15- FIRSTHIGHROOF1 + 1,
502 	SECONDHIGHROOF15- SECONDHIGHROOF1 + 1,
503 
504 	FIFTHWALLDECAL10 - FIFTHWALLDECAL1 + 1,
505 	SIXTHWALLDECAL10 - SIXTHWALLDECAL1 + 1,
506 	SEVENTHWALLDECAL10- SEVENTHWALLDECAL1 + 1,
507 	EIGTHWALLDECAL10 - EIGTHWALLDECAL1 + 1,
508 
509 	HUMANBLOOD16- HUMANBLOOD1 + 1,
510 	CREATUREBLOOD16- CREATUREBLOOD1 + 1,
511 	FIRSTSWITCHES21- FIRSTSWITCHES1 + 1,
512 
513 	// NO SAVED STUFF AFTER HERE!
514 	REVEALEDSLANTROOFS8- REVEALEDSLANTROOFS1 + 1,
515 	FIRSTREVEALEDHIGHROOFS11- FIRSTREVEALEDHIGHROOFS1 + 1,
516 	SECONDREVEALEDHIGHROOFS11- SECONDREVEALEDHIGHROOFS1 + 1,
517 
518 	GUN60 - GUN1 + 1,
519 	P1ITEM149 - P1ITEM1 + 1,
520 	P2ITEM45 - P2ITEM1 + 1,
521 
522 	WINDOWSHATTER20 - WINDOWSHATTER1 + 1,
523 	P3ITEM16 - P3ITEM1 + 1,
524 	BODYEXPLOSION15 - BODYEXPLOSION1 + 1,
525 
526 	EXITTEXTURE35 - EXITTEXTURE1 + 1,
527 	FOOTPRINTS80 - FOOTPRINTS1 + 1,
528 
529 	FIRSTPOINTERS24 - FIRSTPOINTERS1 + 1,
530 	SECONDPOINTERS8 - SECONDPOINTERS1 + 1,
531 	THIRDPOINTERS3 - THIRDPOINTERS1 + 1,
532 
533 	GOODRUN11 - GOODRUN1 + 1,
534 	GOODWALK11 - GOODWALK1 + 1,
535 	GOODSWAT11 - GOODSWAT1 + 1,
536 	GOODPRONE11 - GOODPRONE1 + 1,
537 	CONFIRMMOVE11 - CONFIRMMOVE1 + 1,
538 	VEHICLEMOVE10 - VEHICLEMOVE1 + 1,
539 	ACTIONTWO11 - ACTIONTWO1 + 1,
540 	BADMARKER11 - BADMARKER1 + 1,
541 	GOODRING10 - GOODRING1 + 1,
542 	ROTATINGKEY8 - ROTATINGKEY1 + 1,
543 	SELRING10 - SELRING1 + 1,
544 	SPECIALTILE_COVER_5 - SPECIALTILE_MAPEXIT + 1,
545 	BULLETTILE2 - BULLETTILE1 + 1,
546 
547 	FIRSTMISS5 - FIRSTMISS1 + 1,
548 	SECONDMISS5 - SECONDMISS1 + 1,
549 	THIRDMISS14 - THIRDMISS1 + 1,
550 	WIREFRAMES15 - WIREFRAMES1 + 1
551 };
552 
553 
554 UINT8 gTileTypeLogicalHeight[NUMBEROFTILETYPES] =
555 {
556 	2,  // First texture
557 	2,  // Second texture
558 	2,  // Third texture
559 	2,  // Forth texture
560 	2,  // Fifth texture
561 	2,  // Sixth texture
562 	2,  // Seventh texture
563 	10, // First water
564 	10  // Second water
565 };
566 
567 
SetAnimData(UINT16 const database_elem,TILE_ELEMENT & te,const bool minus_plus)568 static void SetAnimData(UINT16 const database_elem, TILE_ELEMENT& te, const bool minus_plus)
569 {
570 	AllocateAnimTileData(&te, 5);
571 
572 	TILE_ANIMATION_DATA& a = *te.pAnimData;
573 	a.bCurrentFrame = 0;
574 	for (UINT8 k = 0; k != a.ubNumFrames; ++k)
575 	{
576 		a.pusFrames[k] = minus_plus ? database_elem + k : database_elem - k;
577 	}
578 }
579 
580 
SetAnimDataIfInList(INT16 const * const list,UINT16 const database_elem,TILE_ELEMENT & te,const bool minus_plus)581 static void SetAnimDataIfInList(INT16 const* const list, UINT16 const database_elem, TILE_ELEMENT& te, const bool minus_plus)
582 {
583 	for (INT16 const* i = list; *i != -1; ++i)
584 	{
585 		// If we are a shadow type
586 		if (database_elem != *i) continue;
587 		SetAnimData(database_elem, te, minus_plus);
588 	}
589 }
590 
591 
SetSpecificDatabaseValues(UINT16 const type,UINT16 const database_elem,TILE_ELEMENT & te,bool const use_raised_object_type)592 void SetSpecificDatabaseValues(UINT16 const type, UINT16 const database_elem, TILE_ELEMENT& te, bool const use_raised_object_type)
593 {
594 	// Setup buddies for structures and shadows
595 	FOR_EACH(ShadowBuddies const, i, g_shadow_buddies)
596 	{
597 		if (type == i->shadow)
598 		{
599 			te.sBuddyNum = database_elem - i->first_shadow + i->first_structure;
600 			// Check flags and made the same, take from buddy's
601 			te.uiFlags |= gTileDatabase[te.sBuddyNum].uiFlags;
602 			break;
603 		}
604 		else if (type == i->structure)
605 		{
606 			te.sBuddyNum = database_elem - i->first_structure + i->first_shadow;
607 			// Set flag indicating such
608 			te.uiFlags |= HAS_SHADOW_BUDDY;
609 			break;
610 		}
611 	}
612 
613 	if (FIRSTDOOR1 <= database_elem && database_elem <= FOURTHDOORSH20)
614 	{
615 		// Door anims
616 		SetAnimDataIfInList(gOpenDoorList,         database_elem, te, true);  // Open
617 		SetAnimDataIfInList(gOpenDoorShadowList,   database_elem, te, true);  // Open shadow
618 		SetAnimDataIfInList(gClosedDoorList,       database_elem, te, false); // Closed
619 		SetAnimDataIfInList(gClosedDoorShadowList, database_elem, te, false); // Closed shadow
620 	}
621 
622 	if (database_elem == FIRSTMISS1)
623 	{
624 		SetAnimData(database_elem, te, true);
625 	}
626 
627 	if (FIRSTMISS1 <= database_elem && database_elem <= FIRSTMISS5)
628 	{
629 		te.uiFlags |= DYNAMIC_TILE;
630 	}
631 
632 	if (database_elem == WINDOWSHATTER1  ||
633 			database_elem == WINDOWSHATTER6  ||
634 			database_elem == WINDOWSHATTER11 ||
635 			database_elem == WINDOWSHATTER16 )
636 	{
637 		SetAnimData(database_elem, te, true);
638 	}
639 
640 	if (WINDOWSHATTER1 <= database_elem && database_elem <= WINDOWSHATTER20)
641 	{
642 		te.uiFlags |= DYNAMIC_TILE;
643 	}
644 
645 	if (type == BODYEXPLOSION)
646 	{
647 		te.uiFlags |= DYNAMIC_TILE;
648 	}
649 
650 	// Set flags for objects pieces which use proper z
651 	if (use_raised_object_type)
652 	{
653 		te.uiFlags |= OBJECTLAYER_USEZHEIGHT;
654 	}
655 
656 	// Set flag for full 3d tiles, as well as the dynamic flag for the folliage
657 	if (FIRSTFULLSTRUCT1 <= database_elem && database_elem <= SECONDFULLSTRUCT12)
658 	{
659 		INT16 const idx_diff = database_elem - gTileTypeStartIndex[type];
660 		switch (idx_diff % 3)
661 		{
662 			case 0: te.uiFlags |= FULL3D_TILE;  break; // Set every first as full tile
663 			case 1: te.uiFlags |= DYNAMIC_TILE; break; // Every second set as dynamic
664 		}
665 	}
666 
667 	// Ignore height for cliffs ie: if we rasie the land, do not offset the cliff
668 	if (FIRSTCLIFFHANG1 <= database_elem && database_elem <= FIRSTCLIFFSHADOW17)
669 	{
670 		if (type == FIRSTCLIFFHANG) te.uiFlags |= CLIFFHANG_TILE;
671 		te.uiFlags |= IGNORE_WORLD_HEIGHT;
672 	}
673 
674 	if (FIRSTWALL1 <= database_elem && database_elem <= FOURTHWALL65)
675 	{
676 		te.uiFlags |= WALL_TILE;
677 	}
678 
679 	// Set a-frames heigher!
680 	if (FIRSTWALL1 <= database_elem && database_elem <= FOURTHWALL47)
681 	{ // Set these ones higher (for roof pieces)
682 		UINT16 const start = gTileTypeStartIndex[type];
683 		if (start + WALL_AFRAME_START <= database_elem && database_elem <= start + WALL_AFRAME_END)
684 		{
685 			te.uiFlags |= AFRAME_TILE;
686 		}
687 	}
688 
689 	// Set UI Elements to be dynamic
690 	if (FOOTPRINTS1 <= database_elem && database_elem <= THIRDPOINTERS2)
691 	{
692 		te.uiFlags |= DYNAMIC_TILE | OBJECTLAYER_USEZHEIGHT;
693 	}
694 
695 	// Set UI Elements to use object z level
696 	if (FOOTPRINTS <= type && type <= LASTUIELEM)
697 	{
698 		te.uiFlags |= OBJECTLAYER_USEZHEIGHT;
699 	}
700 
701 	// Set UI Elements to use object z level
702 	if (HUMANBLOOD <= type && type <= CREATUREBLOOD)
703 	{
704 		te.uiFlags |= OBJECTLAYER_USEZHEIGHT;
705 	}
706 
707 	// Set UI Elements to use object z level
708 	if (GUNS <= type && type <= P2ITEMS)
709 	{
710 		te.uiFlags |= OBJECTLAYER_USEZHEIGHT;
711 	}
712 	if (type == P3ITEMS)
713 	{
714 		te.uiFlags |= OBJECTLAYER_USEZHEIGHT;
715 	}
716 
717 	if (FIRSTEXPLDEBRIS <= type && type <= SECONDEXPLDEBRIS)
718 	{
719 		te.uiFlags |= OBJECTLAYER_USEZHEIGHT;
720 	}
721 
722 	// Set UI Elements to be dynamic
723 	if (database_elem == MOCKFLOOR1)
724 	{
725 		te.uiFlags |= DYNAMIC_TILE;
726 	}
727 
728 	if (type == BULLETTILE)
729 	{
730 		te.uiFlags |= DYNAMIC_TILE;
731 	}
732 
733 	// Set full tile flag for floors
734 	if (FIRSTFLOOR1 <= database_elem && database_elem <= FOURTHFLOOR8)
735 	{
736 		te.ubFullTile = 1;
737 	}
738 
739 	if (/*FIRSTTEXTURE1 <= database_elem &&*/ database_elem <= DEEPWATERTEXTURE10)
740 	{ // Set tile 'fullness' attribute
741 		te.ubFullTile = gFullBaseTileValues[database_elem];
742 	}
743 
744 	if ((REGWATERTEXTURE18 <= database_elem && database_elem <= REGWATERTEXTURE50) ||
745 			database_elem == REGWATERTEXTURE   ||
746 			database_elem == REGWATERTEXTURE12 ||
747 			database_elem == REGWATERTEXTURE14 ||
748 			database_elem == REGWATERTEXTURE16)
749 	{
750 		te.ubTerrainID = FLAT_GROUND;
751 	}
752 
753 	if ((FIRSTROOF <= type && type <= SECONDSLANTROOF) ||
754 			type == FIRSTHIGHROOF ||
755 			type == SECONDHIGHROOF)
756 	{
757 		te.uiFlags |= ROOF_TILE;
758 	}
759 }
760