1 /* Catacomb Apocalypse Source Code
\r
2 * Copyright (C) 1993-2014 Flat Rock Software
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License along
\r
15 * with this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
26 =============================================================================
\r
30 =============================================================================
\r
33 boolean ShootPlayer (objtype *ob, short obclass, short speed, statetype *state);
\r
34 void T_ShootPlayer(objtype *ob);
\r
36 short head_base_delay;
\r
39 =============================================================================
\r
43 =============================================================================
\r
47 void T_ShooterObj(objtype *ob);
\r
49 void SpawnRamBone(int tilex, int tiley);
\r
50 void T_SkeletonShoot(objtype *ob);
\r
51 void SpawnFutureMage (int tilex, int tiley);
\r
52 void T_FMageShoot(objtype *ob);
\r
53 void SpawnRoboTank(int tilex, int tiley);
\r
54 void T_RoboTankShoot(objtype *ob);
\r
55 void SpawnStompy(int tilex, int tiley);
\r
56 void T_StompyShoot(objtype *ob);
\r
57 void SpawnBug(int tilex, int tiley);
\r
58 void T_BugShoot(objtype *ob);
\r
59 void SpawnShooterEye(int tilex, int tiley);
\r
60 void T_EyeShootPlayer(objtype *ob);
\r
61 void SpawnRunningEye(int tilex, int tiley);
\r
62 void T_RunningEye(objtype *ob);
\r
66 =============================================================================
\r
70 =============================================================================
\r
72 void LargeSound (objtype *ob)
\r
74 if (ob->temp1 != SOUNDPLAYED)
\r
76 SD_PlaySound(LARGEMONSTERSND);
\r
77 ob->temp1 = SOUNDPLAYED;
\r
84 =============================================================================
\r
88 =============================================================================
\r
90 void SmallSound (objtype *ob)
\r
92 if (ob->temp1 != SOUNDPLAYED)
\r
94 SD_PlaySound(SMALLMONSTERSND);
\r
95 ob->temp1 = SOUNDPLAYED;
\r
103 =============================================================================
\r
107 =============================================================================
\r
111 statetype s_skel_1 = {RAMBONEWALK1PIC, 10, &T_ShooterObj, &s_skel_2};
\r
112 statetype s_skel_2 = {RAMBONEWALK2PIC, 10, &T_ShooterObj, &s_skel_3};
\r
113 statetype s_skel_3 = {RAMBONEWALK3PIC, 10, &T_ShooterObj, &s_skel_4};
\r
114 statetype s_skel_4 = {RAMBONEWALK4PIC, 10, &T_ShooterObj, &s_skel_1};
\r
116 statetype s_skel_attack1 = {RAMBONEATTACK1PIC, 12, NULL, &s_skel_attack2};
\r
117 statetype s_skel_attack2 = {RAMBONEATTACK2PIC, 20, NULL, &s_skel_attack3};
\r
118 statetype s_skel_attack3 = {RAMBONEATTACK2PIC, -1, T_SkeletonShoot, &s_skel_attack4};
\r
119 statetype s_skel_attack4 = {RAMBONEATTACK3PIC, 20, NULL, &s_skel_ouch};
\r
121 statetype s_skel_ouch = {RAMBONEATTACK1PIC, 10, NULL, &s_skel_1};
\r
123 statetype s_skel_die1 = {RAMBONEDEATH1PIC, 40, NULL, &s_skel_die2};
\r
124 statetype s_skel_die2 = {RAMBONEDEATH2PIC, 30, NULL, &s_skel_die3};
\r
125 statetype s_skel_die3 = {RAMBONEDEATH3PIC, 20, &LargeSound, NULL};
\r
127 statetype s_skel_shot1 = {RAMBONESHOT1PIC, 10, &T_ShootPlayer, &s_skel_shot2};
\r
128 statetype s_skel_shot2 = {RAMBONESHOT2PIC, 10, &T_ShootPlayer, &s_skel_shot1};
\r
130 #define shooter_mode ob->temp1
\r
131 #define shooter_delay ob->temp2
\r
141 void SpawnRamBone(int tilex, int tiley)
\r
143 SpawnNewObj(tilex, tiley, &s_skel_1,PIXRADIUS*20);
\r
144 new->obclass = ramboneobj;
\r
146 new->flags |= of_shootable;
\r
147 new->hitpoints = EasyHitPoints(12);
\r
158 void T_SkeletonShoot(objtype *ob)
\r
160 ShootPlayer(ob, rbshotobj, MSHOTSPEED, &s_skel_shot1);
\r
166 =============================================================================
\r
170 =============================================================================
\r
173 statetype s_fmage1 = {FMAGEWALK1PIC, 20, &T_ShooterObj, &s_fmage2};
\r
174 statetype s_fmage2 = {FMAGEWALK2PIC, 20, &T_ShooterObj, &s_fmage3};
\r
175 statetype s_fmage3 = {FMAGEWALK3PIC, 20, &T_ShooterObj, &s_fmage1};
\r
177 statetype s_fmageattack1 = {FMAGEATTACK1PIC, 20, NULL, &s_fmageattack2};
\r
178 statetype s_fmageattack2 = {FMAGEATTACK1PIC, -1, &T_FMageShoot, &s_fmageattack3};
\r
179 statetype s_fmageattack3 = {FMAGEATTACK2PIC, 30, NULL, &s_fmage1};
\r
181 statetype s_fmageouch = {FMAGEATTACK1PIC, 10, NULL, &s_fmage1};
\r
183 statetype s_fmagedie1 = {FMAGEDEATH1PIC, 40, NULL, &s_fmagedie2};
\r
184 statetype s_fmagedie2 = {FMAGEDEATH2PIC, 30, &SmallSound, &s_fmagedie3};
\r
185 statetype s_fmagedie3 = {FMAGEDEATH3PIC, 0, NULL, &s_fmagedie3};
\r
187 statetype s_fmshot1 = {FMAGESHOT1PIC, 8, &T_ShootPlayer, &s_fmshot2};
\r
188 statetype s_fmshot2 = {FMAGESHOT2PIC, 8, &T_ShootPlayer, &s_fmshot1};
\r
198 void SpawnFutureMage (int tilex, int tiley)
\r
200 SpawnNewObj(tilex, tiley, &s_fmage1, PIXRADIUS*15);
\r
201 new->obclass = fmageobj;
\r
203 new->flags |= of_shootable;
\r
204 new->hitpoints = EasyHitPoints(12);
\r
215 void T_FMageShoot(objtype *ob)
\r
217 ShootPlayer(ob, fmshotobj, MSHOTSPEED, &s_fmshot1);
\r
223 =============================================================================
\r
227 =============================================================================
\r
230 statetype s_robotank_walk1 = {ROBOTANKWALK1PIC, 15, &T_ShooterObj, &s_robotank_walk2};
\r
231 statetype s_robotank_walk2 = {ROBOTANKWALK2PIC, 15, &T_ShooterObj, &s_robotank_walk3};
\r
232 statetype s_robotank_walk3 = {ROBOTANKWALK3PIC, 15, &T_ShooterObj, &s_robotank_walk4};
\r
233 statetype s_robotank_walk4 = {ROBOTANKWALK4PIC, 15, &T_ShooterObj, &s_robotank_walk1};
\r
235 statetype s_robotank_attack1 = {ROBOTANKWALK1PIC, 15, NULL, &s_robotank_attack2};
\r
236 statetype s_robotank_attack2 = {ROBOTANKATTACK1PIC, 15, NULL, &s_robotank_attack3};
\r
237 statetype s_robotank_attack3 = {ROBOTANKATTACK1PIC, -1, &T_RoboTankShoot, &s_robotank_attack4};
\r
238 statetype s_robotank_attack4 = {ROBOTANKWALK1PIC, 15, NULL, &s_robotank_walk1};
\r
240 statetype s_robotank_death1 = {ROBOTANKDEATH1PIC, 8, NULL, &s_robotank_death2};
\r
241 statetype s_robotank_death2 = {ROBOTANKDEATH2PIC, 8, NULL, &s_robotank_death3};
\r
242 statetype s_robotank_death3 = {ROBOTANKDEATH2PIC, -1, &T_AlternateStates, &s_robotank_death1};
\r
243 statetype s_robotank_death4 = {ROBOTANKDEATH3PIC, 25, &ExplosionSnd, &s_robotank_death5};
\r
244 statetype s_robotank_death5 = {ROBOTANKDEATH4PIC, 20, NULL, &s_robotank_death5};
\r
246 statetype s_robotank_shot1 = {PSHOT1PIC, 10, &T_ShootPlayer, &s_robotank_shot2};
\r
247 statetype s_robotank_shot2 = {PSHOT2PIC, 10, &T_ShootPlayer, &s_robotank_shot1};
\r
257 void SpawnRoboTank(int tilex, int tiley)
\r
259 SpawnNewObj(tilex, tiley, &s_robotank_walk1, PIXRADIUS*35);
\r
260 new->obclass = robotankobj;
\r
262 new->flags |= of_shootable;
\r
263 new->hitpoints = EasyHitPoints(25);
\r
274 void T_RoboTankShoot(objtype *ob)
\r
276 ShootPlayer(ob, rtshotobj, 7000, &s_robotank_shot1);
\r
282 ====================
\r
284 = T_AlternateStates
\r
286 ====================
\r
288 void T_AlternateStates(objtype *ob)
\r
292 ob->state = ob->state->next;
\r
296 if (ob->state == &s_robotank_death3)
\r
297 ob->state = &s_robotank_death4;
\r
299 ob->state = &s_aqua_die4;
\r
301 ob->ticcount = ob->state->tictime;
\r
310 =============================================================================
\r
314 =============================================================================
\r
317 statetype s_stompy_walk1 = {STOMPYWALK1PIC, 15, &T_ShooterObj, &s_stompy_walk2};
\r
318 statetype s_stompy_walk2 = {STOMPYWALK2PIC, 15, &T_ShooterObj, &s_stompy_walk3};
\r
319 statetype s_stompy_walk3 = {STOMPYWALK3PIC, 15, &T_ShooterObj, &s_stompy_walk4};
\r
320 statetype s_stompy_walk4 = {STOMPYWALK4PIC, 15, &T_ShooterObj, &s_stompy_walk1};
\r
322 statetype s_stompy_attack1 = {STOMPYATTACK1PIC, 10, NULL, &s_stompy_attack2};
\r
323 statetype s_stompy_attack2 = {STOMPYATTACK2PIC, 15, NULL, &s_stompy_attack3};
\r
324 statetype s_stompy_attack3 = {STOMPYATTACK2PIC, -1, T_StompyShoot, &s_stompy_attack4};
\r
325 statetype s_stompy_attack4 = {STOMPYATTACK1PIC, 10, NULL, &s_stompy_walk1};
\r
327 statetype s_stompy_ouch = {STOMPYATTACK1PIC, 10, NULL, &s_stompy_walk2};
\r
329 statetype s_stompy_death1 = {STOMPYDEATH1PIC, 45, &ExplosionSnd, &s_stompy_death2};
\r
330 statetype s_stompy_death2 = {STOMPYDEATH2PIC, 30, NULL, &s_stompy_death3};
\r
331 statetype s_stompy_death3 = {STOMPYDEATH3PIC, 25, NULL, &s_stompy_death4};
\r
332 statetype s_stompy_death4 = {STOMPYDEATH4PIC, 20, NULL, NULL};
\r
334 statetype s_stompy_shot1 = {STOMPYSHOT1PIC, 6, &T_ShootPlayer, &s_stompy_shot2};
\r
335 statetype s_stompy_shot2 = {STOMPYSHOT2PIC, 6, &T_ShootPlayer, &s_stompy_shot3};
\r
336 statetype s_stompy_shot3 = {STOMPYSHOT1PIC, 6, &T_ShootPlayer, &s_stompy_shot4};
\r
337 statetype s_stompy_shot4 = {STOMPYSHOT3PIC, 6, &T_ShootPlayer, &s_stompy_shot5};
\r
338 statetype s_stompy_shot5 = {STOMPYSHOT4PIC, 6, &T_ShootPlayer, &s_stompy_shot4};
\r
348 void SpawnStompy(int tilex, int tiley)
\r
350 SpawnNewObj(tilex, tiley, &s_stompy_walk1, PIXRADIUS*25);
\r
351 new->obclass = stompyobj;
\r
353 new->flags |= of_shootable;
\r
354 new->hitpoints = EasyHitPoints(20);
\r
365 void T_StompyShoot(objtype *ob)
\r
367 ShootPlayer(ob, syshotobj, 8500, &s_stompy_shot1);
\r
373 =============================================================================
\r
377 =============================================================================
\r
380 statetype s_bug_walk1 = {BUG_WALK1PIC, 15, &T_ShooterObj, &s_bug_walk2};
\r
381 statetype s_bug_walk2 = {BUG_WALK2PIC, 15, &T_ShooterObj, &s_bug_walk3};
\r
382 statetype s_bug_walk3 = {BUG_WALK3PIC, 15, &T_ShooterObj, &s_bug_walk1};
\r
384 statetype s_bug_attack1 = {BUG_ATTACK1PIC, 20, NULL, &s_bug_attack2};
\r
385 statetype s_bug_attack2 = {BUG_ATTACK2PIC, 20, NULL, &s_bug_attack3};
\r
386 statetype s_bug_attack3 = {BUG_ATTACK2PIC, -1, &T_BugShoot, &s_bug_attack4};
\r
387 statetype s_bug_attack4 = {BUG_ATTACK1PIC, 15, NULL, &s_bug_walk1};
\r
389 statetype s_bug_ouch = {BUG_WALK1PIC, 10, NULL, &s_bug_walk2};
\r
391 statetype s_bug_death1 = {BUG_DEATH1PIC, 35, &SmallSound, &s_bug_death2};
\r
392 statetype s_bug_death2 = {BUG_DEATH2PIC, 10, NULL, &s_bug_death2};
\r
394 statetype s_bug_shot1 = {BUG_SHOT1PIC, 10, &T_ShootPlayer, &s_bug_shot2};
\r
395 statetype s_bug_shot2 = {BUG_SHOT2PIC, 10, &T_ShootPlayer, &s_bug_shot1};
\r
405 void SpawnBug(int tilex, int tiley)
\r
407 SpawnNewObj(tilex, tiley, &s_bug_walk1, PIXRADIUS*20);
\r
408 new->obclass = bugobj;
\r
410 new->flags |= of_shootable;
\r
411 new->hitpoints = EasyHitPoints(10);
\r
422 void T_BugShoot(objtype *ob)
\r
424 ShootPlayer(ob, bgshotobj, 8000, &s_bug_shot1);
\r
432 =============================================================================
\r
436 =============================================================================
\r
439 void T_EyeShootPlayer (objtype *ob);
\r
441 statetype s_eye_pause = {EYE_WALK1PIC,40,NULL,&s_eye_2};
\r
443 statetype s_eye_1 = {EYE_WALK1PIC,20,T_ShooterObj,&s_eye_2};
\r
444 statetype s_eye_2 = {EYE_WALK2PIC,20,T_ShooterObj,&s_eye_3};
\r
445 statetype s_eye_3 = {EYE_WALK3PIC,20,T_ShooterObj,&s_eye_4};
\r
446 statetype s_eye_4 = {EYE_WALK2PIC,20,T_ShooterObj,&s_eye_1};
\r
447 statetype s_eye_shootplayer_1 = {EYE_WALK1PIC,1,T_EyeShootPlayer,&s_eye_shootplayer_2};
\r
448 statetype s_eye_shootplayer_2 = {EYE_WALK1PIC,20,NULL,&s_eye_1};
\r
450 statetype s_eye_ouch = {EYE_OUCH1PIC,8,NULL,&s_eye_ouch2};
\r
451 statetype s_eye_ouch2 = {EYE_OUCH2PIC,8,NULL,&s_eye_1};
\r
453 statetype s_eye_die1 = {EYE_DEATH1PIC,22,NULL,&s_eye_die2};
\r
454 statetype s_eye_die2 = {EYE_DEATH2PIC,22,&SmallSound,&s_eye_die3};
\r
455 statetype s_eye_die3 = {EYE_DEATH3PIC,22,NULL,&s_eye_die4};
\r
456 statetype s_eye_die4 = {EYE_DEATH4PIC,22,NULL,&s_eye_die4};
\r
458 statetype s_eshot1 = {EYE_SHOT1PIC,8,&T_ShootPlayer,&s_eshot2};
\r
459 statetype s_eshot2 = {EYE_SHOT2PIC,8,&T_ShootPlayer,&s_eshot1};
\r
462 //-------------------------------------------------------------------------
\r
464 //-------------------------------------------------------------------------
\r
465 void SpawnShooterEye(int tilex, int tiley)
\r
469 SpawnNewObj(tilex,tiley,&s_eye_1,PIXRADIUS*10);
\r
471 new->obclass = eyeobj;
\r
473 new->flags |= of_shootable;
\r
474 new->hitpoints = EasyHitPoints(15);
\r
475 shooter_mode = sm_other1;
\r
479 //---------------------------------------------------------------------------
\r
480 // T_EyeShootPlayer
\r
481 //---------------------------------------------------------------------------
\r
482 void T_EyeShootPlayer (objtype *ob)
\r
484 ShootPlayer(ob, eshotobj, ESHOTSPEED, &s_eshot1);
\r
494 = ***NOTE*** This routine controls the thinks for the RamBone, RoboTank,
\r
495 = ********** Stompy, Future Mage, Bug, and Old Mage
\r
500 void T_ShooterObj(objtype *ob)
\r
503 unsigned temp_tilex,temp_tiley;
\r
506 shooter_delay -= realtics;
\r
507 if (shooter_delay < 0)
\r
509 shooter_mode = random(sm_dummy);
\r
510 shooter_delay = random(10*60)+random(50);
\r
515 temp_tilex = player->tilex;
\r
516 temp_tiley = player->tiley;
\r
519 switch (shooter_mode)
\r
525 player->x = ((long)other_x[shooter_mode]<<TILESHIFT)+TILEGLOBAL/2;
\r
526 player->y = ((long)other_y[shooter_mode]<<TILESHIFT)+TILEGLOBAL/2;
\r
527 player->tilex = other_x[shooter_mode];
\r
528 player->tiley = other_y[shooter_mode];
\r
532 if (Chase(ob,true))
\r
537 player->tilex = temp_tilex;
\r
538 player->tiley = temp_tiley;
\r
540 angle = AngleNearPlayer(ob);
\r
543 // Handle shooting for the different characters controlled by this think.
\r
544 switch (ob->obclass)
\r
547 if (!random(2) && (angle != -1))
\r
549 ob->state = &s_skel_attack1;
\r
550 ob->ticcount = ob->state->tictime;
\r
555 if (!random(8) && (angle != -1))
\r
557 ob->state = &s_fmageattack1;
\r
558 ob->ticcount = ob->state->tictime;
\r
563 if (!random(15) && (angle != -1))
\r
565 ob->state = &s_robotank_attack1;
\r
566 ob->ticcount = ob->state->tictime;
\r
573 ob->state = &s_stompy_attack1;
\r
574 ob->ticcount = ob->state->tictime;
\r
579 if (!random(5) && (angle != -1))
\r
581 ob->state = &s_bug_attack1;
\r
582 ob->ticcount = ob->state->tictime;
\r
587 if (!random(2) && (angle != -1))
\r
589 ob->state = &s_eye_shootplayer_1;
\r
590 ob->ticcount = ob->state->tictime;
\r
602 =============================================================================
\r
606 =============================================================================
\r
609 statetype s_reye_1 = {EYE_WALK1PIC, 20, &T_RunningEye, &s_reye_2};
\r
610 statetype s_reye_2 = {EYE_WALK2PIC, 20, &T_RunningEye, &s_reye_3};
\r
611 statetype s_reye_3 = {EYE_WALK3PIC, 20, &T_RunningEye, &s_reye_4};
\r
612 statetype s_reye_4 = {EYE_WALK2PIC, 20, &T_RunningEye, &s_reye_1};
\r
614 statetype s_reye_ouch = {EYE_OUCH1PIC, 8, NULL, &s_reye_ouch2};
\r
615 statetype s_reye_ouch2 = {EYE_OUCH2PIC, 8, NULL, &s_reye_1};
\r
617 statetype s_reye_die1 = {EYE_DEATH1PIC, 22, NULL, &s_reye_die2};
\r
618 statetype s_reye_die2 = {EYE_DEATH2PIC, 22, &SmallSound, &s_reye_die3};
\r
619 statetype s_reye_die3 = {EYE_DEATH3PIC, 22, NULL, &s_reye_die4};
\r
620 statetype s_reye_die4 = {EYE_DEATH4PIC, 22, NULL, &s_reye_die4};
\r
623 ====================
\r
625 = SpawnRunningEye()
\r
627 ====================
\r
629 void SpawnRunningEye(int tilex, int tiley)
\r
631 SpawnNewObj(tilex,tiley,&s_reye_1,PIXRADIUS*25);
\r
632 new->obclass = reyeobj;
\r
634 new->flags |= of_shootable;
\r
635 new->hitpoints = EasyHitPoints(15);
\r
636 new->temp2 = (*(mapsegs[2]+farmapylookup[tiley+1]+tilex))>>8;
\r
637 *(mapsegs[2]+farmapylookup[tiley+1]+tilex) = 0;
\r
642 Quit("Initialize the running eye!\n");
\r
647 ====================
\r
651 ====================
\r
653 void T_RunningEye(objtype *ob)
\r
655 int x, y, dir_num, switch_num;
\r
657 unsigned temp_tilex,temp_tiley;
\r
659 dir_num = *(mapsegs[2]+farmapylookup[ob->tiley]+ob->tilex);
\r
660 dir_num = dir_num>>8;
\r
663 dir_num = ob->temp2;
\r
674 actorat[ob->tilex][ob->tiley] = 0;
\r
678 ob->tiley = ob->tiley-1;
\r
679 ob->y = ((long)(ob->tiley)<<TILESHIFT)+TILEGLOBAL/2;
\r
683 ob->tilex = ob->tilex+1;
\r
684 ob->x = ((long)(ob->tilex)<<TILESHIFT)+TILEGLOBAL/2;
\r
688 ob->tiley = ob->tiley+1;
\r
689 ob->y = ((long)(ob->tiley)<<TILESHIFT)+TILEGLOBAL/2;
\r
694 ob->tilex = ob->tilex-1;
\r
695 ob->x = ((long)(ob->tilex)<<TILESHIFT)+TILEGLOBAL/2;
\r
699 ChaseThink(ob,false);
\r
700 actorat[ob->tilex][ob->tiley] = ob;
\r
707 temp_tilex = player->tilex;
\r
708 temp_tiley = player->tiley;
\r
711 switch_num = ob->temp2;
\r
713 switch_num = dir_num;
\r
715 switch (switch_num)
\r
718 player->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
\r
719 player->y = ((long)(ob->tiley-2)<<TILESHIFT)+TILEGLOBAL/2;
\r
720 player->tilex = ob->tilex;
\r
721 player->tiley = ob->tiley-2;
\r
725 player->x = ((long)(ob->tilex+2)<<TILESHIFT)+TILEGLOBAL/2;
\r
726 player->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
\r
727 player->tilex = ob->tilex+2;
\r
728 player->tiley = ob->tiley;
\r
732 player->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
\r
733 player->y = ((long)(ob->tiley+2)<<TILESHIFT)+TILEGLOBAL/2;
\r
734 player->tilex = ob->tilex;
\r
735 player->tiley = ob->tiley+2;
\r
740 player->x = ((long)(ob->tilex-2)<<TILESHIFT)+TILEGLOBAL/2;
\r
741 player->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
\r
742 player->tilex = ob->tilex-2;
\r
743 player->tiley = ob->tiley;
\r
751 player->tilex = temp_tilex;
\r
752 player->tiley = temp_tiley;
\r
755 ob->temp2 = dir_num;
\r
760 =============================================================================
\r
764 =============================================================================
\r
767 void T_Head(objtype *ob);
\r
769 statetype s_head = {HEADPIC, 20, &T_Head, &s_head};
\r
771 statetype s_head_shot1 = {PSHOT1PIC, 10, &T_ShootPlayer, &s_head_shot2};
\r
772 statetype s_head_shot2 = {PSHOT2PIC, 10, &T_ShootPlayer, &s_head_shot1};
\r
776 ===================
\r
778 = SpawnEgyptianHead
\r
780 ===================
\r
783 void SpawnEgyptianHead (int tilex, int tiley)
\r
786 short current_head_delay;
\r
789 SpawnNewObj(tilex, tiley, &s_head, PIXRADIUS*35);
\r
791 head_mode = h_wait_to_rise;
\r
793 tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
795 head_delay = (tile>>8)*30;
\r
798 current_head_delay = (3*60)+random(3*60);
\r
799 head_delay = head_base_delay+current_head_delay;
\r
800 head_base_delay += current_head_delay;
\r
801 if (head_base_delay > 8*60)
\r
802 head_base_delay = 0;
\r
805 new->obclass = realsolidobj;
\r
807 new->flags |= of_shootable;
\r
812 //--------------------------------------------------------------------------
\r
814 //--------------------------------------------------------------------------
\r
815 void T_Head(objtype *ob)
\r
818 unsigned temp_tilex,temp_tiley;
\r
823 case h_wait_to_rise:
\r
824 if (head_delay < 0)
\r
826 if ((ob->tilex == player->tilex) && (ob->tiley == player->tiley))
\r
828 if (CheckHandAttack(ob))
\r
831 ob->obclass = headobj;
\r
832 ob->active = always;
\r
833 head_mode = h_active;
\r
834 head_delay = random(100)+random(60);
\r
835 ob->hitpoints = EasyHitPoints(16);
\r
838 head_delay -= tics;
\r
849 if (!random(2) && (angle != -1))
\r
850 ShootPlayer(ob, hshotobj, 10000, &s_head_shot1);
\r
852 head_delay -= tics;
\r
853 if (head_delay < 0)
\r
855 head_mode = random(h_other4)+1;
\r
856 head_delay = random(10*60)+random(50);
\r
867 temp_tilex = player->tilex;
\r
868 temp_tiley = player->tiley;
\r
870 player->x = ((long)other_x[head_mode]<<TILESHIFT)+TILEGLOBAL/2;
\r
871 player->y = ((long)other_y[head_mode]<<TILESHIFT)+TILEGLOBAL/2;
\r
872 player->tilex = other_x[head_mode];
\r
873 player->tiley = other_y[head_mode];
\r
875 if (Chase(ob,true))
\r
880 player->tilex = temp_tilex;
\r
881 player->tiley = temp_tiley;
\r
883 head_delay -= tics;
\r
884 if (head_delay <= 0)
\r
886 head_mode = h_active;
\r
887 head_delay = random(10*60)+random(50);
\r