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
57 =============================================================================
\r
61 =============================================================================
\r
65 =============================================================================
\r
69 =============================================================================
\r
72 void T_RedDemon (objtype *ob);
\r
73 void T_RedDemonCheckCnt (objtype *ob);
\r
75 extern statetype s_red_demonpause;
\r
77 extern statetype s_red_demon1;
\r
78 extern statetype s_red_demon2;
\r
79 extern statetype s_red_demon3;
\r
80 extern statetype s_red_demon4;
\r
82 extern statetype s_red_demonattack1;
\r
83 extern statetype s_red_demonattack2;
\r
84 extern statetype s_red_demonattack3;
\r
86 extern statetype s_red_demonouch;
\r
88 extern statetype s_red_demondie1;
\r
89 extern statetype s_red_demondie2;
\r
90 extern statetype s_red_demondie3;
\r
91 extern statetype s_red_demondie4;
\r
93 statetype s_red_demonpause = {RED_DEMON1PIC,30,NULL,&s_red_demon2};
\r
95 statetype s_red_demon1 = {RED_DEMON1PIC,20,T_RedDemon,&s_red_demon2};
\r
96 statetype s_red_demon2 = {RED_DEMON2PIC,20,T_RedDemon,&s_red_demon3};
\r
97 statetype s_red_demon3 = {RED_DEMON3PIC,20,T_RedDemon,&s_red_demon4};
\r
98 statetype s_red_demon4 = {RED_DEMON4PIC,20,T_RedDemon,&s_red_demon1};
\r
100 statetype s_red_demonattack1 = {RED_DEMONATTACK1PIC,20,NULL,&s_red_demonattack2};
\r
101 statetype s_red_demonattack2 = {RED_DEMONATTACK2PIC,20,NULL,&s_red_demonattack3};
\r
102 statetype s_red_demonattack3 = {RED_DEMONATTACK3PIC,30,T_DoDamage,&s_red_demon2};
\r
104 statetype s_red_demonouch = {RED_DEMONOUCHPIC,30,NULL,&s_red_demon1};
\r
106 statetype s_red_demondie1 = {RED_DEMONOUCHPIC,9,NULL,&s_red_demondie2};
\r
107 statetype s_red_demondie2 = {RED_DEMONDIE1PIC,9,T_RedDemonCheckCnt,&s_red_demondie1};
\r
108 statetype s_red_demondie3 = {RED_DEMONDIE2PIC,20,NULL,&s_red_demondie4};
\r
109 statetype s_red_demondie4 = {RED_DEMONDIE3PIC,10,NULL,&s_red_demondie4};
\r
120 void SpawnRedDemon (int tilex, int tiley)
\r
122 SpawnNewObj(tilex,tiley,&s_red_demon1,PIXRADIUS*35);
\r
123 new->obclass = reddemonobj;
\r
125 new->flags |= of_shootable;
\r
126 new->hitpoints = EasyHitPoints(50);
\r
139 void T_RedDemon (objtype *ob)
\r
141 if (Chase (ob,true) || (random(1000)<RANDOM_ATTACK))
\r
143 ob->state = &s_red_demonattack1;
\r
144 ob->ticcount = ob->state->tictime;
\r
152 = T_RedDemonCheckCnt
\r
157 void T_RedDemonCheckCnt (objtype *ob)
\r
162 ob->state = &s_red_demondie3;
\r
163 ob->ticcount = ob->state->tictime;
\r
169 =============================================================================
\r
173 =============================================================================
\r
177 void T_Grelminar (objtype *ob);
\r
178 void T_GrelminarShoot (objtype *ob);
\r
179 void T_Grelm_DropKey(objtype *ob);
\r
181 extern statetype s_grelpause;
\r
183 extern statetype s_grel1;
\r
184 extern statetype s_grel2;
\r
186 extern statetype s_grelattack1;
\r
187 extern statetype s_grelattack2;
\r
188 extern statetype s_grelattack3;
\r
190 extern statetype s_grelouch;
\r
192 extern statetype s_greldie1;
\r
193 extern statetype s_greldie2;
\r
194 extern statetype s_greldie3;
\r
195 extern statetype s_greldie4;
\r
196 extern statetype s_greldie5;
\r
197 extern statetype s_greldie5a;
\r
198 extern statetype s_greldie6;
\r
201 statetype s_grelpause = {GREL1PIC,50,NULL,&s_grel2};
\r
203 statetype s_grel1 = {GREL1PIC,20,T_Grelminar,&s_grel2};
\r
204 statetype s_grel2 = {GREL2PIC,20,T_Grelminar,&s_grel1};
\r
206 //statetype s_grelattack1 = {GRELATTACKPIC,20,NULL,&s_grelattack2};
\r
207 //statetype s_grelattack2 = {GRELATTACKPIC,-1,T_GrelminarShoot,&s_grelattack3};
\r
208 statetype s_grelattack3 = {GRELATTACKPIC,30,NULL,&s_grelpause};
\r
210 statetype s_grelouch = {GRELHITPIC,6,NULL,&s_grel1};
\r
212 statetype s_greldie1 = {GRELDIE1PIC,22,NULL,&s_greldie2};
\r
213 statetype s_greldie2 = {GRELDIE2PIC,22,NULL,&s_greldie3};
\r
214 statetype s_greldie3 = {GRELDIE3PIC,22,NULL,&s_greldie4};
\r
215 statetype s_greldie4 = {GRELDIE4PIC,22,NULL,&s_greldie5};
\r
216 statetype s_greldie5 = {GRELDIE5PIC,22,NULL,&s_greldie5a};
\r
217 statetype s_greldie5a = {GRELDIE5PIC,1,T_Grelm_DropKey,&s_greldie6};
\r
218 statetype s_greldie6 = {GRELDIE6PIC,0,NULL,&s_greldie6};
\r
221 extern statetype s_gshot1;
\r
223 statetype s_gshot1 = {SKULL_SHOTPIC,8,T_ShootPlayer,&s_gshot1};
\r
233 void SpawnGrelminar (int tilex, int tiley)
\r
235 unsigned Grel_Hard;
\r
238 SpawnNewObj(tilex,tiley,&s_grel1,PIXRADIUS*35);
\r
239 new->obclass = grelmobj;
\r
241 new->flags |= of_shootable;
\r
244 // if Grelminar is to drop a key the info-plane byte to the right
\r
245 // should have a 1 in the highbyte, else he will not drop the key.
\r
247 DropKey = *(mapsegs[2]+farmapylookup[tiley]+tilex+1);
\r
249 new->temp1 = DropKey>>8;
\r
254 // The info-plane byte below Grelminar will determine how powerful
\r
255 // Grelminar is. If nothing is there, he is the most powerful.
\r
256 // -- affected are the hit points and the shot damage.
\r
257 // The hit points are controlled here, the shot damage is controlled
\r
258 // within the spawning of the shot. See ShootPlayer for more info.
\r
260 Grel_Hard = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
263 new->temp2 = Grel_Hard>>8;
\r
264 new->hitpoints = EasyHitPoints((new->temp2 * 10));
\r
267 new->hitpoints = EasyHitPoints(100);
\r
279 void T_Grelminar (objtype *ob)
\r
284 if (ShootPlayer(ob,gshotobj,ob->temp2,&s_gshot1))
\r
286 ob->state = &s_grelattack3;
\r
287 ob->ticcount = ob->state->tictime;
\r
289 if (CheckHandAttack(ob))
\r
290 TakeDamage (ob->temp2*3);
\r
295 //=================================
\r
299 //=================================
\r
300 void T_Grelm_DropKey(objtype *ob)
\r
308 SpawnBonus(ob->tilex,ob->tiley,B_RKEY);
\r
309 SD_PlaySound(GRELM_DEADSND);
\r
314 =============================================================================
\r
318 =============================================================================
\r
321 void T_Bat (objtype *ob);
\r
322 void T_BatPast (objtype *ob);
\r
324 extern statetype s_bat1;
\r
325 extern statetype s_bat2;
\r
326 extern statetype s_bat3;
\r
327 extern statetype s_bat4;
\r
329 extern statetype s_batdie1;
\r
330 extern statetype s_batdie2;
\r
333 statetype s_bat1 = {BAT1PIC,6,T_Bat,&s_bat2};
\r
334 statetype s_bat2 = {BAT2PIC,6,T_Bat,&s_bat3};
\r
335 statetype s_bat3 = {BAT3PIC,6,T_Bat,&s_bat4};
\r
336 statetype s_bat4 = {BAT4PIC,6,T_Bat,&s_bat1};
\r
338 statetype s_batpast = {BAT4PIC,80,T_BatPast,&s_bat1};
\r
340 statetype s_batdie1 = {BATDIE1PIC,18,NULL,&s_batdie2};
\r
341 statetype s_batdie2 = {BATDIE2PIC,18,NULL,NULL};
\r
352 void SpawnBat (int tilex, int tiley)
\r
354 SpawnNewObj(tilex,tiley,&s_bat1,PIXRADIUS*35);
\r
355 new->obclass = batobj;
\r
356 new->flags |= of_shootable;
\r
358 new->hitpoints = 1;
\r
364 ==================================
\r
368 ==================================
\r
371 void BatChaseThink (objtype *obj)
\r
375 deltax=player->tilex - obj->tilex;
\r
376 deltay=player->tiley - obj->tiley;
\r
390 obj->dir = dirtable[deltay*3+deltax];
\r
394 obj->dir = dirtable[3+deltax];
\r
398 obj->dir = dirtable[deltay*3+1];
\r
406 void BatRunThink (objtype *obj)
\r
410 deltax=player->tilex - obj->tilex;
\r
411 deltay=player->tiley - obj->tiley;
\r
423 obj->dir = dirtable[deltay*3+deltax];
\r
427 obj->dir = dirtable[3+deltax];
\r
431 obj->dir = dirtable[deltay*3+1];
\r
445 void T_Bat (objtype *ob)
\r
448 long deltax,deltay,size;
\r
450 move = ob->speed*tics;
\r
451 size = (long)ob->size + player->size + move;
\r
456 deltax = ob->x - player->x;
\r
457 deltay = ob->y - player->y;
\r
459 if (deltax <= size && deltax >= -size
\r
460 && deltay <= size && deltay >= -size && !ob->temp1)
\r
466 if (move < ob->distance)
\r
472 actorat[ob->tilex][ob->tiley] = 0; // pick up marker from goal
\r
473 if (ob->dir == nodir)
\r
476 ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
\r
477 ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
\r
478 move -= ob->distance;
\r
482 Walk (ob); // go straight
\r
485 ob->state = &s_batpast;
\r
486 ob->ticcount = ob->state->tictime;
\r
490 BatChaseThink (ob); // head towards player
\r
492 actorat[ob->tilex][ob->tiley] = ob; // set down a new goal marker
\r
493 } while (0); // just once
\r
506 void T_BatPast (objtype *ob)
\r
509 long deltax,deltay,size;
\r
511 move = ob->speed*tics;
\r
515 if (move < ob->distance)
\r
520 actorat[ob->tilex][ob->tiley] = 0; // pick up marker from goal
\r
522 ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
\r
523 ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
\r
524 move -= ob->distance;
\r
528 actorat[ob->tilex][ob->tiley] = ob; // set down a new goal marker
\r
529 } while (0); //(move)
\r
534 void T_ChaseThink(objtype *obj);
\r
535 void T_AwakeThink(objtype *obj);
\r
540 =============================================================================
\r
544 =============================================================================
\r
547 void T_Godess (objtype *ob);
\r
550 extern statetype s_godesspause;
\r
552 extern statetype s_godess_statue1;
\r
553 extern statetype s_godess_statue2;
\r
555 extern statetype s_godess1;
\r
556 extern statetype s_godess2;
\r
557 extern statetype s_godess3;
\r
559 extern statetype s_godessattack1;
\r
560 extern statetype s_godessattack2;
\r
561 extern statetype s_godessattack3;
\r
563 extern statetype s_godessouch;
\r
565 extern statetype s_godessdie1;
\r
566 extern statetype s_godessdie2;
\r
567 extern statetype s_godessdie3;
\r
570 statetype s_godesspause = {GODESS_WALK1PIC,25,NULL,&s_godess2};
\r
572 statetype s_godess_statue1 = {GODESS_STATUEPIC,20,T_ChaseThink,&s_godess_statue1};
\r
573 statetype s_godess_statue2 = {GODESS_STATUEPIC,1,T_AwakeThink,&s_godess1};
\r
575 statetype s_godess1 = {GODESS_WALK1PIC,20,T_ChaseThink,&s_godess2};
\r
576 statetype s_godess2 = {GODESS_WALK2PIC,20,T_ChaseThink,&s_godess3};
\r
577 statetype s_godess3 = {GODESS_WALK3PIC,20,T_ChaseThink,&s_godess1};
\r
579 statetype s_godessattack1 = {GODESS_ATTACK1PIC,10,NULL,&s_godessattack2};//20
\r
580 statetype s_godessattack2 = {GODESS_ATTACK2PIC,8,NULL,&s_godessattack3};//20
\r
581 statetype s_godessattack3 = {GODESS_ATTACK3PIC,10,T_DoDamage,&s_godesspause};//30
\r
583 statetype s_godessouch = {GODESS_OUCHPIC,10,NULL,&s_godess1};
\r
585 statetype s_godessdie1 = {GODESS_DEATH1PIC,65,NULL,&s_godessdie2};
\r
586 statetype s_godessdie2 = {GODESS_DEATH2PIC,30,NULL,&s_godessdie2};
\r
598 void SpawnGodess (int tilex, int tiley)
\r
601 short current_zombie_delay;
\r
604 SpawnNewObj(tilex,tiley,&s_godess_statue1,PIXRADIUS*35);
\r
606 zombie_mode = zm_wait_for_dark;
\r
608 tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
610 zombie_delay = (tile>>8)*30;
\r
613 current_zombie_delay = (2*60)+random(4*60);
\r
614 zombie_delay = zombie_base_delay+current_zombie_delay;
\r
615 zombie_base_delay += current_zombie_delay;
\r
616 if (zombie_base_delay > 8*60)
\r
617 zombie_base_delay = 0;
\r
620 new->obclass = realsolidobj;//godessobj;
\r
622 new->flags |= of_shootable;
\r
623 new->flags &= ~of_tree;
\r
624 // new->hitpoints = EasyHitPoints(10);
\r
631 =============================================================================
\r
635 =============================================================================
\r
638 void T_Ant(objtype *ob);
\r
640 statetype s_ant_wait = {ANT_EGG1PIC,10,T_ChaseThink,&s_ant_wait};
\r
642 statetype s_ant_egg = {ANT_EGG2PIC,45,T_AwakeThink,&s_ant_walk1};
\r
644 statetype s_ant_walk1 = {ANT_WALK1PIC,20,T_ChaseThink,&s_ant_walk2};
\r
645 statetype s_ant_walk2 = {ANT_WALK2PIC,20,T_ChaseThink,&s_ant_walk3};
\r
646 statetype s_ant_walk3 = {ANT_WALK3PIC,20,T_ChaseThink,&s_ant_walk1};
\r
648 statetype s_ant_attack1 = {ANT_ATTACKPIC,20,NULL,&s_ant_pause};
\r
650 statetype s_ant_pause = {ANT_WALK2PIC,15,T_DoDamage,&s_ant_walk1};
\r
652 statetype s_ant_ouch = {ANT_WALK1PIC,15,NULL,&s_ant_walk1};
\r
654 statetype s_ant_die1 = {ANT_DEATH1PIC,40,NULL,&s_ant_die2};
\r
655 statetype s_ant_die2 = {ANT_DEATH2PIC,10,NULL,&s_ant_die3};
\r
656 statetype s_ant_die3 = {ANT_DEATH3PIC,10,NULL,&s_ant_die2};
\r
658 #define ant_mode ob->temp1
\r
659 #define ant_delay ob->temp2
\r
668 void SpawnAnt(int tilex, int tiley)
\r
672 SpawnNewObj(tilex,tiley,&s_ant_wait,PIXRADIUS*35);
\r
675 tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
677 ant_delay = (tile>>8)*30;
\r
679 ant_delay = 2*60+random(5*60);
\r
681 ant_mode = zm_wait_for_dark;
\r
683 new->obclass = antobj;
\r
685 new->flags &= ~of_shootable;
\r
686 new->hitpoints = EasyHitPoints(15);
\r
692 =============================================================================
\r
696 =============================================================================
\r
699 extern statetype s_zombie_rise1;
\r
700 extern statetype s_zombie_rise2;
\r
701 extern statetype s_zombie_rise3;
\r
702 extern statetype s_zombie_rise4;
\r
704 extern statetype s_zombie_alive1;
\r
705 extern statetype s_zombie_alive2;
\r
706 extern statetype s_zombie_alive3;
\r
708 //extern statetype s_zombie_attack1;
\r
710 extern statetype s_zombie_death1;
\r
711 extern statetype s_zombie_death2;
\r
712 extern statetype s_zombie_death3;
\r
714 void T_Zombie (objtype *ob);
\r
715 void T_ZombieRisen(objtype *obj);
\r
717 statetype s_zombie_risen = {ZOMB_WALK3PIC,1,T_AwakeThink,&s_zombie_alive1};
\r
719 statetype s_zombie_pause = {ZOMB_WALK1PIC,20,NULL,&s_zombie_alive1};
\r
721 statetype s_zombie_inground = {0,13,T_ChaseThink,&s_zombie_inground};
\r
723 statetype s_zombie_rise1 = {ZOMB_APPEAR1PIC,24,NULL,&s_zombie_rise2};
\r
724 statetype s_zombie_rise2 = {ZOMB_APPEAR2PIC,24,NULL,&s_zombie_rise3};
\r
725 statetype s_zombie_rise3 = {ZOMB_APPEAR3PIC,24,NULL,&s_zombie_rise4};
\r
726 statetype s_zombie_rise4 = {ZOMB_APPEAR4PIC,24,NULL,&s_zombie_risen};
\r
728 statetype s_zombie_alive1 = {ZOMB_WALK1PIC,13,T_ChaseThink,&s_zombie_alive2};
\r
729 statetype s_zombie_alive2 = {ZOMB_WALK2PIC,13,T_ChaseThink,&s_zombie_alive3};
\r
730 statetype s_zombie_alive3 = {ZOMB_WALK3PIC,13,T_ChaseThink,&s_zombie_alive1};
\r
732 statetype s_zombie_death1 = {ZOMB_DIE1PIC,16,NULL,&s_zombie_death2};
\r
733 statetype s_zombie_death2 = {ZOMB_DIE2PIC,16,NULL,&s_zombie_death3};
\r
734 statetype s_zombie_death3 = {ZOMB_DIE3PIC,16,NULL,&s_zombie_death3};
\r
736 statetype s_zombie_attack = {ZOMB_ATTACKPIC,15,T_DoDamage,&s_zombie_pause};
\r
737 //statetype s_zombie_attack1 = {ZOMB_ATTACKPIC,15,NULL,&s_zombie_pause};
\r
739 statetype s_zombie_ouch = {ZOMB_OUCHPIC,15,NULL,&s_zombie_alive1};
\r
742 //--------------------------------------------------------------------------
\r
744 //--------------------------------------------------------------------------
\r
745 void SpawnZombie (int tilex, int tiley)
\r
748 short current_zombie_delay;
\r
751 SpawnNewObj(tilex,tiley,&s_zombie_inground,35*PIXRADIUS);
\r
753 zombie_mode = zm_wait_for_dark;
\r
755 tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
757 zombie_delay = (tile>>8)*30;
\r
760 current_zombie_delay = (2*60)+random(4*60);
\r
761 zombie_delay = zombie_base_delay+current_zombie_delay;
\r
762 zombie_base_delay += current_zombie_delay;
\r
763 if (zombie_base_delay > 8*60)
\r
764 zombie_base_delay = 0;
\r
768 new->obclass = zombieobj;
\r
769 new->hitpoints = EasyHitPoints(8);
\r
771 new->flags &= ~of_shootable;
\r
776 =============================================================================
\r
780 =============================================================================
\r
783 extern statetype s_tree_pause;
\r
784 extern statetype s_tree_idle;
\r
785 extern statetype s_tree_awakening1;
\r
786 extern statetype s_tree_awakening2;
\r
787 extern statetype s_tree_walk1;
\r
788 extern statetype s_tree_walk2;
\r
789 extern statetype s_tree_walk3;
\r
790 extern statetype s_tree_death1;
\r
791 extern statetype s_tree_death2;
\r
792 extern statetype s_tree_death3;
\r
793 extern statetype s_tree_death4;
\r
794 extern statetype s_tree_death5;
\r
795 extern statetype s_tree_attack1;
\r
796 extern statetype s_tree_attack2;
\r
797 extern statetype s_tree_attack3;
\r
798 extern statetype s_tree_ouch;
\r
800 void T_Tree (objtype *ob);
\r
801 void T_DeathThink(objtype *ob);
\r
803 statetype s_tree_pause = {TREE_WALK1PIC,25,NULL,&s_tree_walk2};
\r
805 statetype s_tree_idle = {TREE_IDLEPIC,13,T_ChaseThink,&s_tree_idle};
\r
807 statetype s_tree_awakening1 = {TREE_AWAKENINGPIC,1,T_AwakeThink,&s_tree_awakening2};
\r
808 statetype s_tree_awakening2 = {TREE_AWAKENINGPIC,50,NULL,&s_tree_walk1};
\r
810 statetype s_tree_walk1 = {TREE_WALK1PIC,13,T_ChaseThink,&s_tree_walk2};
\r
811 statetype s_tree_walk2 = {TREE_WALK2PIC,13,T_ChaseThink,&s_tree_walk1};
\r
813 statetype s_tree_death1 = {TREE_DEATH1PIC,45,NULL,&s_tree_death2};
\r
814 statetype s_tree_death2 = {TREE_DEATH2PIC,25,NULL,&s_tree_death3};
\r
815 statetype s_tree_death3 = {TREE_DEATH1PIC,15,T_DeathThink,&s_tree_death4};
\r
816 statetype s_tree_death4 = {TREE_DEATH2PIC,15,T_DeathThink,&s_tree_death5};
\r
817 statetype s_tree_death5 = {TREE_DEATH3PIC,15,T_DeathThink,&s_tree_death3};
\r
819 statetype s_tree_attack1 = {TREE_ATTACK1PIC,15,T_DoDamage,&s_tree_attack2};
\r
820 statetype s_tree_attack2 = {TREE_ATTACK2PIC,15,T_DoDamage,&s_tree_attack3};
\r
821 statetype s_tree_attack3 = {TREE_ATTACK3PIC,15,T_DoDamage,&s_tree_pause};
\r
823 statetype s_tree_ouch = {TREE_AWAKENINGPIC,15,NULL,&s_tree_walk1};
\r
826 #define zombie_mode ob->temp1
\r
827 #define zombie_delay ob->temp2
\r
830 //--------------------------------------------------------------------------
\r
832 //--------------------------------------------------------------------------
\r
833 void SpawnTree(int tilex, int tiley)
\r
836 short current_zombie_delay;
\r
839 SpawnNewObj(tilex,tiley,&s_tree_idle,35*PIXRADIUS);
\r
841 zombie_mode = zm_wait_for_dark;
\r
843 tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
845 zombie_delay = (tile>>8)*30;
\r
848 current_zombie_delay = (2*60)+random(4*60);
\r
849 zombie_delay = zombie_base_delay+current_zombie_delay;
\r
850 zombie_base_delay += current_zombie_delay;
\r
851 if (zombie_base_delay > 8*60)
\r
852 zombie_base_delay = 0;
\r
856 new->obclass = realsolidobj;
\r
857 // new->hitpoints = EasyHitPoints(12);
\r
859 new->flags |= of_shootable;
\r
860 new->flags |= of_tree;
\r
863 //--------------------------------------------------------------------------
\r
865 //--------------------------------------------------------------------------
\r
866 void T_DeathThink(objtype *ob)
\r
870 if ((ob->ticcount - realtics) <= 0)
\r
877 ob->state = &s_tree_death4;
\r
879 ob->state = &s_tree_death5;
\r
885 ob->state = &s_tree_death3;
\r
887 ob->state = &s_tree_death5;
\r
893 ob->state = &s_tree_death3;
\r
895 ob->state = &s_tree_death4;
\r
899 ob->ticcount = ob->state->tictime;
\r
904 if (CheckHandAttack(ob))
\r
909 //////////////////////////////////////////////////////////////////////////
\r
911 // GENERAL THINK ROUTINES USED BY THE ZOMBIE, TREE, ANT, AND GODESS
\r
912 // ----trying to cut down on the code size----
\r
914 //////////////////////////////////////////////////////////////////////////
\r
917 //--------------------------------------------------------------------------
\r
919 //--------------------------------------------------------------------------
\r
920 void T_ChaseThink(objtype *ob)
\r
922 switch (zombie_mode)
\r
924 case zm_wait_for_dark:
\r
926 if (gamestate.mapon == 0)
\r
928 if (BGFLAGS & BGF_NIGHT)
\r
929 zombie_mode = zm_wait_to_rise;
\r
933 zombie_mode = zm_wait_to_rise;
\r
936 case zm_wait_to_rise:
\r
937 if (zombie_delay < 0)
\r
939 if ((ob->tilex == player->tilex) && (ob->tiley == player->tiley))
\r
941 if (CheckHandAttack(ob))
\r
944 ob->active = always;
\r
945 switch (ob->obclass)
\r
948 ob->state = &s_zombie_rise1;
\r
952 ob->state = &s_ant_egg;
\r
955 case realsolidobj: //tree and godess
\r
956 if (ob->flags & of_tree)
\r
957 ob->state = &s_tree_awakening1;
\r
959 ob->state = &s_godess_statue2;
\r
962 ob->ticcount = ob->state->tictime;
\r
963 zombie_mode = zm_active;
\r
966 zombie_delay -= tics;
\r
971 if (Chase (ob,true) || (random(1000)<RANDOM_ATTACK))
\r
973 switch (ob->obclass)
\r
976 ob->state = &s_zombie_attack;
\r
980 ob->state = &s_ant_attack1;
\r
984 ob->state = &s_tree_attack1;
\r
988 ob->state = &s_godessattack1;
\r
991 ob->ticcount = ob->state->tictime;
\r
998 //--------------------------------------------------------------------------
\r
1000 //--------------------------------------------------------------------------
\r
1001 void T_AwakeThink(objtype *obj)
\r
1003 if (obj->obclass == realsolidobj)
\r
1005 if (obj->flags & of_tree)
\r
1006 obj->obclass = treeobj;
\r
1008 obj->obclass = godessobj;
\r
1009 obj->hitpoints = EasyHitPoints(12);
\r
1012 obj->flags |= of_shootable;
\r
1019 //--------------------------------------------------------------------------
\r
1021 //--------------------------------------------------------------------------
\r
1022 boolean ShootPlayer(objtype *ob, short obclass, short speed, statetype *state)
\r
1024 int angle = AngleNearPlayer(ob);
\r
1029 DSpawnNewObjFrac (ob->x,ob->y,state,PIXRADIUS*35);
\r
1030 new->obclass = obclass;
\r
1031 new->active = always;
\r
1032 new->angle = angle;
\r
1035 // If the shot is Grelminar's, then determine the power of the shot.
\r
1036 // The shot speed is hard-wired as 10000. But the shot power is
\r
1037 // determined by speed. Speed now contains "Grelminar's level of
\r
1038 // hardness" and this is multiplied by 3 to get the shot power.
\r
1040 if (obclass == gshotobj)
\r
1042 new->speed = 10000;
\r
1043 new->temp1 = speed*3;
\r
1046 new->speed = speed;
\r
1052 //--------------------------------------------------------------------------
\r
1053 // T_ShootPlayer()
\r
1054 //--------------------------------------------------------------------------
\r
1055 void T_ShootPlayer(objtype *ob)
\r
1058 long xmove,ymove,speed;
\r
1060 speed = ob->speed*tics;
\r
1062 xmove = FixedByFrac(speed,costable[ob->angle]);
\r
1063 ymove = -FixedByFrac(speed,sintable[ob->angle]);
\r
1065 if (ShotClipMove(ob,xmove,ymove))
\r
1067 ob->state = &s_pshot_exp1;
\r
1068 ob->ticcount = ob->state->tictime;
\r
1072 ob->tilex = ob->x >> TILESHIFT;
\r
1073 ob->tiley = ob->y >> TILESHIFT;
\r
1076 // check for collision with wall
\r
1078 if (tilemap[ob->tilex][ob->tiley])
\r
1080 SD_PlaySound (SHOOTWALLSND);
\r
1081 ob->state = &s_pshot_exp1;
\r
1082 ob->ticcount = s_pshot_exp1.tictime;
\r
1088 // check for collision with player
\r
1090 if ( ob->xl <= player->xh
\r
1091 && ob->xh >= player->xl
\r
1092 && ob->yl <= player->yh
\r
1093 && ob->yh >= player->yl)
\r
1095 switch (ob->obclass)
\r
1098 TakeDamage (ESHOTDAMAGE);
\r
1102 TakeDamage (MSHOTDAMAGE);
\r
1106 TakeDamage (ob->temp1); // the damage of Grelminar's shot -
\r
1107 break; // see Grelminar's spawning
\r
1110 TakeDamage(SSHOTDAMAGE);
\r
1121 // check for collision with other solid and realsolid objects.
\r
1122 // Great terminology!! -- solid objects really aren't solid
\r
1123 // -- realsolid objects ARE solid
\r
1124 // if ((actorat[ob->tilex][ob->tiley]) && (actorat[ob->tilex][ob->tiley]->obclass != ob->obclass))
\r
1125 if (((actorat[ob->tilex][ob->tiley]->obclass == realsolidobj) ||
\r
1126 (actorat[ob->tilex][ob->tiley]->obclass == solidobj)) &&
\r
1127 (actorat[ob->tilex][ob->tiley]->flags & of_shootable))
\r
1129 ob->state = &s_pshot_exp1;
\r
1130 ob->ticcount = s_pshot_exp1.tictime;
\r
1135 // check for collision with player
\r
1137 for (check = player->next; check; check=check->next)
\r
1138 if ((ob->flags & of_shootable) && ob->obclass != mageobj
\r
1139 && ob->xl <= check->xh
\r
1140 && ob->xh >= check->xl
\r
1141 && ob->yl <= check->yh
\r
1142 && ob->yh >= check->yl)
\r
1144 switch (ob->obclass)
\r
1147 ShootActor (check,ESHOTDAMAGE);
\r
1151 ShootActor (check,MSHOTDAMAGE);
\r
1155 ShootActor (check,25); //NOLAN--check on me!!!!!!!
\r
1159 ShootActor (check,25);
\r
1163 ShootActor(check, SSHOTDAMAGE);
\r
1167 ShootActor(check, 7);
\r
1170 ob->state = &s_pshot_exp1;
\r
1171 ob->ticcount = s_pshot_exp1.tictime;
\r
1176 //-------------------------------------------------------------------------
\r
1177 // AngleNearPlayer()
\r
1178 //-------------------------------------------------------------------------
\r
1179 int AngleNearPlayer(objtype *ob)
\r
1182 int xdiff = ob->tilex-player->tilex;
\r
1183 int ydiff = ob->tiley-player->tiley;
\r
1185 if (ob->tiley == player->tiley)
\r
1187 if (ob->tilex < player->tilex)
\r
1193 if (ob->tilex == player->tilex)
\r
1195 if (ob->tiley < player->tiley)
\r
1201 if (xdiff == ydiff)
\r
1202 if (ob->tilex < player->tilex)
\r
1204 if (ob->tiley < player->tiley)
\r
1211 if (ob->tiley < player->tiley)
\r