1 /* Catacomb Armageddon 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
25 =============================================================================
\r
29 =============================================================================
\r
31 void SpawnSkeleton(int tilex, int tiley);
\r
34 #define MSHOTDAMAGE 2
\r
35 #define MSHOTSPEED 10000
\r
37 #define ESHOTDAMAGE 1
\r
38 #define ESHOTSPEED 5000
\r
40 #define SSHOTDAMAGE 3
\r
41 #define SSHOTSPEED 6500
\r
43 #define RANDOM_ATTACK 20
\r
47 =============================================================================
\r
51 =============================================================================
\r
54 boolean ShootPlayer (objtype *ob, short obclass, short speed, statetype *state);
\r
55 void T_ShootPlayer(objtype *ob);
\r
58 =============================================================================
\r
62 =============================================================================
\r
68 =============================================================================
\r
72 =============================================================================
\r
75 void T_WallSkeleton(objtype *ob);
\r
77 statetype s_wallskel = {0,40,T_WallSkeleton,&s_wallskel};
\r
78 statetype s_wallskel2 = {0,1,NULL,NULL};
\r
81 enum wskel_modes {ws_wall1,ws_wall2,ws_wall3,ws_exit};
\r
82 //enum wskel_modes {ws_wall1,ws_exit};
\r
84 #define wskel_mode ob->temp1
\r
85 #define wskel_delay ob->temp2
\r
86 #define wskel_base ob->angle
\r
87 #define wskel_wallx ob->hitpoints
\r
88 #define wskel_wally ob->speed
\r
97 void SpawnWallSkeleton(int tilex, int tiley)
\r
99 char xofs[] = {0,0,-1,+1};
\r
100 char yofs[] = {-1,+1,0,0};
\r
103 int wallx=tilex,wally=tiley,wallbase,wallmode,loop;
\r
104 unsigned tile,current_delay;
\r
106 for (loop=0; loop<4; loop++)
\r
108 tile = *(mapsegs[0]+farmapylookup[tiley+yofs[loop]]+tilex+xofs[loop]);
\r
111 // case WALL_SKELETON_CODE:
\r
112 // case WALL_SKELETON_CODE+1:
\r
113 // case WALL_SKELETON_CODE+2:
\r
114 // wallmode = ws_wall1+(tile-WALL_SKELETON_CODE);
\r
115 // wallbase = WALL_SKELETON_CODE;
\r
122 wallmode = ws_wall1+(tile-66);
\r
129 wallmode = ws_wall1+(tile-67);
\r
139 wallx += xofs[loop];
\r
140 wally += yofs[loop];
\r
142 SpawnNewObj(tilex,tiley,&s_wallskel,PIXRADIUS*35);
\r
144 new->obclass = wallskelobj;
\r
146 new->flags &= ~of_shootable;
\r
147 new->hitpoints = 12;
\r
149 // new->tilex = wallx;
\r
150 // new->tiley = wally;
\r
151 wskel_wallx = wallx;
\r
152 wskel_wally = wally;
\r
153 wskel_base = wallbase;
\r
156 wskel_mode = wallmode;
\r
158 tile = *(mapsegs[2]+farmapylookup[wally]+wallx);
\r
160 wskel_delay = (tile>>8)*30;
\r
163 current_delay = (2*60)+random(4*60);
\r
164 wskel_delay = zombie_base_delay+current_delay;
\r
165 zombie_base_delay += current_delay;
\r
166 if (zombie_base_delay > 8*60)
\r
167 zombie_base_delay = 0;
\r
178 void T_WallSkeleton(objtype *ob)
\r
180 int x=wskel_wallx,y=wskel_wally;
\r
182 wskel_delay -= realtics;
\r
183 if (wskel_delay > 0)
\r
186 switch (wskel_mode)
\r
189 if ((wskel_base == 66) || (wskel_base == 67))
\r
193 (unsigned)actorat[x][y]
\r
195 = *(mapsegs[0]+farmapylookup[y]+x)
\r
196 = wskel_base+(wskel_mode-ws_wall1);
\r
199 wskel_delay = (120);
\r
200 ob->active = always;
\r
204 (unsigned)actorat[x][y]
\r
206 = *(mapsegs[0]+farmapylookup[y]+x)
\r
209 ob->tilex = ob->x >> TILESHIFT;
\r
210 ob->tiley = ob->y >> TILESHIFT;
\r
212 ob->obclass = skeletonobj;
\r
214 ob->flags |= of_shootable;
\r
215 ob->hitpoints = 12;
\r
216 ob->state = &s_skel_1;
\r
217 ob->ticcount = ob->state->tictime;
\r
224 =============================================================================
\r
228 =============================================================================
\r
231 void T_Skeleton(objtype *ob);
\r
236 statetype s_skel_pause = {SKELETON_1PIC,40,NULL,&s_skel_2};
\r
238 statetype s_skel_1 = {SKELETON_1PIC,10,T_Skeleton,&s_skel_2};
\r
239 statetype s_skel_2 = {SKELETON_2PIC,10,T_Skeleton,&s_skel_3};
\r
240 statetype s_skel_3 = {SKELETON_3PIC,10,T_Skeleton,&s_skel_4};
\r
241 statetype s_skel_4 = {SKELETON_4PIC,10,T_Skeleton,&s_skel_1};
\r
243 statetype s_skel_attack1 = {SKELETON_ATTACK_1PIC,12,NULL,&s_skel_attack2};
\r
244 statetype s_skel_attack2 = {SKELETON_ATTACK_2PIC,12,NULL,&s_skel_attack3};
\r
245 statetype s_skel_attack3 = {SKELETON_ATTACK_3PIC,12,T_DoDamage,&s_skel_pause};
\r
247 statetype s_skel_ouch = {SKELETON_OUCHPIC,8,NULL,&s_skel_1};
\r
249 statetype s_skel_die1 = {SKELETON_OUCHPIC,18,NULL,&s_skel_die2};
\r
250 statetype s_skel_die2 = {SKELETON_DEATH_1PIC,18,NULL,&s_skel_die3};
\r
251 statetype s_skel_die3 = {SKELETON_DEATH_2PIC,18,NULL,&s_skel_die3};
\r
260 void SpawnSkeleton(int tilex, int tiley)
\r
262 SpawnNewObj(tilex,tiley,&s_skel_1,PIXRADIUS*35);
\r
263 new->obclass = skeletonobj;
\r
265 new->flags |= of_shootable;
\r
266 new->hitpoints = EasyHitPoints(12);
\r
278 void T_Skeleton(objtype *ob)
\r
280 if (Chase (ob,true) || (random(1000)<RANDOM_ATTACK))
\r
282 ob->state = &s_skel_attack1;
\r
283 ob->ticcount = ob->state->tictime;
\r
289 =============================================================================
\r
293 =============================================================================
\r
296 void T_EyeMage (objtype *ob);
\r
297 boolean T_EyeShoot (objtype *ob, boolean eyeshot);
\r
298 void T_EyeShootPlayer (objtype *ob);
\r
300 extern statetype s_eye_shootplayer_1;
\r
301 extern statetype s_eye_shootplayer_2;
\r
303 statetype s_eye_pause = {EYE_WALK1PIC,40,NULL,&s_eye_2};
\r
305 statetype s_eye_1 = {EYE_WALK1PIC,20,T_EyeMage,&s_eye_2};
\r
306 statetype s_eye_2 = {EYE_WALK2PIC,20,T_EyeMage,&s_eye_3};
\r
307 statetype s_eye_3 = {EYE_WALK3PIC,20,T_EyeMage,&s_eye_4};
\r
308 statetype s_eye_4 = {EYE_WALK2PIC,20,T_EyeMage,&s_eye_1};
\r
309 statetype s_eye_shootplayer_1 = {EYE_SCOWLPIC,1,T_EyeShootPlayer,&s_eye_shootplayer_2};
\r
310 statetype s_eye_shootplayer_2 = {EYE_SCOWLPIC,20,NULL,&s_eye_1};
\r
312 statetype s_eye_ouch = {EYE_OUCH1PIC,8,NULL,&s_eye_ouch2};
\r
313 statetype s_eye_ouch2 = {EYE_OUCH2PIC,8,NULL,&s_eye_1};
\r
315 statetype s_eye_die1 = {EYE_DEATH1PIC,22,NULL,&s_eye_die2};
\r
316 statetype s_eye_die2 = {EYE_DEATH2PIC,22,NULL,&s_eye_die3};
\r
317 statetype s_eye_die3 = {EYE_DEATH2PIC,22,NULL,NULL};
\r
319 extern statetype s_eshot2;
\r
321 statetype s_eshot1 = {EYE_SHOT1PIC,8,&T_ShootPlayer,&s_eshot2};
\r
322 statetype s_eshot2 = {EYE_SHOT2PIC,8,&T_ShootPlayer,&s_eshot1};
\r
324 #define eye_mode ob->temp1
\r
325 #define eye_delay ob->temp2
\r
328 //-------------------------------------------------------------------------
\r
330 //-------------------------------------------------------------------------
\r
331 void SpawnEye(int tilex, int tiley)
\r
335 SpawnNewObj(tilex,tiley,&s_eye_1,PIXRADIUS*35);
\r
337 new->obclass = eyeobj;
\r
339 new->flags |= of_shootable;
\r
340 new->hitpoints = EasyHitPoints(15);
\r
341 eye_mode = em_other1;
\r
345 //---------------------------------------------------------------------------
\r
346 // T_EyeShootPlayer
\r
347 //---------------------------------------------------------------------------
\r
348 void T_EyeShootPlayer (objtype *ob)
\r
350 ShootPlayer(ob,eshotobj,ESHOTSPEED,&s_eshot1);
\r
355 =============================================================================
\r
359 =============================================================================
\r
362 void T_Succubus (objtype *ob);
\r
363 void T_SuccubusShot (objtype *ob);
\r
365 extern statetype s_succubus_pause;
\r
366 extern statetype s_succubus_walk1;
\r
367 extern statetype s_succubus_walk2;
\r
368 extern statetype s_succubus_walk3;
\r
369 extern statetype s_succubus_walk4;
\r
370 extern statetype s_succubus_shot1;
\r
371 extern statetype s_succubus_attack1;
\r
372 extern statetype s_succubus_attack2;
\r
373 extern statetype s_succubus_attack3;
\r
374 extern statetype s_succubus_death1;
\r
375 extern statetype s_succubus_death2;
\r
377 statetype s_succubus_pause = {SUCCUBUS_WALK2PIC,10,NULL,&s_succubus_walk3};
\r
379 statetype s_succubus_walk1 = {SUCCUBUS_WALK1PIC,10,T_EyeMage,&s_succubus_walk2};
\r
380 statetype s_succubus_walk2 = {SUCCUBUS_WALK2PIC,10,T_EyeMage,&s_succubus_walk3};
\r
381 statetype s_succubus_walk3 = {SUCCUBUS_WALK3PIC,10,T_EyeMage,&s_succubus_walk4};
\r
382 statetype s_succubus_walk4 = {SUCCUBUS_WALK4PIC,10,T_EyeMage,&s_succubus_walk1};
\r
384 statetype s_succubus_attack1 = {SUCCUBUS_ATTACK1PIC,15,NULL,&s_succubus_attack2};
\r
385 statetype s_succubus_attack2 = {SUCCUBUS_ATTACK1PIC,-1,T_SuccubusShot,&s_succubus_attack3};
\r
386 statetype s_succubus_attack3 = {SUCCUBUS_ATTACK2PIC,15,NULL,&s_succubus_pause};
\r
388 statetype s_succubus_ouch = {SUCCUBUS_OUCHPIC,15,NULL,&s_succubus_walk1};
\r
390 statetype s_succubus_death1 = {SUCCUBUS_DEATH1PIC,55,NULL,&s_succubus_death2};
\r
391 statetype s_succubus_death2 = {SUCCUBUS_DEATH2PIC,20,NULL,&s_succubus_death2};
\r
393 statetype s_succubus_shot1 = {SUCCUBUS_SHOT1PIC,12,&T_ShootPlayer,&s_succubus_shot1};
\r
403 void SpawnSuccubus (int tilex, int tiley)
\r
405 SpawnNewObj(tilex,tiley,&s_succubus_walk1,PIXRADIUS*30);
\r
406 new->obclass = succubusobj;
\r
408 new->flags |= of_shootable;
\r
409 new->hitpoints = EasyHitPoints(12);
\r
420 void T_SuccubusShot (objtype *ob)
\r
422 ShootPlayer(ob,sshotobj,ob->temp1 ? MSHOTSPEED : SSHOTSPEED,&s_succubus_shot1);
\r
423 // ob->state = &s_succubus_attack3;
\r
424 // ob->ticcount = ob->temp1 ? 7 : ob->state->tictime;
\r
429 =============================================================================
\r
433 =============================================================================
\r
437 void T_MageShoot (objtype *ob);
\r
439 extern statetype s_magepause;
\r
441 extern statetype s_mage1;
\r
442 extern statetype s_mage2;
\r
444 extern statetype s_mageattack1;
\r
445 extern statetype s_mageattack2;
\r
446 extern statetype s_mageattack3;
\r
448 extern statetype s_mageouch;
\r
450 extern statetype s_magedie1;
\r
451 extern statetype s_magedie2;
\r
454 statetype s_magepause = {MAGE1PIC,10,NULL,&s_mage2};
\r
456 statetype s_mage1 = {MAGE1PIC,20,T_EyeMage,&s_mage2};
\r
457 statetype s_mage2 = {MAGE2PIC,20,T_EyeMage,&s_mage1};
\r
459 //statetype s_mageattack1 = {MAGEATTACKPIC,20,NULL,&s_mageattack2};
\r
460 //statetype s_mageattack2 = {MAGEATTACKPIC,-1,T_MageShoot,&s_mageattack3};
\r
461 statetype s_mageattack3 = {MAGEATTACKPIC,30,NULL,&s_magepause};
\r
463 statetype s_mageouch = {MAGEOUCHPIC,10,NULL,&s_mage1};
\r
465 statetype s_magedie1 = {MAGEDIE1PIC,20,NULL,&s_magedie2};
\r
466 statetype s_magedie2 = {MAGEDIE2PIC,0,NULL,&s_magedie2};
\r
469 statetype s_mshot1 = {PSHOT1PIC,8,&T_ShootPlayer,&s_mshot2};
\r
470 statetype s_mshot2 = {PSHOT2PIC,8,&T_ShootPlayer,&s_mshot1};
\r
480 void SpawnMage (int tilex, int tiley)
\r
482 SpawnNewObj(tilex,tiley,&s_mage1,PIXRADIUS*35);
\r
483 new->obclass = mageobj;
\r
485 new->flags |= of_shootable;
\r
486 new->hitpoints = EasyHitPoints(12);
\r
496 = ***NOTE*** This routine controls the thinks for the Eye, Mage, and Succubus.
\r
502 void T_EyeMage (objtype *ob)
\r
505 unsigned temp_tilex,temp_tiley;
\r
508 eye_delay -= realtics;
\r
511 eye_mode = random(em_dummy);
\r
512 eye_delay = (10*60);
\r
517 temp_tilex = player->tilex;
\r
518 temp_tiley = player->tiley;
\r
527 player->x = ((long)other_x[eye_mode]<<TILESHIFT)+TILEGLOBAL/2;
\r
528 player->y = ((long)other_y[eye_mode]<<TILESHIFT)+TILEGLOBAL/2;
\r
529 player->tilex = other_x[eye_mode];
\r
530 player->tiley = other_y[eye_mode];
\r
534 if (Chase(ob,true))
\r
539 player->tilex = temp_tilex;
\r
540 player->tiley = temp_tiley;
\r
543 if (ob->obclass == mageobj) // do the mage shot
\r
546 if (ShootPlayer(ob,mshotobj,MSHOTSPEED,&s_mshot1))
\r
548 ob->state = &s_mageattack3;
\r
549 ob->ticcount = ob->state->tictime;
\r
553 if (ob->obclass == succubusobj) // do the succubus shot
\r
555 angle = AngleNearPlayer(ob); // make sure angle is correct
\r
556 // - see AngleNearPlayer
\r
557 if (!random(5) && (angle != -1)) // if correct angle and random # attack
\r
559 ob->state = &s_succubus_attack1; // change state to attack
\r
560 ob->ticcount = ob->state->tictime; // init ticcount - otherwise
\r
561 } // object may get hung in a
\r
566 angle = AngleNearPlayer(ob); // do the eye shot
\r
568 if (!random(2) && (angle != -1))
\r
570 ob->state = &s_eye_shootplayer_1;
\r
571 ob->ticcount = ob->state->tictime;
\r
579 =============================================================================
\r
583 =============================================================================
\r
586 void T_HarmlessBunnyWalk(objtype *ob);
\r
587 void T_Bunny(objtype *ob);
\r
589 extern statetype s_bunny_left1;
\r
590 extern statetype s_bunny_left2;
\r
591 extern statetype s_bunny_left3;
\r
592 extern statetype s_bunny_right1;
\r
593 extern statetype s_bunny_right2;
\r
594 extern statetype s_bunny_right3;
\r
595 extern statetype s_bunny_meta1;
\r
596 extern statetype s_bunny_meta2;
\r
597 extern statetype s_bunny_walk1;
\r
598 extern statetype s_bunny_walk2;
\r
599 extern statetype s_bunny_attack1;
\r
600 extern statetype s_bunny_attack2;
\r
601 extern statetype s_bunny_pause;
\r
602 extern statetype s_bunny_death1;
\r
603 extern statetype s_bunny_death2;
\r
604 extern statetype s_bunny_death3;
\r
606 statetype s_bunny_left1 = {BUNNY_LEFT1PIC, 55, NULL, &s_bunny_left2};
\r
607 statetype s_bunny_left2 = {BUNNY_LEFT1PIC, 10, T_HarmlessBunnyWalk, &s_bunny_left1};
\r
608 statetype s_bunny_left3 = {BUNNY_LEFT2PIC, 30, NULL, &s_bunny_left1};
\r
610 statetype s_bunny_right1 = {BUNNY_RIGHT1PIC, 55, NULL, &s_bunny_right2};
\r
611 statetype s_bunny_right2 = {BUNNY_RIGHT1PIC, 10, T_HarmlessBunnyWalk, &s_bunny_right1};
\r
612 statetype s_bunny_right3 = {BUNNY_RIGHT2PIC, 30, NULL, &s_bunny_right1};
\r
614 statetype s_bunny_meta1 = {BUNNY_META1PIC, 30, NULL, &s_bunny_meta2};
\r
615 statetype s_bunny_meta2 = {BUNNY_META2PIC, 30, NULL, &s_bunny_walk1};
\r
617 statetype s_bunny_walk1 = {BUNNY_WALK1PIC, 25, T_Bunny, &s_bunny_walk2};
\r
618 statetype s_bunny_walk2 = {BUNNY_WALK2PIC, 25, T_Bunny, &s_bunny_walk1};
\r
620 statetype s_bunny_attack1 = {BUNNY_WALK1PIC, 25, NULL, &s_bunny_attack2};
\r
621 statetype s_bunny_attack2 = {BUNNY_WALK2PIC, 25, T_DoDamage, &s_bunny_walk1};
\r
623 statetype s_bunny_ouch = {BUNNY_OUCHPIC, 30, NULL, &s_bunny_pause};
\r
624 statetype s_bunny_pause = {BUNNY_WALK1PIC, 50, T_Bunny, &s_bunny_walk2};
\r
626 statetype s_bunny_death1 = {BUNNY_OUCHPIC, 40, NULL, &s_bunny_death2};
\r
627 statetype s_bunny_death2 = {BUNNY_DEATH1PIC, 50, NULL, &s_bunny_death3};
\r
628 statetype s_bunny_death3 = {BUNNY_DEATH2PIC, 20, NULL, &s_bunny_death3};
\r
631 #define bunny_dir_hop ob->temp1
\r
632 #define bunny_delay ob->temp2
\r
633 #define LEFTSIDE 0x8 // 1=left 0=right --side showing
\r
643 void SpawnBunny (int tilex, int tiley)
\r
645 SpawnNewObj(tilex,tiley,&s_bunny_left1,PIXRADIUS*35);
\r
646 new->obclass = hbunnyobj;
\r
648 new->temp1 = (random(3))+2;
\r
649 new->temp2 = random(30);
\r
650 new->flags &= ~of_shootable;
\r
651 new->flags |= LEFTSIDE; //left side showing}
\r
657 = T_HarmlessBunnyWalk
\r
663 void T_HarmlessBunnyWalk(objtype *ob)
\r
665 int valid_dir[8][2] = {{6,5}, {7,6}, {4,7}, {5,4}, {3,2}, {0,3}, {1,0}, {2,1}};
\r
667 dirtype player_dir;
\r
668 fixed old_x, old_y;
\r
669 unsigned old_tilex, old_tiley;
\r
673 ob->temp2 -= realtics;
\r
674 if (ob->temp2 <= 0)
\r
676 if (CheckHandAttack(ob))
\r
682 actorat[ob->tilex][ob->tiley] = 0;
\r
683 ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
\r
684 ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
\r
685 ob->distance = TILEGLOBAL;
\r
686 ob->state = &s_bunny_meta1;
\r
687 ob->ticcount = ob->state->tictime;
\r
688 ob->obclass = bunnyobj;
\r
689 ob->flags |= of_shootable;
\r
690 ob->hitpoints = EasyHitPoints(10);
\r
692 ChaseThink(ob,true); // JTR - testing..
\r
696 // The direction of the player isn't updated so it must be
\r
697 // calculated. This is done so the correct side (left/right)
\r
698 // of the bunny will be showed.
\r
700 if ((player->angle > 337) || (player->angle <= 22))
\r
703 if (player->angle <= 67)
\r
704 player_dir = northeast;
\r
706 if (player->angle <= 112)
\r
707 player_dir = north;
\r
709 if (player->angle <= 157)
\r
710 player_dir = northwest;
\r
712 if (player->angle <= 202)
\r
715 if (player->angle <= 247)
\r
716 player_dir = southwest;
\r
718 if (player->angle <= 292)
\r
719 player_dir = south;
\r
721 if (player->angle <= 337)
\r
722 player_dir = southeast;
\r
726 ob->temp1 = (random(3))+2;
\r
727 if (ob->flags & LEFTSIDE)
\r
731 if (valid_dir[player_dir][0] != ob->dir)
\r
733 ob->dir = valid_dir[player_dir][0];
\r
738 ob->state = &s_bunny_right1;
\r
739 ob->ticcount = ob->state->tictime;
\r
740 ob->flags &= ~LEFTSIDE;
\r
741 ob->dir = valid_dir[player_dir][1];
\r
749 if (valid_dir[player_dir][1] != ob->dir)
\r
751 ob->dir = valid_dir[player_dir][1];
\r
756 ob->state = &s_bunny_left1;
\r
757 ob->ticcount = ob->state->tictime;
\r
758 ob->flags |= LEFTSIDE;
\r
759 ob->dir = valid_dir[player_dir][2];
\r
764 move = ob->speed*tics;
\r
768 old_distance = ob->distance;
\r
771 old_tilex = ob->tilex;
\r
772 old_tiley = ob->tiley;
\r
774 MoveObj (ob, move);
\r
776 ob->tilex = ob->x >> TILESHIFT;
\r
777 ob->tiley = ob->y >> TILESHIFT;
\r
779 if (ob->tilex == old_tilex && ob->tiley == old_tiley)
\r
784 if (actorat[ob->tilex][ob->tiley] == 0)
\r
786 actorat[old_tilex][old_tiley] = 0;
\r
787 actorat[ob->tilex][ob->tiley] = ob;
\r
788 ob->distance = TILEGLOBAL;
\r
792 ob->distance = old_distance;
\r
795 ob->tilex = old_tilex;
\r
796 ob->tiley = old_tiley;
\r
804 if (ob->flags & LEFTSIDE)
\r
805 ob->state = &s_bunny_left3;
\r
807 ob->state = &s_bunny_right3;
\r
808 ob->ticcount = ob->state->tictime;
\r
819 void T_Bunny(objtype *ob)
\r
821 if (Chase (ob, true) || (random(1000)<RANDOM_ATTACK))
\r
823 ob->state = &s_bunny_attack1;
\r
824 ob->ticcount = ob->state->tictime;
\r