summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/wolf3d/wl_act2.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2019-07-07 22:00:20 -0400
committerFranklin Wei <git@fwei.tk>2019-07-09 11:20:55 -0400
commit3f59fc8b771625aca9c3aefe03cf1038d8461963 (patch)
treee0623a323613baa0b0993411b38bcaed144b27ed /apps/plugins/sdl/progs/wolf3d/wl_act2.c
parent439a0d1d91fa040d261fc39b87278bc9f5391dcc (diff)
downloadrockbox-3f59fc8b771625aca9c3aefe03cf1038d8461963.tar.gz
rockbox-3f59fc8b771625aca9c3aefe03cf1038d8461963.zip
Wolfenstein 3-D!
This is a port of Wolf4SDL, which is derived from the original id software source release. The port runs on top of the SDL plugin runtime and is loaded as an overlay. Licensing of the game code is not an issue, as discussed below (essentially, the Debian project treats Wolf4SDL as GPLv2, with an email from John Carmack backing it up): http://forums.rockbox.org/index.php?topic=52872 Included is a copy of MAME's Yamaha OPL sound chip emulator (fmopl_gpl.c). This file was not part of the original Wolf4SDL source (which includes a non-GPL'd version), but was rather rebased from from a later MAME source which had been relicensed to GPLv2. Change-Id: I64c2ba035e0be7e2f49252f40640641416613439
Diffstat (limited to 'apps/plugins/sdl/progs/wolf3d/wl_act2.c')
-rw-r--r--apps/plugins/sdl/progs/wolf3d/wl_act2.c3899
1 files changed, 3899 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/wolf3d/wl_act2.c b/apps/plugins/sdl/progs/wolf3d/wl_act2.c
new file mode 100644
index 0000000000..20a81f6329
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/wl_act2.c
@@ -0,0 +1,3899 @@
1// WL_ACT2.C
2
3#include <stdio.h>
4#include <math.h>
5#include "wl_def.h"
6#pragma hdrstop
7
8/*
9=============================================================================
10
11 LOCAL CONSTANTS
12
13=============================================================================
14*/
15
16#define PROJECTILESIZE 0xc000l
17
18#define BJRUNSPEED 2048
19#define BJJUMPSPEED 680
20
21
22/*
23=============================================================================
24
25 GLOBAL VARIABLES
26
27=============================================================================
28*/
29
30
31
32/*
33=============================================================================
34
35 LOCAL VARIABLES
36
37=============================================================================
38*/
39
40
41dirtype dirtable[9] = {northwest,north,northeast,west,nodir,east,
42 southwest,south,southeast};
43
44short starthitpoints[4][NUMENEMIES] =
45//
46// BABY MODE
47//
48{
49 {
50 25, // guards
51 50, // officer
52 100, // SS
53 1, // dogs
54 850, // Hans
55 850, // Schabbs
56 200, // fake hitler
57 800, // mecha hitler
58 45, // mutants
59 25, // ghosts
60 25, // ghosts
61 25, // ghosts
62 25, // ghosts
63
64 850, // Gretel
65 850, // Gift
66 850, // Fat
67 5, // en_spectre,
68 1450, // en_angel,
69 850, // en_trans,
70 1050, // en_uber,
71 950, // en_will,
72 1250 // en_death
73 },
74 //
75 // DON'T HURT ME MODE
76 //
77 {
78 25, // guards
79 50, // officer
80 100, // SS
81 1, // dogs
82 950, // Hans
83 950, // Schabbs
84 300, // fake hitler
85 950, // mecha hitler
86 55, // mutants
87 25, // ghosts
88 25, // ghosts
89 25, // ghosts
90 25, // ghosts
91
92 950, // Gretel
93 950, // Gift
94 950, // Fat
95 10, // en_spectre,
96 1550, // en_angel,
97 950, // en_trans,
98 1150, // en_uber,
99 1050, // en_will,
100 1350 // en_death
101 },
102 //
103 // BRING 'EM ON MODE
104 //
105 {
106 25, // guards
107 50, // officer
108 100, // SS
109 1, // dogs
110
111 1050, // Hans
112 1550, // Schabbs
113 400, // fake hitler
114 1050, // mecha hitler
115
116 55, // mutants
117 25, // ghosts
118 25, // ghosts
119 25, // ghosts
120 25, // ghosts
121
122 1050, // Gretel
123 1050, // Gift
124 1050, // Fat
125 15, // en_spectre,
126 1650, // en_angel,
127 1050, // en_trans,
128 1250, // en_uber,
129 1150, // en_will,
130 1450 // en_death
131 },
132 //
133 // DEATH INCARNATE MODE
134 //
135 {
136 25, // guards
137 50, // officer
138 100, // SS
139 1, // dogs
140
141 1200, // Hans
142 2400, // Schabbs
143 500, // fake hitler
144 1200, // mecha hitler
145
146 65, // mutants
147 25, // ghosts
148 25, // ghosts
149 25, // ghosts
150 25, // ghosts
151
152 1200, // Gretel
153 1200, // Gift
154 1200, // Fat
155 25, // en_spectre,
156 2000, // en_angel,
157 1200, // en_trans,
158 1400, // en_uber,
159 1300, // en_will,
160 1600 // en_death
161 }
162};
163
164void A_StartDeathCam (objtype *ob);
165
166
167void T_Path (objtype *ob);
168void T_Shoot (objtype *ob);
169void T_Bite (objtype *ob);
170void T_DogChase (objtype *ob);
171void T_Chase (objtype *ob);
172void T_Projectile (objtype *ob);
173void T_Stand (objtype *ob);
174
175void A_DeathScream (objtype *ob);
176
177extern statetype s_rocket;
178extern statetype s_smoke1;
179extern statetype s_smoke2;
180extern statetype s_smoke3;
181extern statetype s_smoke4;
182extern statetype s_boom2;
183extern statetype s_boom3;
184
185void A_Smoke (objtype *ob);
186
187statetype s_rocket = {true,SPR_ROCKET_1,3,(statefunc)T_Projectile,(statefunc)A_Smoke,&s_rocket};
188statetype s_smoke1 = {false,SPR_SMOKE_1,3,NULL,NULL,&s_smoke2};
189statetype s_smoke2 = {false,SPR_SMOKE_2,3,NULL,NULL,&s_smoke3};
190statetype s_smoke3 = {false,SPR_SMOKE_3,3,NULL,NULL,&s_smoke4};
191statetype s_smoke4 = {false,SPR_SMOKE_4,3,NULL,NULL,NULL};
192
193statetype s_boom1 = {false,SPR_BOOM_1,6,NULL,NULL,&s_boom2};
194statetype s_boom2 = {false,SPR_BOOM_2,6,NULL,NULL,&s_boom3};
195statetype s_boom3 = {false,SPR_BOOM_3,6,NULL,NULL,NULL};
196
197#ifdef SPEAR
198
199extern statetype s_hrocket;
200extern statetype s_hsmoke1;
201extern statetype s_hsmoke2;
202extern statetype s_hsmoke3;
203extern statetype s_hsmoke4;
204extern statetype s_hboom2;
205extern statetype s_hboom3;
206
207void A_Smoke (objtype *ob);
208
209statetype s_hrocket = {true,SPR_HROCKET_1,3,(statefunc)T_Projectile,(statefunc)A_Smoke,&s_hrocket};
210statetype s_hsmoke1 = {false,SPR_HSMOKE_1,3,NULL,NULL,&s_hsmoke2};
211statetype s_hsmoke2 = {false,SPR_HSMOKE_2,3,NULL,NULL,&s_hsmoke3};
212statetype s_hsmoke3 = {false,SPR_HSMOKE_3,3,NULL,NULL,&s_hsmoke4};
213statetype s_hsmoke4 = {false,SPR_HSMOKE_4,3,NULL,NULL,NULL};
214
215statetype s_hboom1 = {false,SPR_HBOOM_1,6,NULL,NULL,&s_hboom2};
216statetype s_hboom2 = {false,SPR_HBOOM_2,6,NULL,NULL,&s_hboom3};
217statetype s_hboom3 = {false,SPR_HBOOM_3,6,NULL,NULL,NULL};
218
219#endif
220
221void T_Schabb (objtype *ob);
222void T_SchabbThrow (objtype *ob);
223void T_Fake (objtype *ob);
224void T_FakeFire (objtype *ob);
225void T_Ghosts (objtype *ob);
226
227void A_Slurpie (objtype *ob);
228void A_HitlerMorph (objtype *ob);
229void A_MechaSound (objtype *ob);
230
231/*
232=================
233=
234= A_Smoke
235=
236=================
237*/
238
239void A_Smoke (objtype *ob)
240{
241 GetNewActor ();
242#ifdef SPEAR
243 if (ob->obclass == hrocketobj)
244 newobj->state = &s_hsmoke1;
245 else
246#endif
247 newobj->state = &s_smoke1;
248 newobj->ticcount = 6;
249
250 newobj->tilex = ob->tilex;
251 newobj->tiley = ob->tiley;
252 newobj->x = ob->x;
253 newobj->y = ob->y;
254 newobj->obclass = inertobj;
255 newobj->active = ac_yes;
256
257 newobj->flags = FL_NEVERMARK;
258}
259
260
261/*
262===================
263=
264= ProjectileTryMove
265=
266= returns true if move ok
267===================
268*/
269
270#define PROJSIZE 0x2000
271
272boolean ProjectileTryMove (objtype *ob)
273{
274 int xl,yl,xh,yh,x,y;
275 objtype *check;
276
277 xl = (ob->x-PROJSIZE) >> TILESHIFT;
278 yl = (ob->y-PROJSIZE) >> TILESHIFT;
279
280 xh = (ob->x+PROJSIZE) >> TILESHIFT;
281 yh = (ob->y+PROJSIZE) >> TILESHIFT;
282
283 //
284 // check for solid walls
285 //
286 for (y=yl;y<=yh;y++)
287 for (x=xl;x<=xh;x++)
288 {
289 check = actorat[x][y];
290 if (check && !ISPOINTER(check))
291 return false;
292 }
293
294 return true;
295}
296
297
298
299/*
300=================
301=
302= T_Projectile
303=
304=================
305*/
306
307void T_Projectile (objtype *ob)
308{
309 int32_t deltax,deltay;
310 int damage;
311 int32_t speed;
312
313 speed = (int32_t)ob->speed*tics;
314
315 deltax = FixedMul(speed,costable[ob->angle]);
316 deltay = -FixedMul(speed,sintable[ob->angle]);
317
318 if (deltax>0x10000l)
319 deltax = 0x10000l;
320 if (deltay>0x10000l)
321 deltay = 0x10000l;
322
323 ob->x += deltax;
324 ob->y += deltay;
325
326 deltax = LABS(ob->x - player->x);
327 deltay = LABS(ob->y - player->y);
328
329 if (!ProjectileTryMove (ob))
330 {
331#ifndef APOGEE_1_0 // actually the whole method is never reached in shareware 1.0
332 if (ob->obclass == rocketobj)
333 {
334 PlaySoundLocActor(MISSILEHITSND,ob);
335 ob->state = &s_boom1;
336 }
337#ifdef SPEAR
338 else if (ob->obclass == hrocketobj)
339 {
340 PlaySoundLocActor(MISSILEHITSND,ob);
341 ob->state = &s_hboom1;
342 }
343#endif
344 else
345#endif
346 ob->state = NULL; // mark for removal
347
348 return;
349 }
350
351 if (deltax < PROJECTILESIZE && deltay < PROJECTILESIZE)
352 { // hit the player
353 switch (ob->obclass)
354 {
355 case needleobj:
356 damage = (US_RndT() >>3) + 20;
357 break;
358 case rocketobj:
359 case hrocketobj:
360 case sparkobj:
361 damage = (US_RndT() >>3) + 30;
362 break;
363 case fireobj:
364 damage = (US_RndT() >>3);
365 break;
366 }
367
368 TakeDamage (damage,ob);
369 ob->state = NULL; // mark for removal
370 return;
371 }
372
373 ob->tilex = (short)(ob->x >> TILESHIFT);
374 ob->tiley = (short)(ob->y >> TILESHIFT);
375}
376
377
378/*
379=============================================================================
380
381GUARD
382
383=============================================================================
384*/
385
386//
387// guards
388//
389
390extern statetype s_grdstand;
391
392extern statetype s_grdpath1;
393extern statetype s_grdpath1s;
394extern statetype s_grdpath2;
395extern statetype s_grdpath3;
396extern statetype s_grdpath3s;
397extern statetype s_grdpath4;
398
399extern statetype s_grdpain;
400extern statetype s_grdpain1;
401
402extern statetype s_grdgiveup;
403
404extern statetype s_grdshoot1;
405extern statetype s_grdshoot2;
406extern statetype s_grdshoot3;
407extern statetype s_grdshoot4;
408
409extern statetype s_grdchase1;
410extern statetype s_grdchase1s;
411extern statetype s_grdchase2;
412extern statetype s_grdchase3;
413extern statetype s_grdchase3s;
414extern statetype s_grdchase4;
415
416extern statetype s_grddie1;
417extern statetype s_grddie1d;
418extern statetype s_grddie2;
419extern statetype s_grddie3;
420extern statetype s_grddie4;
421
422statetype s_grdstand = {true,SPR_GRD_S_1,0,(statefunc)T_Stand,NULL,&s_grdstand};
423
424statetype s_grdpath1 = {true,SPR_GRD_W1_1,20,(statefunc)T_Path,NULL,&s_grdpath1s};
425statetype s_grdpath1s = {true,SPR_GRD_W1_1,5,NULL,NULL,&s_grdpath2};
426statetype s_grdpath2 = {true,SPR_GRD_W2_1,15,(statefunc)T_Path,NULL,&s_grdpath3};
427statetype s_grdpath3 = {true,SPR_GRD_W3_1,20,(statefunc)T_Path,NULL,&s_grdpath3s};
428statetype s_grdpath3s = {true,SPR_GRD_W3_1,5,NULL,NULL,&s_grdpath4};
429statetype s_grdpath4 = {true,SPR_GRD_W4_1,15,(statefunc)T_Path,NULL,&s_grdpath1};
430
431statetype s_grdpain = {2,SPR_GRD_PAIN_1,10,NULL,NULL,&s_grdchase1};
432statetype s_grdpain1 = {2,SPR_GRD_PAIN_2,10,NULL,NULL,&s_grdchase1};
433
434statetype s_grdshoot1 = {false,SPR_GRD_SHOOT1,20,NULL,NULL,&s_grdshoot2};
435statetype s_grdshoot2 = {false,SPR_GRD_SHOOT2,20,NULL,(statefunc)T_Shoot,&s_grdshoot3};
436statetype s_grdshoot3 = {false,SPR_GRD_SHOOT3,20,NULL,NULL,&s_grdchase1};
437
438statetype s_grdchase1 = {true,SPR_GRD_W1_1,10,(statefunc)T_Chase,NULL,&s_grdchase1s};
439statetype s_grdchase1s = {true,SPR_GRD_W1_1,3,NULL,NULL,&s_grdchase2};
440statetype s_grdchase2 = {true,SPR_GRD_W2_1,8,(statefunc)T_Chase,NULL,&s_grdchase3};
441statetype s_grdchase3 = {true,SPR_GRD_W3_1,10,(statefunc)T_Chase,NULL,&s_grdchase3s};
442statetype s_grdchase3s = {true,SPR_GRD_W3_1,3,NULL,NULL,&s_grdchase4};
443statetype s_grdchase4 = {true,SPR_GRD_W4_1,8,(statefunc)T_Chase,NULL,&s_grdchase1};
444
445statetype s_grddie1 = {false,SPR_GRD_DIE_1,15,NULL,(statefunc)A_DeathScream,&s_grddie2};
446statetype s_grddie2 = {false,SPR_GRD_DIE_2,15,NULL,NULL,&s_grddie3};
447statetype s_grddie3 = {false,SPR_GRD_DIE_3,15,NULL,NULL,&s_grddie4};
448statetype s_grddie4 = {false,SPR_GRD_DEAD,0,NULL,NULL,&s_grddie4};
449
450
451#ifndef SPEAR
452//
453// ghosts
454//
455extern statetype s_blinkychase1;
456extern statetype s_blinkychase2;
457extern statetype s_inkychase1;
458extern statetype s_inkychase2;
459extern statetype s_pinkychase1;
460extern statetype s_pinkychase2;
461extern statetype s_clydechase1;
462extern statetype s_clydechase2;
463
464statetype s_blinkychase1 = {false,SPR_BLINKY_W1,10,(statefunc)T_Ghosts,NULL,&s_blinkychase2};
465statetype s_blinkychase2 = {false,SPR_BLINKY_W2,10,(statefunc)T_Ghosts,NULL,&s_blinkychase1};
466
467statetype s_inkychase1 = {false,SPR_INKY_W1,10,(statefunc)T_Ghosts,NULL,&s_inkychase2};
468statetype s_inkychase2 = {false,SPR_INKY_W2,10,(statefunc)T_Ghosts,NULL,&s_inkychase1};
469
470statetype s_pinkychase1 = {false,SPR_PINKY_W1,10,(statefunc)T_Ghosts,NULL,&s_pinkychase2};
471statetype s_pinkychase2 = {false,SPR_PINKY_W2,10,(statefunc)T_Ghosts,NULL,&s_pinkychase1};
472
473statetype s_clydechase1 = {false,SPR_CLYDE_W1,10,(statefunc)T_Ghosts,NULL,&s_clydechase2};
474statetype s_clydechase2 = {false,SPR_CLYDE_W2,10,(statefunc)T_Ghosts,NULL,&s_clydechase1};
475#endif
476
477//
478// dogs
479//
480
481extern statetype s_dogpath1;
482extern statetype s_dogpath1s;
483extern statetype s_dogpath2;
484extern statetype s_dogpath3;
485extern statetype s_dogpath3s;
486extern statetype s_dogpath4;
487
488extern statetype s_dogjump1;
489extern statetype s_dogjump2;
490extern statetype s_dogjump3;
491extern statetype s_dogjump4;
492extern statetype s_dogjump5;
493
494extern statetype s_dogchase1;
495extern statetype s_dogchase1s;
496extern statetype s_dogchase2;
497extern statetype s_dogchase3;
498extern statetype s_dogchase3s;
499extern statetype s_dogchase4;
500
501extern statetype s_dogdie1;
502extern statetype s_dogdie1d;
503extern statetype s_dogdie2;
504extern statetype s_dogdie3;
505extern statetype s_dogdead;
506
507statetype s_dogpath1 = {true,SPR_DOG_W1_1,20,(statefunc)T_Path,NULL,&s_dogpath1s};
508statetype s_dogpath1s = {true,SPR_DOG_W1_1,5,NULL,NULL,&s_dogpath2};
509statetype s_dogpath2 = {true,SPR_DOG_W2_1,15,(statefunc)T_Path,NULL,&s_dogpath3};
510statetype s_dogpath3 = {true,SPR_DOG_W3_1,20,(statefunc)T_Path,NULL,&s_dogpath3s};
511statetype s_dogpath3s = {true,SPR_DOG_W3_1,5,NULL,NULL,&s_dogpath4};
512statetype s_dogpath4 = {true,SPR_DOG_W4_1,15,(statefunc)T_Path,NULL,&s_dogpath1};
513
514statetype s_dogjump1 = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump2};
515statetype s_dogjump2 = {false,SPR_DOG_JUMP2,10,NULL,(statefunc)T_Bite,&s_dogjump3};
516statetype s_dogjump3 = {false,SPR_DOG_JUMP3,10,NULL,NULL,&s_dogjump4};
517statetype s_dogjump4 = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump5};
518statetype s_dogjump5 = {false,SPR_DOG_W1_1,10,NULL,NULL,&s_dogchase1};
519
520statetype s_dogchase1 = {true,SPR_DOG_W1_1,10,(statefunc)T_DogChase,NULL,&s_dogchase1s};
521statetype s_dogchase1s = {true,SPR_DOG_W1_1,3,NULL,NULL,&s_dogchase2};
522statetype s_dogchase2 = {true,SPR_DOG_W2_1,8,(statefunc)T_DogChase,NULL,&s_dogchase3};
523statetype s_dogchase3 = {true,SPR_DOG_W3_1,10,(statefunc)T_DogChase,NULL,&s_dogchase3s};
524statetype s_dogchase3s = {true,SPR_DOG_W3_1,3,NULL,NULL,&s_dogchase4};
525statetype s_dogchase4 = {true,SPR_DOG_W4_1,8,(statefunc)T_DogChase,NULL,&s_dogchase1};
526
527statetype s_dogdie1 = {false,SPR_DOG_DIE_1,15,NULL,(statefunc)A_DeathScream,&s_dogdie2};
528statetype s_dogdie2 = {false,SPR_DOG_DIE_2,15,NULL,NULL,&s_dogdie3};
529statetype s_dogdie3 = {false,SPR_DOG_DIE_3,15,NULL,NULL,&s_dogdead};
530statetype s_dogdead = {false,SPR_DOG_DEAD,15,NULL,NULL,&s_dogdead};
531
532
533//
534// officers
535//
536
537extern statetype s_ofcstand;
538
539extern statetype s_ofcpath1;
540extern statetype s_ofcpath1s;
541extern statetype s_ofcpath2;
542extern statetype s_ofcpath3;
543extern statetype s_ofcpath3s;
544extern statetype s_ofcpath4;
545
546extern statetype s_ofcpain;
547extern statetype s_ofcpain1;
548
549extern statetype s_ofcgiveup;
550
551extern statetype s_ofcshoot1;
552extern statetype s_ofcshoot2;
553extern statetype s_ofcshoot3;
554extern statetype s_ofcshoot4;
555
556extern statetype s_ofcchase1;
557extern statetype s_ofcchase1s;
558extern statetype s_ofcchase2;
559extern statetype s_ofcchase3;
560extern statetype s_ofcchase3s;
561extern statetype s_ofcchase4;
562
563extern statetype s_ofcdie1;
564extern statetype s_ofcdie2;
565extern statetype s_ofcdie3;
566extern statetype s_ofcdie4;
567extern statetype s_ofcdie5;
568
569statetype s_ofcstand = {true,SPR_OFC_S_1,0,(statefunc)T_Stand,NULL,&s_ofcstand};
570
571statetype s_ofcpath1 = {true,SPR_OFC_W1_1,20,(statefunc)T_Path,NULL,&s_ofcpath1s};
572statetype s_ofcpath1s = {true,SPR_OFC_W1_1,5,NULL,NULL,&s_ofcpath2};
573statetype s_ofcpath2 = {true,SPR_OFC_W2_1,15,(statefunc)T_Path,NULL,&s_ofcpath3};
574statetype s_ofcpath3 = {true,SPR_OFC_W3_1,20,(statefunc)T_Path,NULL,&s_ofcpath3s};
575statetype s_ofcpath3s = {true,SPR_OFC_W3_1,5,NULL,NULL,&s_ofcpath4};
576statetype s_ofcpath4 = {true,SPR_OFC_W4_1,15,(statefunc)T_Path,NULL,&s_ofcpath1};
577
578statetype s_ofcpain = {2,SPR_OFC_PAIN_1,10,NULL,NULL,&s_ofcchase1};
579statetype s_ofcpain1 = {2,SPR_OFC_PAIN_2,10,NULL,NULL,&s_ofcchase1};
580
581statetype s_ofcshoot1 = {false,SPR_OFC_SHOOT1,6,NULL,NULL,&s_ofcshoot2};
582statetype s_ofcshoot2 = {false,SPR_OFC_SHOOT2,20,NULL,(statefunc)T_Shoot,&s_ofcshoot3};
583statetype s_ofcshoot3 = {false,SPR_OFC_SHOOT3,10,NULL,NULL,&s_ofcchase1};
584
585statetype s_ofcchase1 = {true,SPR_OFC_W1_1,10,(statefunc)T_Chase,NULL,&s_ofcchase1s};
586statetype s_ofcchase1s = {true,SPR_OFC_W1_1,3,NULL,NULL,&s_ofcchase2};
587statetype s_ofcchase2 = {true,SPR_OFC_W2_1,8,(statefunc)T_Chase,NULL,&s_ofcchase3};
588statetype s_ofcchase3 = {true,SPR_OFC_W3_1,10,(statefunc)T_Chase,NULL,&s_ofcchase3s};
589statetype s_ofcchase3s = {true,SPR_OFC_W3_1,3,NULL,NULL,&s_ofcchase4};
590statetype s_ofcchase4 = {true,SPR_OFC_W4_1,8,(statefunc)T_Chase,NULL,&s_ofcchase1};
591
592statetype s_ofcdie1 = {false,SPR_OFC_DIE_1,11,NULL,(statefunc)A_DeathScream,&s_ofcdie2};
593statetype s_ofcdie2 = {false,SPR_OFC_DIE_2,11,NULL,NULL,&s_ofcdie3};
594statetype s_ofcdie3 = {false,SPR_OFC_DIE_3,11,NULL,NULL,&s_ofcdie4};
595statetype s_ofcdie4 = {false,SPR_OFC_DIE_4,11,NULL,NULL,&s_ofcdie5};
596statetype s_ofcdie5 = {false,SPR_OFC_DEAD,0,NULL,NULL,&s_ofcdie5};
597
598
599//
600// mutant
601//
602
603extern statetype s_mutstand;
604
605extern statetype s_mutpath1;
606extern statetype s_mutpath1s;
607extern statetype s_mutpath2;
608extern statetype s_mutpath3;
609extern statetype s_mutpath3s;
610extern statetype s_mutpath4;
611
612extern statetype s_mutpain;
613extern statetype s_mutpain1;
614
615extern statetype s_mutgiveup;
616
617extern statetype s_mutshoot1;
618extern statetype s_mutshoot2;
619extern statetype s_mutshoot3;
620extern statetype s_mutshoot4;
621
622extern statetype s_mutchase1;
623extern statetype s_mutchase1s;
624extern statetype s_mutchase2;
625extern statetype s_mutchase3;
626extern statetype s_mutchase3s;
627extern statetype s_mutchase4;
628
629extern statetype s_mutdie1;
630extern statetype s_mutdie2;
631extern statetype s_mutdie3;
632extern statetype s_mutdie4;
633extern statetype s_mutdie5;
634
635statetype s_mutstand = {true,SPR_MUT_S_1,0,(statefunc)T_Stand,NULL,&s_mutstand};
636
637statetype s_mutpath1 = {true,SPR_MUT_W1_1,20,(statefunc)T_Path,NULL,&s_mutpath1s};
638statetype s_mutpath1s = {true,SPR_MUT_W1_1,5,NULL,NULL,&s_mutpath2};
639statetype s_mutpath2 = {true,SPR_MUT_W2_1,15,(statefunc)T_Path,NULL,&s_mutpath3};
640statetype s_mutpath3 = {true,SPR_MUT_W3_1,20,(statefunc)T_Path,NULL,&s_mutpath3s};
641statetype s_mutpath3s = {true,SPR_MUT_W3_1,5,NULL,NULL,&s_mutpath4};
642statetype s_mutpath4 = {true,SPR_MUT_W4_1,15,(statefunc)T_Path,NULL,&s_mutpath1};
643
644statetype s_mutpain = {2,SPR_MUT_PAIN_1,10,NULL,NULL,&s_mutchase1};
645statetype s_mutpain1 = {2,SPR_MUT_PAIN_2,10,NULL,NULL,&s_mutchase1};
646
647statetype s_mutshoot1 = {false,SPR_MUT_SHOOT1,6,NULL,(statefunc)T_Shoot,&s_mutshoot2};
648statetype s_mutshoot2 = {false,SPR_MUT_SHOOT2,20,NULL,NULL,&s_mutshoot3};
649statetype s_mutshoot3 = {false,SPR_MUT_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_mutshoot4};
650statetype s_mutshoot4 = {false,SPR_MUT_SHOOT4,20,NULL,NULL,&s_mutchase1};
651
652statetype s_mutchase1 = {true,SPR_MUT_W1_1,10,(statefunc)T_Chase,NULL,&s_mutchase1s};
653statetype s_mutchase1s = {true,SPR_MUT_W1_1,3,NULL,NULL,&s_mutchase2};
654statetype s_mutchase2 = {true,SPR_MUT_W2_1,8,(statefunc)T_Chase,NULL,&s_mutchase3};
655statetype s_mutchase3 = {true,SPR_MUT_W3_1,10,(statefunc)T_Chase,NULL,&s_mutchase3s};
656statetype s_mutchase3s = {true,SPR_MUT_W3_1,3,NULL,NULL,&s_mutchase4};
657statetype s_mutchase4 = {true,SPR_MUT_W4_1,8,(statefunc)T_Chase,NULL,&s_mutchase1};
658
659statetype s_mutdie1 = {false,SPR_MUT_DIE_1,7,NULL,(statefunc)A_DeathScream,&s_mutdie2};
660statetype s_mutdie2 = {false,SPR_MUT_DIE_2,7,NULL,NULL,&s_mutdie3};
661statetype s_mutdie3 = {false,SPR_MUT_DIE_3,7,NULL,NULL,&s_mutdie4};
662statetype s_mutdie4 = {false,SPR_MUT_DIE_4,7,NULL,NULL,&s_mutdie5};
663statetype s_mutdie5 = {false,SPR_MUT_DEAD,0,NULL,NULL,&s_mutdie5};
664
665
666//
667// SS
668//
669
670extern statetype s_ssstand;
671
672extern statetype s_sspath1;
673extern statetype s_sspath1s;
674extern statetype s_sspath2;
675extern statetype s_sspath3;
676extern statetype s_sspath3s;
677extern statetype s_sspath4;
678
679extern statetype s_sspain;
680extern statetype s_sspain1;
681
682extern statetype s_ssshoot1;
683extern statetype s_ssshoot2;
684extern statetype s_ssshoot3;
685extern statetype s_ssshoot4;
686extern statetype s_ssshoot5;
687extern statetype s_ssshoot6;
688extern statetype s_ssshoot7;
689extern statetype s_ssshoot8;
690extern statetype s_ssshoot9;
691
692extern statetype s_sschase1;
693extern statetype s_sschase1s;
694extern statetype s_sschase2;
695extern statetype s_sschase3;
696extern statetype s_sschase3s;
697extern statetype s_sschase4;
698
699extern statetype s_ssdie1;
700extern statetype s_ssdie2;
701extern statetype s_ssdie3;
702extern statetype s_ssdie4;
703
704statetype s_ssstand = {true,SPR_SS_S_1,0,(statefunc)T_Stand,NULL,&s_ssstand};
705
706statetype s_sspath1 = {true,SPR_SS_W1_1,20,(statefunc)T_Path,NULL,&s_sspath1s};
707statetype s_sspath1s = {true,SPR_SS_W1_1,5,NULL,NULL,&s_sspath2};
708statetype s_sspath2 = {true,SPR_SS_W2_1,15,(statefunc)T_Path,NULL,&s_sspath3};
709statetype s_sspath3 = {true,SPR_SS_W3_1,20,(statefunc)T_Path,NULL,&s_sspath3s};
710statetype s_sspath3s = {true,SPR_SS_W3_1,5,NULL,NULL,&s_sspath4};
711statetype s_sspath4 = {true,SPR_SS_W4_1,15,(statefunc)T_Path,NULL,&s_sspath1};
712
713statetype s_sspain = {2,SPR_SS_PAIN_1,10,NULL,NULL,&s_sschase1};
714statetype s_sspain1 = {2,SPR_SS_PAIN_2,10,NULL,NULL,&s_sschase1};
715
716statetype s_ssshoot1 = {false,SPR_SS_SHOOT1,20,NULL,NULL,&s_ssshoot2};
717statetype s_ssshoot2 = {false,SPR_SS_SHOOT2,20,NULL,(statefunc)T_Shoot,&s_ssshoot3};
718statetype s_ssshoot3 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot4};
719statetype s_ssshoot4 = {false,SPR_SS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_ssshoot5};
720statetype s_ssshoot5 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot6};
721statetype s_ssshoot6 = {false,SPR_SS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_ssshoot7};
722statetype s_ssshoot7 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot8};
723statetype s_ssshoot8 = {false,SPR_SS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_ssshoot9};
724statetype s_ssshoot9 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_sschase1};
725
726statetype s_sschase1 = {true,SPR_SS_W1_1,10,(statefunc)T_Chase,NULL,&s_sschase1s};
727statetype s_sschase1s = {true,SPR_SS_W1_1,3,NULL,NULL,&s_sschase2};
728statetype s_sschase2 = {true,SPR_SS_W2_1,8,(statefunc)T_Chase,NULL,&s_sschase3};
729statetype s_sschase3 = {true,SPR_SS_W3_1,10,(statefunc)T_Chase,NULL,&s_sschase3s};
730statetype s_sschase3s = {true,SPR_SS_W3_1,3,NULL,NULL,&s_sschase4};
731statetype s_sschase4 = {true,SPR_SS_W4_1,8,(statefunc)T_Chase,NULL,&s_sschase1};
732
733statetype s_ssdie1 = {false,SPR_SS_DIE_1,15,NULL,(statefunc)A_DeathScream,&s_ssdie2};
734statetype s_ssdie2 = {false,SPR_SS_DIE_2,15,NULL,NULL,&s_ssdie3};
735statetype s_ssdie3 = {false,SPR_SS_DIE_3,15,NULL,NULL,&s_ssdie4};
736statetype s_ssdie4 = {false,SPR_SS_DEAD,0,NULL,NULL,&s_ssdie4};
737
738
739#ifndef SPEAR
740//
741// hans
742//
743extern statetype s_bossstand;
744
745extern statetype s_bosschase1;
746extern statetype s_bosschase1s;
747extern statetype s_bosschase2;
748extern statetype s_bosschase3;
749extern statetype s_bosschase3s;
750extern statetype s_bosschase4;
751
752extern statetype s_bossdie1;
753extern statetype s_bossdie2;
754extern statetype s_bossdie3;
755extern statetype s_bossdie4;
756
757extern statetype s_bossshoot1;
758extern statetype s_bossshoot2;
759extern statetype s_bossshoot3;
760extern statetype s_bossshoot4;
761extern statetype s_bossshoot5;
762extern statetype s_bossshoot6;
763extern statetype s_bossshoot7;
764extern statetype s_bossshoot8;
765
766
767statetype s_bossstand = {false,SPR_BOSS_W1,0,(statefunc)T_Stand,NULL,&s_bossstand};
768
769statetype s_bosschase1 = {false,SPR_BOSS_W1,10,(statefunc)T_Chase,NULL,&s_bosschase1s};
770statetype s_bosschase1s = {false,SPR_BOSS_W1,3,NULL,NULL,&s_bosschase2};
771statetype s_bosschase2 = {false,SPR_BOSS_W2,8,(statefunc)T_Chase,NULL,&s_bosschase3};
772statetype s_bosschase3 = {false,SPR_BOSS_W3,10,(statefunc)T_Chase,NULL,&s_bosschase3s};
773statetype s_bosschase3s = {false,SPR_BOSS_W3,3,NULL,NULL,&s_bosschase4};
774statetype s_bosschase4 = {false,SPR_BOSS_W4,8,(statefunc)T_Chase,NULL,&s_bosschase1};
775
776statetype s_bossdie1 = {false,SPR_BOSS_DIE1,15,NULL,(statefunc)A_DeathScream,&s_bossdie2};
777statetype s_bossdie2 = {false,SPR_BOSS_DIE2,15,NULL,NULL,&s_bossdie3};
778statetype s_bossdie3 = {false,SPR_BOSS_DIE3,15,NULL,NULL,&s_bossdie4};
779statetype s_bossdie4 = {false,SPR_BOSS_DEAD,0,NULL,NULL,&s_bossdie4};
780
781statetype s_bossshoot1 = {false,SPR_BOSS_SHOOT1,30,NULL,NULL,&s_bossshoot2};
782statetype s_bossshoot2 = {false,SPR_BOSS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_bossshoot3};
783statetype s_bossshoot3 = {false,SPR_BOSS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_bossshoot4};
784statetype s_bossshoot4 = {false,SPR_BOSS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_bossshoot5};
785statetype s_bossshoot5 = {false,SPR_BOSS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_bossshoot6};
786statetype s_bossshoot6 = {false,SPR_BOSS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_bossshoot7};
787statetype s_bossshoot7 = {false,SPR_BOSS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_bossshoot8};
788statetype s_bossshoot8 = {false,SPR_BOSS_SHOOT1,10,NULL,NULL,&s_bosschase1};
789
790
791//
792// gretel
793//
794extern statetype s_gretelstand;
795
796extern statetype s_gretelchase1;
797extern statetype s_gretelchase1s;
798extern statetype s_gretelchase2;
799extern statetype s_gretelchase3;
800extern statetype s_gretelchase3s;
801extern statetype s_gretelchase4;
802
803extern statetype s_greteldie1;
804extern statetype s_greteldie2;
805extern statetype s_greteldie3;
806extern statetype s_greteldie4;
807
808extern statetype s_gretelshoot1;
809extern statetype s_gretelshoot2;
810extern statetype s_gretelshoot3;
811extern statetype s_gretelshoot4;
812extern statetype s_gretelshoot5;
813extern statetype s_gretelshoot6;
814extern statetype s_gretelshoot7;
815extern statetype s_gretelshoot8;
816
817
818statetype s_gretelstand = {false,SPR_GRETEL_W1,0,(statefunc)T_Stand,NULL,&s_gretelstand};
819
820statetype s_gretelchase1 = {false,SPR_GRETEL_W1,10,(statefunc)T_Chase,NULL,&s_gretelchase1s};
821statetype s_gretelchase1s = {false,SPR_GRETEL_W1,3,NULL,NULL,&s_gretelchase2};
822statetype s_gretelchase2 = {false,SPR_GRETEL_W2,8,(statefunc)T_Chase,NULL,&s_gretelchase3};
823statetype s_gretelchase3 = {false,SPR_GRETEL_W3,10,(statefunc)T_Chase,NULL,&s_gretelchase3s};
824statetype s_gretelchase3s = {false,SPR_GRETEL_W3,3,NULL,NULL,&s_gretelchase4};
825statetype s_gretelchase4 = {false,SPR_GRETEL_W4,8,(statefunc)T_Chase,NULL,&s_gretelchase1};
826
827statetype s_greteldie1 = {false,SPR_GRETEL_DIE1,15,NULL,(statefunc)A_DeathScream,&s_greteldie2};
828statetype s_greteldie2 = {false,SPR_GRETEL_DIE2,15,NULL,NULL,&s_greteldie3};
829statetype s_greteldie3 = {false,SPR_GRETEL_DIE3,15,NULL,NULL,&s_greteldie4};
830statetype s_greteldie4 = {false,SPR_GRETEL_DEAD,0,NULL,NULL,&s_greteldie4};
831
832statetype s_gretelshoot1 = {false,SPR_GRETEL_SHOOT1,30,NULL,NULL,&s_gretelshoot2};
833statetype s_gretelshoot2 = {false,SPR_GRETEL_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_gretelshoot3};
834statetype s_gretelshoot3 = {false,SPR_GRETEL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_gretelshoot4};
835statetype s_gretelshoot4 = {false,SPR_GRETEL_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_gretelshoot5};
836statetype s_gretelshoot5 = {false,SPR_GRETEL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_gretelshoot6};
837statetype s_gretelshoot6 = {false,SPR_GRETEL_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_gretelshoot7};
838statetype s_gretelshoot7 = {false,SPR_GRETEL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_gretelshoot8};
839statetype s_gretelshoot8 = {false,SPR_GRETEL_SHOOT1,10,NULL,NULL,&s_gretelchase1};
840#endif
841
842
843/*
844===============
845=
846= SpawnStand
847=
848===============
849*/
850
851void SpawnStand (enemy_t which, int tilex, int tiley, int dir)
852{
853 word *map;
854 word tile;
855
856 switch (which)
857 {
858 case en_guard:
859 SpawnNewObj (tilex,tiley,&s_grdstand);
860 newobj->speed = SPDPATROL;
861 if (!loadedgame)
862 gamestate.killtotal++;
863 break;
864
865 case en_officer:
866 SpawnNewObj (tilex,tiley,&s_ofcstand);
867 newobj->speed = SPDPATROL;
868 if (!loadedgame)
869 gamestate.killtotal++;
870 break;
871
872 case en_mutant:
873 SpawnNewObj (tilex,tiley,&s_mutstand);
874 newobj->speed = SPDPATROL;
875 if (!loadedgame)
876 gamestate.killtotal++;
877 break;
878
879 case en_ss:
880 SpawnNewObj (tilex,tiley,&s_ssstand);
881 newobj->speed = SPDPATROL;
882 if (!loadedgame)
883 gamestate.killtotal++;
884 break;
885 }
886
887
888 map = mapsegs[0]+(tiley<<mapshift)+tilex;
889 tile = *map;
890 if (tile == AMBUSHTILE)
891 {
892 tilemap[tilex][tiley] = 0;
893
894 if (*(map+1) >= AREATILE)
895 tile = *(map+1);
896 if (*(map-mapwidth) >= AREATILE)
897 tile = *(map-mapwidth);
898 if (*(map+mapwidth) >= AREATILE)
899 tile = *(map+mapwidth);
900 if ( *(map-1) >= AREATILE)
901 tile = *(map-1);
902
903 *map = tile;
904 newobj->areanumber = tile-AREATILE;
905
906 newobj->flags |= FL_AMBUSH;
907 }
908
909 newobj->obclass = (classtype)(guardobj + which);
910 newobj->hitpoints = starthitpoints[gamestate.difficulty][which];
911 newobj->dir = (dirtype)(dir * 2);
912 newobj->flags |= FL_SHOOTABLE;
913}
914
915
916
917/*
918===============
919=
920= SpawnDeadGuard
921=
922===============
923*/
924
925void SpawnDeadGuard (int tilex, int tiley)
926{
927 SpawnNewObj (tilex,tiley,&s_grddie4);
928 DEMOIF_SDL
929 {
930 newobj->flags |= FL_NONMARK; // walk through moving enemy fix
931 }
932 newobj->obclass = inertobj;
933}
934
935
936
937#ifndef SPEAR
938/*
939===============
940=
941= SpawnBoss
942=
943===============
944*/
945
946void SpawnBoss (int tilex, int tiley)
947{
948 SpawnNewObj (tilex,tiley,&s_bossstand);
949 newobj->speed = SPDPATROL;
950
951 newobj->obclass = bossobj;
952 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_boss];
953 newobj->dir = nodir;
954 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
955 if (!loadedgame)
956 gamestate.killtotal++;
957}
958
959/*
960===============
961=
962= SpawnGretel
963=
964===============
965*/
966
967void SpawnGretel (int tilex, int tiley)
968{
969 SpawnNewObj (tilex,tiley,&s_gretelstand);
970 newobj->speed = SPDPATROL;
971
972 newobj->obclass = gretelobj;
973 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_gretel];
974 newobj->dir = nodir;
975 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
976 if (!loadedgame)
977 gamestate.killtotal++;
978}
979#endif
980
981/*
982===============
983=
984= SpawnPatrol
985=
986===============
987*/
988
989void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir)
990{
991 switch (which)
992 {
993 case en_guard:
994 SpawnNewObj (tilex,tiley,&s_grdpath1);
995 newobj->speed = SPDPATROL;
996 if (!loadedgame)
997 gamestate.killtotal++;
998 break;
999
1000 case en_officer:
1001 SpawnNewObj (tilex,tiley,&s_ofcpath1);
1002 newobj->speed = SPDPATROL;
1003 if (!loadedgame)
1004 gamestate.killtotal++;
1005 break;
1006
1007 case en_ss:
1008 SpawnNewObj (tilex,tiley,&s_sspath1);
1009 newobj->speed = SPDPATROL;
1010 if (!loadedgame)
1011 gamestate.killtotal++;
1012 break;
1013
1014 case en_mutant:
1015 SpawnNewObj (tilex,tiley,&s_mutpath1);
1016 newobj->speed = SPDPATROL;
1017 if (!loadedgame)
1018 gamestate.killtotal++;
1019 break;
1020
1021 case en_dog:
1022 SpawnNewObj (tilex,tiley,&s_dogpath1);
1023 newobj->speed = SPDDOG;
1024 if (!loadedgame)
1025 gamestate.killtotal++;
1026 break;
1027 }
1028
1029 newobj->obclass = (classtype)(guardobj+which);
1030 newobj->dir = (dirtype)(dir*2);
1031 newobj->hitpoints = starthitpoints[gamestate.difficulty][which];
1032 newobj->distance = TILEGLOBAL;
1033 newobj->flags |= FL_SHOOTABLE;
1034 newobj->active = ac_yes;
1035
1036 actorat[newobj->tilex][newobj->tiley] = NULL; // don't use original spot
1037
1038 switch (dir)
1039 {
1040 case 0:
1041 newobj->tilex++;
1042 break;
1043 case 1:
1044 newobj->tiley--;
1045 break;
1046 case 2:
1047 newobj->tilex--;
1048 break;
1049 case 3:
1050 newobj->tiley++;
1051 break;
1052 }
1053
1054 actorat[newobj->tilex][newobj->tiley] = newobj;
1055}
1056
1057
1058
1059/*
1060==================
1061=
1062= A_DeathScream
1063=
1064==================
1065*/
1066
1067void A_DeathScream (objtype *ob)
1068{
1069#ifndef UPLOAD
1070#ifndef SPEAR
1071 if (mapon==9 && !US_RndT())
1072#else
1073 if ((mapon==18 || mapon==19) && !US_RndT())
1074#endif
1075 {
1076 switch(ob->obclass)
1077 {
1078 case mutantobj:
1079 case guardobj:
1080 case officerobj:
1081 case ssobj:
1082 case dogobj:
1083 PlaySoundLocActor(DEATHSCREAM6SND,ob);
1084 return;
1085 }
1086 }
1087#endif
1088
1089 switch (ob->obclass)
1090 {
1091 case mutantobj:
1092 PlaySoundLocActor(AHHHGSND,ob);
1093 break;
1094
1095 case guardobj:
1096 {
1097 int sounds[9]={ DEATHSCREAM1SND,
1098 DEATHSCREAM2SND,
1099 DEATHSCREAM3SND,
1100#ifndef APOGEE_1_0
1101 DEATHSCREAM4SND,
1102 DEATHSCREAM5SND,
1103 DEATHSCREAM7SND,
1104 DEATHSCREAM8SND,
1105 DEATHSCREAM9SND
1106#endif
1107 };
1108
1109#ifndef UPLOAD
1110 PlaySoundLocActor(sounds[US_RndT()%8],ob);
1111#else
1112 PlaySoundLocActor(sounds[US_RndT()%2],ob);
1113#endif
1114 break;
1115 }
1116 case officerobj:
1117 PlaySoundLocActor(NEINSOVASSND,ob);
1118 break;
1119 case ssobj:
1120 PlaySoundLocActor(LEBENSND,ob); // JAB
1121 break;
1122 case dogobj:
1123 PlaySoundLocActor(DOGDEATHSND,ob); // JAB
1124 break;
1125#ifndef SPEAR
1126 case bossobj:
1127 SD_PlaySound(MUTTISND); // JAB
1128 break;
1129 case schabbobj:
1130 SD_PlaySound(MEINGOTTSND);
1131 break;
1132 case fakeobj:
1133 SD_PlaySound(HITLERHASND);
1134 break;
1135 case mechahitlerobj:
1136 SD_PlaySound(SCHEISTSND);
1137 break;
1138 case realhitlerobj:
1139 SD_PlaySound(EVASND);
1140 break;
1141#ifndef APOGEE_1_0
1142 case gretelobj:
1143 SD_PlaySound(MEINSND);
1144 break;
1145 case giftobj:
1146 SD_PlaySound(DONNERSND);
1147 break;
1148 case fatobj:
1149 SD_PlaySound(ROSESND);
1150 break;
1151#endif
1152#else
1153 case spectreobj:
1154 SD_PlaySound(GHOSTFADESND);
1155 break;
1156 case angelobj:
1157 SD_PlaySound(ANGELDEATHSND);
1158 break;
1159 case transobj:
1160 SD_PlaySound(TRANSDEATHSND);
1161 break;
1162 case uberobj:
1163 SD_PlaySound(UBERDEATHSND);
1164 break;
1165 case willobj:
1166 SD_PlaySound(WILHELMDEATHSND);
1167 break;
1168 case deathobj:
1169 SD_PlaySound(KNIGHTDEATHSND);
1170 break;
1171#endif
1172 }
1173}
1174
1175
1176/*
1177=============================================================================
1178
1179 SPEAR ACTORS
1180
1181=============================================================================
1182*/
1183
1184#ifdef SPEAR
1185
1186void T_Launch (objtype *ob);
1187void T_Will (objtype *ob);
1188
1189extern statetype s_angelshoot1;
1190extern statetype s_deathshoot1;
1191extern statetype s_spark1;
1192
1193//
1194// trans
1195//
1196extern statetype s_transstand;
1197
1198extern statetype s_transchase1;
1199extern statetype s_transchase1s;
1200extern statetype s_transchase2;
1201extern statetype s_transchase3;
1202extern statetype s_transchase3s;
1203extern statetype s_transchase4;
1204
1205extern statetype s_transdie0;
1206extern statetype s_transdie01;
1207extern statetype s_transdie1;
1208extern statetype s_transdie2;
1209extern statetype s_transdie3;
1210extern statetype s_transdie4;
1211
1212extern statetype s_transshoot1;
1213extern statetype s_transshoot2;
1214extern statetype s_transshoot3;
1215extern statetype s_transshoot4;
1216extern statetype s_transshoot5;
1217extern statetype s_transshoot6;
1218extern statetype s_transshoot7;
1219extern statetype s_transshoot8;
1220
1221
1222statetype s_transstand = {false,SPR_TRANS_W1,0,(statefunc)T_Stand,NULL,&s_transstand};
1223
1224statetype s_transchase1 = {false,SPR_TRANS_W1,10,(statefunc)T_Chase,NULL,&s_transchase1s};
1225statetype s_transchase1s = {false,SPR_TRANS_W1,3,NULL,NULL,&s_transchase2};
1226statetype s_transchase2 = {false,SPR_TRANS_W2,8,(statefunc)T_Chase,NULL,&s_transchase3};
1227statetype s_transchase3 = {false,SPR_TRANS_W3,10,(statefunc)T_Chase,NULL,&s_transchase3s};
1228statetype s_transchase3s = {false,SPR_TRANS_W3,3,NULL,NULL,&s_transchase4};
1229statetype s_transchase4 = {false,SPR_TRANS_W4,8,(statefunc)T_Chase,NULL,&s_transchase1};
1230
1231statetype s_transdie0 = {false,SPR_TRANS_W1,1,NULL,(statefunc)A_DeathScream,&s_transdie01};
1232statetype s_transdie01 = {false,SPR_TRANS_W1,1,NULL,NULL,&s_transdie1};
1233statetype s_transdie1 = {false,SPR_TRANS_DIE1,15,NULL,NULL,&s_transdie2};
1234statetype s_transdie2 = {false,SPR_TRANS_DIE2,15,NULL,NULL,&s_transdie3};
1235statetype s_transdie3 = {false,SPR_TRANS_DIE3,15,NULL,NULL,&s_transdie4};
1236statetype s_transdie4 = {false,SPR_TRANS_DEAD,0,NULL,NULL,&s_transdie4};
1237
1238statetype s_transshoot1 = {false,SPR_TRANS_SHOOT1,30,NULL,NULL,&s_transshoot2};
1239statetype s_transshoot2 = {false,SPR_TRANS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_transshoot3};
1240statetype s_transshoot3 = {false,SPR_TRANS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_transshoot4};
1241statetype s_transshoot4 = {false,SPR_TRANS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_transshoot5};
1242statetype s_transshoot5 = {false,SPR_TRANS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_transshoot6};
1243statetype s_transshoot6 = {false,SPR_TRANS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_transshoot7};
1244statetype s_transshoot7 = {false,SPR_TRANS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_transshoot8};
1245statetype s_transshoot8 = {false,SPR_TRANS_SHOOT1,10,NULL,NULL,&s_transchase1};
1246
1247
1248/*
1249===============
1250=
1251= SpawnTrans
1252=
1253===============
1254*/
1255
1256void SpawnTrans (int tilex, int tiley)
1257{
1258 // word *map;
1259 // word tile;
1260
1261 if (SoundBlasterPresent && DigiMode != sds_Off)
1262 s_transdie01.tictime = 105;
1263
1264 SpawnNewObj (tilex,tiley,&s_transstand);
1265 newobj->obclass = transobj;
1266 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_trans];
1267 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
1268 if (!loadedgame)
1269 gamestate.killtotal++;
1270}
1271
1272
1273//
1274// uber
1275//
1276void T_UShoot (objtype *ob);
1277
1278extern statetype s_uberstand;
1279
1280extern statetype s_uberchase1;
1281extern statetype s_uberchase1s;
1282extern statetype s_uberchase2;
1283extern statetype s_uberchase3;
1284extern statetype s_uberchase3s;
1285extern statetype s_uberchase4;
1286
1287extern statetype s_uberdie0;
1288extern statetype s_uberdie01;
1289extern statetype s_uberdie1;
1290extern statetype s_uberdie2;
1291extern statetype s_uberdie3;
1292extern statetype s_uberdie4;
1293extern statetype s_uberdie5;
1294
1295extern statetype s_ubershoot1;
1296extern statetype s_ubershoot2;
1297extern statetype s_ubershoot3;
1298extern statetype s_ubershoot4;
1299extern statetype s_ubershoot5;
1300extern statetype s_ubershoot6;
1301extern statetype s_ubershoot7;
1302
1303
1304statetype s_uberstand = {false,SPR_UBER_W1,0,(statefunc)T_Stand,NULL,&s_uberstand};
1305
1306statetype s_uberchase1 = {false,SPR_UBER_W1,10,(statefunc)T_Chase,NULL,&s_uberchase1s};
1307statetype s_uberchase1s = {false,SPR_UBER_W1,3,NULL,NULL,&s_uberchase2};
1308statetype s_uberchase2 = {false,SPR_UBER_W2,8,(statefunc)T_Chase,NULL,&s_uberchase3};
1309statetype s_uberchase3 = {false,SPR_UBER_W3,10,(statefunc)T_Chase,NULL,&s_uberchase3s};
1310statetype s_uberchase3s = {false,SPR_UBER_W3,3,NULL,NULL,&s_uberchase4};
1311statetype s_uberchase4 = {false,SPR_UBER_W4,8,(statefunc)T_Chase,NULL,&s_uberchase1};
1312
1313statetype s_uberdie0 = {false,SPR_UBER_W1,1,NULL,(statefunc)A_DeathScream,&s_uberdie01};
1314statetype s_uberdie01 = {false,SPR_UBER_W1,1,NULL,NULL,&s_uberdie1};
1315statetype s_uberdie1 = {false,SPR_UBER_DIE1,15,NULL,NULL,&s_uberdie2};
1316statetype s_uberdie2 = {false,SPR_UBER_DIE2,15,NULL,NULL,&s_uberdie3};
1317statetype s_uberdie3 = {false,SPR_UBER_DIE3,15,NULL,NULL,&s_uberdie4};
1318statetype s_uberdie4 = {false,SPR_UBER_DIE4,15,NULL,NULL,&s_uberdie5};
1319statetype s_uberdie5 = {false,SPR_UBER_DEAD,0,NULL,NULL,&s_uberdie5};
1320
1321statetype s_ubershoot1 = {false,SPR_UBER_SHOOT1,30,NULL,NULL,&s_ubershoot2};
1322statetype s_ubershoot2 = {false,SPR_UBER_SHOOT2,12,NULL,(statefunc)T_UShoot,&s_ubershoot3};
1323statetype s_ubershoot3 = {false,SPR_UBER_SHOOT3,12,NULL,(statefunc)T_UShoot,&s_ubershoot4};
1324statetype s_ubershoot4 = {false,SPR_UBER_SHOOT4,12,NULL,(statefunc)T_UShoot,&s_ubershoot5};
1325statetype s_ubershoot5 = {false,SPR_UBER_SHOOT3,12,NULL,(statefunc)T_UShoot,&s_ubershoot6};
1326statetype s_ubershoot6 = {false,SPR_UBER_SHOOT2,12,NULL,(statefunc)T_UShoot,&s_ubershoot7};
1327statetype s_ubershoot7 = {false,SPR_UBER_SHOOT1,12,NULL,NULL,&s_uberchase1};
1328
1329
1330/*
1331===============
1332=
1333= SpawnUber
1334=
1335===============
1336*/
1337
1338void SpawnUber (int tilex, int tiley)
1339{
1340 if (SoundBlasterPresent && DigiMode != sds_Off)
1341 s_uberdie01.tictime = 70;
1342
1343 SpawnNewObj (tilex,tiley,&s_uberstand);
1344 newobj->obclass = uberobj;
1345 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_uber];
1346 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
1347 if (!loadedgame)
1348 gamestate.killtotal++;
1349}
1350
1351
1352/*
1353===============
1354=
1355= T_UShoot
1356=
1357===============
1358*/
1359
1360void T_UShoot (objtype *ob)
1361{
1362 int dx,dy,dist;
1363
1364 T_Shoot (ob);
1365
1366 dx = abs(ob->tilex - player->tilex);
1367 dy = abs(ob->tiley - player->tiley);
1368 dist = dx>dy ? dx : dy;
1369 if (dist <= 1)
1370 TakeDamage (10,ob);
1371}
1372
1373
1374//
1375// will
1376//
1377extern statetype s_willstand;
1378
1379extern statetype s_willchase1;
1380extern statetype s_willchase1s;
1381extern statetype s_willchase2;
1382extern statetype s_willchase3;
1383extern statetype s_willchase3s;
1384extern statetype s_willchase4;
1385
1386extern statetype s_willdie1;
1387extern statetype s_willdie2;
1388extern statetype s_willdie3;
1389extern statetype s_willdie4;
1390extern statetype s_willdie5;
1391extern statetype s_willdie6;
1392
1393extern statetype s_willshoot1;
1394extern statetype s_willshoot2;
1395extern statetype s_willshoot3;
1396extern statetype s_willshoot4;
1397extern statetype s_willshoot5;
1398extern statetype s_willshoot6;
1399
1400
1401statetype s_willstand = {false,SPR_WILL_W1,0,(statefunc)T_Stand,NULL,&s_willstand};
1402
1403statetype s_willchase1 = {false,SPR_WILL_W1,10,(statefunc)T_Will,NULL,&s_willchase1s};
1404statetype s_willchase1s = {false,SPR_WILL_W1,3,NULL,NULL,&s_willchase2};
1405statetype s_willchase2 = {false,SPR_WILL_W2,8,(statefunc)T_Will,NULL,&s_willchase3};
1406statetype s_willchase3 = {false,SPR_WILL_W3,10,(statefunc)T_Will,NULL,&s_willchase3s};
1407statetype s_willchase3s = {false,SPR_WILL_W3,3,NULL,NULL,&s_willchase4};
1408statetype s_willchase4 = {false,SPR_WILL_W4,8,(statefunc)T_Will,NULL,&s_willchase1};
1409
1410statetype s_willdeathcam = {false,SPR_WILL_W1,1,NULL,NULL,&s_willdie1};
1411
1412statetype s_willdie1 = {false,SPR_WILL_W1,1,NULL,(statefunc)A_DeathScream,&s_willdie2};
1413statetype s_willdie2 = {false,SPR_WILL_W1,10,NULL,NULL,&s_willdie3};
1414statetype s_willdie3 = {false,SPR_WILL_DIE1,10,NULL,NULL,&s_willdie4};
1415statetype s_willdie4 = {false,SPR_WILL_DIE2,10,NULL,NULL,&s_willdie5};
1416statetype s_willdie5 = {false,SPR_WILL_DIE3,10,NULL,NULL,&s_willdie6};
1417statetype s_willdie6 = {false,SPR_WILL_DEAD,20,NULL,NULL,&s_willdie6};
1418
1419statetype s_willshoot1 = {false,SPR_WILL_SHOOT1,30,NULL,NULL,&s_willshoot2};
1420statetype s_willshoot2 = {false,SPR_WILL_SHOOT2,10,NULL,(statefunc)T_Launch,&s_willshoot3};
1421statetype s_willshoot3 = {false,SPR_WILL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_willshoot4};
1422statetype s_willshoot4 = {false,SPR_WILL_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_willshoot5};
1423statetype s_willshoot5 = {false,SPR_WILL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_willshoot6};
1424statetype s_willshoot6 = {false,SPR_WILL_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_willchase1};
1425
1426
1427/*
1428===============
1429=
1430= SpawnWill
1431=
1432===============
1433*/
1434
1435void SpawnWill (int tilex, int tiley)
1436{
1437 if (SoundBlasterPresent && DigiMode != sds_Off)
1438 s_willdie2.tictime = 70;
1439
1440 SpawnNewObj (tilex,tiley,&s_willstand);
1441 newobj->obclass = willobj;
1442 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_will];
1443 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
1444 if (!loadedgame)
1445 gamestate.killtotal++;
1446}
1447
1448
1449/*
1450================
1451=
1452= T_Will
1453=
1454================
1455*/
1456
1457void T_Will (objtype *ob)
1458{
1459 int32_t move;
1460 int dx,dy,dist;
1461 boolean dodge;
1462
1463 dodge = false;
1464 dx = abs(ob->tilex - player->tilex);
1465 dy = abs(ob->tiley - player->tiley);
1466 dist = dx>dy ? dx : dy;
1467
1468 if (CheckLine(ob)) // got a shot at player?
1469 {
1470 ob->hidden = false;
1471 if ( (unsigned) US_RndT() < (tics<<3) && objfreelist)
1472 {
1473 //
1474 // go into attack frame
1475 //
1476 if (ob->obclass == willobj)
1477 NewState (ob,&s_willshoot1);
1478 else if (ob->obclass == angelobj)
1479 NewState (ob,&s_angelshoot1);
1480 else
1481 NewState (ob,&s_deathshoot1);
1482 return;
1483 }
1484 dodge = true;
1485 }
1486 else
1487 ob->hidden = true;
1488
1489 if (ob->dir == nodir)
1490 {
1491 if (dodge)
1492 SelectDodgeDir (ob);
1493 else
1494 SelectChaseDir (ob);
1495 if (ob->dir == nodir)
1496 return; // object is blocked in
1497 }
1498
1499 move = ob->speed*tics;
1500
1501 while (move)
1502 {
1503 if (ob->distance < 0)
1504 {
1505 //
1506 // waiting for a door to open
1507 //
1508 OpenDoor (-ob->distance-1);
1509 if (doorobjlist[-ob->distance-1].action != dr_open)
1510 return;
1511 ob->distance = TILEGLOBAL; // go ahead, the door is now open
1512 TryWalk(ob);
1513 }
1514
1515 if (move < ob->distance)
1516 {
1517 MoveObj (ob,move);
1518 break;
1519 }
1520
1521 //
1522 // reached goal tile, so select another one
1523 //
1524
1525 //
1526 // fix position to account for round off during moving
1527 //
1528 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
1529 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
1530
1531 move -= ob->distance;
1532
1533 if (dist <4)
1534 SelectRunDir (ob);
1535 else if (dodge)
1536 SelectDodgeDir (ob);
1537 else
1538 SelectChaseDir (ob);
1539
1540 if (ob->dir == nodir)
1541 return; // object is blocked in
1542 }
1543
1544}
1545
1546
1547//
1548// death
1549//
1550extern statetype s_deathstand;
1551
1552extern statetype s_deathchase1;
1553extern statetype s_deathchase1s;
1554extern statetype s_deathchase2;
1555extern statetype s_deathchase3;
1556extern statetype s_deathchase3s;
1557extern statetype s_deathchase4;
1558
1559extern statetype s_deathdie1;
1560extern statetype s_deathdie2;
1561extern statetype s_deathdie3;
1562extern statetype s_deathdie4;
1563extern statetype s_deathdie5;
1564extern statetype s_deathdie6;
1565extern statetype s_deathdie7;
1566extern statetype s_deathdie8;
1567extern statetype s_deathdie9;
1568
1569extern statetype s_deathshoot1;
1570extern statetype s_deathshoot2;
1571extern statetype s_deathshoot3;
1572extern statetype s_deathshoot4;
1573extern statetype s_deathshoot5;
1574
1575
1576statetype s_deathstand = {false,SPR_DEATH_W1,0,(statefunc)T_Stand,NULL,&s_deathstand};
1577
1578statetype s_deathchase1 = {false,SPR_DEATH_W1,10,(statefunc)T_Will,NULL,&s_deathchase1s};
1579statetype s_deathchase1s = {false,SPR_DEATH_W1,3,NULL,NULL,&s_deathchase2};
1580statetype s_deathchase2 = {false,SPR_DEATH_W2,8,(statefunc)T_Will,NULL,&s_deathchase3};
1581statetype s_deathchase3 = {false,SPR_DEATH_W3,10,(statefunc)T_Will,NULL,&s_deathchase3s};
1582statetype s_deathchase3s = {false,SPR_DEATH_W3,3,NULL,NULL,&s_deathchase4};
1583statetype s_deathchase4 = {false,SPR_DEATH_W4,8,(statefunc)T_Will,NULL,&s_deathchase1};
1584
1585statetype s_deathdeathcam = {false,SPR_DEATH_W1,1,NULL,NULL,&s_deathdie1};
1586
1587statetype s_deathdie1 = {false,SPR_DEATH_W1,1,NULL,(statefunc)A_DeathScream,&s_deathdie2};
1588statetype s_deathdie2 = {false,SPR_DEATH_W1,10,NULL,NULL,&s_deathdie3};
1589statetype s_deathdie3 = {false,SPR_DEATH_DIE1,10,NULL,NULL,&s_deathdie4};
1590statetype s_deathdie4 = {false,SPR_DEATH_DIE2,10,NULL,NULL,&s_deathdie5};
1591statetype s_deathdie5 = {false,SPR_DEATH_DIE3,10,NULL,NULL,&s_deathdie6};
1592statetype s_deathdie6 = {false,SPR_DEATH_DIE4,10,NULL,NULL,&s_deathdie7};
1593statetype s_deathdie7 = {false,SPR_DEATH_DIE5,10,NULL,NULL,&s_deathdie8};
1594statetype s_deathdie8 = {false,SPR_DEATH_DIE6,10,NULL,NULL,&s_deathdie9};
1595statetype s_deathdie9 = {false,SPR_DEATH_DEAD,0,NULL,NULL,&s_deathdie9};
1596
1597statetype s_deathshoot1 = {false,SPR_DEATH_SHOOT1,30,NULL,NULL,&s_deathshoot2};
1598statetype s_deathshoot2 = {false,SPR_DEATH_SHOOT2,10,NULL,(statefunc)T_Launch,&s_deathshoot3};
1599statetype s_deathshoot3 = {false,SPR_DEATH_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_deathshoot4};
1600statetype s_deathshoot4 = {false,SPR_DEATH_SHOOT3,10,NULL,(statefunc)T_Launch,&s_deathshoot5};
1601statetype s_deathshoot5 = {false,SPR_DEATH_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_deathchase1};
1602
1603
1604/*
1605===============
1606=
1607= SpawnDeath
1608=
1609===============
1610*/
1611
1612void SpawnDeath (int tilex, int tiley)
1613{
1614 if (SoundBlasterPresent && DigiMode != sds_Off)
1615 s_deathdie2.tictime = 105;
1616
1617 SpawnNewObj (tilex,tiley,&s_deathstand);
1618 newobj->obclass = deathobj;
1619 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_death];
1620 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
1621 if (!loadedgame)
1622 gamestate.killtotal++;
1623}
1624
1625/*
1626===============
1627=
1628= T_Launch
1629=
1630===============
1631*/
1632
1633void T_Launch (objtype *ob)
1634{
1635 int32_t deltax,deltay;
1636 float angle;
1637 int iangle;
1638
1639 deltax = player->x - ob->x;
1640 deltay = ob->y - player->y;
1641 angle = (float) atan2 ((float) deltay, (float) deltax);
1642 if (angle<0)
1643 angle = (float) (M_PI*2+angle);
1644 iangle = (int) (angle/(M_PI*2)*ANGLES);
1645 if (ob->obclass == deathobj)
1646 {
1647 T_Shoot (ob);
1648 if (ob->state == &s_deathshoot2)
1649 {
1650 iangle-=4;
1651 if (iangle<0)
1652 iangle+=ANGLES;
1653 }
1654 else
1655 {
1656 iangle+=4;
1657 if (iangle>=ANGLES)
1658 iangle-=ANGLES;
1659 }
1660 }
1661
1662 GetNewActor ();
1663 newobj->state = &s_rocket;
1664 newobj->ticcount = 1;
1665
1666 newobj->tilex = ob->tilex;
1667 newobj->tiley = ob->tiley;
1668 newobj->x = ob->x;
1669 newobj->y = ob->y;
1670 newobj->obclass = rocketobj;
1671 switch(ob->obclass)
1672 {
1673 case deathobj:
1674 newobj->state = &s_hrocket;
1675 newobj->obclass = hrocketobj;
1676 PlaySoundLocActor (KNIGHTMISSILESND,newobj);
1677 break;
1678 case angelobj:
1679 newobj->state = &s_spark1;
1680 newobj->obclass = sparkobj;
1681 PlaySoundLocActor (ANGELFIRESND,newobj);
1682 break;
1683 default:
1684 PlaySoundLocActor (MISSILEFIRESND,newobj);
1685 }
1686
1687 newobj->dir = nodir;
1688 newobj->angle = iangle;
1689 newobj->speed = 0x2000l;
1690 newobj->flags = FL_NEVERMARK;
1691 newobj->active = ac_yes;
1692}
1693
1694
1695
1696//
1697// angel
1698//
1699void A_Relaunch (objtype *ob);
1700void A_Victory (objtype *ob);
1701void A_StartAttack (objtype *ob);
1702void A_Breathing (objtype *ob);
1703
1704extern statetype s_angelstand;
1705
1706extern statetype s_angelchase1;
1707extern statetype s_angelchase1s;
1708extern statetype s_angelchase2;
1709extern statetype s_angelchase3;
1710extern statetype s_angelchase3s;
1711extern statetype s_angelchase4;
1712
1713extern statetype s_angeldie1;
1714extern statetype s_angeldie11;
1715extern statetype s_angeldie2;
1716extern statetype s_angeldie3;
1717extern statetype s_angeldie4;
1718extern statetype s_angeldie5;
1719extern statetype s_angeldie6;
1720extern statetype s_angeldie7;
1721extern statetype s_angeldie8;
1722extern statetype s_angeldie9;
1723
1724extern statetype s_angelshoot1;
1725extern statetype s_angelshoot2;
1726extern statetype s_angelshoot3;
1727extern statetype s_angelshoot4;
1728extern statetype s_angelshoot5;
1729extern statetype s_angelshoot6;
1730
1731extern statetype s_angeltired;
1732extern statetype s_angeltired2;
1733extern statetype s_angeltired3;
1734extern statetype s_angeltired4;
1735extern statetype s_angeltired5;
1736extern statetype s_angeltired6;
1737extern statetype s_angeltired7;
1738
1739extern statetype s_spark1;
1740extern statetype s_spark2;
1741extern statetype s_spark3;
1742extern statetype s_spark4;
1743
1744
1745statetype s_angelstand = {false,SPR_ANGEL_W1,0,(statefunc)T_Stand,NULL,&s_angelstand};
1746
1747statetype s_angelchase1 = {false,SPR_ANGEL_W1,10,(statefunc)T_Will,NULL,&s_angelchase1s};
1748statetype s_angelchase1s = {false,SPR_ANGEL_W1,3,NULL,NULL,&s_angelchase2};
1749statetype s_angelchase2 = {false,SPR_ANGEL_W2,8,(statefunc)T_Will,NULL,&s_angelchase3};
1750statetype s_angelchase3 = {false,SPR_ANGEL_W3,10,(statefunc)T_Will,NULL,&s_angelchase3s};
1751statetype s_angelchase3s = {false,SPR_ANGEL_W3,3,NULL,NULL,&s_angelchase4};
1752statetype s_angelchase4 = {false,SPR_ANGEL_W4,8,(statefunc)T_Will,NULL,&s_angelchase1};
1753
1754statetype s_angeldie1 = {false,SPR_ANGEL_W1,1,NULL,(statefunc)A_DeathScream,&s_angeldie11};
1755statetype s_angeldie11 = {false,SPR_ANGEL_W1,1,NULL,NULL,&s_angeldie2};
1756statetype s_angeldie2 = {false,SPR_ANGEL_DIE1,10,NULL,(statefunc)A_Slurpie,&s_angeldie3};
1757statetype s_angeldie3 = {false,SPR_ANGEL_DIE2,10,NULL,NULL,&s_angeldie4};
1758statetype s_angeldie4 = {false,SPR_ANGEL_DIE3,10,NULL,NULL,&s_angeldie5};
1759statetype s_angeldie5 = {false,SPR_ANGEL_DIE4,10,NULL,NULL,&s_angeldie6};
1760statetype s_angeldie6 = {false,SPR_ANGEL_DIE5,10,NULL,NULL,&s_angeldie7};
1761statetype s_angeldie7 = {false,SPR_ANGEL_DIE6,10,NULL,NULL,&s_angeldie8};
1762statetype s_angeldie8 = {false,SPR_ANGEL_DIE7,10,NULL,NULL,&s_angeldie9};
1763statetype s_angeldie9 = {false,SPR_ANGEL_DEAD,130,NULL,(statefunc)A_Victory,&s_angeldie9};
1764
1765statetype s_angelshoot1 = {false,SPR_ANGEL_SHOOT1,10,NULL,(statefunc)A_StartAttack,&s_angelshoot2};
1766statetype s_angelshoot2 = {false,SPR_ANGEL_SHOOT2,20,NULL,(statefunc)T_Launch,&s_angelshoot3};
1767statetype s_angelshoot3 = {false,SPR_ANGEL_SHOOT1,10,NULL,(statefunc)A_Relaunch,&s_angelshoot2};
1768
1769statetype s_angeltired = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angeltired2};
1770statetype s_angeltired2 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired3};
1771statetype s_angeltired3 = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angeltired4};
1772statetype s_angeltired4 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired5};
1773statetype s_angeltired5 = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angeltired6};
1774statetype s_angeltired6 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired7};
1775statetype s_angeltired7 = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angelchase1};
1776
1777statetype s_spark1 = {false,SPR_SPARK1,6,(statefunc)T_Projectile,NULL,&s_spark2};
1778statetype s_spark2 = {false,SPR_SPARK2,6,(statefunc)T_Projectile,NULL,&s_spark3};
1779statetype s_spark3 = {false,SPR_SPARK3,6,(statefunc)T_Projectile,NULL,&s_spark4};
1780statetype s_spark4 = {false,SPR_SPARK4,6,(statefunc)T_Projectile,NULL,&s_spark1};
1781
1782
1783void A_Slurpie (objtype *)
1784{
1785 SD_PlaySound(SLURPIESND);
1786}
1787
1788void A_Breathing (objtype *)
1789{
1790 SD_PlaySound(ANGELTIREDSND);
1791}
1792
1793/*
1794===============
1795=
1796= SpawnAngel
1797=
1798===============
1799*/
1800
1801void SpawnAngel (int tilex, int tiley)
1802{
1803 if (SoundBlasterPresent && DigiMode != sds_Off)
1804 s_angeldie11.tictime = 105;
1805
1806 SpawnNewObj (tilex,tiley,&s_angelstand);
1807 newobj->obclass = angelobj;
1808 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_angel];
1809 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
1810 if (!loadedgame)
1811 gamestate.killtotal++;
1812}
1813
1814
1815/*
1816=================
1817=
1818= A_Victory
1819=
1820=================
1821*/
1822
1823void A_Victory (objtype *)
1824{
1825 playstate = ex_victorious;
1826}
1827
1828
1829/*
1830=================
1831=
1832= A_StartAttack
1833=
1834=================
1835*/
1836
1837void A_StartAttack (objtype *ob)
1838{
1839 ob->temp1 = 0;
1840}
1841
1842
1843/*
1844=================
1845=
1846= A_Relaunch
1847=
1848=================
1849*/
1850
1851void A_Relaunch (objtype *ob)
1852{
1853 if (++ob->temp1 == 3)
1854 {
1855 NewState (ob,&s_angeltired);
1856 return;
1857 }
1858
1859 if (US_RndT()&1)
1860 {
1861 NewState (ob,&s_angelchase1);
1862 return;
1863 }
1864}
1865
1866
1867
1868
1869//
1870// spectre
1871//
1872void T_SpectreWait (objtype *ob);
1873void A_Dormant (objtype *ob);
1874
1875extern statetype s_spectrewait1;
1876extern statetype s_spectrewait2;
1877extern statetype s_spectrewait3;
1878extern statetype s_spectrewait4;
1879
1880extern statetype s_spectrechase1;
1881extern statetype s_spectrechase2;
1882extern statetype s_spectrechase3;
1883extern statetype s_spectrechase4;
1884
1885extern statetype s_spectredie1;
1886extern statetype s_spectredie2;
1887extern statetype s_spectredie3;
1888extern statetype s_spectredie4;
1889
1890extern statetype s_spectrewake;
1891
1892statetype s_spectrewait1 = {false,SPR_SPECTRE_W1,10,(statefunc)T_Stand,NULL,&s_spectrewait2};
1893statetype s_spectrewait2 = {false,SPR_SPECTRE_W2,10,(statefunc)T_Stand,NULL,&s_spectrewait3};
1894statetype s_spectrewait3 = {false,SPR_SPECTRE_W3,10,(statefunc)T_Stand,NULL,&s_spectrewait4};
1895statetype s_spectrewait4 = {false,SPR_SPECTRE_W4,10,(statefunc)T_Stand,NULL,&s_spectrewait1};
1896
1897statetype s_spectrechase1 = {false,SPR_SPECTRE_W1,10,(statefunc)T_Ghosts,NULL,&s_spectrechase2};
1898statetype s_spectrechase2 = {false,SPR_SPECTRE_W2,10,(statefunc)T_Ghosts,NULL,&s_spectrechase3};
1899statetype s_spectrechase3 = {false,SPR_SPECTRE_W3,10,(statefunc)T_Ghosts,NULL,&s_spectrechase4};
1900statetype s_spectrechase4 = {false,SPR_SPECTRE_W4,10,(statefunc)T_Ghosts,NULL,&s_spectrechase1};
1901
1902statetype s_spectredie1 = {false,SPR_SPECTRE_F1,10,NULL,NULL,&s_spectredie2};
1903statetype s_spectredie2 = {false,SPR_SPECTRE_F2,10,NULL,NULL,&s_spectredie3};
1904statetype s_spectredie3 = {false,SPR_SPECTRE_F3,10,NULL,NULL,&s_spectredie4};
1905statetype s_spectredie4 = {false,SPR_SPECTRE_F4,300,NULL,NULL,&s_spectrewake};
1906statetype s_spectrewake = {false,SPR_SPECTRE_F4,10,NULL,(statefunc)A_Dormant,&s_spectrewake};
1907
1908/*
1909===============
1910=
1911= SpawnSpectre
1912=
1913===============
1914*/
1915
1916void SpawnSpectre (int tilex, int tiley)
1917{
1918 SpawnNewObj (tilex,tiley,&s_spectrewait1);
1919 newobj->obclass = spectreobj;
1920 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_spectre];
1921 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH|FL_BONUS; // |FL_NEVERMARK|FL_NONMARK;
1922 if (!loadedgame)
1923 gamestate.killtotal++;
1924}
1925
1926
1927/*
1928===============
1929=
1930= A_Dormant
1931=
1932===============
1933*/
1934
1935void A_Dormant (objtype *ob)
1936{
1937 int32_t deltax,deltay;
1938 int xl,xh,yl,yh;
1939 int x,y;
1940 uintptr_t tile;
1941
1942 deltax = ob->x - player->x;
1943 if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
1944 goto moveok;
1945 deltay = ob->y - player->y;
1946 if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
1947 goto moveok;
1948
1949 return;
1950moveok:
1951
1952 xl = (ob->x-MINDIST) >> TILESHIFT;
1953 xh = (ob->x+MINDIST) >> TILESHIFT;
1954 yl = (ob->y-MINDIST) >> TILESHIFT;
1955 yh = (ob->y+MINDIST) >> TILESHIFT;
1956
1957 for (y=yl ; y<=yh ; y++)
1958 for (x=xl ; x<=xh ; x++)
1959 {
1960 tile = (uintptr_t)actorat[x][y];
1961 if (!tile)
1962 continue;
1963 if (!ISPOINTER(tile))
1964 return;
1965 if (((objtype *)tile)->flags&FL_SHOOTABLE)
1966 return;
1967 }
1968
1969 ob->flags |= FL_AMBUSH | FL_SHOOTABLE;
1970 ob->flags &= ~FL_ATTACKMODE;
1971 ob->flags &= ~FL_NONMARK; // stuck bugfix 1
1972 ob->dir = nodir;
1973 NewState (ob,&s_spectrewait1);
1974}
1975
1976
1977#endif
1978
1979/*
1980=============================================================================
1981
1982 SCHABBS / GIFT / FAT
1983
1984=============================================================================
1985*/
1986
1987#ifndef SPEAR
1988/*
1989===============
1990=
1991= SpawnGhosts
1992=
1993===============
1994*/
1995
1996void SpawnGhosts (int which, int tilex, int tiley)
1997{
1998 switch(which)
1999 {
2000 case en_blinky:
2001 SpawnNewObj (tilex,tiley,&s_blinkychase1);
2002 break;
2003 case en_clyde:
2004 SpawnNewObj (tilex,tiley,&s_clydechase1);
2005 break;
2006 case en_pinky:
2007 SpawnNewObj (tilex,tiley,&s_pinkychase1);
2008 break;
2009 case en_inky:
2010 SpawnNewObj (tilex,tiley,&s_inkychase1);
2011 break;
2012 }
2013
2014 newobj->obclass = ghostobj;
2015 newobj->speed = SPDDOG;
2016
2017 newobj->dir = east;
2018 newobj->flags |= FL_AMBUSH;
2019 if (!loadedgame)
2020 {
2021 gamestate.killtotal++;
2022 gamestate.killcount++;
2023 }
2024}
2025
2026
2027
2028void T_Gift (objtype *ob);
2029void T_GiftThrow (objtype *ob);
2030
2031void T_Fat (objtype *ob);
2032void T_FatThrow (objtype *ob);
2033
2034//
2035// schabb
2036//
2037extern statetype s_schabbstand;
2038
2039extern statetype s_schabbchase1;
2040extern statetype s_schabbchase1s;
2041extern statetype s_schabbchase2;
2042extern statetype s_schabbchase3;
2043extern statetype s_schabbchase3s;
2044extern statetype s_schabbchase4;
2045
2046extern statetype s_schabbdie1;
2047extern statetype s_schabbdie2;
2048extern statetype s_schabbdie3;
2049extern statetype s_schabbdie4;
2050extern statetype s_schabbdie5;
2051extern statetype s_schabbdie6;
2052
2053extern statetype s_schabbshoot1;
2054extern statetype s_schabbshoot2;
2055
2056extern statetype s_needle1;
2057extern statetype s_needle2;
2058extern statetype s_needle3;
2059extern statetype s_needle4;
2060
2061extern statetype s_schabbdeathcam;
2062
2063
2064statetype s_schabbstand = {false,SPR_SCHABB_W1,0,(statefunc)T_Stand,NULL,&s_schabbstand};
2065
2066statetype s_schabbchase1 = {false,SPR_SCHABB_W1,10,(statefunc)T_Schabb,NULL,&s_schabbchase1s};
2067statetype s_schabbchase1s = {false,SPR_SCHABB_W1,3,NULL,NULL,&s_schabbchase2};
2068statetype s_schabbchase2 = {false,SPR_SCHABB_W2,8,(statefunc)T_Schabb,NULL,&s_schabbchase3};
2069statetype s_schabbchase3 = {false,SPR_SCHABB_W3,10,(statefunc)T_Schabb,NULL,&s_schabbchase3s};
2070statetype s_schabbchase3s = {false,SPR_SCHABB_W3,3,NULL,NULL,&s_schabbchase4};
2071statetype s_schabbchase4 = {false,SPR_SCHABB_W4,8,(statefunc)T_Schabb,NULL,&s_schabbchase1};
2072
2073statetype s_schabbdeathcam = {false,SPR_SCHABB_W1,1,NULL,NULL,&s_schabbdie1};
2074
2075statetype s_schabbdie1 = {false,SPR_SCHABB_W1,10,NULL,(statefunc)A_DeathScream,&s_schabbdie2};
2076statetype s_schabbdie2 = {false,SPR_SCHABB_W1,10,NULL,NULL,&s_schabbdie3};
2077statetype s_schabbdie3 = {false,SPR_SCHABB_DIE1,10,NULL,NULL,&s_schabbdie4};
2078statetype s_schabbdie4 = {false,SPR_SCHABB_DIE2,10,NULL,NULL,&s_schabbdie5};
2079statetype s_schabbdie5 = {false,SPR_SCHABB_DIE3,10,NULL,NULL,&s_schabbdie6};
2080statetype s_schabbdie6 = {false,SPR_SCHABB_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_schabbdie6};
2081
2082statetype s_schabbshoot1 = {false,SPR_SCHABB_SHOOT1,30,NULL,NULL,&s_schabbshoot2};
2083statetype s_schabbshoot2 = {false,SPR_SCHABB_SHOOT2,10,NULL,(statefunc)T_SchabbThrow,&s_schabbchase1};
2084
2085statetype s_needle1 = {false,SPR_HYPO1,6,(statefunc)T_Projectile,NULL,&s_needle2};
2086statetype s_needle2 = {false,SPR_HYPO2,6,(statefunc)T_Projectile,NULL,&s_needle3};
2087statetype s_needle3 = {false,SPR_HYPO3,6,(statefunc)T_Projectile,NULL,&s_needle4};
2088statetype s_needle4 = {false,SPR_HYPO4,6,(statefunc)T_Projectile,NULL,&s_needle1};
2089
2090
2091//
2092// gift
2093//
2094extern statetype s_giftstand;
2095
2096extern statetype s_giftchase1;
2097extern statetype s_giftchase1s;
2098extern statetype s_giftchase2;
2099extern statetype s_giftchase3;
2100extern statetype s_giftchase3s;
2101extern statetype s_giftchase4;
2102
2103extern statetype s_giftdie1;
2104extern statetype s_giftdie2;
2105extern statetype s_giftdie3;
2106extern statetype s_giftdie4;
2107extern statetype s_giftdie5;
2108extern statetype s_giftdie6;
2109
2110extern statetype s_giftshoot1;
2111extern statetype s_giftshoot2;
2112
2113extern statetype s_needle1;
2114extern statetype s_needle2;
2115extern statetype s_needle3;
2116extern statetype s_needle4;
2117
2118extern statetype s_giftdeathcam;
2119
2120extern statetype s_boom1;
2121extern statetype s_boom2;
2122extern statetype s_boom3;
2123
2124
2125statetype s_giftstand = {false,SPR_GIFT_W1,0,(statefunc)T_Stand,NULL,&s_giftstand};
2126
2127statetype s_giftchase1 = {false,SPR_GIFT_W1,10,(statefunc)T_Gift,NULL,&s_giftchase1s};
2128statetype s_giftchase1s = {false,SPR_GIFT_W1,3,NULL,NULL,&s_giftchase2};
2129statetype s_giftchase2 = {false,SPR_GIFT_W2,8,(statefunc)T_Gift,NULL,&s_giftchase3};
2130statetype s_giftchase3 = {false,SPR_GIFT_W3,10,(statefunc)T_Gift,NULL,&s_giftchase3s};
2131statetype s_giftchase3s = {false,SPR_GIFT_W3,3,NULL,NULL,&s_giftchase4};
2132statetype s_giftchase4 = {false,SPR_GIFT_W4,8,(statefunc)T_Gift,NULL,&s_giftchase1};
2133
2134statetype s_giftdeathcam = {false,SPR_GIFT_W1,1,NULL,NULL,&s_giftdie1};
2135
2136statetype s_giftdie1 = {false,SPR_GIFT_W1,1,NULL,(statefunc)A_DeathScream,&s_giftdie2};
2137statetype s_giftdie2 = {false,SPR_GIFT_W1,10,NULL,NULL,&s_giftdie3};
2138statetype s_giftdie3 = {false,SPR_GIFT_DIE1,10,NULL,NULL,&s_giftdie4};
2139statetype s_giftdie4 = {false,SPR_GIFT_DIE2,10,NULL,NULL,&s_giftdie5};
2140statetype s_giftdie5 = {false,SPR_GIFT_DIE3,10,NULL,NULL,&s_giftdie6};
2141statetype s_giftdie6 = {false,SPR_GIFT_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_giftdie6};
2142
2143statetype s_giftshoot1 = {false,SPR_GIFT_SHOOT1,30,NULL,NULL,&s_giftshoot2};
2144statetype s_giftshoot2 = {false,SPR_GIFT_SHOOT2,10,NULL,(statefunc)T_GiftThrow,&s_giftchase1};
2145
2146
2147//
2148// fat
2149//
2150extern statetype s_fatstand;
2151
2152extern statetype s_fatchase1;
2153extern statetype s_fatchase1s;
2154extern statetype s_fatchase2;
2155extern statetype s_fatchase3;
2156extern statetype s_fatchase3s;
2157extern statetype s_fatchase4;
2158
2159extern statetype s_fatdie1;
2160extern statetype s_fatdie2;
2161extern statetype s_fatdie3;
2162extern statetype s_fatdie4;
2163extern statetype s_fatdie5;
2164extern statetype s_fatdie6;
2165
2166extern statetype s_fatshoot1;
2167extern statetype s_fatshoot2;
2168extern statetype s_fatshoot3;
2169extern statetype s_fatshoot4;
2170extern statetype s_fatshoot5;
2171extern statetype s_fatshoot6;
2172
2173extern statetype s_needle1;
2174extern statetype s_needle2;
2175extern statetype s_needle3;
2176extern statetype s_needle4;
2177
2178extern statetype s_fatdeathcam;
2179
2180
2181statetype s_fatstand = {false,SPR_FAT_W1,0,(statefunc)T_Stand,NULL,&s_fatstand};
2182
2183statetype s_fatchase1 = {false,SPR_FAT_W1,10,(statefunc)T_Fat,NULL,&s_fatchase1s};
2184statetype s_fatchase1s = {false,SPR_FAT_W1,3,NULL,NULL,&s_fatchase2};
2185statetype s_fatchase2 = {false,SPR_FAT_W2,8,(statefunc)T_Fat,NULL,&s_fatchase3};
2186statetype s_fatchase3 = {false,SPR_FAT_W3,10,(statefunc)T_Fat,NULL,&s_fatchase3s};
2187statetype s_fatchase3s = {false,SPR_FAT_W3,3,NULL,NULL,&s_fatchase4};
2188statetype s_fatchase4 = {false,SPR_FAT_W4,8,(statefunc)T_Fat,NULL,&s_fatchase1};
2189
2190statetype s_fatdeathcam = {false,SPR_FAT_W1,1,NULL,NULL,&s_fatdie1};
2191
2192statetype s_fatdie1 = {false,SPR_FAT_W1,1,NULL,(statefunc)A_DeathScream,&s_fatdie2};
2193statetype s_fatdie2 = {false,SPR_FAT_W1,10,NULL,NULL,&s_fatdie3};
2194statetype s_fatdie3 = {false,SPR_FAT_DIE1,10,NULL,NULL,&s_fatdie4};
2195statetype s_fatdie4 = {false,SPR_FAT_DIE2,10,NULL,NULL,&s_fatdie5};
2196statetype s_fatdie5 = {false,SPR_FAT_DIE3,10,NULL,NULL,&s_fatdie6};
2197statetype s_fatdie6 = {false,SPR_FAT_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_fatdie6};
2198
2199statetype s_fatshoot1 = {false,SPR_FAT_SHOOT1,30,NULL,NULL,&s_fatshoot2};
2200statetype s_fatshoot2 = {false,SPR_FAT_SHOOT2,10,NULL,(statefunc)T_GiftThrow,&s_fatshoot3};
2201statetype s_fatshoot3 = {false,SPR_FAT_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_fatshoot4};
2202statetype s_fatshoot4 = {false,SPR_FAT_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_fatshoot5};
2203statetype s_fatshoot5 = {false,SPR_FAT_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_fatshoot6};
2204statetype s_fatshoot6 = {false,SPR_FAT_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_fatchase1};
2205
2206
2207/*
2208===============
2209=
2210= SpawnSchabbs
2211=
2212===============
2213*/
2214
2215void SpawnSchabbs (int tilex, int tiley)
2216{
2217 if (DigiMode != sds_Off)
2218 s_schabbdie2.tictime = 140;
2219 else
2220 s_schabbdie2.tictime = 5;
2221
2222 SpawnNewObj (tilex,tiley,&s_schabbstand);
2223 newobj->speed = SPDPATROL;
2224
2225 newobj->obclass = schabbobj;
2226 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_schabbs];
2227 newobj->dir = nodir;
2228 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
2229 if (!loadedgame)
2230 gamestate.killtotal++;
2231}
2232
2233
2234/*
2235===============
2236=
2237= SpawnGift
2238=
2239===============
2240*/
2241
2242void SpawnGift (int tilex, int tiley)
2243{
2244 if (DigiMode != sds_Off)
2245 s_giftdie2.tictime = 140;
2246 else
2247 s_giftdie2.tictime = 5;
2248
2249 SpawnNewObj (tilex,tiley,&s_giftstand);
2250 newobj->speed = SPDPATROL;
2251
2252 newobj->obclass = giftobj;
2253 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_gift];
2254 newobj->dir = nodir;
2255 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
2256 if (!loadedgame)
2257 gamestate.killtotal++;
2258}
2259
2260
2261/*
2262===============
2263=
2264= SpawnFat
2265=
2266===============
2267*/
2268
2269void SpawnFat (int tilex, int tiley)
2270{
2271 if (DigiMode != sds_Off)
2272 s_fatdie2.tictime = 140;
2273 else
2274 s_fatdie2.tictime = 5;
2275
2276 SpawnNewObj (tilex,tiley,&s_fatstand);
2277 newobj->speed = SPDPATROL;
2278
2279 newobj->obclass = fatobj;
2280 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_fat];
2281 newobj->dir = nodir;
2282 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
2283 if (!loadedgame)
2284 gamestate.killtotal++;
2285}
2286
2287
2288/*
2289=================
2290=
2291= T_SchabbThrow
2292=
2293=================
2294*/
2295
2296void T_SchabbThrow (objtype *ob)
2297{
2298 int32_t deltax,deltay;
2299 float angle;
2300 int iangle;
2301
2302 deltax = player->x - ob->x;
2303 deltay = ob->y - player->y;
2304 angle = (float) atan2((float) deltay, (float) deltax);
2305 if (angle<0)
2306 angle = (float) (M_PI*2+angle);
2307 iangle = (int) (angle/(M_PI*2)*ANGLES);
2308
2309 GetNewActor ();
2310 newobj->state = &s_needle1;
2311 newobj->ticcount = 1;
2312
2313 newobj->tilex = ob->tilex;
2314 newobj->tiley = ob->tiley;
2315 newobj->x = ob->x;
2316 newobj->y = ob->y;
2317 newobj->obclass = needleobj;
2318 newobj->dir = nodir;
2319 newobj->angle = iangle;
2320 newobj->speed = 0x2000l;
2321
2322 newobj->flags = FL_NEVERMARK;
2323 newobj->active = ac_yes;
2324
2325 PlaySoundLocActor (SCHABBSTHROWSND,newobj);
2326}
2327
2328/*
2329=================
2330=
2331= T_GiftThrow
2332=
2333=================
2334*/
2335
2336void T_GiftThrow (objtype *ob)
2337{
2338 int32_t deltax,deltay;
2339 float angle;
2340 int iangle;
2341
2342 deltax = player->x - ob->x;
2343 deltay = ob->y - player->y;
2344 angle = (float) atan2((float) deltay, (float) deltax);
2345 if (angle<0)
2346 angle = (float) (M_PI*2+angle);
2347 iangle = (int) (angle/(M_PI*2)*ANGLES);
2348
2349 GetNewActor ();
2350 newobj->state = &s_rocket;
2351 newobj->ticcount = 1;
2352
2353 newobj->tilex = ob->tilex;
2354 newobj->tiley = ob->tiley;
2355 newobj->x = ob->x;
2356 newobj->y = ob->y;
2357 newobj->obclass = rocketobj;
2358 newobj->dir = nodir;
2359 newobj->angle = iangle;
2360 newobj->speed = 0x2000l;
2361 newobj->flags = FL_NEVERMARK;
2362 newobj->active = ac_yes;
2363
2364#ifndef APOGEE_1_0 // T_GiftThrow will never be called in shareware v1.0
2365 PlaySoundLocActor (MISSILEFIRESND,newobj);
2366#endif
2367}
2368
2369
2370/*
2371=================
2372=
2373= T_Schabb
2374=
2375=================
2376*/
2377
2378void T_Schabb (objtype *ob)
2379{
2380 int32_t move;
2381 int dx,dy,dist;
2382 boolean dodge;
2383
2384 dodge = false;
2385 dx = abs(ob->tilex - player->tilex);
2386 dy = abs(ob->tiley - player->tiley);
2387 dist = dx>dy ? dx : dy;
2388
2389 if (CheckLine(ob)) // got a shot at player?
2390 {
2391 ob->hidden = false;
2392 if ( (unsigned) US_RndT() < (tics<<3) && objfreelist)
2393 {
2394 //
2395 // go into attack frame
2396 //
2397 NewState (ob,&s_schabbshoot1);
2398 return;
2399 }
2400 dodge = true;
2401 }
2402 else
2403 ob->hidden = true;
2404
2405 if (ob->dir == nodir)
2406 {
2407 if (dodge)
2408 SelectDodgeDir (ob);
2409 else
2410 SelectChaseDir (ob);
2411 if (ob->dir == nodir)
2412 return; // object is blocked in
2413 }
2414
2415 move = ob->speed*tics;
2416
2417 while (move)
2418 {
2419 if (ob->distance < 0)
2420 {
2421 //
2422 // waiting for a door to open
2423 //
2424 OpenDoor (-ob->distance-1);
2425 if (doorobjlist[-ob->distance-1].action != dr_open)
2426 return;
2427 ob->distance = TILEGLOBAL; // go ahead, the door is now open
2428 TryWalk(ob);
2429 }
2430
2431 if (move < ob->distance)
2432 {
2433 MoveObj (ob,move);
2434 break;
2435 }
2436
2437 //
2438 // reached goal tile, so select another one
2439 //
2440
2441 //
2442 // fix position to account for round off during moving
2443 //
2444 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
2445 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
2446
2447 move -= ob->distance;
2448
2449 if (dist <4)
2450 SelectRunDir (ob);
2451 else if (dodge)
2452 SelectDodgeDir (ob);
2453 else
2454 SelectChaseDir (ob);
2455
2456 if (ob->dir == nodir)
2457 return; // object is blocked in
2458 }
2459}
2460
2461
2462/*
2463=================
2464=
2465= T_Gift
2466=
2467=================
2468*/
2469
2470void T_Gift (objtype *ob)
2471{
2472 int32_t move;
2473 int dx,dy,dist;
2474 boolean dodge;
2475
2476 dodge = false;
2477 dx = abs(ob->tilex - player->tilex);
2478 dy = abs(ob->tiley - player->tiley);
2479 dist = dx>dy ? dx : dy;
2480
2481 if (CheckLine(ob)) // got a shot at player?
2482 {
2483 ob->hidden = false;
2484 if ( (unsigned) US_RndT() < (tics<<3) && objfreelist)
2485 {
2486 //
2487 // go into attack frame
2488 //
2489 NewState (ob,&s_giftshoot1);
2490 return;
2491 }
2492 dodge = true;
2493 }
2494 else
2495 ob->hidden = true;
2496
2497 if (ob->dir == nodir)
2498 {
2499 if (dodge)
2500 SelectDodgeDir (ob);
2501 else
2502 SelectChaseDir (ob);
2503 if (ob->dir == nodir)
2504 return; // object is blocked in
2505 }
2506
2507 move = ob->speed*tics;
2508
2509 while (move)
2510 {
2511 if (ob->distance < 0)
2512 {
2513 //
2514 // waiting for a door to open
2515 //
2516 OpenDoor (-ob->distance-1);
2517 if (doorobjlist[-ob->distance-1].action != dr_open)
2518 return;
2519 ob->distance = TILEGLOBAL; // go ahead, the door is now open
2520 TryWalk(ob);
2521 }
2522
2523 if (move < ob->distance)
2524 {
2525 MoveObj (ob,move);
2526 break;
2527 }
2528
2529 //
2530 // reached goal tile, so select another one
2531 //
2532
2533 //
2534 // fix position to account for round off during moving
2535 //
2536 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
2537 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
2538
2539 move -= ob->distance;
2540
2541 if (dist <4)
2542 SelectRunDir (ob);
2543 else if (dodge)
2544 SelectDodgeDir (ob);
2545 else
2546 SelectChaseDir (ob);
2547
2548 if (ob->dir == nodir)
2549 return; // object is blocked in
2550 }
2551}
2552
2553
2554/*
2555=================
2556=
2557= T_Fat
2558=
2559=================
2560*/
2561
2562void T_Fat (objtype *ob)
2563{
2564 int32_t move;
2565 int dx,dy,dist;
2566 boolean dodge;
2567
2568 dodge = false;
2569 dx = abs(ob->tilex - player->tilex);
2570 dy = abs(ob->tiley - player->tiley);
2571 dist = dx>dy ? dx : dy;
2572
2573 if (CheckLine(ob)) // got a shot at player?
2574 {
2575 ob->hidden = false;
2576 if ( (unsigned) US_RndT() < (tics<<3) && objfreelist)
2577 {
2578 //
2579 // go into attack frame
2580 //
2581 NewState (ob,&s_fatshoot1);
2582 return;
2583 }
2584 dodge = true;
2585 }
2586 else
2587 ob->hidden = true;
2588
2589 if (ob->dir == nodir)
2590 {
2591 if (dodge)
2592 SelectDodgeDir (ob);
2593 else
2594 SelectChaseDir (ob);
2595 if (ob->dir == nodir)
2596 return; // object is blocked in
2597 }
2598
2599 move = ob->speed*tics;
2600
2601 while (move)
2602 {
2603 if (ob->distance < 0)
2604 {
2605 //
2606 // waiting for a door to open
2607 //
2608 OpenDoor (-ob->distance-1);
2609 if (doorobjlist[-ob->distance-1].action != dr_open)
2610 return;
2611 ob->distance = TILEGLOBAL; // go ahead, the door is now open
2612 TryWalk(ob);
2613 }
2614
2615 if (move < ob->distance)
2616 {
2617 MoveObj (ob,move);
2618 break;
2619 }
2620
2621 //
2622 // reached goal tile, so select another one
2623 //
2624
2625 //
2626 // fix position to account for round off during moving
2627 //
2628 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
2629 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
2630
2631 move -= ob->distance;
2632
2633 if (dist <4)
2634 SelectRunDir (ob);
2635 else if (dodge)
2636 SelectDodgeDir (ob);
2637 else
2638 SelectChaseDir (ob);
2639
2640 if (ob->dir == nodir)
2641 return; // object is blocked in
2642 }
2643}
2644
2645
2646/*
2647=============================================================================
2648
2649 HITLERS
2650
2651=============================================================================
2652*/
2653
2654
2655//
2656// fake
2657//
2658extern statetype s_fakestand;
2659
2660extern statetype s_fakechase1;
2661extern statetype s_fakechase1s;
2662extern statetype s_fakechase2;
2663extern statetype s_fakechase3;
2664extern statetype s_fakechase3s;
2665extern statetype s_fakechase4;
2666
2667extern statetype s_fakedie1;
2668extern statetype s_fakedie2;
2669extern statetype s_fakedie3;
2670extern statetype s_fakedie4;
2671extern statetype s_fakedie5;
2672extern statetype s_fakedie6;
2673
2674extern statetype s_fakeshoot1;
2675extern statetype s_fakeshoot2;
2676extern statetype s_fakeshoot3;
2677extern statetype s_fakeshoot4;
2678extern statetype s_fakeshoot5;
2679extern statetype s_fakeshoot6;
2680extern statetype s_fakeshoot7;
2681extern statetype s_fakeshoot8;
2682extern statetype s_fakeshoot9;
2683
2684extern statetype s_fire1;
2685extern statetype s_fire2;
2686
2687statetype s_fakestand = {false,SPR_FAKE_W1,0,(statefunc)T_Stand,NULL,&s_fakestand};
2688
2689statetype s_fakechase1 = {false,SPR_FAKE_W1,10,(statefunc)T_Fake,NULL,&s_fakechase1s};
2690statetype s_fakechase1s = {false,SPR_FAKE_W1,3,NULL,NULL,&s_fakechase2};
2691statetype s_fakechase2 = {false,SPR_FAKE_W2,8,(statefunc)T_Fake,NULL,&s_fakechase3};
2692statetype s_fakechase3 = {false,SPR_FAKE_W3,10,(statefunc)T_Fake,NULL,&s_fakechase3s};
2693statetype s_fakechase3s = {false,SPR_FAKE_W3,3,NULL,NULL,&s_fakechase4};
2694statetype s_fakechase4 = {false,SPR_FAKE_W4,8,(statefunc)T_Fake,NULL,&s_fakechase1};
2695
2696statetype s_fakedie1 = {false,SPR_FAKE_DIE1,10,NULL,(statefunc)A_DeathScream,&s_fakedie2};
2697statetype s_fakedie2 = {false,SPR_FAKE_DIE2,10,NULL,NULL,&s_fakedie3};
2698statetype s_fakedie3 = {false,SPR_FAKE_DIE3,10,NULL,NULL,&s_fakedie4};
2699statetype s_fakedie4 = {false,SPR_FAKE_DIE4,10,NULL,NULL,&s_fakedie5};
2700statetype s_fakedie5 = {false,SPR_FAKE_DIE5,10,NULL,NULL,&s_fakedie6};
2701statetype s_fakedie6 = {false,SPR_FAKE_DEAD,0,NULL,NULL,&s_fakedie6};
2702
2703statetype s_fakeshoot1 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot2};
2704statetype s_fakeshoot2 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot3};
2705statetype s_fakeshoot3 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot4};
2706statetype s_fakeshoot4 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot5};
2707statetype s_fakeshoot5 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot6};
2708statetype s_fakeshoot6 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot7};
2709statetype s_fakeshoot7 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot8};
2710statetype s_fakeshoot8 = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot9};
2711statetype s_fakeshoot9 = {false,SPR_FAKE_SHOOT,8,NULL,NULL,&s_fakechase1};
2712
2713statetype s_fire1 = {false,SPR_FIRE1,6,NULL,(statefunc)T_Projectile,&s_fire2};
2714statetype s_fire2 = {false,SPR_FIRE2,6,NULL,(statefunc)T_Projectile,&s_fire1};
2715
2716//
2717// hitler
2718//
2719extern statetype s_mechachase1;
2720extern statetype s_mechachase1s;
2721extern statetype s_mechachase2;
2722extern statetype s_mechachase3;
2723extern statetype s_mechachase3s;
2724extern statetype s_mechachase4;
2725
2726extern statetype s_mechadie1;
2727extern statetype s_mechadie2;
2728extern statetype s_mechadie3;
2729extern statetype s_mechadie4;
2730
2731extern statetype s_mechashoot1;
2732extern statetype s_mechashoot2;
2733extern statetype s_mechashoot3;
2734extern statetype s_mechashoot4;
2735extern statetype s_mechashoot5;
2736extern statetype s_mechashoot6;
2737
2738
2739extern statetype s_hitlerchase1;
2740extern statetype s_hitlerchase1s;
2741extern statetype s_hitlerchase2;
2742extern statetype s_hitlerchase3;
2743extern statetype s_hitlerchase3s;
2744extern statetype s_hitlerchase4;
2745
2746extern statetype s_hitlerdie1;
2747extern statetype s_hitlerdie2;
2748extern statetype s_hitlerdie3;
2749extern statetype s_hitlerdie4;
2750extern statetype s_hitlerdie5;
2751extern statetype s_hitlerdie6;
2752extern statetype s_hitlerdie7;
2753extern statetype s_hitlerdie8;
2754extern statetype s_hitlerdie9;
2755extern statetype s_hitlerdie10;
2756
2757extern statetype s_hitlershoot1;
2758extern statetype s_hitlershoot2;
2759extern statetype s_hitlershoot3;
2760extern statetype s_hitlershoot4;
2761extern statetype s_hitlershoot5;
2762extern statetype s_hitlershoot6;
2763
2764extern statetype s_hitlerdeathcam;
2765
2766statetype s_mechastand = {false,SPR_MECHA_W1,0,(statefunc)T_Stand,NULL,&s_mechastand};
2767
2768statetype s_mechachase1 = {false,SPR_MECHA_W1,10,(statefunc)T_Chase,(statefunc)A_MechaSound,&s_mechachase1s};
2769statetype s_mechachase1s = {false,SPR_MECHA_W1,6,NULL,NULL,&s_mechachase2};
2770statetype s_mechachase2 = {false,SPR_MECHA_W2,8,(statefunc)T_Chase,NULL,&s_mechachase3};
2771statetype s_mechachase3 = {false,SPR_MECHA_W3,10,(statefunc)T_Chase,(statefunc)A_MechaSound,&s_mechachase3s};
2772statetype s_mechachase3s = {false,SPR_MECHA_W3,6,NULL,NULL,&s_mechachase4};
2773statetype s_mechachase4 = {false,SPR_MECHA_W4,8,(statefunc)T_Chase,NULL,&s_mechachase1};
2774
2775statetype s_mechadie1 = {false,SPR_MECHA_DIE1,10,NULL,(statefunc)A_DeathScream,&s_mechadie2};
2776statetype s_mechadie2 = {false,SPR_MECHA_DIE2,10,NULL,NULL,&s_mechadie3};
2777statetype s_mechadie3 = {false,SPR_MECHA_DIE3,10,NULL,(statefunc)A_HitlerMorph,&s_mechadie4};
2778statetype s_mechadie4 = {false,SPR_MECHA_DEAD,0,NULL,NULL,&s_mechadie4};
2779
2780statetype s_mechashoot1 = {false,SPR_MECHA_SHOOT1,30,NULL,NULL,&s_mechashoot2};
2781statetype s_mechashoot2 = {false,SPR_MECHA_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_mechashoot3};
2782statetype s_mechashoot3 = {false,SPR_MECHA_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_mechashoot4};
2783statetype s_mechashoot4 = {false,SPR_MECHA_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_mechashoot5};
2784statetype s_mechashoot5 = {false,SPR_MECHA_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_mechashoot6};
2785statetype s_mechashoot6 = {false,SPR_MECHA_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_mechachase1};
2786
2787
2788statetype s_hitlerchase1 = {false,SPR_HITLER_W1,6,(statefunc)T_Chase,NULL,&s_hitlerchase1s};
2789statetype s_hitlerchase1s = {false,SPR_HITLER_W1,4,NULL,NULL,&s_hitlerchase2};
2790statetype s_hitlerchase2 = {false,SPR_HITLER_W2,2,(statefunc)T_Chase,NULL,&s_hitlerchase3};
2791statetype s_hitlerchase3 = {false,SPR_HITLER_W3,6,(statefunc)T_Chase,NULL,&s_hitlerchase3s};
2792statetype s_hitlerchase3s = {false,SPR_HITLER_W3,4,NULL,NULL,&s_hitlerchase4};
2793statetype s_hitlerchase4 = {false,SPR_HITLER_W4,2,(statefunc)T_Chase,NULL,&s_hitlerchase1};
2794
2795statetype s_hitlerdeathcam = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie1};
2796
2797statetype s_hitlerdie1 = {false,SPR_HITLER_W1,1,NULL,(statefunc)A_DeathScream,&s_hitlerdie2};
2798statetype s_hitlerdie2 = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie3};
2799statetype s_hitlerdie3 = {false,SPR_HITLER_DIE1,10,NULL,(statefunc)A_Slurpie,&s_hitlerdie4};
2800statetype s_hitlerdie4 = {false,SPR_HITLER_DIE2,10,NULL,NULL,&s_hitlerdie5};
2801statetype s_hitlerdie5 = {false,SPR_HITLER_DIE3,10,NULL,NULL,&s_hitlerdie6};
2802statetype s_hitlerdie6 = {false,SPR_HITLER_DIE4,10,NULL,NULL,&s_hitlerdie7};
2803statetype s_hitlerdie7 = {false,SPR_HITLER_DIE5,10,NULL,NULL,&s_hitlerdie8};
2804statetype s_hitlerdie8 = {false,SPR_HITLER_DIE6,10,NULL,NULL,&s_hitlerdie9};
2805statetype s_hitlerdie9 = {false,SPR_HITLER_DIE7,10,NULL,NULL,&s_hitlerdie10};
2806statetype s_hitlerdie10 = {false,SPR_HITLER_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_hitlerdie10};
2807
2808statetype s_hitlershoot1 = {false,SPR_HITLER_SHOOT1,30,NULL,NULL,&s_hitlershoot2};
2809statetype s_hitlershoot2 = {false,SPR_HITLER_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_hitlershoot3};
2810statetype s_hitlershoot3 = {false,SPR_HITLER_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_hitlershoot4};
2811statetype s_hitlershoot4 = {false,SPR_HITLER_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_hitlershoot5};
2812statetype s_hitlershoot5 = {false,SPR_HITLER_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_hitlershoot6};
2813statetype s_hitlershoot6 = {false,SPR_HITLER_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_hitlerchase1};
2814
2815
2816
2817/*
2818===============
2819=
2820= SpawnFakeHitler
2821=
2822===============
2823*/
2824
2825void SpawnFakeHitler (int tilex, int tiley)
2826{
2827 if (DigiMode != sds_Off)
2828 s_hitlerdie2.tictime = 140;
2829 else
2830 s_hitlerdie2.tictime = 5;
2831
2832 SpawnNewObj (tilex,tiley,&s_fakestand);
2833 newobj->speed = SPDPATROL;
2834
2835 newobj->obclass = fakeobj;
2836 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_fake];
2837 newobj->dir = nodir;
2838 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
2839 if (!loadedgame)
2840 gamestate.killtotal++;
2841}
2842
2843
2844/*
2845===============
2846=
2847= SpawnHitler
2848=
2849===============
2850*/
2851
2852void SpawnHitler (int tilex, int tiley)
2853{
2854 if (DigiMode != sds_Off)
2855 s_hitlerdie2.tictime = 140;
2856 else
2857 s_hitlerdie2.tictime = 5;
2858
2859
2860 SpawnNewObj (tilex,tiley,&s_mechastand);
2861 newobj->speed = SPDPATROL;
2862
2863 newobj->obclass = mechahitlerobj;
2864 newobj->hitpoints = starthitpoints[gamestate.difficulty][en_hitler];
2865 newobj->dir = nodir;
2866 newobj->flags |= FL_SHOOTABLE|FL_AMBUSH;
2867 if (!loadedgame)
2868 gamestate.killtotal++;
2869}
2870
2871
2872/*
2873===============
2874=
2875= A_HitlerMorph
2876=
2877===============
2878*/
2879
2880void A_HitlerMorph (objtype *ob)
2881{
2882 short hitpoints[4]={500,700,800,900};
2883
2884 SpawnNewObj (ob->tilex,ob->tiley,&s_hitlerchase1);
2885 newobj->speed = SPDPATROL*5;
2886
2887 newobj->x = ob->x;
2888 newobj->y = ob->y;
2889
2890 newobj->distance = ob->distance;
2891 newobj->dir = ob->dir;
2892 newobj->flags = ob->flags | FL_SHOOTABLE;
2893 newobj->flags &= ~FL_NONMARK; // hitler stuck with nodir fix
2894
2895 newobj->obclass = realhitlerobj;
2896 newobj->hitpoints = hitpoints[gamestate.difficulty];
2897}
2898
2899
2900////////////////////////////////////////////////////////
2901//
2902// A_MechaSound
2903// A_Slurpie
2904//
2905////////////////////////////////////////////////////////
2906void A_MechaSound (objtype *ob)
2907{
2908 if (areabyplayer[ob->areanumber])
2909 PlaySoundLocActor (MECHSTEPSND,ob);
2910}
2911
2912void A_Slurpie (objtype * ob)
2913{
2914 SD_PlaySound(SLURPIESND);
2915}
2916
2917/*
2918=================
2919=
2920= T_FakeFire
2921=
2922=================
2923*/
2924
2925void T_FakeFire (objtype *ob)
2926{
2927 int32_t deltax,deltay;
2928 float angle;
2929 int iangle;
2930
2931 if (!objfreelist) // stop shooting if over MAXACTORS
2932 {
2933 NewState (ob,&s_fakechase1);
2934 return;
2935 }
2936
2937 deltax = player->x - ob->x;
2938 deltay = ob->y - player->y;
2939 angle = (float) atan2((float) deltay, (float) deltax);
2940 if (angle<0)
2941 angle = (float)(M_PI*2+angle);
2942 iangle = (int) (angle/(M_PI*2)*ANGLES);
2943
2944 GetNewActor ();
2945 newobj->state = &s_fire1;
2946 newobj->ticcount = 1;
2947
2948 newobj->tilex = ob->tilex;
2949 newobj->tiley = ob->tiley;
2950 newobj->x = ob->x;
2951 newobj->y = ob->y;
2952 newobj->dir = nodir;
2953 newobj->angle = iangle;
2954 newobj->obclass = fireobj;
2955 newobj->speed = 0x1200l;
2956 newobj->flags = FL_NEVERMARK;
2957 newobj->active = ac_yes;
2958
2959 PlaySoundLocActor (FLAMETHROWERSND,newobj);
2960}
2961
2962
2963
2964/*
2965=================
2966=
2967= T_Fake
2968=
2969=================
2970*/
2971
2972void T_Fake (objtype *ob)
2973{
2974 int32_t move;
2975
2976 if (CheckLine(ob)) // got a shot at player?
2977 {
2978 ob->hidden = false;
2979 if ( (unsigned) US_RndT() < (tics<<1) && objfreelist)
2980 {
2981 //
2982 // go into attack frame
2983 //
2984 NewState (ob,&s_fakeshoot1);
2985 return;
2986 }
2987 }
2988 else
2989 ob->hidden = true;
2990
2991 if (ob->dir == nodir)
2992 {
2993 SelectDodgeDir (ob);
2994 if (ob->dir == nodir)
2995 return; // object is blocked in
2996 }
2997
2998 move = ob->speed*tics;
2999
3000 while (move)
3001 {
3002 if (move < ob->distance)
3003 {
3004 MoveObj (ob,move);
3005 break;
3006 }
3007
3008 //
3009 // reached goal tile, so select another one
3010 //
3011
3012 //
3013 // fix position to account for round off during moving
3014 //
3015 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
3016 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
3017
3018 move -= ob->distance;
3019
3020 SelectDodgeDir (ob);
3021
3022 if (ob->dir == nodir)
3023 return; // object is blocked in
3024 }
3025}
3026
3027#endif
3028/*
3029============================================================================
3030
3031STAND
3032
3033============================================================================
3034*/
3035
3036
3037/*
3038===============
3039=
3040= T_Stand
3041=
3042===============
3043*/
3044
3045void T_Stand (objtype *ob)
3046{
3047 SightPlayer (ob);
3048}
3049
3050
3051/*
3052============================================================================
3053
3054CHASE
3055
3056============================================================================
3057*/
3058
3059/*
3060=================
3061=
3062= T_Chase
3063=
3064=================
3065*/
3066
3067void T_Chase (objtype *ob)
3068{
3069 int32_t move,target;
3070 int dx,dy,dist,chance;
3071 boolean dodge;
3072
3073 if (gamestate.victoryflag)
3074 return;
3075
3076 dodge = false;
3077 if (CheckLine(ob)) // got a shot at player?
3078 {
3079 ob->hidden = false;
3080 dx = abs(ob->tilex - player->tilex);
3081 dy = abs(ob->tiley - player->tiley);
3082 dist = dx>dy ? dx : dy;
3083
3084#ifdef PLAYDEMOLIKEORIGINAL
3085 if(DEMOCOND_ORIG)
3086 {
3087 if(!dist || (dist == 1 && ob->distance < 0x4000))
3088 chance = 300;
3089 else
3090 chance = (tics<<4)/dist;
3091 }
3092 else
3093#endif
3094 {
3095 if (dist)
3096 chance = (tics<<4)/dist;
3097 else
3098 chance = 300;
3099
3100 if (dist == 1)
3101 {
3102 target = abs(ob->x - player->x);
3103 if (target < 0x14000l)
3104 {
3105 target = abs(ob->y - player->y);
3106 if (target < 0x14000l)
3107 chance = 300;
3108 }
3109 }
3110 }
3111
3112 if ( US_RndT()<chance)
3113 {
3114 //
3115 // go into attack frame
3116 //
3117 switch (ob->obclass)
3118 {
3119 case guardobj:
3120 NewState (ob,&s_grdshoot1);
3121 break;
3122 case officerobj:
3123 NewState (ob,&s_ofcshoot1);
3124 break;
3125 case mutantobj:
3126 NewState (ob,&s_mutshoot1);
3127 break;
3128 case ssobj:
3129 NewState (ob,&s_ssshoot1);
3130 break;
3131#ifndef SPEAR
3132 case bossobj:
3133 NewState (ob,&s_bossshoot1);
3134 break;
3135 case gretelobj:
3136 NewState (ob,&s_gretelshoot1);
3137 break;
3138 case mechahitlerobj:
3139 NewState (ob,&s_mechashoot1);
3140 break;
3141 case realhitlerobj:
3142 NewState (ob,&s_hitlershoot1);
3143 break;
3144#else
3145 case angelobj:
3146 NewState (ob,&s_angelshoot1);
3147 break;
3148 case transobj:
3149 NewState (ob,&s_transshoot1);
3150 break;
3151 case uberobj:
3152 NewState (ob,&s_ubershoot1);
3153 break;
3154 case willobj:
3155 NewState (ob,&s_willshoot1);
3156 break;
3157 case deathobj:
3158 NewState (ob,&s_deathshoot1);
3159 break;
3160#endif
3161 }
3162 return;
3163 }
3164 dodge = true;
3165 }
3166 else
3167 ob->hidden = true;
3168
3169 if (ob->dir == nodir)
3170 {
3171 if (dodge)
3172 SelectDodgeDir (ob);
3173 else
3174 SelectChaseDir (ob);
3175 if (ob->dir == nodir)
3176 return; // object is blocked in
3177 }
3178
3179 move = ob->speed*tics;
3180
3181 while (move)
3182 {
3183 if (ob->distance < 0)
3184 {
3185 //
3186 // waiting for a door to open
3187 //
3188 OpenDoor (-ob->distance-1);
3189 if (doorobjlist[-ob->distance-1].action != dr_open)
3190 return;
3191 ob->distance = TILEGLOBAL; // go ahead, the door is now open
3192 DEMOIF_SDL
3193 {
3194 TryWalk(ob);
3195 }
3196 }
3197
3198 if (move < ob->distance)
3199 {
3200 MoveObj (ob,move);
3201 break;
3202 }
3203
3204 //
3205 // reached goal tile, so select another one
3206 //
3207
3208 //
3209 // fix position to account for round off during moving
3210 //
3211 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
3212 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
3213
3214 move -= ob->distance;
3215
3216 if (dodge)
3217 SelectDodgeDir (ob);
3218 else
3219 SelectChaseDir (ob);
3220
3221 if (ob->dir == nodir)
3222 return; // object is blocked in
3223 }
3224}
3225
3226
3227/*
3228=================
3229=
3230= T_Ghosts
3231=
3232=================
3233*/
3234
3235void T_Ghosts (objtype *ob)
3236{
3237 int32_t move;
3238
3239 if (ob->dir == nodir)
3240 {
3241 SelectChaseDir (ob);
3242 if (ob->dir == nodir)
3243 return; // object is blocked in
3244 }
3245
3246 move = ob->speed*tics;
3247
3248 while (move)
3249 {
3250 if (move < ob->distance)
3251 {
3252 MoveObj (ob,move);
3253 break;
3254 }
3255
3256 //
3257 // reached goal tile, so select another one
3258 //
3259
3260 //
3261 // fix position to account for round off during moving
3262 //
3263 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
3264 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
3265
3266 move -= ob->distance;
3267
3268 SelectChaseDir (ob);
3269
3270 if (ob->dir == nodir)
3271 return; // object is blocked in
3272 }
3273}
3274
3275/*
3276=================
3277=
3278= T_DogChase
3279=
3280=================
3281*/
3282
3283void T_DogChase (objtype *ob)
3284{
3285 int32_t move;
3286 int32_t dx,dy;
3287
3288
3289 if (ob->dir == nodir)
3290 {
3291 SelectDodgeDir (ob);
3292 if (ob->dir == nodir)
3293 return; // object is blocked in
3294 }
3295
3296 move = ob->speed*tics;
3297
3298 while (move)
3299 {
3300 //
3301 // check for byte range
3302 //
3303 dx = player->x - ob->x;
3304 if (dx<0)
3305 dx = -dx;
3306 dx -= move;
3307 if (dx <= MINACTORDIST)
3308 {
3309 dy = player->y - ob->y;
3310 if (dy<0)
3311 dy = -dy;
3312 dy -= move;
3313 if (dy <= MINACTORDIST)
3314 {
3315 NewState (ob,&s_dogjump1);
3316 return;
3317 }
3318 }
3319
3320 if (move < ob->distance)
3321 {
3322 MoveObj (ob,move);
3323 break;
3324 }
3325
3326 //
3327 // reached goal tile, so select another one
3328 //
3329
3330 //
3331 // fix position to account for round off during moving
3332 //
3333 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
3334 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
3335
3336 move -= ob->distance;
3337
3338 SelectDodgeDir (ob);
3339
3340 if (ob->dir == nodir)
3341 return; // object is blocked in
3342 }
3343}
3344
3345
3346
3347/*
3348============================================================================
3349
3350 PATH
3351
3352============================================================================
3353*/
3354
3355
3356/*
3357===============
3358=
3359= SelectPathDir
3360=
3361===============
3362*/
3363
3364void SelectPathDir (objtype *ob)
3365{
3366 unsigned spot;
3367
3368 spot = MAPSPOT(ob->tilex,ob->tiley,1)-ICONARROWS;
3369
3370 if (spot<8)
3371 {
3372 // new direction
3373 ob->dir = (dirtype)(spot);
3374 }
3375
3376 ob->distance = TILEGLOBAL;
3377
3378 if (!TryWalk (ob))
3379 ob->dir = nodir;
3380}
3381
3382
3383/*
3384===============
3385=
3386= T_Path
3387=
3388===============
3389*/
3390
3391void T_Path (objtype *ob)
3392{
3393 int32_t move;
3394
3395 if (SightPlayer (ob))
3396 return;
3397
3398 if (ob->dir == nodir)
3399 {
3400 SelectPathDir (ob);
3401 if (ob->dir == nodir)
3402 return; // all movement is blocked
3403 }
3404
3405
3406 move = ob->speed*tics;
3407
3408 while (move)
3409 {
3410 if (ob->distance < 0)
3411 {
3412 //
3413 // waiting for a door to open
3414 //
3415 OpenDoor (-ob->distance-1);
3416 if (doorobjlist[-ob->distance-1].action != dr_open)
3417 return;
3418 ob->distance = TILEGLOBAL; // go ahead, the door is now open
3419 DEMOIF_SDL
3420 {
3421 TryWalk(ob);
3422 }
3423 }
3424
3425 if (move < ob->distance)
3426 {
3427 MoveObj (ob,move);
3428 break;
3429 }
3430
3431 if (ob->tilex>MAPSIZE || ob->tiley>MAPSIZE)
3432 {
3433 sprintf (str, "T_Path hit a wall at %u,%u, dir %u",
3434 ob->tilex,ob->tiley,ob->dir);
3435 Quit (str);
3436 }
3437
3438 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
3439 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
3440 move -= ob->distance;
3441
3442 SelectPathDir (ob);
3443
3444 if (ob->dir == nodir)
3445 return; // all movement is blocked
3446 }
3447}
3448
3449
3450/*
3451=============================================================================
3452
3453 FIGHT
3454
3455=============================================================================
3456*/
3457
3458
3459/*
3460===============
3461=
3462= T_Shoot
3463=
3464= Try to damage the player, based on skill level and player's speed
3465=
3466===============
3467*/
3468
3469void T_Shoot (objtype *ob)
3470{
3471 int dx,dy,dist;
3472 int hitchance,damage;
3473
3474 hitchance = 128;
3475
3476 if (!areabyplayer[ob->areanumber])
3477 return;
3478
3479 if (CheckLine (ob)) // player is not behind a wall
3480 {
3481 dx = abs(ob->tilex - player->tilex);
3482 dy = abs(ob->tiley - player->tiley);
3483 dist = dx>dy ? dx:dy;
3484
3485 if (ob->obclass == ssobj || ob->obclass == bossobj)
3486 dist = dist*2/3; // ss are better shots
3487
3488 if (thrustspeed >= RUNSPEED)
3489 {
3490 if (ob->flags&FL_VISABLE)
3491 hitchance = 160-dist*16; // player can see to dodge
3492 else
3493 hitchance = 160-dist*8;
3494 }
3495 else
3496 {
3497 if (ob->flags&FL_VISABLE)
3498 hitchance = 256-dist*16; // player can see to dodge
3499 else
3500 hitchance = 256-dist*8;
3501 }
3502
3503 // see if the shot was a hit
3504
3505 if (US_RndT()<hitchance)
3506 {
3507 if (dist<2)
3508 damage = US_RndT()>>2;
3509 else if (dist<4)
3510 damage = US_RndT()>>3;
3511 else
3512 damage = US_RndT()>>4;
3513
3514 TakeDamage (damage,ob);
3515 }
3516 }
3517
3518 switch(ob->obclass)
3519 {
3520 case ssobj:
3521 PlaySoundLocActor(SSFIRESND,ob);
3522 break;
3523#ifndef SPEAR
3524#ifndef APOGEE_1_0
3525 case giftobj:
3526 case fatobj:
3527 PlaySoundLocActor(MISSILEFIRESND,ob);
3528 break;
3529#endif
3530 case mechahitlerobj:
3531 case realhitlerobj:
3532 case bossobj:
3533 PlaySoundLocActor(BOSSFIRESND,ob);
3534 break;
3535 case schabbobj:
3536 PlaySoundLocActor(SCHABBSTHROWSND,ob);
3537 break;
3538 case fakeobj:
3539 PlaySoundLocActor(FLAMETHROWERSND,ob);
3540 break;
3541#endif
3542 default:
3543 PlaySoundLocActor(NAZIFIRESND,ob);
3544 }
3545}
3546
3547
3548/*
3549===============
3550=
3551= T_Bite
3552=
3553===============
3554*/
3555
3556void T_Bite (objtype *ob)
3557{
3558 int32_t dx,dy;
3559
3560 PlaySoundLocActor(DOGATTACKSND,ob); // JAB
3561
3562 dx = player->x - ob->x;
3563 if (dx<0)
3564 dx = -dx;
3565 dx -= TILEGLOBAL;
3566 if (dx <= MINACTORDIST)
3567 {
3568 dy = player->y - ob->y;
3569 if (dy<0)
3570 dy = -dy;
3571 dy -= TILEGLOBAL;
3572 if (dy <= MINACTORDIST)
3573 {
3574 if (US_RndT()<180)
3575 {
3576 TakeDamage (US_RndT()>>4,ob);
3577 return;
3578 }
3579 }
3580 }
3581}
3582
3583
3584#ifndef SPEAR
3585/*
3586============================================================================
3587
3588 BJ VICTORY
3589
3590============================================================================
3591*/
3592
3593
3594//
3595// BJ victory
3596//
3597
3598void T_BJRun (objtype *ob);
3599void T_BJJump (objtype *ob);
3600void T_BJDone (objtype *ob);
3601void T_BJYell (objtype *ob);
3602
3603void T_DeathCam (objtype *ob);
3604
3605extern statetype s_bjrun1;
3606extern statetype s_bjrun1s;
3607extern statetype s_bjrun2;
3608extern statetype s_bjrun3;
3609extern statetype s_bjrun3s;
3610extern statetype s_bjrun4;
3611
3612extern statetype s_bjjump1;
3613extern statetype s_bjjump2;
3614extern statetype s_bjjump3;
3615extern statetype s_bjjump4;
3616
3617
3618statetype s_bjrun1 = {false,SPR_BJ_W1,12,(statefunc)T_BJRun,NULL,&s_bjrun1s};
3619statetype s_bjrun1s = {false,SPR_BJ_W1,3, NULL,NULL,&s_bjrun2};
3620statetype s_bjrun2 = {false,SPR_BJ_W2,8,(statefunc)T_BJRun,NULL,&s_bjrun3};
3621statetype s_bjrun3 = {false,SPR_BJ_W3,12,(statefunc)T_BJRun,NULL,&s_bjrun3s};
3622statetype s_bjrun3s = {false,SPR_BJ_W3,3, NULL,NULL,&s_bjrun4};
3623statetype s_bjrun4 = {false,SPR_BJ_W4,8,(statefunc)T_BJRun,NULL,&s_bjrun1};
3624
3625
3626statetype s_bjjump1 = {false,SPR_BJ_JUMP1,14,(statefunc)T_BJJump,NULL,&s_bjjump2};
3627statetype s_bjjump2 = {false,SPR_BJ_JUMP2,14,(statefunc)T_BJJump,(statefunc)T_BJYell,&s_bjjump3};
3628statetype s_bjjump3 = {false,SPR_BJ_JUMP3,14,(statefunc)T_BJJump,NULL,&s_bjjump4};
3629statetype s_bjjump4 = {false,SPR_BJ_JUMP4,300,NULL,(statefunc)T_BJDone,&s_bjjump4};
3630
3631
3632statetype s_deathcam = {false,0,0,NULL,NULL,NULL};
3633
3634
3635/*
3636===============
3637=
3638= SpawnBJVictory
3639=
3640===============
3641*/
3642
3643void SpawnBJVictory (void)
3644{
3645 SpawnNewObj (player->tilex,player->tiley+1,&s_bjrun1);
3646 newobj->x = player->x;
3647 newobj->y = player->y;
3648 newobj->obclass = bjobj;
3649 newobj->dir = north;
3650 newobj->temp1 = 6; // tiles to run forward
3651}
3652
3653
3654
3655/*
3656===============
3657=
3658= T_BJRun
3659=
3660===============
3661*/
3662
3663void T_BJRun (objtype *ob)
3664{
3665 int32_t move;
3666
3667 move = BJRUNSPEED*tics;
3668
3669 while (move)
3670 {
3671 if (move < ob->distance)
3672 {
3673 MoveObj (ob,move);
3674 break;
3675 }
3676
3677
3678 ob->x = ((int32_t)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
3679 ob->y = ((int32_t)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
3680 move -= ob->distance;
3681
3682 SelectPathDir (ob);
3683
3684 if ( !(--ob->temp1) )
3685 {
3686 NewState (ob,&s_bjjump1);
3687 return;
3688 }
3689 }
3690}
3691
3692
3693/*
3694===============
3695=
3696= T_BJJump
3697=
3698===============
3699*/
3700
3701void T_BJJump (objtype *ob)
3702{
3703 int32_t move;
3704
3705 move = BJJUMPSPEED*tics;
3706 MoveObj (ob,move);
3707}
3708
3709
3710/*
3711===============
3712=
3713= T_BJYell
3714=
3715===============
3716*/
3717
3718void T_BJYell (objtype *ob)
3719{
3720 PlaySoundLocActor(YEAHSND,ob); // JAB
3721}
3722
3723
3724/*
3725===============
3726=
3727= T_BJDone
3728=
3729===============
3730*/
3731
3732void T_BJDone (objtype * ob)
3733{
3734 playstate = ex_victorious; // exit castle tile
3735}
3736
3737
3738
3739//===========================================================================
3740
3741
3742/*
3743===============
3744=
3745= CheckPosition
3746=
3747===============
3748*/
3749
3750boolean CheckPosition (objtype *ob)
3751{
3752 int x,y,xl,yl,xh,yh;
3753 objtype *check;
3754
3755 xl = (ob->x-PLAYERSIZE) >> TILESHIFT;
3756 yl = (ob->y-PLAYERSIZE) >> TILESHIFT;
3757
3758 xh = (ob->x+PLAYERSIZE) >> TILESHIFT;
3759 yh = (ob->y+PLAYERSIZE) >> TILESHIFT;
3760
3761 //
3762 // check for solid walls
3763 //
3764 for (y=yl;y<=yh;y++)
3765 {
3766 for (x=xl;x<=xh;x++)
3767 {
3768 check = actorat[x][y];
3769 if (check && !ISPOINTER(check))
3770 return false;
3771 }
3772 }
3773
3774 return true;
3775}
3776
3777
3778/*
3779===============
3780=
3781= A_StartDeathCam
3782=
3783===============
3784*/
3785
3786void A_StartDeathCam (objtype *ob)
3787{
3788 int32_t dx,dy;
3789 float fangle;
3790 int32_t xmove,ymove;
3791 int32_t dist;
3792
3793 FinishPaletteShifts ();
3794
3795 VW_WaitVBL (100);
3796
3797 if (gamestate.victoryflag)
3798 {
3799 playstate = ex_victorious; // exit castle tile
3800 return;
3801 }
3802
3803 if(usedoublebuffering) VH_UpdateScreen();
3804
3805 gamestate.victoryflag = true;
3806 unsigned fadeheight = viewsize != 21 ? screenHeight-scaleFactor*STATUSLINES : screenHeight;
3807 VL_BarScaledCoord (0, 0, screenWidth, fadeheight, bordercol);
3808 FizzleFade(screenBuffer, 0, 0, screenWidth, fadeheight, 70, false);
3809
3810 if (bordercol != VIEWCOLOR)
3811 {
3812 CA_CacheGrChunk (STARTFONT+1);
3813 fontnumber = 1;
3814 SETFONTCOLOR(15,bordercol);
3815 PrintX = 68; PrintY = 45;
3816 US_Print (STR_SEEAGAIN);
3817 UNCACHEGRCHUNK(STARTFONT+1);
3818 }
3819 else
3820 {
3821 CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
3822#ifdef JAPAN
3823#ifndef JAPDEMO
3824 CA_CacheScreen(C_LETSSEEPIC);
3825#endif
3826#else
3827 Write(0,7,STR_SEEAGAIN);
3828#endif
3829 }
3830
3831 VW_UpdateScreen ();
3832 if(usedoublebuffering) VH_UpdateScreen();
3833
3834 IN_UserInput(300);
3835
3836 //
3837 // line angle up exactly
3838 //
3839 NewState (player,&s_deathcam);
3840
3841 player->x = gamestate.killx;
3842 player->y = gamestate.killy;
3843
3844 dx = ob->x - player->x;
3845 dy = player->y - ob->y;
3846
3847 fangle = (float) atan2((float) dy, (float) dx); // returns -pi to pi
3848 if (fangle<0)
3849 fangle = (float) (M_PI*2+fangle);
3850
3851 player->angle = (short) (fangle/(M_PI*2)*ANGLES);
3852
3853 //
3854 // try to position as close as possible without being in a wall
3855 //
3856 dist = 0x14000l;
3857 do
3858 {
3859 xmove = FixedMul(dist,costable[player->angle]);
3860 ymove = -FixedMul(dist,sintable[player->angle]);
3861
3862 player->x = ob->x - xmove;
3863 player->y = ob->y - ymove;
3864 dist += 0x1000;
3865
3866 } while (!CheckPosition (player));
3867 plux = (word)(player->x >> UNSIGNEDSHIFT); // scale to fit in unsigned
3868 pluy = (word)(player->y >> UNSIGNEDSHIFT);
3869 player->tilex = (word)(player->x >> TILESHIFT); // scale to tile values
3870 player->tiley = (word)(player->y >> TILESHIFT);
3871
3872 //
3873 // go back to the game
3874 //
3875
3876 DrawPlayBorder ();
3877
3878 fizzlein = true;
3879
3880 switch (ob->obclass)
3881 {
3882#ifndef SPEAR
3883 case schabbobj:
3884 NewState (ob,&s_schabbdeathcam);
3885 break;
3886 case realhitlerobj:
3887 NewState (ob,&s_hitlerdeathcam);
3888 break;
3889 case giftobj:
3890 NewState (ob,&s_giftdeathcam);
3891 break;
3892 case fatobj:
3893 NewState (ob,&s_fatdeathcam);
3894 break;
3895#endif
3896 }
3897}
3898
3899#endif