OSDN Git Service

803fe8b953a987b7c7f7dd075e4c5c1dfb068055
[proj16/16.git] / src / lib / hb / c6_act2.c
1 /* Catacomb Apocalypse Source Code\r
2  * Copyright (C) 1993-2014 Flat Rock Software\r
3  *\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
8  *\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
13  *\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
17  */\r
18 \r
19 // C3_PLAY.C\r
20 \r
21 #include "DEF.H"\r
22 #pragma hdrstop\r
23 \r
24 \r
25 /*\r
26 =============================================================================\r
27 \r
28                                                  GLOBAL VARIABLES\r
29 \r
30 =============================================================================\r
31 */\r
32 \r
33 boolean ShootPlayer (objtype *ob, short obclass, short speed, statetype *state);\r
34 void T_ShootPlayer(objtype *ob);\r
35 \r
36 short head_base_delay;\r
37 \r
38 /*\r
39 =============================================================================\r
40 \r
41                                                  LOCAL VARIABLES\r
42 \r
43 =============================================================================\r
44 */\r
45 \r
46 \r
47 void T_ShooterObj(objtype *ob);\r
48 \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
63 \r
64 \r
65 /*\r
66 =============================================================================\r
67 \r
68                                                                                 LARGE SOUND\r
69 \r
70 =============================================================================\r
71 */\r
72 void LargeSound (objtype *ob)\r
73 {\r
74         if (ob->temp1 != SOUNDPLAYED)\r
75         {\r
76                 SD_PlaySound(LARGEMONSTERSND);\r
77                 ob->temp1 = SOUNDPLAYED;\r
78 \r
79         }\r
80 }\r
81 \r
82 \r
83 /*\r
84 =============================================================================\r
85 \r
86                                                                                 SMALL SOUND\r
87 \r
88 =============================================================================\r
89 */\r
90 void SmallSound (objtype *ob)\r
91 {\r
92         if (ob->temp1 != SOUNDPLAYED)\r
93         {\r
94                 SD_PlaySound(SMALLMONSTERSND);\r
95                 ob->temp1 = SOUNDPLAYED;\r
96 \r
97         }\r
98 }\r
99 \r
100 \r
101 \r
102 /*\r
103 =============================================================================\r
104 \r
105                                                                                 RAMBONE\r
106 \r
107 =============================================================================\r
108 */\r
109 \r
110 \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
115 \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
120 \r
121 statetype s_skel_ouch = {RAMBONEATTACK1PIC, 10, NULL, &s_skel_1};\r
122 \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
126 \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
129 \r
130 #define shooter_mode            ob->temp1\r
131 #define shooter_delay   ob->temp2\r
132 \r
133 \r
134 /*\r
135 ===============\r
136 =\r
137 = SpawnSkeleton\r
138 =\r
139 ===============\r
140 */\r
141 void SpawnRamBone(int tilex, int tiley)\r
142 {\r
143         SpawnNewObj(tilex, tiley, &s_skel_1,PIXRADIUS*20);\r
144         new->obclass    = ramboneobj;\r
145         new->speed              = 2036;\r
146         new->flags              |= of_shootable;\r
147         new->hitpoints  = EasyHitPoints(12);\r
148 }\r
149 \r
150 \r
151 /*\r
152 =================\r
153 =\r
154 = T_SkeletonShoot\r
155 =\r
156 =================\r
157 */\r
158 void T_SkeletonShoot(objtype *ob)\r
159 {\r
160         ShootPlayer(ob, rbshotobj, MSHOTSPEED, &s_skel_shot1);\r
161 }\r
162 \r
163 \r
164 \r
165 /*\r
166 =============================================================================\r
167 \r
168                                                                                 FUTURE MAGE\r
169 \r
170 =============================================================================\r
171 */\r
172 \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
176 \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
180 \r
181 statetype s_fmageouch = {FMAGEATTACK1PIC, 10, NULL, &s_fmage1};\r
182 \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
186 \r
187 statetype s_fmshot1 = {FMAGESHOT1PIC, 8, &T_ShootPlayer, &s_fmshot2};\r
188 statetype s_fmshot2 = {FMAGESHOT2PIC, 8, &T_ShootPlayer, &s_fmshot1};\r
189 \r
190 /*\r
191 =================\r
192 =\r
193 = SpawnFutureMage\r
194 =\r
195 =================\r
196 */\r
197 \r
198 void SpawnFutureMage (int tilex, int tiley)\r
199 {\r
200         SpawnNewObj(tilex, tiley, &s_fmage1, PIXRADIUS*15);\r
201         new->obclass    = fmageobj;\r
202         new->speed              = 3072;\r
203         new->flags              |= of_shootable;\r
204         new->hitpoints  = EasyHitPoints(12);\r
205 }\r
206 \r
207 \r
208 /*\r
209 =================\r
210 =\r
211 = T_FMageShoot\r
212 =\r
213 =================\r
214 */\r
215 void T_FMageShoot(objtype *ob)\r
216 {\r
217         ShootPlayer(ob, fmshotobj, MSHOTSPEED, &s_fmshot1);\r
218 }\r
219 \r
220 \r
221 \r
222 /*\r
223 =============================================================================\r
224 \r
225                                                                                 ROBO TANK\r
226 \r
227 =============================================================================\r
228 */\r
229 \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
234 \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
239 \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
245 \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
248 \r
249 \r
250 /*\r
251 =================\r
252 =\r
253 = SpawnRoboTank\r
254 =\r
255 =================\r
256 */\r
257 void SpawnRoboTank(int tilex, int tiley)\r
258 {\r
259         SpawnNewObj(tilex, tiley, &s_robotank_walk1, PIXRADIUS*35);\r
260         new->obclass    = robotankobj;\r
261         new->speed              = 1700;\r
262         new->flags              |= of_shootable;\r
263         new->hitpoints  = EasyHitPoints(25);\r
264 }\r
265 \r
266 \r
267 /*\r
268 =================\r
269 =\r
270 = T_RoboTankShoot\r
271 =\r
272 =================\r
273 */\r
274 void T_RoboTankShoot(objtype *ob)\r
275 {\r
276         ShootPlayer(ob, rtshotobj, 7000, &s_robotank_shot1);\r
277 }\r
278 \r
279 \r
280 \r
281 /*\r
282 ====================\r
283 =\r
284 = T_AlternateStates\r
285 =\r
286 ====================\r
287 */\r
288 void T_AlternateStates(objtype *ob)\r
289 {\r
290         if (ob->temp1--)\r
291         {\r
292                 ob->state = ob->state->next;\r
293         }\r
294         else\r
295         {\r
296                 if (ob->state == &s_robotank_death3)\r
297                         ob->state = &s_robotank_death4;\r
298                 else\r
299                         ob->state = &s_aqua_die4;\r
300         }\r
301         ob->ticcount    = ob->state->tictime;\r
302 }\r
303 \r
304 \r
305 \r
306 \r
307 \r
308 \r
309 /*\r
310 =============================================================================\r
311 \r
312                                                                                         STOMPY\r
313 \r
314 =============================================================================\r
315 */\r
316 \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
321 \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
326 \r
327 statetype s_stompy_ouch = {STOMPYATTACK1PIC, 10, NULL, &s_stompy_walk2};\r
328 \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
333 \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
339 \r
340 \r
341 /*\r
342 =================\r
343 =\r
344 = SpawnStompy\r
345 =\r
346 =================\r
347 */\r
348 void SpawnStompy(int tilex, int tiley)\r
349 {\r
350         SpawnNewObj(tilex, tiley, &s_stompy_walk1, PIXRADIUS*25);\r
351         new->obclass    = stompyobj;\r
352         new->speed              = 1800;\r
353         new->flags              |= of_shootable;\r
354         new->hitpoints  = EasyHitPoints(20);\r
355 }\r
356 \r
357 \r
358 /*\r
359 =================\r
360 =\r
361 = T_StompyShoot\r
362 =\r
363 =================\r
364 */\r
365 void T_StompyShoot(objtype *ob)\r
366 {\r
367         ShootPlayer(ob, syshotobj, 8500, &s_stompy_shot1);\r
368 }\r
369 \r
370 \r
371 \r
372 /*\r
373 =============================================================================\r
374 \r
375                                                                                                 BUG\r
376 \r
377 =============================================================================\r
378 */\r
379 \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
383 \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
388 \r
389 statetype s_bug_ouch = {BUG_WALK1PIC, 10, NULL, &s_bug_walk2};\r
390 \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
393 \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
396 \r
397 \r
398 /*\r
399 =================\r
400 =\r
401 = SpawnBug\r
402 =\r
403 =================\r
404 */\r
405 void SpawnBug(int tilex, int tiley)\r
406 {\r
407         SpawnNewObj(tilex, tiley, &s_bug_walk1, PIXRADIUS*20);\r
408         new->obclass    = bugobj;\r
409         new->speed              = 1500;\r
410         new->flags              |= of_shootable;\r
411         new->hitpoints  = EasyHitPoints(10);\r
412 }\r
413 \r
414 \r
415 /*\r
416 =================\r
417 =\r
418 = T_BugShoot\r
419 =\r
420 =================\r
421 */\r
422 void T_BugShoot(objtype *ob)\r
423 {\r
424         ShootPlayer(ob, bgshotobj, 8000, &s_bug_shot1);\r
425 }\r
426 \r
427 \r
428 \r
429 \r
430 \r
431 /*\r
432 =============================================================================\r
433 \r
434                                                                         MEC EYE\r
435 \r
436 =============================================================================\r
437 */\r
438 \r
439 void T_EyeShootPlayer (objtype *ob);\r
440 \r
441 statetype s_eye_pause = {EYE_WALK1PIC,40,NULL,&s_eye_2};\r
442 \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
449 \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
452 \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
457 \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
460 \r
461 \r
462 //-------------------------------------------------------------------------\r
463 // SpawnEye()\r
464 //-------------------------------------------------------------------------\r
465 void SpawnShooterEye(int tilex, int tiley)\r
466 {\r
467         objtype *ob;\r
468 \r
469         SpawnNewObj(tilex,tiley,&s_eye_1,PIXRADIUS*10);\r
470         ob = new;\r
471         new->obclass = eyeobj;\r
472         new->speed = 3000;\r
473         new->flags |= of_shootable;\r
474         new->hitpoints = EasyHitPoints(15);\r
475         shooter_mode = sm_other1;\r
476 }\r
477 \r
478 \r
479 //---------------------------------------------------------------------------\r
480 // T_EyeShootPlayer\r
481 //---------------------------------------------------------------------------\r
482 void T_EyeShootPlayer (objtype *ob)\r
483 {\r
484         ShootPlayer(ob, eshotobj, ESHOTSPEED, &s_eshot1);\r
485 }\r
486 \r
487 \r
488 /*\r
489 ===============\r
490 =\r
491 = T_ShooterObj\r
492 =\r
493 = **********\r
494 = ***NOTE*** This routine controls the thinks for the RamBone, RoboTank,\r
495 = **********    Stompy, Future Mage, Bug, and Old Mage\r
496 =\r
497 ===============\r
498 */\r
499 \r
500 void T_ShooterObj(objtype *ob)\r
501 {\r
502         fixed tempx,tempy;\r
503         unsigned temp_tilex,temp_tiley;\r
504         int angle;\r
505 \r
506         shooter_delay -= realtics;\r
507         if (shooter_delay < 0)\r
508         {\r
509                 shooter_mode = random(sm_dummy);\r
510                 shooter_delay = random(10*60)+random(50);\r
511         }\r
512 \r
513         tempx = player->x;\r
514         tempy = player->y;\r
515         temp_tilex = player->tilex;\r
516         temp_tiley = player->tiley;\r
517 \r
518 \r
519         switch (shooter_mode)\r
520         {\r
521                 case sm_other1:\r
522                 case sm_other2:\r
523                 case sm_other3:\r
524                 case sm_other4:\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
529                 break;\r
530         }\r
531 \r
532         if (Chase(ob,true))\r
533                 shooter_delay = 0;\r
534 \r
535         player->x = tempx;\r
536         player->y = tempy;\r
537         player->tilex = temp_tilex;\r
538         player->tiley = temp_tiley;\r
539 \r
540         angle = AngleNearPlayer(ob);\r
541 \r
542 \r
543   // Handle shooting for the different characters controlled by this think.\r
544         switch (ob->obclass)\r
545         {\r
546                 case ramboneobj:\r
547                         if (!random(2) && (angle != -1))\r
548                         {\r
549                                 ob->state = &s_skel_attack1;\r
550                                 ob->ticcount = ob->state->tictime;\r
551                         }\r
552                 break;\r
553 \r
554                 case fmageobj:\r
555                         if (!random(8) && (angle != -1))\r
556                         {\r
557                                 ob->state = &s_fmageattack1;\r
558                                 ob->ticcount = ob->state->tictime;\r
559                         }\r
560                 break;\r
561 \r
562                 case robotankobj:\r
563                         if (!random(15) && (angle != -1))\r
564                         {\r
565                                 ob->state = &s_robotank_attack1;\r
566                                 ob->ticcount = ob->state->tictime;\r
567                         }\r
568                 break;\r
569 \r
570                 case stompyobj:\r
571                         if (angle != -1)\r
572                         {\r
573                                 ob->state = &s_stompy_attack1;\r
574                                 ob->ticcount = ob->state->tictime;\r
575                         }\r
576                 break;\r
577 \r
578                 case bugobj:\r
579                         if (!random(5) && (angle != -1))\r
580                         {\r
581                                 ob->state = &s_bug_attack1;\r
582                                 ob->ticcount = ob->state->tictime;\r
583                         }\r
584                 break;\r
585 \r
586                 case eyeobj:\r
587                         if (!random(2) && (angle != -1))\r
588                         {\r
589                                 ob->state = &s_eye_shootplayer_1;\r
590                                 ob->ticcount = ob->state->tictime;\r
591                         }\r
592                 break;\r
593         }\r
594 }\r
595 \r
596 \r
597 \r
598 \r
599 \r
600 \r
601 /*\r
602 =============================================================================\r
603 \r
604                                                                                 RUNNING EYE\r
605 \r
606 =============================================================================\r
607 */\r
608 \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
613 \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
616 \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
621 \r
622 /*\r
623 ====================\r
624 =\r
625 = SpawnRunningEye()\r
626 =\r
627 ====================\r
628 */\r
629 void SpawnRunningEye(int tilex, int tiley)\r
630 {\r
631         SpawnNewObj(tilex,tiley,&s_reye_1,PIXRADIUS*25);\r
632         new->obclass = reyeobj;\r
633         new->speed = 3500;\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
638 \r
639         new->temp1 = 2;\r
640 \r
641         if (!new->temp2)\r
642                 Quit("Initialize the running eye!\n");\r
643 }\r
644 \r
645 \r
646 /*\r
647 ====================\r
648 =\r
649 = T_RunningEye\r
650 =\r
651 ====================\r
652 */\r
653 void T_RunningEye(objtype *ob)\r
654 {\r
655         int x, y, dir_num, switch_num;\r
656         fixed tempx,tempy;\r
657         unsigned temp_tilex,temp_tiley;\r
658 \r
659         dir_num = *(mapsegs[2]+farmapylookup[ob->tiley]+ob->tilex);\r
660         dir_num = dir_num>>8;\r
661 \r
662         if (!dir_num)\r
663                 dir_num = ob->temp2;\r
664 \r
665         if (dir_num == 5)\r
666         {\r
667                 if (ob->temp1)\r
668                 {\r
669                         ob->temp1--;\r
670                 }\r
671                 else\r
672                 {\r
673                         ob->temp1 = 2;\r
674                         actorat[ob->tilex][ob->tiley] = 0;\r
675                         switch (ob->temp2)\r
676                         {\r
677                                 case 1:\r
678                                         ob->tiley = ob->tiley-1;\r
679                                         ob->y = ((long)(ob->tiley)<<TILESHIFT)+TILEGLOBAL/2;\r
680                                 break;\r
681 \r
682                                 case 2:\r
683                                         ob->tilex = ob->tilex+1;\r
684                                         ob->x = ((long)(ob->tilex)<<TILESHIFT)+TILEGLOBAL/2;\r
685                                 break;\r
686 \r
687                                 case 3:\r
688                                         ob->tiley = ob->tiley+1;\r
689                                         ob->y = ((long)(ob->tiley)<<TILESHIFT)+TILEGLOBAL/2;\r
690                                 break;\r
691 \r
692                                 case 0:\r
693                                 case 4:\r
694                                         ob->tilex = ob->tilex-1;\r
695                                         ob->x = ((long)(ob->tilex)<<TILESHIFT)+TILEGLOBAL/2;\r
696                                 break;\r
697                         }\r
698                         CalcBounds (ob);\r
699                         ChaseThink(ob,false);\r
700                         actorat[ob->tilex][ob->tiley] = ob;\r
701                         return;\r
702                 }\r
703         }\r
704 \r
705         tempx = player->x;\r
706         tempy = player->y;\r
707         temp_tilex = player->tilex;\r
708         temp_tiley = player->tiley;\r
709 \r
710         if (dir_num == 5)\r
711                 switch_num = ob->temp2;\r
712         else\r
713                 switch_num = dir_num;\r
714 \r
715         switch (switch_num)\r
716         {\r
717                 case 1:\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
722                 break;\r
723 \r
724                 case 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
729                 break;\r
730 \r
731                 case 3:\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
736                 break;\r
737 \r
738                 case 0:\r
739                 case 4:\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
744                 break;\r
745         }\r
746 \r
747         Chase(ob, false);\r
748 \r
749         player->x = tempx;\r
750         player->y = tempy;\r
751         player->tilex = temp_tilex;\r
752         player->tiley = temp_tiley;\r
753 \r
754         if (dir_num != 5)\r
755                 ob->temp2 = dir_num;\r
756 }\r
757 \r
758 \r
759 /*\r
760 =============================================================================\r
761 \r
762                                                                                 EGYPTIAN HEAD\r
763 \r
764 =============================================================================\r
765 */\r
766 \r
767 void T_Head(objtype *ob);\r
768 \r
769 statetype s_head = {HEADPIC, 20, &T_Head, &s_head};\r
770 \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
773 \r
774 \r
775 /*\r
776 ===================\r
777 =\r
778 = SpawnEgyptianHead\r
779 =\r
780 ===================\r
781 */\r
782 \r
783 void SpawnEgyptianHead (int tilex, int tiley)\r
784 {\r
785         objtype *ob;\r
786         short current_head_delay;\r
787         unsigned tile;\r
788 \r
789         SpawnNewObj(tilex, tiley, &s_head, PIXRADIUS*35);\r
790         ob = new;\r
791         head_mode = h_wait_to_rise;\r
792 \r
793         tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);\r
794         if (tile)\r
795                 head_delay = (tile>>8)*30;\r
796         else\r
797         {\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
803         }\r
804 \r
805         new->obclass    = realsolidobj;\r
806         new->speed              = 3000;\r
807         new->flags        |= of_shootable;\r
808 }\r
809 \r
810 \r
811 \r
812 //--------------------------------------------------------------------------\r
813 // T_Head()\r
814 //--------------------------------------------------------------------------\r
815 void T_Head(objtype *ob)\r
816 {\r
817         fixed tempx,tempy;\r
818         unsigned temp_tilex,temp_tiley;\r
819         int angle;\r
820 \r
821         switch (head_mode)\r
822         {\r
823                 case h_wait_to_rise:\r
824                         if (head_delay < 0)\r
825                         {\r
826                                 if ((ob->tilex == player->tilex) && (ob->tiley == player->tiley))\r
827                                         break;\r
828                                 if (CheckHandAttack(ob))\r
829                                         break;\r
830 \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
836                         }\r
837                         else\r
838                                 head_delay -= tics;\r
839 \r
840                 break;\r
841 \r
842                 case h_player1:\r
843                 case h_player2:\r
844                 case h_player3:\r
845                 case h_player4:\r
846                 case h_active:\r
847                         Chase (ob,true);\r
848 \r
849                         if (!random(2) && (angle != -1))\r
850                                 ShootPlayer(ob, hshotobj, 10000, &s_head_shot1);\r
851 \r
852                         head_delay -= tics;\r
853                         if (head_delay < 0)\r
854                         {\r
855                                 head_mode = random(h_other4)+1;\r
856                                 head_delay = random(10*60)+random(50);\r
857                         }\r
858                 break;\r
859 \r
860                 case h_other1:\r
861                 case h_other2:\r
862                 case h_other3:\r
863                 case h_other4:\r
864 \r
865                         tempx = player->x;\r
866                         tempy = player->y;\r
867                         temp_tilex = player->tilex;\r
868                         temp_tiley = player->tiley;\r
869 \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
874 \r
875                         if (Chase(ob,true))\r
876                                 head_delay = 0;\r
877 \r
878                         player->x = tempx;\r
879                         player->y = tempy;\r
880                         player->tilex = temp_tilex;\r
881                         player->tiley = temp_tiley;\r
882 \r
883                         head_delay -= tics;\r
884                         if (head_delay <= 0)\r
885                         {\r
886                                 head_mode = h_active;\r
887                                 head_delay = random(10*60)+random(50);\r
888                         }\r
889                 break;\r
890         }\r
891 }\r