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