Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.  
  41. dirtype dirtable[9] = {northwest,north,northeast,west,nodir,east,
  42.     southwest,south,southeast};
  43.  
  44. short 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.  
  164. void    A_StartDeathCam (objtype *ob);
  165.  
  166.  
  167. void    T_Path (objtype *ob);
  168. void    T_Shoot (objtype *ob);
  169. void    T_Bite (objtype *ob);
  170. void    T_DogChase (objtype *ob);
  171. void    T_Chase (objtype *ob);
  172. void    T_Projectile (objtype *ob);
  173. void    T_Stand (objtype *ob);
  174.  
  175. void A_DeathScream (objtype *ob);
  176.  
  177. extern  statetype s_rocket;
  178. extern  statetype s_smoke1;
  179. extern  statetype s_smoke2;
  180. extern  statetype s_smoke3;
  181. extern  statetype s_smoke4;
  182. extern  statetype s_boom2;
  183. extern  statetype s_boom3;
  184.  
  185. void A_Smoke (objtype *ob);
  186.  
  187. statetype s_rocket              = {true,SPR_ROCKET_1,3,(statefunc)T_Projectile,(statefunc)A_Smoke,&s_rocket};
  188. statetype s_smoke1              = {false,SPR_SMOKE_1,3,NULL,NULL,&s_smoke2};
  189. statetype s_smoke2              = {false,SPR_SMOKE_2,3,NULL,NULL,&s_smoke3};
  190. statetype s_smoke3              = {false,SPR_SMOKE_3,3,NULL,NULL,&s_smoke4};
  191. statetype s_smoke4              = {false,SPR_SMOKE_4,3,NULL,NULL,NULL};
  192.  
  193. statetype s_boom1               = {false,SPR_BOOM_1,6,NULL,NULL,&s_boom2};
  194. statetype s_boom2               = {false,SPR_BOOM_2,6,NULL,NULL,&s_boom3};
  195. statetype s_boom3               = {false,SPR_BOOM_3,6,NULL,NULL,NULL};
  196.  
  197. #ifdef SPEAR
  198.  
  199. extern  statetype s_hrocket;
  200. extern  statetype s_hsmoke1;
  201. extern  statetype s_hsmoke2;
  202. extern  statetype s_hsmoke3;
  203. extern  statetype s_hsmoke4;
  204. extern  statetype s_hboom2;
  205. extern  statetype s_hboom3;
  206.  
  207. void A_Smoke (objtype *ob);
  208.  
  209. statetype s_hrocket             = {true,SPR_HROCKET_1,3,(statefunc)T_Projectile,(statefunc)A_Smoke,&s_hrocket};
  210. statetype s_hsmoke1             = {false,SPR_HSMOKE_1,3,NULL,NULL,&s_hsmoke2};
  211. statetype s_hsmoke2             = {false,SPR_HSMOKE_2,3,NULL,NULL,&s_hsmoke3};
  212. statetype s_hsmoke3             = {false,SPR_HSMOKE_3,3,NULL,NULL,&s_hsmoke4};
  213. statetype s_hsmoke4             = {false,SPR_HSMOKE_4,3,NULL,NULL,NULL};
  214.  
  215. statetype s_hboom1              = {false,SPR_HBOOM_1,6,NULL,NULL,&s_hboom2};
  216. statetype s_hboom2              = {false,SPR_HBOOM_2,6,NULL,NULL,&s_hboom3};
  217. statetype s_hboom3              = {false,SPR_HBOOM_3,6,NULL,NULL,NULL};
  218.  
  219. #endif
  220.  
  221. void    T_Schabb (objtype *ob);
  222. void    T_SchabbThrow (objtype *ob);
  223. void    T_Fake (objtype *ob);
  224. void    T_FakeFire (objtype *ob);
  225. void    T_Ghosts (objtype *ob);
  226.  
  227. void A_Slurpie (objtype *ob);
  228. void A_HitlerMorph (objtype *ob);
  229. void A_MechaSound (objtype *ob);
  230.  
  231. /*
  232. =================
  233. =
  234. = A_Smoke
  235. =
  236. =================
  237. */
  238.  
  239. void 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.  
  272. boolean 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.  
  307. void 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.  
  381. GUARD
  382.  
  383. =============================================================================
  384. */
  385.  
  386. //
  387. // guards
  388. //
  389.  
  390. extern  statetype s_grdstand;
  391.  
  392. extern  statetype s_grdpath1;
  393. extern  statetype s_grdpath1s;
  394. extern  statetype s_grdpath2;
  395. extern  statetype s_grdpath3;
  396. extern  statetype s_grdpath3s;
  397. extern  statetype s_grdpath4;
  398.  
  399. extern  statetype s_grdpain;
  400. extern  statetype s_grdpain1;
  401.  
  402. extern  statetype s_grdgiveup;
  403.  
  404. extern  statetype s_grdshoot1;
  405. extern  statetype s_grdshoot2;
  406. extern  statetype s_grdshoot3;
  407. extern  statetype s_grdshoot4;
  408.  
  409. extern  statetype s_grdchase1;
  410. extern  statetype s_grdchase1s;
  411. extern  statetype s_grdchase2;
  412. extern  statetype s_grdchase3;
  413. extern  statetype s_grdchase3s;
  414. extern  statetype s_grdchase4;
  415.  
  416. extern  statetype s_grddie1;
  417. extern  statetype s_grddie1d;
  418. extern  statetype s_grddie2;
  419. extern  statetype s_grddie3;
  420. extern  statetype s_grddie4;
  421.  
  422. statetype s_grdstand            = {true,SPR_GRD_S_1,0,(statefunc)T_Stand,NULL,&s_grdstand};
  423.  
  424. statetype s_grdpath1            = {true,SPR_GRD_W1_1,20,(statefunc)T_Path,NULL,&s_grdpath1s};
  425. statetype s_grdpath1s           = {true,SPR_GRD_W1_1,5,NULL,NULL,&s_grdpath2};
  426. statetype s_grdpath2            = {true,SPR_GRD_W2_1,15,(statefunc)T_Path,NULL,&s_grdpath3};
  427. statetype s_grdpath3            = {true,SPR_GRD_W3_1,20,(statefunc)T_Path,NULL,&s_grdpath3s};
  428. statetype s_grdpath3s           = {true,SPR_GRD_W3_1,5,NULL,NULL,&s_grdpath4};
  429. statetype s_grdpath4            = {true,SPR_GRD_W4_1,15,(statefunc)T_Path,NULL,&s_grdpath1};
  430.  
  431. statetype s_grdpain             = {2,SPR_GRD_PAIN_1,10,NULL,NULL,&s_grdchase1};
  432. statetype s_grdpain1            = {2,SPR_GRD_PAIN_2,10,NULL,NULL,&s_grdchase1};
  433.  
  434. statetype s_grdshoot1           = {false,SPR_GRD_SHOOT1,20,NULL,NULL,&s_grdshoot2};
  435. statetype s_grdshoot2           = {false,SPR_GRD_SHOOT2,20,NULL,(statefunc)T_Shoot,&s_grdshoot3};
  436. statetype s_grdshoot3           = {false,SPR_GRD_SHOOT3,20,NULL,NULL,&s_grdchase1};
  437.  
  438. statetype s_grdchase1           = {true,SPR_GRD_W1_1,10,(statefunc)T_Chase,NULL,&s_grdchase1s};
  439. statetype s_grdchase1s          = {true,SPR_GRD_W1_1,3,NULL,NULL,&s_grdchase2};
  440. statetype s_grdchase2           = {true,SPR_GRD_W2_1,8,(statefunc)T_Chase,NULL,&s_grdchase3};
  441. statetype s_grdchase3           = {true,SPR_GRD_W3_1,10,(statefunc)T_Chase,NULL,&s_grdchase3s};
  442. statetype s_grdchase3s          = {true,SPR_GRD_W3_1,3,NULL,NULL,&s_grdchase4};
  443. statetype s_grdchase4           = {true,SPR_GRD_W4_1,8,(statefunc)T_Chase,NULL,&s_grdchase1};
  444.  
  445. statetype s_grddie1             = {false,SPR_GRD_DIE_1,15,NULL,(statefunc)A_DeathScream,&s_grddie2};
  446. statetype s_grddie2             = {false,SPR_GRD_DIE_2,15,NULL,NULL,&s_grddie3};
  447. statetype s_grddie3             = {false,SPR_GRD_DIE_3,15,NULL,NULL,&s_grddie4};
  448. statetype s_grddie4             = {false,SPR_GRD_DEAD,0,NULL,NULL,&s_grddie4};
  449.  
  450.  
  451. #ifndef SPEAR
  452. //
  453. // ghosts
  454. //
  455. extern  statetype s_blinkychase1;
  456. extern  statetype s_blinkychase2;
  457. extern  statetype s_inkychase1;
  458. extern  statetype s_inkychase2;
  459. extern  statetype s_pinkychase1;
  460. extern  statetype s_pinkychase2;
  461. extern  statetype s_clydechase1;
  462. extern  statetype s_clydechase2;
  463.  
  464. statetype s_blinkychase1        = {false,SPR_BLINKY_W1,10,(statefunc)T_Ghosts,NULL,&s_blinkychase2};
  465. statetype s_blinkychase2        = {false,SPR_BLINKY_W2,10,(statefunc)T_Ghosts,NULL,&s_blinkychase1};
  466.  
  467. statetype s_inkychase1          = {false,SPR_INKY_W1,10,(statefunc)T_Ghosts,NULL,&s_inkychase2};
  468. statetype s_inkychase2          = {false,SPR_INKY_W2,10,(statefunc)T_Ghosts,NULL,&s_inkychase1};
  469.  
  470. statetype s_pinkychase1         = {false,SPR_PINKY_W1,10,(statefunc)T_Ghosts,NULL,&s_pinkychase2};
  471. statetype s_pinkychase2         = {false,SPR_PINKY_W2,10,(statefunc)T_Ghosts,NULL,&s_pinkychase1};
  472.  
  473. statetype s_clydechase1         = {false,SPR_CLYDE_W1,10,(statefunc)T_Ghosts,NULL,&s_clydechase2};
  474. statetype s_clydechase2         = {false,SPR_CLYDE_W2,10,(statefunc)T_Ghosts,NULL,&s_clydechase1};
  475. #endif
  476.  
  477. //
  478. // dogs
  479. //
  480.  
  481. extern  statetype s_dogpath1;
  482. extern  statetype s_dogpath1s;
  483. extern  statetype s_dogpath2;
  484. extern  statetype s_dogpath3;
  485. extern  statetype s_dogpath3s;
  486. extern  statetype s_dogpath4;
  487.  
  488. extern  statetype s_dogjump1;
  489. extern  statetype s_dogjump2;
  490. extern  statetype s_dogjump3;
  491. extern  statetype s_dogjump4;
  492. extern  statetype s_dogjump5;
  493.  
  494. extern  statetype s_dogchase1;
  495. extern  statetype s_dogchase1s;
  496. extern  statetype s_dogchase2;
  497. extern  statetype s_dogchase3;
  498. extern  statetype s_dogchase3s;
  499. extern  statetype s_dogchase4;
  500.  
  501. extern  statetype s_dogdie1;
  502. extern  statetype s_dogdie1d;
  503. extern  statetype s_dogdie2;
  504. extern  statetype s_dogdie3;
  505. extern  statetype s_dogdead;
  506.  
  507. statetype s_dogpath1            = {true,SPR_DOG_W1_1,20,(statefunc)T_Path,NULL,&s_dogpath1s};
  508. statetype s_dogpath1s           = {true,SPR_DOG_W1_1,5,NULL,NULL,&s_dogpath2};
  509. statetype s_dogpath2            = {true,SPR_DOG_W2_1,15,(statefunc)T_Path,NULL,&s_dogpath3};
  510. statetype s_dogpath3            = {true,SPR_DOG_W3_1,20,(statefunc)T_Path,NULL,&s_dogpath3s};
  511. statetype s_dogpath3s           = {true,SPR_DOG_W3_1,5,NULL,NULL,&s_dogpath4};
  512. statetype s_dogpath4            = {true,SPR_DOG_W4_1,15,(statefunc)T_Path,NULL,&s_dogpath1};
  513.  
  514. statetype s_dogjump1            = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump2};
  515. statetype s_dogjump2            = {false,SPR_DOG_JUMP2,10,NULL,(statefunc)T_Bite,&s_dogjump3};
  516. statetype s_dogjump3            = {false,SPR_DOG_JUMP3,10,NULL,NULL,&s_dogjump4};
  517. statetype s_dogjump4            = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump5};
  518. statetype s_dogjump5            = {false,SPR_DOG_W1_1,10,NULL,NULL,&s_dogchase1};
  519.  
  520. statetype s_dogchase1           = {true,SPR_DOG_W1_1,10,(statefunc)T_DogChase,NULL,&s_dogchase1s};
  521. statetype s_dogchase1s          = {true,SPR_DOG_W1_1,3,NULL,NULL,&s_dogchase2};
  522. statetype s_dogchase2           = {true,SPR_DOG_W2_1,8,(statefunc)T_DogChase,NULL,&s_dogchase3};
  523. statetype s_dogchase3           = {true,SPR_DOG_W3_1,10,(statefunc)T_DogChase,NULL,&s_dogchase3s};
  524. statetype s_dogchase3s          = {true,SPR_DOG_W3_1,3,NULL,NULL,&s_dogchase4};
  525. statetype s_dogchase4           = {true,SPR_DOG_W4_1,8,(statefunc)T_DogChase,NULL,&s_dogchase1};
  526.  
  527. statetype s_dogdie1             = {false,SPR_DOG_DIE_1,15,NULL,(statefunc)A_DeathScream,&s_dogdie2};
  528. statetype s_dogdie2             = {false,SPR_DOG_DIE_2,15,NULL,NULL,&s_dogdie3};
  529. statetype s_dogdie3             = {false,SPR_DOG_DIE_3,15,NULL,NULL,&s_dogdead};
  530. statetype s_dogdead             = {false,SPR_DOG_DEAD,15,NULL,NULL,&s_dogdead};
  531.  
  532.  
  533. //
  534. // officers
  535. //
  536.  
  537. extern  statetype s_ofcstand;
  538.  
  539. extern  statetype s_ofcpath1;
  540. extern  statetype s_ofcpath1s;
  541. extern  statetype s_ofcpath2;
  542. extern  statetype s_ofcpath3;
  543. extern  statetype s_ofcpath3s;
  544. extern  statetype s_ofcpath4;
  545.  
  546. extern  statetype s_ofcpain;
  547. extern  statetype s_ofcpain1;
  548.  
  549. extern  statetype s_ofcgiveup;
  550.  
  551. extern  statetype s_ofcshoot1;
  552. extern  statetype s_ofcshoot2;
  553. extern  statetype s_ofcshoot3;
  554. extern  statetype s_ofcshoot4;
  555.  
  556. extern  statetype s_ofcchase1;
  557. extern  statetype s_ofcchase1s;
  558. extern  statetype s_ofcchase2;
  559. extern  statetype s_ofcchase3;
  560. extern  statetype s_ofcchase3s;
  561. extern  statetype s_ofcchase4;
  562.  
  563. extern  statetype s_ofcdie1;
  564. extern  statetype s_ofcdie2;
  565. extern  statetype s_ofcdie3;
  566. extern  statetype s_ofcdie4;
  567. extern  statetype s_ofcdie5;
  568.  
  569. statetype s_ofcstand            = {true,SPR_OFC_S_1,0,(statefunc)T_Stand,NULL,&s_ofcstand};
  570.  
  571. statetype s_ofcpath1            = {true,SPR_OFC_W1_1,20,(statefunc)T_Path,NULL,&s_ofcpath1s};
  572. statetype s_ofcpath1s           = {true,SPR_OFC_W1_1,5,NULL,NULL,&s_ofcpath2};
  573. statetype s_ofcpath2            = {true,SPR_OFC_W2_1,15,(statefunc)T_Path,NULL,&s_ofcpath3};
  574. statetype s_ofcpath3            = {true,SPR_OFC_W3_1,20,(statefunc)T_Path,NULL,&s_ofcpath3s};
  575. statetype s_ofcpath3s           = {true,SPR_OFC_W3_1,5,NULL,NULL,&s_ofcpath4};
  576. statetype s_ofcpath4            = {true,SPR_OFC_W4_1,15,(statefunc)T_Path,NULL,&s_ofcpath1};
  577.  
  578. statetype s_ofcpain             = {2,SPR_OFC_PAIN_1,10,NULL,NULL,&s_ofcchase1};
  579. statetype s_ofcpain1            = {2,SPR_OFC_PAIN_2,10,NULL,NULL,&s_ofcchase1};
  580.  
  581. statetype s_ofcshoot1           = {false,SPR_OFC_SHOOT1,6,NULL,NULL,&s_ofcshoot2};
  582. statetype s_ofcshoot2           = {false,SPR_OFC_SHOOT2,20,NULL,(statefunc)T_Shoot,&s_ofcshoot3};
  583. statetype s_ofcshoot3           = {false,SPR_OFC_SHOOT3,10,NULL,NULL,&s_ofcchase1};
  584.  
  585. statetype s_ofcchase1           = {true,SPR_OFC_W1_1,10,(statefunc)T_Chase,NULL,&s_ofcchase1s};
  586. statetype s_ofcchase1s          = {true,SPR_OFC_W1_1,3,NULL,NULL,&s_ofcchase2};
  587. statetype s_ofcchase2           = {true,SPR_OFC_W2_1,8,(statefunc)T_Chase,NULL,&s_ofcchase3};
  588. statetype s_ofcchase3           = {true,SPR_OFC_W3_1,10,(statefunc)T_Chase,NULL,&s_ofcchase3s};
  589. statetype s_ofcchase3s          = {true,SPR_OFC_W3_1,3,NULL,NULL,&s_ofcchase4};
  590. statetype s_ofcchase4           = {true,SPR_OFC_W4_1,8,(statefunc)T_Chase,NULL,&s_ofcchase1};
  591.  
  592. statetype s_ofcdie1             = {false,SPR_OFC_DIE_1,11,NULL,(statefunc)A_DeathScream,&s_ofcdie2};
  593. statetype s_ofcdie2             = {false,SPR_OFC_DIE_2,11,NULL,NULL,&s_ofcdie3};
  594. statetype s_ofcdie3             = {false,SPR_OFC_DIE_3,11,NULL,NULL,&s_ofcdie4};
  595. statetype s_ofcdie4             = {false,SPR_OFC_DIE_4,11,NULL,NULL,&s_ofcdie5};
  596. statetype s_ofcdie5             = {false,SPR_OFC_DEAD,0,NULL,NULL,&s_ofcdie5};
  597.  
  598.  
  599. //
  600. // mutant
  601. //
  602.  
  603. extern  statetype s_mutstand;
  604.  
  605. extern  statetype s_mutpath1;
  606. extern  statetype s_mutpath1s;
  607. extern  statetype s_mutpath2;
  608. extern  statetype s_mutpath3;
  609. extern  statetype s_mutpath3s;
  610. extern  statetype s_mutpath4;
  611.  
  612. extern  statetype s_mutpain;
  613. extern  statetype s_mutpain1;
  614.  
  615. extern  statetype s_mutgiveup;
  616.  
  617. extern  statetype s_mutshoot1;
  618. extern  statetype s_mutshoot2;
  619. extern  statetype s_mutshoot3;
  620. extern  statetype s_mutshoot4;
  621.  
  622. extern  statetype s_mutchase1;
  623. extern  statetype s_mutchase1s;
  624. extern  statetype s_mutchase2;
  625. extern  statetype s_mutchase3;
  626. extern  statetype s_mutchase3s;
  627. extern  statetype s_mutchase4;
  628.  
  629. extern  statetype s_mutdie1;
  630. extern  statetype s_mutdie2;
  631. extern  statetype s_mutdie3;
  632. extern  statetype s_mutdie4;
  633. extern  statetype s_mutdie5;
  634.  
  635. statetype s_mutstand            = {true,SPR_MUT_S_1,0,(statefunc)T_Stand,NULL,&s_mutstand};
  636.  
  637. statetype s_mutpath1            = {true,SPR_MUT_W1_1,20,(statefunc)T_Path,NULL,&s_mutpath1s};
  638. statetype s_mutpath1s           = {true,SPR_MUT_W1_1,5,NULL,NULL,&s_mutpath2};
  639. statetype s_mutpath2            = {true,SPR_MUT_W2_1,15,(statefunc)T_Path,NULL,&s_mutpath3};
  640. statetype s_mutpath3            = {true,SPR_MUT_W3_1,20,(statefunc)T_Path,NULL,&s_mutpath3s};
  641. statetype s_mutpath3s           = {true,SPR_MUT_W3_1,5,NULL,NULL,&s_mutpath4};
  642. statetype s_mutpath4            = {true,SPR_MUT_W4_1,15,(statefunc)T_Path,NULL,&s_mutpath1};
  643.  
  644. statetype s_mutpain             = {2,SPR_MUT_PAIN_1,10,NULL,NULL,&s_mutchase1};
  645. statetype s_mutpain1            = {2,SPR_MUT_PAIN_2,10,NULL,NULL,&s_mutchase1};
  646.  
  647. statetype s_mutshoot1           = {false,SPR_MUT_SHOOT1,6,NULL,(statefunc)T_Shoot,&s_mutshoot2};
  648. statetype s_mutshoot2           = {false,SPR_MUT_SHOOT2,20,NULL,NULL,&s_mutshoot3};
  649. statetype s_mutshoot3           = {false,SPR_MUT_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_mutshoot4};
  650. statetype s_mutshoot4           = {false,SPR_MUT_SHOOT4,20,NULL,NULL,&s_mutchase1};
  651.  
  652. statetype s_mutchase1           = {true,SPR_MUT_W1_1,10,(statefunc)T_Chase,NULL,&s_mutchase1s};
  653. statetype s_mutchase1s          = {true,SPR_MUT_W1_1,3,NULL,NULL,&s_mutchase2};
  654. statetype s_mutchase2           = {true,SPR_MUT_W2_1,8,(statefunc)T_Chase,NULL,&s_mutchase3};
  655. statetype s_mutchase3           = {true,SPR_MUT_W3_1,10,(statefunc)T_Chase,NULL,&s_mutchase3s};
  656. statetype s_mutchase3s          = {true,SPR_MUT_W3_1,3,NULL,NULL,&s_mutchase4};
  657. statetype s_mutchase4           = {true,SPR_MUT_W4_1,8,(statefunc)T_Chase,NULL,&s_mutchase1};
  658.  
  659. statetype s_mutdie1             = {false,SPR_MUT_DIE_1,7,NULL,(statefunc)A_DeathScream,&s_mutdie2};
  660. statetype s_mutdie2             = {false,SPR_MUT_DIE_2,7,NULL,NULL,&s_mutdie3};
  661. statetype s_mutdie3             = {false,SPR_MUT_DIE_3,7,NULL,NULL,&s_mutdie4};
  662. statetype s_mutdie4             = {false,SPR_MUT_DIE_4,7,NULL,NULL,&s_mutdie5};
  663. statetype s_mutdie5             = {false,SPR_MUT_DEAD,0,NULL,NULL,&s_mutdie5};
  664.  
  665.  
  666. //
  667. // SS
  668. //
  669.  
  670. extern  statetype s_ssstand;
  671.  
  672. extern  statetype s_sspath1;
  673. extern  statetype s_sspath1s;
  674. extern  statetype s_sspath2;
  675. extern  statetype s_sspath3;
  676. extern  statetype s_sspath3s;
  677. extern  statetype s_sspath4;
  678.  
  679. extern  statetype s_sspain;
  680. extern  statetype s_sspain1;
  681.  
  682. extern  statetype s_ssshoot1;
  683. extern  statetype s_ssshoot2;
  684. extern  statetype s_ssshoot3;
  685. extern  statetype s_ssshoot4;
  686. extern  statetype s_ssshoot5;
  687. extern  statetype s_ssshoot6;
  688. extern  statetype s_ssshoot7;
  689. extern  statetype s_ssshoot8;
  690. extern  statetype s_ssshoot9;
  691.  
  692. extern  statetype s_sschase1;
  693. extern  statetype s_sschase1s;
  694. extern  statetype s_sschase2;
  695. extern  statetype s_sschase3;
  696. extern  statetype s_sschase3s;
  697. extern  statetype s_sschase4;
  698.  
  699. extern  statetype s_ssdie1;
  700. extern  statetype s_ssdie2;
  701. extern  statetype s_ssdie3;
  702. extern  statetype s_ssdie4;
  703.  
  704. statetype s_ssstand             = {true,SPR_SS_S_1,0,(statefunc)T_Stand,NULL,&s_ssstand};
  705.  
  706. statetype s_sspath1             = {true,SPR_SS_W1_1,20,(statefunc)T_Path,NULL,&s_sspath1s};
  707. statetype s_sspath1s            = {true,SPR_SS_W1_1,5,NULL,NULL,&s_sspath2};
  708. statetype s_sspath2             = {true,SPR_SS_W2_1,15,(statefunc)T_Path,NULL,&s_sspath3};
  709. statetype s_sspath3             = {true,SPR_SS_W3_1,20,(statefunc)T_Path,NULL,&s_sspath3s};
  710. statetype s_sspath3s            = {true,SPR_SS_W3_1,5,NULL,NULL,&s_sspath4};
  711. statetype s_sspath4             = {true,SPR_SS_W4_1,15,(statefunc)T_Path,NULL,&s_sspath1};
  712.  
  713. statetype s_sspain              = {2,SPR_SS_PAIN_1,10,NULL,NULL,&s_sschase1};
  714. statetype s_sspain1             = {2,SPR_SS_PAIN_2,10,NULL,NULL,&s_sschase1};
  715.  
  716. statetype s_ssshoot1            = {false,SPR_SS_SHOOT1,20,NULL,NULL,&s_ssshoot2};
  717. statetype s_ssshoot2            = {false,SPR_SS_SHOOT2,20,NULL,(statefunc)T_Shoot,&s_ssshoot3};
  718. statetype s_ssshoot3            = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot4};
  719. statetype s_ssshoot4            = {false,SPR_SS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_ssshoot5};
  720. statetype s_ssshoot5            = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot6};
  721. statetype s_ssshoot6            = {false,SPR_SS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_ssshoot7};
  722. statetype s_ssshoot7            = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot8};
  723. statetype s_ssshoot8            = {false,SPR_SS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_ssshoot9};
  724. statetype s_ssshoot9            = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_sschase1};
  725.  
  726. statetype s_sschase1            = {true,SPR_SS_W1_1,10,(statefunc)T_Chase,NULL,&s_sschase1s};
  727. statetype s_sschase1s           = {true,SPR_SS_W1_1,3,NULL,NULL,&s_sschase2};
  728. statetype s_sschase2            = {true,SPR_SS_W2_1,8,(statefunc)T_Chase,NULL,&s_sschase3};
  729. statetype s_sschase3            = {true,SPR_SS_W3_1,10,(statefunc)T_Chase,NULL,&s_sschase3s};
  730. statetype s_sschase3s           = {true,SPR_SS_W3_1,3,NULL,NULL,&s_sschase4};
  731. statetype s_sschase4            = {true,SPR_SS_W4_1,8,(statefunc)T_Chase,NULL,&s_sschase1};
  732.  
  733. statetype s_ssdie1              = {false,SPR_SS_DIE_1,15,NULL,(statefunc)A_DeathScream,&s_ssdie2};
  734. statetype s_ssdie2              = {false,SPR_SS_DIE_2,15,NULL,NULL,&s_ssdie3};
  735. statetype s_ssdie3              = {false,SPR_SS_DIE_3,15,NULL,NULL,&s_ssdie4};
  736. statetype s_ssdie4              = {false,SPR_SS_DEAD,0,NULL,NULL,&s_ssdie4};
  737.  
  738.  
  739. #ifndef SPEAR
  740. //
  741. // hans
  742. //
  743. extern  statetype s_bossstand;
  744.  
  745. extern  statetype s_bosschase1;
  746. extern  statetype s_bosschase1s;
  747. extern  statetype s_bosschase2;
  748. extern  statetype s_bosschase3;
  749. extern  statetype s_bosschase3s;
  750. extern  statetype s_bosschase4;
  751.  
  752. extern  statetype s_bossdie1;
  753. extern  statetype s_bossdie2;
  754. extern  statetype s_bossdie3;
  755. extern  statetype s_bossdie4;
  756.  
  757. extern  statetype s_bossshoot1;
  758. extern  statetype s_bossshoot2;
  759. extern  statetype s_bossshoot3;
  760. extern  statetype s_bossshoot4;
  761. extern  statetype s_bossshoot5;
  762. extern  statetype s_bossshoot6;
  763. extern  statetype s_bossshoot7;
  764. extern  statetype s_bossshoot8;
  765.  
  766.  
  767. statetype s_bossstand           = {false,SPR_BOSS_W1,0,(statefunc)T_Stand,NULL,&s_bossstand};
  768.  
  769. statetype s_bosschase1          = {false,SPR_BOSS_W1,10,(statefunc)T_Chase,NULL,&s_bosschase1s};
  770. statetype s_bosschase1s         = {false,SPR_BOSS_W1,3,NULL,NULL,&s_bosschase2};
  771. statetype s_bosschase2          = {false,SPR_BOSS_W2,8,(statefunc)T_Chase,NULL,&s_bosschase3};
  772. statetype s_bosschase3          = {false,SPR_BOSS_W3,10,(statefunc)T_Chase,NULL,&s_bosschase3s};
  773. statetype s_bosschase3s         = {false,SPR_BOSS_W3,3,NULL,NULL,&s_bosschase4};
  774. statetype s_bosschase4          = {false,SPR_BOSS_W4,8,(statefunc)T_Chase,NULL,&s_bosschase1};
  775.  
  776. statetype s_bossdie1            = {false,SPR_BOSS_DIE1,15,NULL,(statefunc)A_DeathScream,&s_bossdie2};
  777. statetype s_bossdie2            = {false,SPR_BOSS_DIE2,15,NULL,NULL,&s_bossdie3};
  778. statetype s_bossdie3            = {false,SPR_BOSS_DIE3,15,NULL,NULL,&s_bossdie4};
  779. statetype s_bossdie4            = {false,SPR_BOSS_DEAD,0,NULL,NULL,&s_bossdie4};
  780.  
  781. statetype s_bossshoot1          = {false,SPR_BOSS_SHOOT1,30,NULL,NULL,&s_bossshoot2};
  782. statetype s_bossshoot2          = {false,SPR_BOSS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_bossshoot3};
  783. statetype s_bossshoot3          = {false,SPR_BOSS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_bossshoot4};
  784. statetype s_bossshoot4          = {false,SPR_BOSS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_bossshoot5};
  785. statetype s_bossshoot5          = {false,SPR_BOSS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_bossshoot6};
  786. statetype s_bossshoot6          = {false,SPR_BOSS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_bossshoot7};
  787. statetype s_bossshoot7          = {false,SPR_BOSS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_bossshoot8};
  788. statetype s_bossshoot8          = {false,SPR_BOSS_SHOOT1,10,NULL,NULL,&s_bosschase1};
  789.  
  790.  
  791. //
  792. // gretel
  793. //
  794. extern  statetype s_gretelstand;
  795.  
  796. extern  statetype s_gretelchase1;
  797. extern  statetype s_gretelchase1s;
  798. extern  statetype s_gretelchase2;
  799. extern  statetype s_gretelchase3;
  800. extern  statetype s_gretelchase3s;
  801. extern  statetype s_gretelchase4;
  802.  
  803. extern  statetype s_greteldie1;
  804. extern  statetype s_greteldie2;
  805. extern  statetype s_greteldie3;
  806. extern  statetype s_greteldie4;
  807.  
  808. extern  statetype s_gretelshoot1;
  809. extern  statetype s_gretelshoot2;
  810. extern  statetype s_gretelshoot3;
  811. extern  statetype s_gretelshoot4;
  812. extern  statetype s_gretelshoot5;
  813. extern  statetype s_gretelshoot6;
  814. extern  statetype s_gretelshoot7;
  815. extern  statetype s_gretelshoot8;
  816.  
  817.  
  818. statetype s_gretelstand         = {false,SPR_GRETEL_W1,0,(statefunc)T_Stand,NULL,&s_gretelstand};
  819.  
  820. statetype s_gretelchase1        = {false,SPR_GRETEL_W1,10,(statefunc)T_Chase,NULL,&s_gretelchase1s};
  821. statetype s_gretelchase1s       = {false,SPR_GRETEL_W1,3,NULL,NULL,&s_gretelchase2};
  822. statetype s_gretelchase2        = {false,SPR_GRETEL_W2,8,(statefunc)T_Chase,NULL,&s_gretelchase3};
  823. statetype s_gretelchase3        = {false,SPR_GRETEL_W3,10,(statefunc)T_Chase,NULL,&s_gretelchase3s};
  824. statetype s_gretelchase3s       = {false,SPR_GRETEL_W3,3,NULL,NULL,&s_gretelchase4};
  825. statetype s_gretelchase4        = {false,SPR_GRETEL_W4,8,(statefunc)T_Chase,NULL,&s_gretelchase1};
  826.  
  827. statetype s_greteldie1          = {false,SPR_GRETEL_DIE1,15,NULL,(statefunc)A_DeathScream,&s_greteldie2};
  828. statetype s_greteldie2          = {false,SPR_GRETEL_DIE2,15,NULL,NULL,&s_greteldie3};
  829. statetype s_greteldie3          = {false,SPR_GRETEL_DIE3,15,NULL,NULL,&s_greteldie4};
  830. statetype s_greteldie4          = {false,SPR_GRETEL_DEAD,0,NULL,NULL,&s_greteldie4};
  831.  
  832. statetype s_gretelshoot1        = {false,SPR_GRETEL_SHOOT1,30,NULL,NULL,&s_gretelshoot2};
  833. statetype s_gretelshoot2        = {false,SPR_GRETEL_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_gretelshoot3};
  834. statetype s_gretelshoot3        = {false,SPR_GRETEL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_gretelshoot4};
  835. statetype s_gretelshoot4        = {false,SPR_GRETEL_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_gretelshoot5};
  836. statetype s_gretelshoot5        = {false,SPR_GRETEL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_gretelshoot6};
  837. statetype s_gretelshoot6        = {false,SPR_GRETEL_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_gretelshoot7};
  838. statetype s_gretelshoot7        = {false,SPR_GRETEL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_gretelshoot8};
  839. statetype s_gretelshoot8        = {false,SPR_GRETEL_SHOOT1,10,NULL,NULL,&s_gretelchase1};
  840. #endif
  841.  
  842.  
  843. /*
  844. ===============
  845. =
  846. = SpawnStand
  847. =
  848. ===============
  849. */
  850.  
  851. void 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.  
  925. void 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.  
  946. void 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.  
  967. void 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.  
  989. void 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.  
  1067. void 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.  
  1186. void T_Launch (objtype *ob);
  1187. void T_Will (objtype *ob);
  1188.  
  1189. extern  statetype s_angelshoot1;
  1190. extern  statetype s_deathshoot1;
  1191. extern  statetype s_spark1;
  1192.  
  1193. //
  1194. // trans
  1195. //
  1196. extern  statetype s_transstand;
  1197.  
  1198. extern  statetype s_transchase1;
  1199. extern  statetype s_transchase1s;
  1200. extern  statetype s_transchase2;
  1201. extern  statetype s_transchase3;
  1202. extern  statetype s_transchase3s;
  1203. extern  statetype s_transchase4;
  1204.  
  1205. extern  statetype s_transdie0;
  1206. extern  statetype s_transdie01;
  1207. extern  statetype s_transdie1;
  1208. extern  statetype s_transdie2;
  1209. extern  statetype s_transdie3;
  1210. extern  statetype s_transdie4;
  1211.  
  1212. extern  statetype s_transshoot1;
  1213. extern  statetype s_transshoot2;
  1214. extern  statetype s_transshoot3;
  1215. extern  statetype s_transshoot4;
  1216. extern  statetype s_transshoot5;
  1217. extern  statetype s_transshoot6;
  1218. extern  statetype s_transshoot7;
  1219. extern  statetype s_transshoot8;
  1220.  
  1221.  
  1222. statetype s_transstand          = {false,SPR_TRANS_W1,0,(statefunc)T_Stand,NULL,&s_transstand};
  1223.  
  1224. statetype s_transchase1         = {false,SPR_TRANS_W1,10,(statefunc)T_Chase,NULL,&s_transchase1s};
  1225. statetype s_transchase1s        = {false,SPR_TRANS_W1,3,NULL,NULL,&s_transchase2};
  1226. statetype s_transchase2         = {false,SPR_TRANS_W2,8,(statefunc)T_Chase,NULL,&s_transchase3};
  1227. statetype s_transchase3         = {false,SPR_TRANS_W3,10,(statefunc)T_Chase,NULL,&s_transchase3s};
  1228. statetype s_transchase3s        = {false,SPR_TRANS_W3,3,NULL,NULL,&s_transchase4};
  1229. statetype s_transchase4         = {false,SPR_TRANS_W4,8,(statefunc)T_Chase,NULL,&s_transchase1};
  1230.  
  1231. statetype s_transdie0           = {false,SPR_TRANS_W1,1,NULL,(statefunc)A_DeathScream,&s_transdie01};
  1232. statetype s_transdie01          = {false,SPR_TRANS_W1,1,NULL,NULL,&s_transdie1};
  1233. statetype s_transdie1           = {false,SPR_TRANS_DIE1,15,NULL,NULL,&s_transdie2};
  1234. statetype s_transdie2           = {false,SPR_TRANS_DIE2,15,NULL,NULL,&s_transdie3};
  1235. statetype s_transdie3           = {false,SPR_TRANS_DIE3,15,NULL,NULL,&s_transdie4};
  1236. statetype s_transdie4           = {false,SPR_TRANS_DEAD,0,NULL,NULL,&s_transdie4};
  1237.  
  1238. statetype s_transshoot1         = {false,SPR_TRANS_SHOOT1,30,NULL,NULL,&s_transshoot2};
  1239. statetype s_transshoot2         = {false,SPR_TRANS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_transshoot3};
  1240. statetype s_transshoot3         = {false,SPR_TRANS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_transshoot4};
  1241. statetype s_transshoot4         = {false,SPR_TRANS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_transshoot5};
  1242. statetype s_transshoot5         = {false,SPR_TRANS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_transshoot6};
  1243. statetype s_transshoot6         = {false,SPR_TRANS_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_transshoot7};
  1244. statetype s_transshoot7         = {false,SPR_TRANS_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_transshoot8};
  1245. statetype s_transshoot8         = {false,SPR_TRANS_SHOOT1,10,NULL,NULL,&s_transchase1};
  1246.  
  1247.  
  1248. /*
  1249. ===============
  1250. =
  1251. = SpawnTrans
  1252. =
  1253. ===============
  1254. */
  1255.  
  1256. void 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. //
  1276. void T_UShoot (objtype *ob);
  1277.  
  1278. extern  statetype s_uberstand;
  1279.  
  1280. extern  statetype s_uberchase1;
  1281. extern  statetype s_uberchase1s;
  1282. extern  statetype s_uberchase2;
  1283. extern  statetype s_uberchase3;
  1284. extern  statetype s_uberchase3s;
  1285. extern  statetype s_uberchase4;
  1286.  
  1287. extern  statetype s_uberdie0;
  1288. extern  statetype s_uberdie01;
  1289. extern  statetype s_uberdie1;
  1290. extern  statetype s_uberdie2;
  1291. extern  statetype s_uberdie3;
  1292. extern  statetype s_uberdie4;
  1293. extern  statetype s_uberdie5;
  1294.  
  1295. extern  statetype s_ubershoot1;
  1296. extern  statetype s_ubershoot2;
  1297. extern  statetype s_ubershoot3;
  1298. extern  statetype s_ubershoot4;
  1299. extern  statetype s_ubershoot5;
  1300. extern  statetype s_ubershoot6;
  1301. extern  statetype s_ubershoot7;
  1302.  
  1303.  
  1304. statetype s_uberstand           = {false,SPR_UBER_W1,0,(statefunc)T_Stand,NULL,&s_uberstand};
  1305.  
  1306. statetype s_uberchase1          = {false,SPR_UBER_W1,10,(statefunc)T_Chase,NULL,&s_uberchase1s};
  1307. statetype s_uberchase1s         = {false,SPR_UBER_W1,3,NULL,NULL,&s_uberchase2};
  1308. statetype s_uberchase2          = {false,SPR_UBER_W2,8,(statefunc)T_Chase,NULL,&s_uberchase3};
  1309. statetype s_uberchase3          = {false,SPR_UBER_W3,10,(statefunc)T_Chase,NULL,&s_uberchase3s};
  1310. statetype s_uberchase3s         = {false,SPR_UBER_W3,3,NULL,NULL,&s_uberchase4};
  1311. statetype s_uberchase4          = {false,SPR_UBER_W4,8,(statefunc)T_Chase,NULL,&s_uberchase1};
  1312.  
  1313. statetype s_uberdie0            = {false,SPR_UBER_W1,1,NULL,(statefunc)A_DeathScream,&s_uberdie01};
  1314. statetype s_uberdie01           = {false,SPR_UBER_W1,1,NULL,NULL,&s_uberdie1};
  1315. statetype s_uberdie1            = {false,SPR_UBER_DIE1,15,NULL,NULL,&s_uberdie2};
  1316. statetype s_uberdie2            = {false,SPR_UBER_DIE2,15,NULL,NULL,&s_uberdie3};
  1317. statetype s_uberdie3            = {false,SPR_UBER_DIE3,15,NULL,NULL,&s_uberdie4};
  1318. statetype s_uberdie4            = {false,SPR_UBER_DIE4,15,NULL,NULL,&s_uberdie5};
  1319. statetype s_uberdie5            = {false,SPR_UBER_DEAD,0,NULL,NULL,&s_uberdie5};
  1320.  
  1321. statetype s_ubershoot1          = {false,SPR_UBER_SHOOT1,30,NULL,NULL,&s_ubershoot2};
  1322. statetype s_ubershoot2          = {false,SPR_UBER_SHOOT2,12,NULL,(statefunc)T_UShoot,&s_ubershoot3};
  1323. statetype s_ubershoot3          = {false,SPR_UBER_SHOOT3,12,NULL,(statefunc)T_UShoot,&s_ubershoot4};
  1324. statetype s_ubershoot4          = {false,SPR_UBER_SHOOT4,12,NULL,(statefunc)T_UShoot,&s_ubershoot5};
  1325. statetype s_ubershoot5          = {false,SPR_UBER_SHOOT3,12,NULL,(statefunc)T_UShoot,&s_ubershoot6};
  1326. statetype s_ubershoot6          = {false,SPR_UBER_SHOOT2,12,NULL,(statefunc)T_UShoot,&s_ubershoot7};
  1327. statetype s_ubershoot7          = {false,SPR_UBER_SHOOT1,12,NULL,NULL,&s_uberchase1};
  1328.  
  1329.  
  1330. /*
  1331. ===============
  1332. =
  1333. = SpawnUber
  1334. =
  1335. ===============
  1336. */
  1337.  
  1338. void 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.  
  1360. void 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. //
  1377. extern  statetype s_willstand;
  1378.  
  1379. extern  statetype s_willchase1;
  1380. extern  statetype s_willchase1s;
  1381. extern  statetype s_willchase2;
  1382. extern  statetype s_willchase3;
  1383. extern  statetype s_willchase3s;
  1384. extern  statetype s_willchase4;
  1385.  
  1386. extern  statetype s_willdie1;
  1387. extern  statetype s_willdie2;
  1388. extern  statetype s_willdie3;
  1389. extern  statetype s_willdie4;
  1390. extern  statetype s_willdie5;
  1391. extern  statetype s_willdie6;
  1392.  
  1393. extern  statetype s_willshoot1;
  1394. extern  statetype s_willshoot2;
  1395. extern  statetype s_willshoot3;
  1396. extern  statetype s_willshoot4;
  1397. extern  statetype s_willshoot5;
  1398. extern  statetype s_willshoot6;
  1399.  
  1400.  
  1401. statetype s_willstand           = {false,SPR_WILL_W1,0,(statefunc)T_Stand,NULL,&s_willstand};
  1402.  
  1403. statetype s_willchase1          = {false,SPR_WILL_W1,10,(statefunc)T_Will,NULL,&s_willchase1s};
  1404. statetype s_willchase1s         = {false,SPR_WILL_W1,3,NULL,NULL,&s_willchase2};
  1405. statetype s_willchase2          = {false,SPR_WILL_W2,8,(statefunc)T_Will,NULL,&s_willchase3};
  1406. statetype s_willchase3          = {false,SPR_WILL_W3,10,(statefunc)T_Will,NULL,&s_willchase3s};
  1407. statetype s_willchase3s         = {false,SPR_WILL_W3,3,NULL,NULL,&s_willchase4};
  1408. statetype s_willchase4          = {false,SPR_WILL_W4,8,(statefunc)T_Will,NULL,&s_willchase1};
  1409.  
  1410. statetype s_willdeathcam        = {false,SPR_WILL_W1,1,NULL,NULL,&s_willdie1};
  1411.  
  1412. statetype s_willdie1            = {false,SPR_WILL_W1,1,NULL,(statefunc)A_DeathScream,&s_willdie2};
  1413. statetype s_willdie2            = {false,SPR_WILL_W1,10,NULL,NULL,&s_willdie3};
  1414. statetype s_willdie3            = {false,SPR_WILL_DIE1,10,NULL,NULL,&s_willdie4};
  1415. statetype s_willdie4            = {false,SPR_WILL_DIE2,10,NULL,NULL,&s_willdie5};
  1416. statetype s_willdie5            = {false,SPR_WILL_DIE3,10,NULL,NULL,&s_willdie6};
  1417. statetype s_willdie6            = {false,SPR_WILL_DEAD,20,NULL,NULL,&s_willdie6};
  1418.  
  1419. statetype s_willshoot1          = {false,SPR_WILL_SHOOT1,30,NULL,NULL,&s_willshoot2};
  1420. statetype s_willshoot2          = {false,SPR_WILL_SHOOT2,10,NULL,(statefunc)T_Launch,&s_willshoot3};
  1421. statetype s_willshoot3          = {false,SPR_WILL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_willshoot4};
  1422. statetype s_willshoot4          = {false,SPR_WILL_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_willshoot5};
  1423. statetype s_willshoot5          = {false,SPR_WILL_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_willshoot6};
  1424. statetype s_willshoot6          = {false,SPR_WILL_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_willchase1};
  1425.  
  1426.  
  1427. /*
  1428. ===============
  1429. =
  1430. = SpawnWill
  1431. =
  1432. ===============
  1433. */
  1434.  
  1435. void 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.  
  1457. void 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. //
  1550. extern  statetype s_deathstand;
  1551.  
  1552. extern  statetype s_deathchase1;
  1553. extern  statetype s_deathchase1s;
  1554. extern  statetype s_deathchase2;
  1555. extern  statetype s_deathchase3;
  1556. extern  statetype s_deathchase3s;
  1557. extern  statetype s_deathchase4;
  1558.  
  1559. extern  statetype s_deathdie1;
  1560. extern  statetype s_deathdie2;
  1561. extern  statetype s_deathdie3;
  1562. extern  statetype s_deathdie4;
  1563. extern  statetype s_deathdie5;
  1564. extern  statetype s_deathdie6;
  1565. extern  statetype s_deathdie7;
  1566. extern  statetype s_deathdie8;
  1567. extern  statetype s_deathdie9;
  1568.  
  1569. extern  statetype s_deathshoot1;
  1570. extern  statetype s_deathshoot2;
  1571. extern  statetype s_deathshoot3;
  1572. extern  statetype s_deathshoot4;
  1573. extern  statetype s_deathshoot5;
  1574.  
  1575.  
  1576. statetype s_deathstand          = {false,SPR_DEATH_W1,0,(statefunc)T_Stand,NULL,&s_deathstand};
  1577.  
  1578. statetype s_deathchase1         = {false,SPR_DEATH_W1,10,(statefunc)T_Will,NULL,&s_deathchase1s};
  1579. statetype s_deathchase1s        = {false,SPR_DEATH_W1,3,NULL,NULL,&s_deathchase2};
  1580. statetype s_deathchase2         = {false,SPR_DEATH_W2,8,(statefunc)T_Will,NULL,&s_deathchase3};
  1581. statetype s_deathchase3         = {false,SPR_DEATH_W3,10,(statefunc)T_Will,NULL,&s_deathchase3s};
  1582. statetype s_deathchase3s        = {false,SPR_DEATH_W3,3,NULL,NULL,&s_deathchase4};
  1583. statetype s_deathchase4         = {false,SPR_DEATH_W4,8,(statefunc)T_Will,NULL,&s_deathchase1};
  1584.  
  1585. statetype s_deathdeathcam       = {false,SPR_DEATH_W1,1,NULL,NULL,&s_deathdie1};
  1586.  
  1587. statetype s_deathdie1           = {false,SPR_DEATH_W1,1,NULL,(statefunc)A_DeathScream,&s_deathdie2};
  1588. statetype s_deathdie2           = {false,SPR_DEATH_W1,10,NULL,NULL,&s_deathdie3};
  1589. statetype s_deathdie3           = {false,SPR_DEATH_DIE1,10,NULL,NULL,&s_deathdie4};
  1590. statetype s_deathdie4           = {false,SPR_DEATH_DIE2,10,NULL,NULL,&s_deathdie5};
  1591. statetype s_deathdie5           = {false,SPR_DEATH_DIE3,10,NULL,NULL,&s_deathdie6};
  1592. statetype s_deathdie6           = {false,SPR_DEATH_DIE4,10,NULL,NULL,&s_deathdie7};
  1593. statetype s_deathdie7           = {false,SPR_DEATH_DIE5,10,NULL,NULL,&s_deathdie8};
  1594. statetype s_deathdie8           = {false,SPR_DEATH_DIE6,10,NULL,NULL,&s_deathdie9};
  1595. statetype s_deathdie9           = {false,SPR_DEATH_DEAD,0,NULL,NULL,&s_deathdie9};
  1596.  
  1597. statetype s_deathshoot1         = {false,SPR_DEATH_SHOOT1,30,NULL,NULL,&s_deathshoot2};
  1598. statetype s_deathshoot2         = {false,SPR_DEATH_SHOOT2,10,NULL,(statefunc)T_Launch,&s_deathshoot3};
  1599. statetype s_deathshoot3         = {false,SPR_DEATH_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_deathshoot4};
  1600. statetype s_deathshoot4         = {false,SPR_DEATH_SHOOT3,10,NULL,(statefunc)T_Launch,&s_deathshoot5};
  1601. statetype s_deathshoot5         = {false,SPR_DEATH_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_deathchase1};
  1602.  
  1603.  
  1604. /*
  1605. ===============
  1606. =
  1607. = SpawnDeath
  1608. =
  1609. ===============
  1610. */
  1611.  
  1612. void 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.  
  1633. void 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. //
  1699. void A_Relaunch (objtype *ob);
  1700. void A_Victory (objtype *ob);
  1701. void A_StartAttack (objtype *ob);
  1702. void A_Breathing (objtype *ob);
  1703.  
  1704. extern  statetype s_angelstand;
  1705.  
  1706. extern  statetype s_angelchase1;
  1707. extern  statetype s_angelchase1s;
  1708. extern  statetype s_angelchase2;
  1709. extern  statetype s_angelchase3;
  1710. extern  statetype s_angelchase3s;
  1711. extern  statetype s_angelchase4;
  1712.  
  1713. extern  statetype s_angeldie1;
  1714. extern  statetype s_angeldie11;
  1715. extern  statetype s_angeldie2;
  1716. extern  statetype s_angeldie3;
  1717. extern  statetype s_angeldie4;
  1718. extern  statetype s_angeldie5;
  1719. extern  statetype s_angeldie6;
  1720. extern  statetype s_angeldie7;
  1721. extern  statetype s_angeldie8;
  1722. extern  statetype s_angeldie9;
  1723.  
  1724. extern  statetype s_angelshoot1;
  1725. extern  statetype s_angelshoot2;
  1726. extern  statetype s_angelshoot3;
  1727. extern  statetype s_angelshoot4;
  1728. extern  statetype s_angelshoot5;
  1729. extern  statetype s_angelshoot6;
  1730.  
  1731. extern  statetype s_angeltired;
  1732. extern  statetype s_angeltired2;
  1733. extern  statetype s_angeltired3;
  1734. extern  statetype s_angeltired4;
  1735. extern  statetype s_angeltired5;
  1736. extern  statetype s_angeltired6;
  1737. extern  statetype s_angeltired7;
  1738.  
  1739. extern  statetype s_spark1;
  1740. extern  statetype s_spark2;
  1741. extern  statetype s_spark3;
  1742. extern  statetype s_spark4;
  1743.  
  1744.  
  1745. statetype s_angelstand          = {false,SPR_ANGEL_W1,0,(statefunc)T_Stand,NULL,&s_angelstand};
  1746.  
  1747. statetype s_angelchase1         = {false,SPR_ANGEL_W1,10,(statefunc)T_Will,NULL,&s_angelchase1s};
  1748. statetype s_angelchase1s        = {false,SPR_ANGEL_W1,3,NULL,NULL,&s_angelchase2};
  1749. statetype s_angelchase2         = {false,SPR_ANGEL_W2,8,(statefunc)T_Will,NULL,&s_angelchase3};
  1750. statetype s_angelchase3         = {false,SPR_ANGEL_W3,10,(statefunc)T_Will,NULL,&s_angelchase3s};
  1751. statetype s_angelchase3s        = {false,SPR_ANGEL_W3,3,NULL,NULL,&s_angelchase4};
  1752. statetype s_angelchase4         = {false,SPR_ANGEL_W4,8,(statefunc)T_Will,NULL,&s_angelchase1};
  1753.  
  1754. statetype s_angeldie1           = {false,SPR_ANGEL_W1,1,NULL,(statefunc)A_DeathScream,&s_angeldie11};
  1755. statetype s_angeldie11          = {false,SPR_ANGEL_W1,1,NULL,NULL,&s_angeldie2};
  1756. statetype s_angeldie2           = {false,SPR_ANGEL_DIE1,10,NULL,(statefunc)A_Slurpie,&s_angeldie3};
  1757. statetype s_angeldie3           = {false,SPR_ANGEL_DIE2,10,NULL,NULL,&s_angeldie4};
  1758. statetype s_angeldie4           = {false,SPR_ANGEL_DIE3,10,NULL,NULL,&s_angeldie5};
  1759. statetype s_angeldie5           = {false,SPR_ANGEL_DIE4,10,NULL,NULL,&s_angeldie6};
  1760. statetype s_angeldie6           = {false,SPR_ANGEL_DIE5,10,NULL,NULL,&s_angeldie7};
  1761. statetype s_angeldie7           = {false,SPR_ANGEL_DIE6,10,NULL,NULL,&s_angeldie8};
  1762. statetype s_angeldie8           = {false,SPR_ANGEL_DIE7,10,NULL,NULL,&s_angeldie9};
  1763. statetype s_angeldie9           = {false,SPR_ANGEL_DEAD,130,NULL,(statefunc)A_Victory,&s_angeldie9};
  1764.  
  1765. statetype s_angelshoot1         = {false,SPR_ANGEL_SHOOT1,10,NULL,(statefunc)A_StartAttack,&s_angelshoot2};
  1766. statetype s_angelshoot2         = {false,SPR_ANGEL_SHOOT2,20,NULL,(statefunc)T_Launch,&s_angelshoot3};
  1767. statetype s_angelshoot3         = {false,SPR_ANGEL_SHOOT1,10,NULL,(statefunc)A_Relaunch,&s_angelshoot2};
  1768.  
  1769. statetype s_angeltired          = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angeltired2};
  1770. statetype s_angeltired2         = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired3};
  1771. statetype s_angeltired3         = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angeltired4};
  1772. statetype s_angeltired4         = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired5};
  1773. statetype s_angeltired5         = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angeltired6};
  1774. statetype s_angeltired6         = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired7};
  1775. statetype s_angeltired7         = {false,SPR_ANGEL_TIRED1,40,NULL,(statefunc)A_Breathing,&s_angelchase1};
  1776.  
  1777. statetype s_spark1              = {false,SPR_SPARK1,6,(statefunc)T_Projectile,NULL,&s_spark2};
  1778. statetype s_spark2              = {false,SPR_SPARK2,6,(statefunc)T_Projectile,NULL,&s_spark3};
  1779. statetype s_spark3              = {false,SPR_SPARK3,6,(statefunc)T_Projectile,NULL,&s_spark4};
  1780. statetype s_spark4              = {false,SPR_SPARK4,6,(statefunc)T_Projectile,NULL,&s_spark1};
  1781.  
  1782.  
  1783. void A_Slurpie (objtype *)
  1784. {
  1785.     SD_PlaySound(SLURPIESND);
  1786. }
  1787.  
  1788. void A_Breathing (objtype *)
  1789. {
  1790.     SD_PlaySound(ANGELTIREDSND);
  1791. }
  1792.  
  1793. /*
  1794. ===============
  1795. =
  1796. = SpawnAngel
  1797. =
  1798. ===============
  1799. */
  1800.  
  1801. void 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.  
  1823. void A_Victory (objtype *)
  1824. {
  1825.     playstate = ex_victorious;
  1826. }
  1827.  
  1828.  
  1829. /*
  1830. =================
  1831. =
  1832. = A_StartAttack
  1833. =
  1834. =================
  1835. */
  1836.  
  1837. void A_StartAttack (objtype *ob)
  1838. {
  1839.     ob->temp1 = 0;
  1840. }
  1841.  
  1842.  
  1843. /*
  1844. =================
  1845. =
  1846. = A_Relaunch
  1847. =
  1848. =================
  1849. */
  1850.  
  1851. void 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. //
  1872. void T_SpectreWait (objtype *ob);
  1873. void A_Dormant (objtype *ob);
  1874.  
  1875. extern  statetype s_spectrewait1;
  1876. extern  statetype s_spectrewait2;
  1877. extern  statetype s_spectrewait3;
  1878. extern  statetype s_spectrewait4;
  1879.  
  1880. extern  statetype s_spectrechase1;
  1881. extern  statetype s_spectrechase2;
  1882. extern  statetype s_spectrechase3;
  1883. extern  statetype s_spectrechase4;
  1884.  
  1885. extern  statetype s_spectredie1;
  1886. extern  statetype s_spectredie2;
  1887. extern  statetype s_spectredie3;
  1888. extern  statetype s_spectredie4;
  1889.  
  1890. extern  statetype s_spectrewake;
  1891.  
  1892. statetype s_spectrewait1        = {false,SPR_SPECTRE_W1,10,(statefunc)T_Stand,NULL,&s_spectrewait2};
  1893. statetype s_spectrewait2        = {false,SPR_SPECTRE_W2,10,(statefunc)T_Stand,NULL,&s_spectrewait3};
  1894. statetype s_spectrewait3        = {false,SPR_SPECTRE_W3,10,(statefunc)T_Stand,NULL,&s_spectrewait4};
  1895. statetype s_spectrewait4        = {false,SPR_SPECTRE_W4,10,(statefunc)T_Stand,NULL,&s_spectrewait1};
  1896.  
  1897. statetype s_spectrechase1       = {false,SPR_SPECTRE_W1,10,(statefunc)T_Ghosts,NULL,&s_spectrechase2};
  1898. statetype s_spectrechase2       = {false,SPR_SPECTRE_W2,10,(statefunc)T_Ghosts,NULL,&s_spectrechase3};
  1899. statetype s_spectrechase3       = {false,SPR_SPECTRE_W3,10,(statefunc)T_Ghosts,NULL,&s_spectrechase4};
  1900. statetype s_spectrechase4       = {false,SPR_SPECTRE_W4,10,(statefunc)T_Ghosts,NULL,&s_spectrechase1};
  1901.  
  1902. statetype s_spectredie1         = {false,SPR_SPECTRE_F1,10,NULL,NULL,&s_spectredie2};
  1903. statetype s_spectredie2         = {false,SPR_SPECTRE_F2,10,NULL,NULL,&s_spectredie3};
  1904. statetype s_spectredie3         = {false,SPR_SPECTRE_F3,10,NULL,NULL,&s_spectredie4};
  1905. statetype s_spectredie4         = {false,SPR_SPECTRE_F4,300,NULL,NULL,&s_spectrewake};
  1906. statetype s_spectrewake         = {false,SPR_SPECTRE_F4,10,NULL,(statefunc)A_Dormant,&s_spectrewake};
  1907.  
  1908. /*
  1909. ===============
  1910. =
  1911. = SpawnSpectre
  1912. =
  1913. ===============
  1914. */
  1915.  
  1916. void 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.  
  1935. void 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;
  1950. moveok:
  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.  
  1996. void 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.  
  2028. void    T_Gift (objtype *ob);
  2029. void    T_GiftThrow (objtype *ob);
  2030.  
  2031. void    T_Fat (objtype *ob);
  2032. void    T_FatThrow (objtype *ob);
  2033.  
  2034. //
  2035. // schabb
  2036. //
  2037. extern  statetype s_schabbstand;
  2038.  
  2039. extern  statetype s_schabbchase1;
  2040. extern  statetype s_schabbchase1s;
  2041. extern  statetype s_schabbchase2;
  2042. extern  statetype s_schabbchase3;
  2043. extern  statetype s_schabbchase3s;
  2044. extern  statetype s_schabbchase4;
  2045.  
  2046. extern  statetype s_schabbdie1;
  2047. extern  statetype s_schabbdie2;
  2048. extern  statetype s_schabbdie3;
  2049. extern  statetype s_schabbdie4;
  2050. extern  statetype s_schabbdie5;
  2051. extern  statetype s_schabbdie6;
  2052.  
  2053. extern  statetype s_schabbshoot1;
  2054. extern  statetype s_schabbshoot2;
  2055.  
  2056. extern  statetype s_needle1;
  2057. extern  statetype s_needle2;
  2058. extern  statetype s_needle3;
  2059. extern  statetype s_needle4;
  2060.  
  2061. extern  statetype s_schabbdeathcam;
  2062.  
  2063.  
  2064. statetype s_schabbstand         = {false,SPR_SCHABB_W1,0,(statefunc)T_Stand,NULL,&s_schabbstand};
  2065.  
  2066. statetype s_schabbchase1        = {false,SPR_SCHABB_W1,10,(statefunc)T_Schabb,NULL,&s_schabbchase1s};
  2067. statetype s_schabbchase1s       = {false,SPR_SCHABB_W1,3,NULL,NULL,&s_schabbchase2};
  2068. statetype s_schabbchase2        = {false,SPR_SCHABB_W2,8,(statefunc)T_Schabb,NULL,&s_schabbchase3};
  2069. statetype s_schabbchase3        = {false,SPR_SCHABB_W3,10,(statefunc)T_Schabb,NULL,&s_schabbchase3s};
  2070. statetype s_schabbchase3s       = {false,SPR_SCHABB_W3,3,NULL,NULL,&s_schabbchase4};
  2071. statetype s_schabbchase4        = {false,SPR_SCHABB_W4,8,(statefunc)T_Schabb,NULL,&s_schabbchase1};
  2072.  
  2073. statetype s_schabbdeathcam      = {false,SPR_SCHABB_W1,1,NULL,NULL,&s_schabbdie1};
  2074.  
  2075. statetype s_schabbdie1          = {false,SPR_SCHABB_W1,10,NULL,(statefunc)A_DeathScream,&s_schabbdie2};
  2076. statetype s_schabbdie2          = {false,SPR_SCHABB_W1,10,NULL,NULL,&s_schabbdie3};
  2077. statetype s_schabbdie3          = {false,SPR_SCHABB_DIE1,10,NULL,NULL,&s_schabbdie4};
  2078. statetype s_schabbdie4          = {false,SPR_SCHABB_DIE2,10,NULL,NULL,&s_schabbdie5};
  2079. statetype s_schabbdie5          = {false,SPR_SCHABB_DIE3,10,NULL,NULL,&s_schabbdie6};
  2080. statetype s_schabbdie6          = {false,SPR_SCHABB_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_schabbdie6};
  2081.  
  2082. statetype s_schabbshoot1        = {false,SPR_SCHABB_SHOOT1,30,NULL,NULL,&s_schabbshoot2};
  2083. statetype s_schabbshoot2        = {false,SPR_SCHABB_SHOOT2,10,NULL,(statefunc)T_SchabbThrow,&s_schabbchase1};
  2084.  
  2085. statetype s_needle1             = {false,SPR_HYPO1,6,(statefunc)T_Projectile,NULL,&s_needle2};
  2086. statetype s_needle2             = {false,SPR_HYPO2,6,(statefunc)T_Projectile,NULL,&s_needle3};
  2087. statetype s_needle3             = {false,SPR_HYPO3,6,(statefunc)T_Projectile,NULL,&s_needle4};
  2088. statetype s_needle4             = {false,SPR_HYPO4,6,(statefunc)T_Projectile,NULL,&s_needle1};
  2089.  
  2090.  
  2091. //
  2092. // gift
  2093. //
  2094. extern  statetype s_giftstand;
  2095.  
  2096. extern  statetype s_giftchase1;
  2097. extern  statetype s_giftchase1s;
  2098. extern  statetype s_giftchase2;
  2099. extern  statetype s_giftchase3;
  2100. extern  statetype s_giftchase3s;
  2101. extern  statetype s_giftchase4;
  2102.  
  2103. extern  statetype s_giftdie1;
  2104. extern  statetype s_giftdie2;
  2105. extern  statetype s_giftdie3;
  2106. extern  statetype s_giftdie4;
  2107. extern  statetype s_giftdie5;
  2108. extern  statetype s_giftdie6;
  2109.  
  2110. extern  statetype s_giftshoot1;
  2111. extern  statetype s_giftshoot2;
  2112.  
  2113. extern  statetype s_needle1;
  2114. extern  statetype s_needle2;
  2115. extern  statetype s_needle3;
  2116. extern  statetype s_needle4;
  2117.  
  2118. extern  statetype s_giftdeathcam;
  2119.  
  2120. extern  statetype s_boom1;
  2121. extern  statetype s_boom2;
  2122. extern  statetype s_boom3;
  2123.  
  2124.  
  2125. statetype s_giftstand           = {false,SPR_GIFT_W1,0,(statefunc)T_Stand,NULL,&s_giftstand};
  2126.  
  2127. statetype s_giftchase1          = {false,SPR_GIFT_W1,10,(statefunc)T_Gift,NULL,&s_giftchase1s};
  2128. statetype s_giftchase1s         = {false,SPR_GIFT_W1,3,NULL,NULL,&s_giftchase2};
  2129. statetype s_giftchase2          = {false,SPR_GIFT_W2,8,(statefunc)T_Gift,NULL,&s_giftchase3};
  2130. statetype s_giftchase3          = {false,SPR_GIFT_W3,10,(statefunc)T_Gift,NULL,&s_giftchase3s};
  2131. statetype s_giftchase3s         = {false,SPR_GIFT_W3,3,NULL,NULL,&s_giftchase4};
  2132. statetype s_giftchase4          = {false,SPR_GIFT_W4,8,(statefunc)T_Gift,NULL,&s_giftchase1};
  2133.  
  2134. statetype s_giftdeathcam        = {false,SPR_GIFT_W1,1,NULL,NULL,&s_giftdie1};
  2135.  
  2136. statetype s_giftdie1            = {false,SPR_GIFT_W1,1,NULL,(statefunc)A_DeathScream,&s_giftdie2};
  2137. statetype s_giftdie2            = {false,SPR_GIFT_W1,10,NULL,NULL,&s_giftdie3};
  2138. statetype s_giftdie3            = {false,SPR_GIFT_DIE1,10,NULL,NULL,&s_giftdie4};
  2139. statetype s_giftdie4            = {false,SPR_GIFT_DIE2,10,NULL,NULL,&s_giftdie5};
  2140. statetype s_giftdie5            = {false,SPR_GIFT_DIE3,10,NULL,NULL,&s_giftdie6};
  2141. statetype s_giftdie6            = {false,SPR_GIFT_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_giftdie6};
  2142.  
  2143. statetype s_giftshoot1          = {false,SPR_GIFT_SHOOT1,30,NULL,NULL,&s_giftshoot2};
  2144. statetype s_giftshoot2          = {false,SPR_GIFT_SHOOT2,10,NULL,(statefunc)T_GiftThrow,&s_giftchase1};
  2145.  
  2146.  
  2147. //
  2148. // fat
  2149. //
  2150. extern  statetype s_fatstand;
  2151.  
  2152. extern  statetype s_fatchase1;
  2153. extern  statetype s_fatchase1s;
  2154. extern  statetype s_fatchase2;
  2155. extern  statetype s_fatchase3;
  2156. extern  statetype s_fatchase3s;
  2157. extern  statetype s_fatchase4;
  2158.  
  2159. extern  statetype s_fatdie1;
  2160. extern  statetype s_fatdie2;
  2161. extern  statetype s_fatdie3;
  2162. extern  statetype s_fatdie4;
  2163. extern  statetype s_fatdie5;
  2164. extern  statetype s_fatdie6;
  2165.  
  2166. extern  statetype s_fatshoot1;
  2167. extern  statetype s_fatshoot2;
  2168. extern  statetype s_fatshoot3;
  2169. extern  statetype s_fatshoot4;
  2170. extern  statetype s_fatshoot5;
  2171. extern  statetype s_fatshoot6;
  2172.  
  2173. extern  statetype s_needle1;
  2174. extern  statetype s_needle2;
  2175. extern  statetype s_needle3;
  2176. extern  statetype s_needle4;
  2177.  
  2178. extern  statetype s_fatdeathcam;
  2179.  
  2180.  
  2181. statetype s_fatstand            = {false,SPR_FAT_W1,0,(statefunc)T_Stand,NULL,&s_fatstand};
  2182.  
  2183. statetype s_fatchase1           = {false,SPR_FAT_W1,10,(statefunc)T_Fat,NULL,&s_fatchase1s};
  2184. statetype s_fatchase1s          = {false,SPR_FAT_W1,3,NULL,NULL,&s_fatchase2};
  2185. statetype s_fatchase2           = {false,SPR_FAT_W2,8,(statefunc)T_Fat,NULL,&s_fatchase3};
  2186. statetype s_fatchase3           = {false,SPR_FAT_W3,10,(statefunc)T_Fat,NULL,&s_fatchase3s};
  2187. statetype s_fatchase3s          = {false,SPR_FAT_W3,3,NULL,NULL,&s_fatchase4};
  2188. statetype s_fatchase4           = {false,SPR_FAT_W4,8,(statefunc)T_Fat,NULL,&s_fatchase1};
  2189.  
  2190. statetype s_fatdeathcam         = {false,SPR_FAT_W1,1,NULL,NULL,&s_fatdie1};
  2191.  
  2192. statetype s_fatdie1             = {false,SPR_FAT_W1,1,NULL,(statefunc)A_DeathScream,&s_fatdie2};
  2193. statetype s_fatdie2             = {false,SPR_FAT_W1,10,NULL,NULL,&s_fatdie3};
  2194. statetype s_fatdie3             = {false,SPR_FAT_DIE1,10,NULL,NULL,&s_fatdie4};
  2195. statetype s_fatdie4             = {false,SPR_FAT_DIE2,10,NULL,NULL,&s_fatdie5};
  2196. statetype s_fatdie5             = {false,SPR_FAT_DIE3,10,NULL,NULL,&s_fatdie6};
  2197. statetype s_fatdie6             = {false,SPR_FAT_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_fatdie6};
  2198.  
  2199. statetype s_fatshoot1           = {false,SPR_FAT_SHOOT1,30,NULL,NULL,&s_fatshoot2};
  2200. statetype s_fatshoot2           = {false,SPR_FAT_SHOOT2,10,NULL,(statefunc)T_GiftThrow,&s_fatshoot3};
  2201. statetype s_fatshoot3           = {false,SPR_FAT_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_fatshoot4};
  2202. statetype s_fatshoot4           = {false,SPR_FAT_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_fatshoot5};
  2203. statetype s_fatshoot5           = {false,SPR_FAT_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_fatshoot6};
  2204. statetype s_fatshoot6           = {false,SPR_FAT_SHOOT4,10,NULL,(statefunc)T_Shoot,&s_fatchase1};
  2205.  
  2206.  
  2207. /*
  2208. ===============
  2209. =
  2210. = SpawnSchabbs
  2211. =
  2212. ===============
  2213. */
  2214.  
  2215. void 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.  
  2242. void 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.  
  2269. void 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.  
  2296. void 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.  
  2336. void 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.  
  2378. void 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.  
  2470. void 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.  
  2562. void 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. //
  2658. extern  statetype s_fakestand;
  2659.  
  2660. extern  statetype s_fakechase1;
  2661. extern  statetype s_fakechase1s;
  2662. extern  statetype s_fakechase2;
  2663. extern  statetype s_fakechase3;
  2664. extern  statetype s_fakechase3s;
  2665. extern  statetype s_fakechase4;
  2666.  
  2667. extern  statetype s_fakedie1;
  2668. extern  statetype s_fakedie2;
  2669. extern  statetype s_fakedie3;
  2670. extern  statetype s_fakedie4;
  2671. extern  statetype s_fakedie5;
  2672. extern  statetype s_fakedie6;
  2673.  
  2674. extern  statetype s_fakeshoot1;
  2675. extern  statetype s_fakeshoot2;
  2676. extern  statetype s_fakeshoot3;
  2677. extern  statetype s_fakeshoot4;
  2678. extern  statetype s_fakeshoot5;
  2679. extern  statetype s_fakeshoot6;
  2680. extern  statetype s_fakeshoot7;
  2681. extern  statetype s_fakeshoot8;
  2682. extern  statetype s_fakeshoot9;
  2683.  
  2684. extern  statetype s_fire1;
  2685. extern  statetype s_fire2;
  2686.  
  2687. statetype s_fakestand           = {false,SPR_FAKE_W1,0,(statefunc)T_Stand,NULL,&s_fakestand};
  2688.  
  2689. statetype s_fakechase1          = {false,SPR_FAKE_W1,10,(statefunc)T_Fake,NULL,&s_fakechase1s};
  2690. statetype s_fakechase1s         = {false,SPR_FAKE_W1,3,NULL,NULL,&s_fakechase2};
  2691. statetype s_fakechase2          = {false,SPR_FAKE_W2,8,(statefunc)T_Fake,NULL,&s_fakechase3};
  2692. statetype s_fakechase3          = {false,SPR_FAKE_W3,10,(statefunc)T_Fake,NULL,&s_fakechase3s};
  2693. statetype s_fakechase3s         = {false,SPR_FAKE_W3,3,NULL,NULL,&s_fakechase4};
  2694. statetype s_fakechase4          = {false,SPR_FAKE_W4,8,(statefunc)T_Fake,NULL,&s_fakechase1};
  2695.  
  2696. statetype s_fakedie1            = {false,SPR_FAKE_DIE1,10,NULL,(statefunc)A_DeathScream,&s_fakedie2};
  2697. statetype s_fakedie2            = {false,SPR_FAKE_DIE2,10,NULL,NULL,&s_fakedie3};
  2698. statetype s_fakedie3            = {false,SPR_FAKE_DIE3,10,NULL,NULL,&s_fakedie4};
  2699. statetype s_fakedie4            = {false,SPR_FAKE_DIE4,10,NULL,NULL,&s_fakedie5};
  2700. statetype s_fakedie5            = {false,SPR_FAKE_DIE5,10,NULL,NULL,&s_fakedie6};
  2701. statetype s_fakedie6            = {false,SPR_FAKE_DEAD,0,NULL,NULL,&s_fakedie6};
  2702.  
  2703. statetype s_fakeshoot1          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot2};
  2704. statetype s_fakeshoot2          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot3};
  2705. statetype s_fakeshoot3          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot4};
  2706. statetype s_fakeshoot4          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot5};
  2707. statetype s_fakeshoot5          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot6};
  2708. statetype s_fakeshoot6          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot7};
  2709. statetype s_fakeshoot7          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot8};
  2710. statetype s_fakeshoot8          = {false,SPR_FAKE_SHOOT,8,NULL,(statefunc)T_FakeFire,&s_fakeshoot9};
  2711. statetype s_fakeshoot9          = {false,SPR_FAKE_SHOOT,8,NULL,NULL,&s_fakechase1};
  2712.  
  2713. statetype s_fire1               = {false,SPR_FIRE1,6,NULL,(statefunc)T_Projectile,&s_fire2};
  2714. statetype s_fire2               = {false,SPR_FIRE2,6,NULL,(statefunc)T_Projectile,&s_fire1};
  2715.  
  2716. //
  2717. // hitler
  2718. //
  2719. extern  statetype s_mechachase1;
  2720. extern  statetype s_mechachase1s;
  2721. extern  statetype s_mechachase2;
  2722. extern  statetype s_mechachase3;
  2723. extern  statetype s_mechachase3s;
  2724. extern  statetype s_mechachase4;
  2725.  
  2726. extern  statetype s_mechadie1;
  2727. extern  statetype s_mechadie2;
  2728. extern  statetype s_mechadie3;
  2729. extern  statetype s_mechadie4;
  2730.  
  2731. extern  statetype s_mechashoot1;
  2732. extern  statetype s_mechashoot2;
  2733. extern  statetype s_mechashoot3;
  2734. extern  statetype s_mechashoot4;
  2735. extern  statetype s_mechashoot5;
  2736. extern  statetype s_mechashoot6;
  2737.  
  2738.  
  2739. extern  statetype s_hitlerchase1;
  2740. extern  statetype s_hitlerchase1s;
  2741. extern  statetype s_hitlerchase2;
  2742. extern  statetype s_hitlerchase3;
  2743. extern  statetype s_hitlerchase3s;
  2744. extern  statetype s_hitlerchase4;
  2745.  
  2746. extern  statetype s_hitlerdie1;
  2747. extern  statetype s_hitlerdie2;
  2748. extern  statetype s_hitlerdie3;
  2749. extern  statetype s_hitlerdie4;
  2750. extern  statetype s_hitlerdie5;
  2751. extern  statetype s_hitlerdie6;
  2752. extern  statetype s_hitlerdie7;
  2753. extern  statetype s_hitlerdie8;
  2754. extern  statetype s_hitlerdie9;
  2755. extern  statetype s_hitlerdie10;
  2756.  
  2757. extern  statetype s_hitlershoot1;
  2758. extern  statetype s_hitlershoot2;
  2759. extern  statetype s_hitlershoot3;
  2760. extern  statetype s_hitlershoot4;
  2761. extern  statetype s_hitlershoot5;
  2762. extern  statetype s_hitlershoot6;
  2763.  
  2764. extern  statetype s_hitlerdeathcam;
  2765.  
  2766. statetype s_mechastand          = {false,SPR_MECHA_W1,0,(statefunc)T_Stand,NULL,&s_mechastand};
  2767.  
  2768. statetype s_mechachase1         = {false,SPR_MECHA_W1,10,(statefunc)T_Chase,(statefunc)A_MechaSound,&s_mechachase1s};
  2769. statetype s_mechachase1s        = {false,SPR_MECHA_W1,6,NULL,NULL,&s_mechachase2};
  2770. statetype s_mechachase2         = {false,SPR_MECHA_W2,8,(statefunc)T_Chase,NULL,&s_mechachase3};
  2771. statetype s_mechachase3         = {false,SPR_MECHA_W3,10,(statefunc)T_Chase,(statefunc)A_MechaSound,&s_mechachase3s};
  2772. statetype s_mechachase3s        = {false,SPR_MECHA_W3,6,NULL,NULL,&s_mechachase4};
  2773. statetype s_mechachase4         = {false,SPR_MECHA_W4,8,(statefunc)T_Chase,NULL,&s_mechachase1};
  2774.  
  2775. statetype s_mechadie1           = {false,SPR_MECHA_DIE1,10,NULL,(statefunc)A_DeathScream,&s_mechadie2};
  2776. statetype s_mechadie2           = {false,SPR_MECHA_DIE2,10,NULL,NULL,&s_mechadie3};
  2777. statetype s_mechadie3           = {false,SPR_MECHA_DIE3,10,NULL,(statefunc)A_HitlerMorph,&s_mechadie4};
  2778. statetype s_mechadie4           = {false,SPR_MECHA_DEAD,0,NULL,NULL,&s_mechadie4};
  2779.  
  2780. statetype s_mechashoot1         = {false,SPR_MECHA_SHOOT1,30,NULL,NULL,&s_mechashoot2};
  2781. statetype s_mechashoot2         = {false,SPR_MECHA_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_mechashoot3};
  2782. statetype s_mechashoot3         = {false,SPR_MECHA_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_mechashoot4};
  2783. statetype s_mechashoot4         = {false,SPR_MECHA_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_mechashoot5};
  2784. statetype s_mechashoot5         = {false,SPR_MECHA_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_mechashoot6};
  2785. statetype s_mechashoot6         = {false,SPR_MECHA_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_mechachase1};
  2786.  
  2787.  
  2788. statetype s_hitlerchase1        = {false,SPR_HITLER_W1,6,(statefunc)T_Chase,NULL,&s_hitlerchase1s};
  2789. statetype s_hitlerchase1s       = {false,SPR_HITLER_W1,4,NULL,NULL,&s_hitlerchase2};
  2790. statetype s_hitlerchase2        = {false,SPR_HITLER_W2,2,(statefunc)T_Chase,NULL,&s_hitlerchase3};
  2791. statetype s_hitlerchase3        = {false,SPR_HITLER_W3,6,(statefunc)T_Chase,NULL,&s_hitlerchase3s};
  2792. statetype s_hitlerchase3s       = {false,SPR_HITLER_W3,4,NULL,NULL,&s_hitlerchase4};
  2793. statetype s_hitlerchase4        = {false,SPR_HITLER_W4,2,(statefunc)T_Chase,NULL,&s_hitlerchase1};
  2794.  
  2795. statetype s_hitlerdeathcam      = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie1};
  2796.  
  2797. statetype s_hitlerdie1          = {false,SPR_HITLER_W1,1,NULL,(statefunc)A_DeathScream,&s_hitlerdie2};
  2798. statetype s_hitlerdie2          = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie3};
  2799. statetype s_hitlerdie3          = {false,SPR_HITLER_DIE1,10,NULL,(statefunc)A_Slurpie,&s_hitlerdie4};
  2800. statetype s_hitlerdie4          = {false,SPR_HITLER_DIE2,10,NULL,NULL,&s_hitlerdie5};
  2801. statetype s_hitlerdie5          = {false,SPR_HITLER_DIE3,10,NULL,NULL,&s_hitlerdie6};
  2802. statetype s_hitlerdie6          = {false,SPR_HITLER_DIE4,10,NULL,NULL,&s_hitlerdie7};
  2803. statetype s_hitlerdie7          = {false,SPR_HITLER_DIE5,10,NULL,NULL,&s_hitlerdie8};
  2804. statetype s_hitlerdie8          = {false,SPR_HITLER_DIE6,10,NULL,NULL,&s_hitlerdie9};
  2805. statetype s_hitlerdie9          = {false,SPR_HITLER_DIE7,10,NULL,NULL,&s_hitlerdie10};
  2806. statetype s_hitlerdie10         = {false,SPR_HITLER_DEAD,20,NULL,(statefunc)A_StartDeathCam,&s_hitlerdie10};
  2807.  
  2808. statetype s_hitlershoot1        = {false,SPR_HITLER_SHOOT1,30,NULL,NULL,&s_hitlershoot2};
  2809. statetype s_hitlershoot2        = {false,SPR_HITLER_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_hitlershoot3};
  2810. statetype s_hitlershoot3        = {false,SPR_HITLER_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_hitlershoot4};
  2811. statetype s_hitlershoot4        = {false,SPR_HITLER_SHOOT2,10,NULL,(statefunc)T_Shoot,&s_hitlershoot5};
  2812. statetype s_hitlershoot5        = {false,SPR_HITLER_SHOOT3,10,NULL,(statefunc)T_Shoot,&s_hitlershoot6};
  2813. statetype 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.  
  2825. void 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.  
  2852. void 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.  
  2880. void 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. ////////////////////////////////////////////////////////
  2906. void A_MechaSound (objtype *ob)
  2907. {
  2908.     if (areabyplayer[ob->areanumber])
  2909.         PlaySoundLocActor (MECHSTEPSND,ob);
  2910. }
  2911.  
  2912. void A_Slurpie (objtype *)
  2913. {
  2914.     SD_PlaySound(SLURPIESND);
  2915. }
  2916.  
  2917. /*
  2918. =================
  2919. =
  2920. = T_FakeFire
  2921. =
  2922. =================
  2923. */
  2924.  
  2925. void 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.  
  2972. void 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.  
  3031. STAND
  3032.  
  3033. ============================================================================
  3034. */
  3035.  
  3036.  
  3037. /*
  3038. ===============
  3039. =
  3040. = T_Stand
  3041. =
  3042. ===============
  3043. */
  3044.  
  3045. void T_Stand (objtype *ob)
  3046. {
  3047.     SightPlayer (ob);
  3048. }
  3049.  
  3050.  
  3051. /*
  3052. ============================================================================
  3053.  
  3054. CHASE
  3055.  
  3056. ============================================================================
  3057. */
  3058.  
  3059. /*
  3060. =================
  3061. =
  3062. = T_Chase
  3063. =
  3064. =================
  3065. */
  3066.  
  3067. void 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.  
  3235. void 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.  
  3283. void 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.  
  3364. void 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.  
  3391. void 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.  
  3469. void 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.  
  3556. void 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.  
  3598. void T_BJRun (objtype *ob);
  3599. void T_BJJump (objtype *ob);
  3600. void T_BJDone (objtype *ob);
  3601. void T_BJYell (objtype *ob);
  3602.  
  3603. void T_DeathCam (objtype *ob);
  3604.  
  3605. extern  statetype s_bjrun1;
  3606. extern  statetype s_bjrun1s;
  3607. extern  statetype s_bjrun2;
  3608. extern  statetype s_bjrun3;
  3609. extern  statetype s_bjrun3s;
  3610. extern  statetype s_bjrun4;
  3611.  
  3612. extern  statetype s_bjjump1;
  3613. extern  statetype s_bjjump2;
  3614. extern  statetype s_bjjump3;
  3615. extern  statetype s_bjjump4;
  3616.  
  3617.  
  3618. statetype s_bjrun1              = {false,SPR_BJ_W1,12,(statefunc)T_BJRun,NULL,&s_bjrun1s};
  3619. statetype s_bjrun1s             = {false,SPR_BJ_W1,3, NULL,NULL,&s_bjrun2};
  3620. statetype s_bjrun2              = {false,SPR_BJ_W2,8,(statefunc)T_BJRun,NULL,&s_bjrun3};
  3621. statetype s_bjrun3              = {false,SPR_BJ_W3,12,(statefunc)T_BJRun,NULL,&s_bjrun3s};
  3622. statetype s_bjrun3s             = {false,SPR_BJ_W3,3, NULL,NULL,&s_bjrun4};
  3623. statetype s_bjrun4              = {false,SPR_BJ_W4,8,(statefunc)T_BJRun,NULL,&s_bjrun1};
  3624.  
  3625.  
  3626. statetype s_bjjump1             = {false,SPR_BJ_JUMP1,14,(statefunc)T_BJJump,NULL,&s_bjjump2};
  3627. statetype s_bjjump2             = {false,SPR_BJ_JUMP2,14,(statefunc)T_BJJump,(statefunc)T_BJYell,&s_bjjump3};
  3628. statetype s_bjjump3             = {false,SPR_BJ_JUMP3,14,(statefunc)T_BJJump,NULL,&s_bjjump4};
  3629. statetype s_bjjump4             = {false,SPR_BJ_JUMP4,300,NULL,(statefunc)T_BJDone,&s_bjjump4};
  3630.  
  3631.  
  3632. statetype s_deathcam            = {false,0,0,NULL,NULL,NULL};
  3633.  
  3634.  
  3635. /*
  3636. ===============
  3637. =
  3638. = SpawnBJVictory
  3639. =
  3640. ===============
  3641. */
  3642.  
  3643. void 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.  
  3663. void 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.  
  3701. void 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.  
  3718. void T_BJYell (objtype *ob)
  3719. {
  3720.     PlaySoundLocActor(YEAHSND,ob);  // JAB
  3721. }
  3722.  
  3723.  
  3724. /*
  3725. ===============
  3726. =
  3727. = T_BJDone
  3728. =
  3729. ===============
  3730. */
  3731.  
  3732. void T_BJDone (objtype *)
  3733. {
  3734.     playstate = ex_victorious;                              // exit castle tile
  3735. }
  3736.  
  3737.  
  3738.  
  3739. //===========================================================================
  3740.  
  3741.  
  3742. /*
  3743. ===============
  3744. =
  3745. = CheckPosition
  3746. =
  3747. ===============
  3748. */
  3749.  
  3750. boolean 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.  
  3786. void    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
  3900.