1 /*
2  *  Open Fodder
3  *  ---------------
4  *
5  *  Copyright (C) 2008-2018 Open Fodder
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License along
18  *  with this program; if not, write to the Free Software Foundation, Inc.,
19  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  */
22 
23 #include "stdafx.hpp"
24 
25 #define SpriteTableFunction(x, y) mSprite_Function[x] = &cFodder::y;
26 
27 #define SpriteFunction(name) mSprite_Function[eSprite_##name] = &cFodder::Sprite_Handle_##name; mSprite_Names[eSprite_##name] = #name;
28 
29 
Sprite_Table_Setup()30 void cFodder::Sprite_Table_Setup() {
31 
32 	for (int16 x = 0; x < 118; ++x) {
33 		mSprite_Function[x] = &cFodder::Sprite_Handle_Null;
34 	}
35 
36 	/* 00 */
37 	SpriteFunction( Player );
38 	SpriteTableFunction( 1,							Sprite_Handle_Null );
39 	SpriteFunction( Grenade );
40 	SpriteFunction( ShadowSmall );
41 
42 	/* 04 */
43 	SpriteFunction( Null );
44 	SpriteFunction( Enemy );
45 	SpriteFunction( Bullet );
46 	SpriteTableFunction( 7,							Sprite_Handle_Null );
47 
48 	/* 08 */
49 	SpriteTableFunction( 8,							Sprite_Handle_Null );
50 	SpriteTableFunction( 9,							Sprite_Handle_Null );
51 	SpriteTableFunction( 10,						Sprite_Handle_Null );
52 	SpriteTableFunction( 11,						Sprite_Handle_Null );
53 
54 	/* 12 */
55 	SpriteFunction( Explosion );
56 	SpriteFunction( Shrub );
57 	SpriteFunction( Tree );
58 	SpriteFunction( BuildingRoof );
59 
60 	/* 16 */
61 	SpriteFunction( Snowman );
62 	SpriteFunction( Shrub2 );
63 	SpriteFunction( Waterfall );
64 	SpriteFunction( Bird2_Left );
65 
66 	/* 20 */
67 	SpriteFunction( BuildingDoor );
68 	SpriteFunction( Player_Rank );
69 	SpriteFunction( Player_Shadow );
70 	SpriteFunction( BloodTrail );
71 
72 	/* 24 */
73 	SpriteFunction( GroundHole );
74 	SpriteFunction( BuildingDoor2 );
75 	SpriteTableFunction( 26,						Sprite_Handle_Null );
76 	SpriteFunction( Floating_Dead_Soldier );
77 
78 	/* 28 */
79 	SpriteFunction( Text_Complete );
80 	SpriteFunction( Text_Mission );
81 	SpriteFunction( Text_Phase );
82 	SpriteTableFunction( 31,						Sprite_Handle_Null );
83 
84 	/* 32 */
85 	SpriteTableFunction( 32,						Sprite_Handle_Null );
86 	SpriteFunction( Rocket );
87 	SpriteFunction( Text_GameOver );
88 	SpriteFunction( Shadow );
89 
90 	/* 36 */
91 	SpriteFunction( Enemy_Rocket );
92 	SpriteFunction( GrenadeBox );
93 	SpriteFunction( RocketBox );
94 	SpriteFunction( Building_Explosion );
95 
96 	/* 40 */
97 	SpriteFunction( Helicopter_Grenade_Enemy );
98 	SpriteFunction( Flashing_Light );
99 	SpriteFunction( Helicopter_Grenade2_Enemy );
100 	SpriteFunction( Helicopter_Missile_Enemy );
101 
102 	/* 44 */
103 	SpriteFunction( Helicopter_Homing_Enemy );
104 	SpriteFunction( Missile );
105 	SpriteFunction( MissileHoming );
106 	SpriteFunction( Sparks );
107 
108 	/* 48 */
109 	SpriteFunction( FireTrail );
110 	SpriteFunction( Helicopter_Grenade2_Human );
111 	SpriteFunction( Helicopter_Grenade_Human );
112 	SpriteFunction( Helicopter_Missile_Human );
113 
114 	/* 52 */
115 	SpriteFunction( Helicopter_Homing_Human );
116 	SpriteFunction( Helicopter_PropCrash );
117 	SpriteFunction( Mine );
118 	SpriteFunction( Mine2 );
119 
120 	/* 56 */
121 	SpriteFunction( Spike );
122 	SpriteFunction( Smoke );
123 	SpriteFunction( Text_Try );
124 	SpriteFunction( Text_Again );
125 
126 	/* 60 */
127 	SpriteFunction( BoilingPot );
128 	SpriteFunction( Civilian );
129 	SpriteFunction( Civilian2 );
130 	SpriteFunction( VehicleNoGun_Human );
131 
132 	/* 64 */
133 	SpriteFunction( VehicleGun_Human );
134 	SpriteFunction( Tank_Human );
135 	SpriteFunction( Bird_Left );
136 	SpriteFunction( Bird_Right );
137 
138 	/* 68 */
139 	SpriteFunction( Seal );
140 	SpriteFunction( Tank_Enemy );
141 	SpriteFunction( Civilian_Spear );
142 	SpriteFunction( Civilian_Spear2 );
143 
144 	/* 72 */
145 	SpriteFunction( Hostage );
146 	SpriteFunction( Hostage_Rescue_Tent );
147 	SpriteFunction( Door_Civilian );
148 	SpriteFunction( Door2_Civilian );
149 
150 	/* 76 */
151 	SpriteFunction( Door_Civilian_Spear );
152 	SpriteFunction( Cannon );
153 	SpriteFunction( Turret_Missile_Human );
154 	SpriteFunction( Turret_Missile2_Human );
155 
156 	/* 80 */
157 	SpriteFunction( VehicleNoGun_Enemy );
158 	SpriteFunction( VehicleGun_Enemy );
159 	SpriteFunction( Vehicle_Unk_Enemy );
160 	SpriteFunction( Civilian_Invisible );
161 
162 	/* 84 */
163 	SpriteFunction( Turret_Missile_Enemy );
164 	SpriteFunction( Turret_Missile2_Enemy );
165 	SpriteFunction( Vehicle_Sinking_1 );
166 	SpriteFunction( Vehicle_Sinking_2 );
167 
168 	/* 88 */
169 	SpriteFunction( BuildingDoor3 );
170 	SpriteFunction( Explosion2 );
171 	SpriteFunction( Door_Civilian_Rescue );
172 	SpriteFunction( Seal_Mine);
173 
174 	/* 92 */
175 	SpriteFunction( Spider_Mine );
176 	SpriteFunction( Bonus_RankToGeneral );
177 	SpriteFunction( Bonus_Rockets );
178 	SpriteFunction( Bonus_Armour );
179 
180 	/* 96 */
181 	SpriteFunction( Bonus_RankHomingInvin_SquadLeader );
182 	SpriteFunction( MissileHoming2 );
183 	SpriteFunction( Bonus_RankHomingInvin_Squad );
184 	SpriteFunction( Helicopter_CallPad );
185 
186 	/* 100 */
187 	SpriteFunction( BuildingDoor_Reinforced );
188 	SpriteFunction( Helicopter_Grenade2_Human_Called );
189 	SpriteFunction( Helicopter_Grenade_Human_Called );
190 	SpriteFunction( Helicopter_Missile_Human_Called );
191 
192 	/* 104 */
193 	SpriteFunction( Helicopter_Homing_Human_Called );
194 	SpriteFunction( Turret_HomingMissile_Enemy );
195 	SpriteFunction( Enemy_Leader );
196 	SpriteFunction( Helicopter_Homing_Enemy2 );
197 
198 	/* 108 */
199 	SpriteFunction( Computer_1 );
200 	SpriteFunction( Computer_2 );
201 	SpriteFunction( Computer_3 );
202 	// End of Cannon Fodder Sprites
203 
204 	//  Cannon Foodder 2 only Sprites
205     /* 111 */
206     SpriteFunction( UFO_Callpad);
207     SpriteFunction( Turret_Cannon_Invulnerable );
208     SpriteFunction( Turret_Missile_Invulnerable );
209 
210     SpriteFunction( Looping_Vehicle_Left );
211     SpriteFunction( Looping_Vehicle_Right );
212 
213     /* 116 */
214     SpriteFunction( Looping_Vehicle_Up );
215     SpriteFunction( Looping_Vehicle_Down );
216 
217 	//  End Cannon Fodder 2 Sprites
218 }
219 
220 // Types of units which are hostile towards the Player
221 const int16 mEnemy_Unit_Types[] = {
222 	eSprite_Enemy, eSprite_Enemy_Rocket,	eSprite_Helicopter_Grenade_Enemy,	eSprite_Helicopter_Grenade2_Enemy,
223 	eSprite_Helicopter_Missile_Enemy,		eSprite_Helicopter_Homing_Enemy,	eSprite_Tank_Enemy,
224 	eSprite_VehicleNoGun_Enemy,				eSprite_VehicleGun_Enemy,			eSprite_Vehicle_Unk_Enemy,
225 	eSprite_Turret_Missile_Enemy,			eSprite_Turret_Missile2_Enemy,		eSprite_Turret_HomingMissile_Enemy,
226 	eSprite_Computer_1,						eSprite_Computer_2,					eSprite_Computer_3,
227 
228     // CF2 sprites
229     eSprite_Turret_Cannon_Invulnerable, eSprite_Turret_Missile_Invulnerable,
230 	-1
231 };
232 
233 // Sprites which missiles can lock on to
234 const int16 mSprite_Missile_CanLock[] = {
235 	0, 0, 0, 0, 0, -1, 0, 0, 0, 0,
236 	0, 0, 0, -1, -1, -1, -1, -1, 0, 0,
237 	-1, 0, 0, 0, 0, -1, 0, -1, 0, 0,
238 	0, 0, 0, 0, 0, 0, -1, 0, 0, 0,
239 	-1, 0, -1, -1, -1, 0, -1, 0, 0, 0,
240 	0, 0, 0, 0, -1, -1, 0, 0, 0, 0,
241 	0, 0, 0, 0, 0, 0, 0, 0, -1, -1,
242 	-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
243 	-1, -1, -1, 0, -1, -1, 0, 0, -1, 0,
244 	0, -1, -1, 0, 0, 0, 0, 0, 0, 0,
245 	-1, 0, 0, 0, 0, -1, -1, -1, -1, -1,
246 	-1,
247 
248     // CF2: 111-118
249     0, -1, -1, -1, -1, -1, -1
250 };
251 
252 const int16 mSprite_Width[] = {
253 	10, 0, 6, 0, 0, 10, 0, 24, 0, 0,
254 	0, 0, 0, 20, 10, 16, 10, 20, 0, 0,
255 	20, 0, 0, 0, 0, 20, 0, 10, 0, 0,
256 	0, 24, 0, 0, 0, 0, 10, 10, 10, 0,
257 	24, 0, 24, 24, 24, 0, 16, 0, 0, 24,
258 	24, 24, 24, 0, 10, 10, 0, 0, 0, 0,
259 	0, 10, 10, 24, 24, 24, 0, 0, 10, 24,
260 	10, 0, 10, 10, 20, 20, 20, 0, 24, 24,
261 	24, 24, 24, 10, 24, 24, 0, 0, 20, 0,
262 	20, 10, 10, 0, 0, 0, 0, 0, 0, 0,
263 	20, 24, 24, 24, 24, 24, 10, 24, 24, 24,
264 	24,
265 
266     // CF2: 111-118
267     0, 24, 24, 24, 24, 24, 24
268 };
269 
270 const int16 mSprite_Height_Top[] = {
271 	2, 0, 2, 0, 0, 2, 0, 5, 0, 0,
272 	0, 0, 0, 2, 2, 2, 2, 2, 0, 0,
273 	12, 0, 0, 0, 0, 12, 0, 2, 0, 0,
274 	0, 5, 0, 0, 0, 0, 2, 2, 2, 0,
275 	5, 0, 5, 5, 5, 0, 5, 0, 0, 5,
276 	5, 5, 5, 0, 2, 2, 0, 0, 0, 0,
277 	0, 2, 2, 5, 5, 5, 0, 0, 2, 5,
278 	2, 0, 2, 2, 12, 12, 12, 0, 5, 5,
279 	5, 5, 5, 2, 5, 5, 0, 0, 12, 0,
280 	12, 2, 2, 0, 0, 0, 0, 0, 0, 0,
281 	12, 5, 5, 5, 5, 5, 2, 5, 5, 5,
282 	5,
283 
284     // CF2: 111-118
285     0, 5, 5, 5, 5, 5, 5
286 };
287 
288 const int16 mSprite_Height_Bottom[] = {
289 	3, 0, 2, 0, 0, 3, 0, 3, 0, 0,
290 	0, 0, 0, 2, 2, 2, 2, 2, 0, 0,
291 	3, 0, 0, 0, 0, 3, 0, 3, 0, 0,
292 	0, 3, 0, 0, 0, 0, 3, 3, 3, 0,
293 	3, 0, 3, 3, 3, 0, 3, 0, 0, 3,
294 	3, 3, 3, 0, 3, 3, 0, 0, 0, 0,
295 	0, 3, 3, 3, 3, 3, 0, 0, 3, 3,
296 	3, 0, 3, 3, 3, 3, 3, 0, 3, 3,
297 	3, 3, 3, 3, 3, 3, 0, 0, 3, 0,
298 	3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
299 	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
300 	3,
301 
302     // CF2: 111-118
303     0, 3, 3, 3, 3, 3, 3
304 };
305 
306 const int16 mSprite_Can_Be_RunOver[] = {
307 	2, 0, 1, 0, 0, 2, 0, 1, 0, 0,
308 	2, 0, 0, 1, 1, 1, 1, 1, 0, 0,
309 	1, 0, 0, 0, 0, 1, 0, 2, 0, 0,
310 	0, 1, 0, 0, 0, 0, 2, 2, 2, 0,
311 	1, 0, 1, 1, 1, 0, 2, 0, 0, 1,
312 	1, 1, 1, 0, 2, 2, 0, 0, 0, 0,
313 	0, 2, 2, 1, 1, 1, 0, 0, 2, 1,
314 	2, 0, 2, 2, 1, 1, 1, 0, 1, 1,
315 	1, 1, 1, 2, 1, 1, 0, 0, 1, 0,
316 	1, 2, 2, 0, 0, 0, 0, 0, 0, 0,
317 	1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
318 	1,
319 
320     // CF2: 111-118
321     0, 1, 1, 1, 1, 1, 1
322 };
323 
324 const int16 mSprite_Direction_Frame_Unk[] = {
325 	0, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1
326 };
327 
328 const int16 mSprite_Explosion_Area_PerFrame[] = {
329 	5, 7, 0, 0, 1, 4, 2, 3, 1, 0,
330 	1, 0, 0, -1, -2, -2, -1, -5, -2, 1,
331 	1, 2, 1, 0, 1, -1, 0, -1
332 };
333 
334 const int16 mSprite_Explosion_Positions[] = {
335 	0, 0, 16, 16, -16, -32, -16, 16, 32, -16,
336 	-32, 32, 32, -16, -16, 16, -16, -32, 48, 48,
337 	-64, -48, 48, -16, -32, 64, 48, -64, 0, 32,
338 	-48, -32, -16, 48, 64, -32, -32, 48, 0, -64,
339 	-32, 32, 48, 32, -48, -64, 64, 48, -64, 16,
340 	-32768
341 };
342 
343 const int16 mSprite_Turret_Positions[] = {
344 	0, 7, -9, 6, -14, 3, -16, 0, -19, -7,
345 	-19, -12, -16, -16, -10, -20, -2, -22, 6, -20,
346 	12, -15, 16, -12, 18, -6, 16, 0, 12, 2,
347 	6, 5
348 };
349 
350 const int16 mSprite_SpiderMine_Frames[] = {
351 	0, 0, 0, 0, 1, 1, 1, 1, 2, 2,
352 	2, 2, 1, 1, 1, 1
353 };
354 
355 const int16 mSprite_Hostage_Frames[] = {
356 	0, 1, 2, 1
357 };
358 
359 const int16 mSprite_Helicopter_Light_Positions[] = {
360 	14, -16, 11, -15, 10, -16, 10, -20, 10, -23,
361 	10, -23, 11, -24, 13, -25, 14, -25, 16, -25,
362 	18, -23, 18, -22, 19, -23, 19, -20, 19, -16,
363 	19, -15
364 };
365 
366 const int16 mSprite_Helicopter_CallPad_Frames[] = {
367 	1, 2, 3, 2
368 };
369 
370 const int16 mSprite_Helicopter_Sounds[] = {
371 	4, 51, 52, 53, 54, 4, 51, 52
372 };
373 
374 const sWeaponData mSprite_Bullet_UnitData[] = {
375 	{ 70, 8, 7, 31, 0 },
376 	{ 75, 8, 7, 31, 0 },
377 	{ 80, 8, 7, 31, 0 },
378 	{ 85, 8, 7, 31, 0 },
379 	{ 85, 8, 6, 31, 0 },
380 	{ 100, 7, 6, 15, 0 },
381 	{ 100, 7, 6, 15, 0 },
382 	{ 105, 7, 6, 15, 0 },
383 	{ 105, 7, 5, 15, 0 },	// Rank 0
384 	{ 110, 7, 5, 15, 0 },	// Rank 1
385 	{ 130, 6, 5, 15, 0 },	// Rank 2
386 	{ 125, 7, 5, 7, 0 },	// Rank 3
387 	{ 125, 7, 4, 7, 0 },	// Rank 4
388 	{ 130, 7, 4, 7, 0 },	// Rank 5
389 	{ 115, 8, 4, 7, 0 },	// Rank 6
390 	{ 120, 8, 4, 7, 0 },	// Rank 7  - 15
391 	{ 120, 8, 3, 3, 0 },
392 	{ 125, 8, 3, 3, 0 },
393 	{ 130, 8, 3, 3, 0 },
394 	{ 120, 9, 3, 3, 0 },
395 	{ 120, 9, 3, 1, 0 },
396 	{ 125, 9, 3, 1, 0 },
397 	{ 130, 9, 3, 1, 0 },
398 	{ 120, 10, 3, 1, 0 },
399 	{ 125, 10, 3, 1, 0 },
400 	{ 130, 10, 3, 1, 0 }
401 };
402 
403 const int16 mSprite_Player_MissionOver_Frames[] = {
404 	0, 1, 2, 3, 2, 1, 2
405 };
406 
407 const int8 mSprite_Seal_AnimFrames[] = {
408 
409 	0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02,
410 	0x02, 0x02, 0x01, 0x01, 0x01, 0x01
411 };
412 
413 const int16 mSprite_VehiclePosition_Mod[] = {
414 	11, 5, 18, 5, 6, 5, 10, 6, 0, 7,
415 	6, 9, -2, 5, -1, 9, -2, -6, -2, 2,
416 	-2, -6, -2, 1, 5, -4, 8, -8, 7, -4,
417 	14, -8, 10, -8, 18, -8, 16, -8, 22, -6,
418 	17, -8, 22, -2, 19, -2, 25, 2, 22, -4,
419 	22, 2, 22, -2, 20, 5, 24, 2, 22, 7,
420 	25, 5, 20, 8
421 };
422 
423 const int16 mSprite_Computer_Animation[] = {
424 	147, 143, 145, 143
425 };
426 
427 const int16 mSprite_Seal_Frames[] = {
428 	1, 1, 1, 0, 0, 0, 1, 1, 0, 0,
429 	1, 0, 1, 0, 1, 2, 3, -1
430 };
431 
432 const int16 mSprite_Computer_Frames[] = {
433 	1, 0, 4, 0
434 };
435 
436 const int8 mSprite_Civilian_Sound_Death[] = {
437 	0x0B, 0x0C, 0x0D, 0x14, 0x15, 0x16, 0x0D, 0x14
438 };
439 
440 const int8 mSprite_Soldier_Unk[] = {
441 	-34, -1, -56, -1, 0x38, 0x00, 0x22, 0x00
442 };
443 
444 const sSpriteSheet_pstuff mSpriteSheet_PStuff[209] = {
445 	{ 0, 79, 48, 13 },
446 	{ 48, 79, 48, 13 },
447 	{ 96, 79, 48, 13 },
448 	{ 0, 160, 48, 13 },
449 	{ 48, 160, 48, 13 },
450 	{ 96, 160, 48, 13 },
451 	{ 0, 160, 48, 13 },
452 	{ 96, 160, 48, 13 },
453 	{ 48, 160, 48, 13 },
454 	{ 48, 0, 16, 11 },
455 
456 	{ 64, 0, 16, 11 },
457 	{ 80, 0, 16, 11 },
458 	{ 96, 0, 16, 11 },
459 	{ 112, 0, 16, 11 },
460 	{ 128, 0, 16, 11 },
461 	{ 144, 0, 16, 11 },
462 	{ 160, 0, 16, 11 },
463 	{ 176, 0, 16, 11 },
464 	{ 192, 0, 16, 11 },
465 	{ 208, 0, 16, 11 },
466 
467 	{ 224, 0, 16, 11 },
468 	{ 240, 0, 16, 11 },
469 	{ 256, 0, 16, 11 },
470 	{ 272, 0, 16, 11 },
471 	{ 288, 0, 16, 11 },
472 	{ 304, 0, 16, 11 },
473 	{ 0, 12, 16, 11 },
474 	{ 16, 12, 16, 11 },
475 	{ 32, 12, 16, 11 },
476 	{ 48, 12, 16, 11 },
477 
478 	{ 64, 12, 16, 11 },
479 	{ 80, 12, 16, 11 },
480 	{ 96, 12, 16, 11 },
481 	{ 112, 12, 16, 11 },
482 	{ 128, 12, 16, 11 },
483 	{ 64, 113, 16, 15 },
484 	{ 80, 113, 16, 15 },
485 	{ 0, 113, 16, 15 },
486 	{ 16, 113, 16, 15 },
487 	{ 32, 113, 16, 15 },
488 
489 	{ 48, 113, 16, 15 },
490 	{ 0, 24, 16, 7 },
491 	{ 16, 24, 16, 7 },
492 	{ 32, 24, 16, 7 },
493 	{ 48, 24, 16, 7 },
494 	{ 64, 24, 16, 7 },
495 	{ 80, 24, 16, 7 },
496 	{ 96, 24, 16, 7 },
497 	{ 112, 24, 16, 7 },
498 	{ 128, 24, 16, 7 },
499 	{ 144, 24, 16, 7 },
500 	{ 160, 24, 16, 7 },
501 	{ 176, 24, 16, 7 },
502 	{ 192, 24, 16, 7 },
503 	{ 208, 24, 16, 7 },
504 	{ 224, 24, 16, 7 },
505 	{ 240, 24, 16, 7 },
506 	{ 256, 24, 16, 7 },
507 	{ 272, 24, 16, 7 },
508 	{ 288, 24, 16, 7 },
509 	{ 304, 24, 16, 7 },
510 	{ 0, 32, 16, 7 },
511 	{ 16, 32, 16, 7 },
512 	{ 32, 32, 16, 7 },
513 	{ 48, 32, 16, 7 },
514 	{ 64, 32, 16, 7 },
515 	{ 80, 32, 16, 7 },
516 	{ 96, 32, 16, 7 },
517 	{ 112, 32, 16, 7 },
518 	{ 128, 32, 16, 7 },
519 	{ 144, 32, 16, 7 },
520 	{ 160, 32, 16, 7 },
521 	{ 176, 32, 16, 7 },
522 	{ 192, 32, 16, 7 },
523 	{ 208, 32, 16, 7 },
524 	{ 224, 32, 16, 7 },
525 	{ 240, 32, 16, 7 },
526 	{ 0, 40, 16, 7 },
527 	{ 16, 40, 16, 7 },
528 	{ 32, 40, 16, 7 },
529 	{ 48, 40, 16, 7 },
530 	{ 64, 40, 16, 7 },
531 	{ 80, 40, 16, 7 },
532 	{ 96, 40, 16, 7 },
533 	{ 112, 40, 16, 7 },
534 	{ 128, 40, 16, 7 },
535 	{ 144, 40, 16, 7 },
536 	{ 160, 40, 16, 7 },
537 	{ 176, 40, 16, 7 },
538 	{ 192, 40, 16, 7 },
539 	{ 208, 40, 16, 7 },
540 	{ 224, 40, 16, 7 },
541 	{ 240, 40, 16, 7 },
542 	{ 256, 40, 16, 7 },
543 	{ 272, 40, 16, 7 },
544 	{ 288, 40, 16, 7 },
545 	{ 304, 40, 16, 7 },
546 	{ 0, 48, 16, 7 },
547 	{ 16, 48, 16, 7 },
548 	{ 32, 48, 16, 7 },
549 	{ 48, 48, 16, 7 },
550 	{ 64, 48, 16, 7 },
551 	{ 80, 48, 16, 7 },
552 	{ 96, 48, 16, 7 },
553 	{ 112, 48, 16, 7 },
554 	{ 128, 48, 16, 7 },
555 	{ 144, 48, 16, 7 },
556 	{ 160, 48, 16, 7 },
557 	{ 176, 48, 16, 7 },
558 	{ 192, 48, 16, 7 },
559 	{ 208, 48, 16, 7 },
560 	{ 224, 48, 16, 7 },
561 	{ 240, 48, 16, 7 },
562 	{ 0, 56, 16, 7 },
563 	{ 16, 56, 16, 7 },
564 	{ 32, 56, 16, 7 },
565 	{ 48, 56, 16, 7 },
566 	{ 64, 56, 16, 7 },
567 	{ 80, 56, 16, 7 },
568 	{ 96, 56, 16, 7 },
569 	{ 112, 56, 16, 7 },
570 	{ 128, 56, 16, 7 },
571 	{ 144, 56, 16, 7 },
572 	{ 160, 56, 16, 7 },
573 	{ 176, 56, 16, 7 },
574 	{ 192, 56, 16, 7 },
575 	{ 208, 56, 16, 7 },
576 	{ 224, 56, 16, 7 },
577 	{ 240, 56, 16, 7 },
578 	{ 256, 56, 16, 7 },
579 	{ 272, 56, 16, 7 },
580 	{ 288, 56, 16, 7 },
581 	{ 304, 56, 16, 7 },
582 	{ 0, 64, 16, 7 },
583 	{ 16, 64, 16, 7 },
584 	{ 32, 64, 16, 7 },
585 	{ 48, 64, 16, 7 },
586 	{ 64, 64, 16, 7 },
587 	{ 80, 64, 16, 7 },
588 	{ 96, 64, 16, 7 },
589 	{ 112, 64, 16, 7 },
590 	{ 128, 64, 16, 7 },
591 	{ 144, 64, 16, 7 },
592 	{ 160, 64, 16, 7 },
593 	{ 176, 64, 16, 7 },
594 	{ 192, 64, 16, 7 },
595 	{ 208, 64, 16, 7 },
596 	{ 224, 64, 16, 7 },
597 	{ 240, 64, 16, 7 },
598 	{ 160, 72, 32, 19 },
599 	{ 192, 72, 32, 19 },
600 	{ 224, 72, 32, 19 },
601 	{ 256, 72, 32, 19 },
602 	{ 288, 72, 32, 19 },
603 	{ 0, 93, 32, 19 },
604 	{ 32, 93, 32, 19 },
605 	{ 64, 93, 32, 19 },
606 	{ 96, 93, 32, 19 },
607 	{ 128, 93, 32, 19 },
608 	{ 0, 140, 32, 19 },
609 	{ 32, 140, 32, 19 },
610 	{ 64, 140, 32, 19 },
611 	{ 96, 140, 32, 19 },
612 	{ 128, 140, 32, 19 },
613 	{ 160, 140, 32, 19 },
614 	{ 192, 140, 32, 19 },
615 	{ 224, 140, 32, 19 },
616 	{ 256, 140, 32, 19 },
617 	{ 288, 140, 32, 19 },
618 	{ 0, 0, 48, 11 },
619 	{ 0, 0, 48, 11 },
620 	{ 144, 12, 48, 11 },
621 	{ 192, 12, 48, 11 },
622 	{ 96, 113, 48, 13 },
623 	{ 144, 113, 48, 13 },
624 	{ 0, 72, 16, 6 },
625 	{ 16, 72, 16, 6 },
626 	{ 32, 72, 16, 6 },
627 	{ 48, 72, 16, 6 },
628 	{ 64, 72, 16, 6 },
629 	{ 80, 72, 16, 6 },
630 	{ 96, 72, 16, 6 },
631 	{ 112, 72, 16, 6 },
632 	{ 128, 72, 16, 6 },
633 	{ 144, 72, 16, 6 },
634 	{ 0, 131, 16, 6 },
635 	{ 16, 131, 16, 6 },
636 	{ 32, 131, 16, 6 },
637 	{ 48, 131, 16, 6 },
638 	{ 64, 131, 16, 6 },
639 	{ 80, 131, 16, 6 },
640 	{ 96, 131, 16, 6 },
641 	{ 112, 131, 16, 6 },
642 	{ 128, 131, 16, 6 },
643 	{ 144, 131, 16, 6 },
644 	{ 192, 93, 16, 19 },
645 	{ 224, 93, 16, 19 },
646 	{ 208, 93, 16, 19 },
647 	{ 240, 93, 16, 19 },
648 	{ 256, 93, 16, 19 },
649 	{ 272, 93, 16, 19 },
650 	{ 288, 93, 16, 19 },
651 	{ 160, 93, 32, 19 },
652 	{ 0, 178, 48, 22 },				// Briefing Helicopter: Front
653 	{ 48, 178, 16, 14 },			// Briefing Helicopter: Tail
654 	/* 205 */{ 64, 175, 48, 2 },	// Briefing Helicopter: Blade-1
655 	/* 206 */{ 64, 178, 48, 2 },	// Briefing Helicopter: Blade-2
656 	/* 207 */{ 64, 181, 48, 2 },	// Briefing Helicopter: Blade-3
657 	{ 192, 113, 48, 10 }			// World Map Icon
658 };
659 
660 int16 word_32AEC[] = {
661 	0x00, 0x01, 0x02, 0x03, 0x04,   // Walk Anim
662 	0x05, 0x06, 0x07,
663 
664     0x20, 0x21, 0x22, 0x23, 0x24,   // Death Anim
665     0x25, 0x26, 0x27,
666 
667     0x28, 0x29, 0x22, 0x2B, 0x2C,   // Death-2 Anim
668     0x2D, 0x2E, 0x2F,
669 
670     0x30, 0x31, 0x32, 0x33, 0x34,
671     0x35, 0x36, 0x37,
672 
673     0x18, 0x19, 0x1A, 0x1B, 0x1C,
674     0x1D, 0x1E, 0x1F,
675 
676 	0x08, 0x09, 0x0A, 0x0B, 0x0C,
677 	0x0D, 0x0E, 0x0F, 0x10, 0x11,
678 	0x12, 0x13, 0x14, 0x15, 0x16,
679 	0x17, 0x39, 0x3A, 0x3B, 0x3C,
680 	0x3D, 0x3E, 0x3F, 0x40, 0xB0,
681 	0xB1, 0xB2, 0xB3, 0xB4, 0xB5,
682 	0xB6, 0xB7
683 };
684 
685 int16 word_32B7C[] = {
686 	0x42, 0x43, 0x44, 0x45, 0x46,   // Walk Anim
687 	0x47, 0x48, 0x49,
688 
689     0x62, 0x63,	0x64, 0x65, 0x66,   // Death Anim
690     0x67, 0x68, 0x69,
691 
692     0x6A, 0x6B, 0x64, 0x6D, 0x6E,   // Death-2 Anim
693     0x6F, 0x70, 0x71,
694 
695     0x72, 0x73, 0x74,
696     0x75, 0x76, 0x77, 0x78, 0x79,
697 
698     0x5A, 0x5B, 0x5C,               // Swim
699 	0x5D, 0x5E, 0x5F, 0x60, 0x61,
700 
701 	0x4A, 0x4B, 0x4C, 0x4D, 0x4E,   // Throw
702 	0x4F, 0x50, 0x51,
703 
704     0x52, 0x53, 0x54, 0x55, 0x56,   // Prone
705     0x57, 0x58, 0x59,
706 
707     0xA8, 0xA9, 0xAA, 0xAB, 0xAC,   // With Rocket Launcher
708     0xAD, 0xAE, 0xAF,
709 
710     0xB8, 0xB9, 0xBA, 0xBB, 0xBC,   // Still with gun out
711     0xBD, 0xBE, 0xBF,
712 };
713 
714 const int16* mSprite_AnimationPtrs[] = {
715 	word_32AEC,	// Human
716 	word_32B7C	// Computer
717 };
718 
719 const int16 mSprite_Speed_Direction_Modifier[] = {
720 	0x18, 0x14, 0x0E, 0x0A, 0x08,
721 	0x0A, 0x0E, 0x14
722 };
723 
724 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf1 = {
725 	0,
726 	-1
727 };
728 
729 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf2 = {
730 	0, 1,
731 	-1
732 };
733 
734 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf3 = {
735 	0, 1, 0, 2,
736 	-1
737 };
738 
739 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf4 = {
740 	0, 1, 0, 2, 0, 3, 0, 2,
741 	-1
742 };
743 
744 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf5 = {
745 	0, 1, 0, 2, 0, 3, 0, 4, 0, 3,
746 	0, 2,
747 	-1,
748 };
749 
750 
751 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf6 = {
752 	0, 1, 0, 2, 0, 3, 0, 4, 0, 5,
753 	0, 4, 0, 3, 0, 2,
754 	-1
755 };
756 
757 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf7 = {
758 	0, 1, 0, 2, 0, 3, 0, 4, 0, 5,
759 	0, 6, 0, 5, 0, 4, 0, 3, 0, 2,
760 	-1,
761 };
762 
763 const std::vector<int16> mSoldier_Squad_Fire_RotationSquadOf8 = {
764 	0, 1, 0, 2, 0, 3, 0, 4, 0, 5,
765 	0, 6, 0, 5, 0, 4, 0, 3, 0, 2,
766 	-1
767 };
768 
769 const std::vector<std::vector<int16>> mSoldier_Squad_Fire_RotationOrder = {
770 	mSoldier_Squad_Fire_RotationSquadOf1,
771 	mSoldier_Squad_Fire_RotationSquadOf2,
772 	mSoldier_Squad_Fire_RotationSquadOf3,
773 	mSoldier_Squad_Fire_RotationSquadOf4,
774 	mSoldier_Squad_Fire_RotationSquadOf5,
775 	mSoldier_Squad_Fire_RotationSquadOf6,
776 	mSoldier_Squad_Fire_RotationSquadOf7,
777 	mSoldier_Squad_Fire_RotationSquadOf8
778 };
779 
Clear()780 void sSprite::Clear() {
781 	field_0 = -32768;
782 	field_2 = 0;
783 	field_4 = 0;
784 	field_6 = 0;
785 	field_8 = 0;
786 	field_A = 0;
787 	field_C = 0;
788 	field_E = 0;
789 	field_10 = 0;
790 	field_12 = 0;
791 	field_14 = 0;
792 	field_16 = 0;
793 	field_18 = 0;
794 	field_1A_sprite = 0;
795 	field_1E = 0;
796 	field_20 = 0;
797 	field_22 = eSprite_PersonType_Human;
798 	field_24 = 0;
799 	field_26 = 0;
800 	field_28 = 0;
801 	field_2A = 0;
802 	field_2C = eSprite_Draw_Second;
803 	field_2E = 0;
804 	field_30 = 0;
805 	field_32 = 0;
806 	field_34 = 0;
807 	field_36 = 0;
808 	field_38 = eSprite_Anim_None;
809 	field_3A = 0;
810 	field_3C = 0;
811 	field_3E = 0;
812 	field_40 = 0;
813 	field_42 = 0;
814 	field_43 = 0;
815 	field_44 = 0;
816 	field_45 = 0;
817 	field_46_sprite = 0;
818 	field_4A = 0;
819 	field_4C = 0;
820 	field_4D = 0;
821 	field_4E = 0;
822 	field_4F = 0;
823 	field_50 = 0;
824 	field_52 = 0;
825 	field_54 = 0;
826 	field_55 = 0;
827 	field_56 = 0;
828 	field_57 = 0;
829 	field_58 = 0;
830 	field_59 = 0;
831 	field_5A = 0;
832 	field_5B = 0;
833 	field_5C = 0;
834 	field_5D = 0;
835 	field_5E = 0;
836 	field_5E_Squad = 0;
837 	field_5E_SoldierAllocated = 0;
838 	field_60 = 0;
839 	field_61 = 0;
840 	field_62 = 0;
841 	field_64 = 0;
842 	field_65 = 0;
843 	field_66 = 0;
844 	field_6A_sprite = 0;
845 	field_6E = 0;
846 	field_6F = 0;
847 	field_70 = 0;
848 	field_74 = 0;
849 	field_75 = 0;
850 }
851