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
33 #define MSHOTDAMAGE 2
\r
34 #define MSHOTSPEED 10000
\r
36 #define ESHOTDAMAGE 1
\r
37 #define ESHOTSPEED 5000
\r
39 #define SSHOTDAMAGE 3
\r
40 #define SSHOTSPEED 6500
\r
42 #define RANDOM_ATTACK 20
\r
46 =============================================================================
\r
50 =============================================================================
\r
53 boolean ShootPlayer (objtype *ob, short obclass, short speed, statetype *state);
\r
54 void T_ShootPlayer(objtype *ob);
\r
56 short zombie_base_delay;
\r
58 short other_x[] = {0,39,39,0},
\r
59 other_y[] = {0,0,27,27};
\r
62 =============================================================================
\r
66 =============================================================================
\r
70 dirtype dirtable[9] = {northwest,north,northeast,west,nodir,east,
\r
71 southwest,south,southeast};
\r
75 =============================================================================
\r
79 =============================================================================
\r
82 extern statetype s_boltbonus2;
\r
83 extern statetype s_nukebonus2;
\r
84 extern statetype s_boltbonus3;
\r
85 extern statetype s_nukebonus3;
\r
87 statetype s_boltbonus = {BOLTOBJPIC,8,NULL,&s_boltbonus2};
\r
88 statetype s_boltbonus2 = {BOLT2OBJPIC,8,NULL,&s_boltbonus3};
\r
89 statetype s_boltbonus3 = {BOLT3OBJPIC,8,NULL,&s_boltbonus};
\r
91 statetype s_nukebonus = {NUKEOBJPIC,8,NULL,&s_nukebonus2};
\r
92 statetype s_nukebonus2 = {NUKE2OBJPIC,8,NULL,&s_nukebonus3};
\r
93 statetype s_nukebonus3 = {NUKE3OBJPIC,8,NULL,&s_nukebonus};
\r
95 statetype s_potionbonus = {POTIONOBJPIC,0,NULL,&s_potionbonus};
\r
96 //statetype s_rkey2bonus = {RKEY2PIC,0,NULL,&s_rkey2bonus};
\r
97 statetype s_rkeybonus = {RKEYOBJPIC,0,NULL,&s_rkeybonus};
\r
98 statetype s_ykeybonus = {YKEYOBJPIC,0,NULL,&s_ykeybonus};
\r
99 statetype s_gkeybonus = {GKEYOBJPIC,0,NULL,&s_gkeybonus};
\r
100 statetype s_bkeybonus = {BKEYOBJPIC,0,NULL,&s_bkeybonus};
\r
101 //////////////////////////statetype s_scrollbonus = {SCROLLOBJPIC,0,NULL,&s_scrollbonus};
\r
102 statetype s_chestbonus = {CHESTOBJPIC,0,NULL,&s_chestbonus};
\r
103 //statetype s_goalbonus = {NEMESISPIC,0,NULL,&s_goalbonus};
\r
105 extern statetype s_waterchestbonus2;
\r
106 statetype s_waterchestbonus1 = {O_WATER_CHEST1PIC,8,NULL,&s_waterchestbonus2};
\r
107 statetype s_waterchestbonus2 = {O_WATER_CHEST2PIC,8,NULL,&s_waterchestbonus1};
\r
109 extern statetype s_rgem2bonus;
\r
110 extern statetype s_ygem2bonus;
\r
111 extern statetype s_ggem2bonus;
\r
112 extern statetype s_bgem2bonus;
\r
113 extern statetype s_pgem2bonus;
\r
115 statetype s_rgem1bonus = {RGEM1PIC,30,NULL,&s_rgem2bonus};
\r
116 statetype s_ygem1bonus = {YGEM1PIC,30,NULL,&s_ygem2bonus};
\r
117 statetype s_ggem1bonus = {GGEM1PIC,30,NULL,&s_ggem2bonus};
\r
118 statetype s_bgem1bonus = {BGEM1PIC,30,NULL,&s_bgem2bonus};
\r
119 statetype s_pgem1bonus = {PGEM1PIC,30,NULL,&s_pgem2bonus};
\r
121 statetype s_rgem2bonus = {RGEM2PIC,30,NULL,&s_rgem1bonus};
\r
122 statetype s_ygem2bonus = {YGEM2PIC,30,NULL,&s_ygem1bonus};
\r
123 statetype s_ggem2bonus = {GGEM2PIC,30,NULL,&s_ggem1bonus};
\r
124 statetype s_bgem2bonus = {BGEM2PIC,30,NULL,&s_bgem1bonus};
\r
125 statetype s_pgem2bonus = {PGEM2PIC,30,NULL,&s_pgem1bonus};
\r
127 statetype s_bonus_die = {0,8,NULL,NULL};
\r
137 void SpawnBonus (int tilex, int tiley, int number)
\r
139 extern unsigned gcolor;
\r
145 case B_BOLT: state = &s_boltbonus; break;
\r
146 case B_NUKE: state = &s_nukebonus; break;
\r
147 case B_POTION: state = &s_potionbonus; break;
\r
149 case B_RKEY: state = &s_rkeybonus; break;
\r
150 case B_YKEY: state = &s_ykeybonus; break;
\r
151 case B_GKEY: state = &s_gkeybonus; break;
\r
152 case B_BKEY: state = &s_bkeybonus; break;
\r
154 case B_RGEM: state = &s_rgem1bonus; break;
\r
155 case B_YGEM: state = &s_ygem1bonus; break;
\r
156 case B_GGEM: state = &s_ggem1bonus; break;
\r
157 case B_BGEM: state = &s_bgem1bonus; break;
\r
158 case B_PGEM: state = &s_pgem1bonus; break;
\r
161 if (gcolor == 0x0101)
\r
162 state = &s_waterchestbonus1;
\r
164 state = &s_chestbonus;
\r
175 case B_SCROLL8: state = &s_scrollbonus; break;
\r
178 // case B_RKEY2: state = &s_rkey2bonus; break;
\r
181 Quit("SpawnBonus(): INVALID BONUS");
\r
185 SpawnNewObj (tilex,tiley,state,TILEGLOBAL/2);
\r
186 // new->tileobject = true;
\r
187 new->temp1 = number;
\r
188 new->obclass = bonusobj;
\r
196 new->flags |= of_shootable;
\r
200 new->flags &= ~of_shootable;
\r
214 statetype s_tombs[3] = {{TOMB1PIC,8,NULL,&s_tombs[0]},
\r
215 {TOMB2PIC,8,NULL,&s_tombs[1]},
\r
216 {TOMB3PIC,8,NULL,&s_tombs[2]}};
\r
218 void SpawnTombstone (int tilex, int tiley, int shape)
\r
220 statetype *state=&s_tombs[shape];
\r
222 SpawnNewObj (tilex,tiley,state,TILEGLOBAL/2);
\r
223 // new->tileobject = true;
\r
224 new->obclass = realsolidobj;
\r
225 new->flags |= of_shootable;
\r
230 ============================================================================
\r
234 ============================================================================
\r
237 extern statetype s_ftimebonus;
\r
238 extern statetype s_ftimebonus2;
\r
240 statetype s_ftimebonus = {TIMEOBJ1PIC,6,NULL,&s_ftimebonus2};
\r
241 statetype s_ftimebonus2 = {TIMEOBJ2PIC,6,NULL,&s_ftimebonus};
\r
250 void SpawnFTime(int tilex, int tiley)
\r
252 SpawnNewObj(tilex,tiley,&s_ftimebonus,TILEGLOBAL/2);
\r
253 // new->tileobject = true;
\r
254 new->obclass = freezeobj;
\r
255 new->flags |= of_shootable;
\r
259 =============================================================================
\r
263 =============================================================================
\r
267 void T_WallDie (objtype *ob);
\r
269 extern statetype s_walldie1;
\r
270 extern statetype s_walldie2;
\r
271 extern statetype s_walldie3;
\r
272 extern statetype s_walldie4;
\r
273 extern statetype s_walldie5;
\r
274 extern statetype s_walldie6;
\r
276 statetype s_walldie1 = {0,20,NULL,&s_walldie2};
\r
277 statetype s_walldie2 = {0,-1,T_WallDie,&s_walldie3};
\r
278 statetype s_walldie3 = {0,20,NULL,&s_walldie4};
\r
279 statetype s_walldie4 = {0,-1,T_WallDie,&s_walldie5};
\r
280 statetype s_walldie5 = {0,20,NULL,&s_walldie6};
\r
281 statetype s_walldie6 = {0,-1,T_WallDie,NULL};
\r
292 void ExplodeWall (int tilex, int tiley)
\r
294 extern unsigned gcolor;
\r
297 DSpawnNewObj (tilex,tiley,&s_walldie1,0);
\r
298 if (new == &dummyobj)
\r
300 new->obclass = inertobj;
\r
301 new->active = always;
\r
302 if (gcolor == 0x0101)
\r
303 tilenum = WATEREXP;
\r
306 (unsigned)actorat[new->tilex][new->tiley] = tilemap[new->tilex][new->tiley] =
\r
307 *(mapsegs[0]+farmapylookup[new->tiley]+new->tilex) = tilenum;
\r
308 *(mapsegs[2]+farmapylookup[new->tiley]+new->tilex) &= 0xFF;
\r
320 void T_WallDie (objtype *ob)
\r
322 extern unsigned gcolor;
\r
323 unsigned tile,other,spot,x,y;
\r
325 if (++ob->temp1 == 3)
\r
328 if (gcolor == 0x0101)
\r
329 tile = WATEREXP-1 + ob->temp1;
\r
331 tile = WALLEXP-1 + ob->temp1;
\r
335 (unsigned)actorat[x][y] = tilemap[x][y] = *(mapsegs[0]+farmapylookup[y]+x) = tile;
\r
337 if (ob->temp1 == 1)
\r
340 // blow up nearby walls
\r
342 spot = (*(mapsegs[2]+farmapylookup[y]+(x-1))) >> 8;
\r
343 if (spot == EXP_WALL_CODE)
\r
344 ExplodeWall (x-1,y);
\r
345 spot = (*(mapsegs[2]+farmapylookup[y]+(x+1))) >> 8;
\r
346 if (spot == EXP_WALL_CODE)
\r
347 ExplodeWall (x+1,y);
\r
348 spot = (*(mapsegs[2]+farmapylookup[y-1]+x)) >> 8;
\r
349 if (spot == EXP_WALL_CODE)
\r
350 ExplodeWall (x,y-1);
\r
351 spot = (*(mapsegs[2]+farmapylookup[y+1]+x)) >> 8;
\r
352 if (spot == EXP_WALL_CODE)
\r
353 ExplodeWall (x,y+1);
\r
357 =============================================================================
\r
361 =============================================================================
\r
364 void T_Gate (objtype *ob);
\r
366 extern statetype s_obj_gate1;
\r
367 extern statetype s_obj_gate2;
\r
368 extern statetype s_obj_gate3;
\r
369 extern statetype s_obj_gate4;
\r
371 statetype s_obj_gate1 = {OBJ_WARP1PIC,10,T_Gate,&s_obj_gate2};
\r
372 statetype s_obj_gate2 = {OBJ_WARP2PIC,10,T_Gate,&s_obj_gate3};
\r
373 statetype s_obj_gate3 = {OBJ_WARP3PIC,10,T_Gate,&s_obj_gate4};
\r
374 statetype s_obj_gate4 = {OBJ_WARP4PIC,10,T_Gate,&s_obj_gate1};
\r
376 extern statetype s_anthill;
\r
377 statetype s_anthill = {ANT_HILLPIC, 20, T_Gate, &s_anthill};
\r
379 //---------------------------------------------------------------------------
\r
382 // TYPE : Type param is the gate number (1-what ever) will link you to
\r
383 // gate of that type.
\r
384 //---------------------------------------------------------------------------
\r
385 void SpawnWarp (int tilex, int tiley, int type)
\r
389 SpawnNewObj (tilex,tiley,&s_obj_gate1,TILEGLOBAL/3);
\r
391 SpawnNewObj (tilex,tiley,&s_anthill,TILEGLOBAL/3);
\r
392 new->obclass = gateobj;
\r
406 #define STATUSCOLOR 4
\r
408 void T_Gate (objtype *ob)
\r
411 unsigned temp,spot;
\r
413 if (CheckHandAttack (ob) && !playstate)
\r
417 // spot = (*(mapsegs[2]+farmapylookup[ob->tiley+1]+ob->tilex)) >> 8;
\r
419 // if (gamestate.keys[spot])
\r
428 // temp = bufferofs;
\r
430 // VW_Bar (26,4,232,9,STATUSCOLOR); // clear text description
\r
431 // bufferofs = temp;
\r
433 // IN_ClearKeysDown ();
\r
437 // teleport inside level
\r
440 for (check=player->next;check;check=check->next)
\r
441 if (check->obclass==gateobj && check->temp1==ob->temp1 &&
\r
444 player->x = check->x;
\r
445 player->y = check->y;
\r
446 Thrust (player->angle,TILEGLOBAL/2); // move forwards
\r
447 Thrust (player->angle,TILEGLOBAL/2); // move forwards
\r
448 Thrust (player->angle,TILEGLOBAL/2); // move forwards
\r
450 SD_PlaySound(WARPSND);
\r
456 // teleport out of level
\r
459 playstate = ex_warped;
\r
460 spot = (*(mapsegs[2]+farmapylookup[ob->tiley+1]+ob->tilex)) >> 8;
\r
461 gamestate.mapon=spot;
\r
462 SD_PlaySound(WARPUPSND);
\r
470 =============================================================================
\r
474 =============================================================================
\r
477 #define FATCLOUDDAMAGE 2
\r
479 void T_FatDemon (objtype *ob);
\r
480 void T_CheckCnt(objtype *ob);
\r
481 void ExplodeSound(objtype *ob);
\r
483 extern statetype s_fatdemon_pause;
\r
484 extern statetype s_fatdemon_walk1;
\r
485 extern statetype s_fatdemon_walk2;
\r
486 extern statetype s_fatdemon_walk3;
\r
487 extern statetype s_fatdemon_walk4;
\r
488 extern statetype s_fatdemon_attack1;
\r
489 extern statetype s_fatdemon_attack2;
\r
490 extern statetype s_fatdemon_blowup2;
\r
491 extern statetype s_fatdemon_blowup3;
\r
492 extern statetype s_fatdemon_blowup4;
\r
493 extern statetype s_fatdemon_blowup5;
\r
494 extern statetype s_fatdemon_blowup6;
\r
495 extern statetype s_fatdemon_blowup7;
\r
496 extern statetype s_fatdemon_explode;
\r
497 extern statetype s_fatdemon_feet;
\r
499 statetype s_fatdemon_pause = {FATDEMON_WALK1PIC,40,NULL,&s_fatdemon_walk2};
\r
501 statetype s_fatdemon_walk1 = {FATDEMON_WALK1PIC,13,T_FatDemon,&s_fatdemon_walk2};
\r
502 statetype s_fatdemon_walk2 = {FATDEMON_WALK2PIC,13,T_FatDemon,&s_fatdemon_walk3};
\r
503 statetype s_fatdemon_walk3 = {FATDEMON_WALK3PIC,13,T_FatDemon,&s_fatdemon_walk4};
\r
504 statetype s_fatdemon_walk4 = {FATDEMON_WALK4PIC,13,T_FatDemon,&s_fatdemon_walk1};
\r
506 statetype s_fatdemon_attack1 = {FATDEMON_ATTACK1PIC,20,NULL,&s_fatdemon_attack2};
\r
507 statetype s_fatdemon_attack2 = {FATDEMON_ATTACK2PIC,20,T_DoDamage,&s_fatdemon_pause};
\r
509 statetype s_fatdemon_ouch = {FATDEMON_OUCHPIC,14,NULL,&s_fatdemon_walk1};
\r
511 statetype s_fatdemon_blowup1 = {FATDEMON_BLOWUP1PIC,25,NULL,&s_fatdemon_blowup2};
\r
512 statetype s_fatdemon_blowup2 = {FATDEMON_BLOWUP2PIC,25,NULL,&s_fatdemon_blowup3};
\r
513 statetype s_fatdemon_blowup3 = {FATDEMON_BLOWUP1PIC,15,NULL,&s_fatdemon_blowup4};
\r
514 statetype s_fatdemon_blowup4 = {FATDEMON_BLOWUP2PIC,15,NULL,&s_fatdemon_blowup5};
\r
515 statetype s_fatdemon_blowup5 = {FATDEMON_BLOWUP1PIC,6,NULL,&s_fatdemon_blowup6};
\r
516 statetype s_fatdemon_blowup6 = {FATDEMON_BLOWUP2PIC,6,T_CheckCnt,&s_fatdemon_blowup5};
\r
517 statetype s_fatdemon_blowup7 = {FATDEMON_BLOWUP3PIC,30,NULL,&s_fatdemon_explode};
\r
520 statetype s_fatdemon_explode = {FATDEMON_EXPLODEPIC,40,ExplodeSound,&s_fatdemon_feet};
\r
521 statetype s_fatdemon_feet = {FATDEMON_FEETPIC,30,NULL,&s_fatdemon_feet};
\r
523 #define cnt ob->temp1
\r
524 #define cloud_delay ob->temp2
\r
534 void SpawnFatDemon (int tilex, int tiley)
\r
536 SpawnNewObj(tilex,tiley,&s_fatdemon_walk1,35*PIXRADIUS);
\r
538 new->obclass = fatdemonobj;
\r
539 new->flags |= of_shootable;
\r
540 new->hitpoints = EasyHitPoints(10);
\r
541 new->temp1 = 25; //used to "shake" the fat dude??????
\r
553 void T_FatDemon (objtype *ob)
\r
555 if (Chase(ob,true) || (random(1000)<RANDOM_ATTACK))
\r
557 ob->state = &s_fatdemon_attack1;
\r
558 ob->ticcount = ob->state->tictime;
\r
572 void T_CheckCnt (objtype *ob)
\r
577 ob->state = &s_fatdemon_blowup7;
\r
578 ob->ticcount = ob->state->tictime;
\r
589 void ExplodeSound(objtype *ob)
\r
591 if (ob->temp1 != 666) // Has this think been called already?
\r
593 SD_PlaySound(BODY_EXPLODESND);
\r
594 ob->temp1 = 666; // Has now!
\r
600 =============================================================================
\r
604 =============================================================================
\r
607 extern statetype s_dragon_shot1;
\r
608 extern statetype s_dragon_shot2;
\r
611 void T_Dragon(objtype *ob);
\r
612 void T_DragonShoot(objtype *ob);
\r
615 statetype s_wet_bubbles1 = {DRAGON_BUBBLES1PIC,13,T_Dragon,&s_wet_bubbles2};
\r
616 statetype s_wet_bubbles2 = {DRAGON_BUBBLES2PIC,15,T_Dragon,&s_wet_bubbles1};
\r
617 statetype s_wet_bubbles3 = {0,35,T_Dragon,&s_wet_bubbles1};
\r
619 statetype s_wet_peek = {DRAGON_EYESPIC,45,NULL,&s_wet_bubbles1};
\r
621 statetype s_wet_rise1 = {DRAGON_BUBBLES2PIC,15,NULL,&s_wet_rise3};
\r
622 statetype s_wet_rise3 = {DRAGON_EYESPIC,20,NULL,&s_wet_rise4};
\r
623 statetype s_wet_rise4 = {DRAGON_RISE1PIC,20,NULL,&s_wet_rise5};
\r
624 statetype s_wet_rise5 = {DRAGON_RISE2PIC,20,NULL,&s_wet_walk1};
\r
626 statetype s_wet_sink1 = {DRAGON_RISE2PIC,20,NULL,&s_wet_sink2};
\r
627 statetype s_wet_sink2 = {DRAGON_RISE1PIC,20,NULL,&s_wet_sink3};
\r
628 statetype s_wet_sink3 = {DRAGON_EYESPIC,20,NULL,&s_wet_bubbles1};
\r
630 statetype s_wet_walk1 = {DRAGON_WALK1PIC,12,T_Dragon,&s_wet_walk2};
\r
631 statetype s_wet_walk2 = {DRAGON_WALK2PIC,12,T_Dragon,&s_wet_walk3};
\r
632 statetype s_wet_walk3 = {DRAGON_WALK3PIC,12,T_Dragon,&s_wet_walk4};
\r
633 statetype s_wet_walk4 = {DRAGON_WALK4PIC,12,T_Dragon,&s_wet_walk1};
\r
635 statetype s_wet_attack1 = {DRAGON_ATTACK1PIC,10,NULL,&s_wet_attack2};
\r
636 statetype s_wet_attack2 = {DRAGON_ATTACK2PIC,10,NULL,&s_wet_attack3};
\r
637 statetype s_wet_attack3 = {DRAGON_ATTACK2PIC,10,NULL,&s_wet_attack4};
\r
638 statetype s_wet_attack4 = {DRAGON_ATTACK3PIC,10,T_DragonShoot,&s_wet_walk1};
\r
640 statetype s_wet_ouch = {DRAGON_OUCHPIC,10,T_Dragon,&s_wet_walk1};
\r
642 statetype s_wet_die1 = {DRAGON_DEATH1PIC,27,NULL,&s_wet_die2};
\r
643 statetype s_wet_die2 = {DRAGON_DEATH2PIC,29,NULL,&s_wet_die3};
\r
644 statetype s_wet_die3 = {DRAGON_DEATH3PIC,44,NULL,&s_wet_die4};
\r
645 statetype s_wet_die4 = {DRAGON_BUBBLES2PIC,26,NULL,&s_wet_die5};
\r
646 statetype s_wet_die5 = {DRAGON_BUBBLES1PIC,23,NULL,NULL};
\r
648 statetype s_dragon_shot1 = {PSHOT1PIC,8,&T_ShootPlayer,&s_dragon_shot2};
\r
649 statetype s_dragon_shot2 = {PSHOT2PIC,8,&T_ShootPlayer,&s_dragon_shot1};
\r
652 typedef enum {wt_BUBBLES,wt_WALK,wt_CORNER1,wt_CORNER2,wt_CORNER3,wt_CORNER4} DragonTypes;
\r
655 #define WD_TIMEREMAIN (ob->temp1)
\r
656 #define WD_STAGE (ob->temp2)
\r
657 #define WATER_DRAGON_LEAVE 0x04
\r
666 void SpawnDragon(int tilex, int tiley)
\r
669 SpawnNewObj(tilex,tiley,&s_wet_bubbles1,PIXRADIUS*35);
\r
672 WD_STAGE = wt_BUBBLES;
\r
673 WD_TIMEREMAIN = 80;
\r
675 new->obclass = wetobj;
\r
677 new->flags &= ~of_shootable;
\r
678 new->hitpoints = EasyHitPoints(20);
\r
690 void T_Dragon(objtype *ob)
\r
695 ob->flags &= ~of_shootable;
\r
696 if (Chase(ob,true))
\r
698 // RISE & GOTO WALK STAGE
\r
701 WD_STAGE = wt_WALK;
\r
702 WD_TIMEREMAIN = 60*8+random(60*5);
\r
703 ob->state = &s_wet_rise1;
\r
705 ob->ticcount = ob->state->tictime;
\r
709 // DEC COUNTER - And check for WALK
\r
711 if ((WD_TIMEREMAIN-=realtics) < 0)
\r
713 // RISE & GOTO WALK STAGE
\r
716 WD_STAGE = wt_WALK;
\r
717 WD_TIMEREMAIN = 60*8+random(60*5);
\r
718 ob->state = &s_wet_rise1;
\r
720 ob->ticcount = ob->state->tictime;
\r
723 if (random(1000)<5)
\r
725 // RANDOM PEEK UP OUT OF WATER
\r
728 ob->state=&s_wet_peek;
\r
729 ob->ticcount = ob->state->tictime;
\r
736 ob->flags |= of_shootable;
\r
738 if (Chase(ob,true) || (CheckHandAttack(ob)))
\r
741 ob->flags |= WATER_DRAGON_LEAVE;
\r
742 WD_STAGE = random(wt_CORNER3) + 2;
\r
743 WD_TIMEREMAIN = 60*2+(random(6)*60);
\r
744 ob->state = &s_wet_bubbles1;
\r
745 ob->ticcount = ob->state->tictime;
\r
748 if (AngleNearPlayer(ob) != -1)
\r
750 ob->state = &s_wet_attack1;
\r
751 ob->ticcount = ob->state->tictime;
\r
756 // DEC COUNTER - And check for SINK
\r
758 if ((WD_TIMEREMAIN-=realtics) < 0)
\r
760 // SINK & GOTO BUBBLE STAGE
\r
763 WD_STAGE = wt_BUBBLES;
\r
764 WD_TIMEREMAIN = 60*2+random(60*2);
\r
765 ob->state = &s_wet_sink1;
\r
767 ob->ticcount = ob->state->tictime;
\r
768 ob->flags &= ~of_shootable;
\r
777 ob->flags &= ~of_shootable;
\r
778 if ((WD_TIMEREMAIN -= realtics) < 0)
\r
780 WD_STAGE = wt_BUBBLES;
\r
781 ob->flags &= ~WATER_DRAGON_LEAVE;
\r
786 unsigned temp_tilex,temp_tiley;
\r
790 temp_tilex = player->tilex;
\r
791 temp_tiley = player->tiley;
\r
793 player->x = ((long)other_x[WD_STAGE-2]<<TILESHIFT)+TILEGLOBAL/2;
\r
794 player->y = ((long)other_y[WD_STAGE-2]<<TILESHIFT)+TILEGLOBAL/2;
\r
795 player->tilex = other_x[WD_STAGE-2];
\r
796 player->tiley = other_y[WD_STAGE-2];
\r
803 player->tilex = temp_tilex;
\r
804 player->tiley = temp_tiley;
\r
817 void T_DragonShoot (objtype *ob)
\r
819 ShootPlayer(ob,dshotobj,10000,&s_dragon_shot1);
\r