summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/wolf3d/wl_act2.c
diff options
context:
space:
mode:
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