rnd-20040921-1-src
[rocksndiamonds.git] / src / game_em / synchro_1.c
1 /* first part of synchro.
2  *
3  * game logic for players.
4  *
5  * large switch statement for tiles the player interacts with.
6  */
7
8 #include "tile.h"
9 #include "level.h"
10 #include "sample.h"
11
12
13 static void player(struct PLAYER *);
14 static int test(struct PLAYER *);
15 static void die(struct PLAYER *);
16
17 void synchro_1(void)
18 {
19  /* must test for death and actually kill separately */
20   char ply1_kill = test(&ply1);
21   char ply2_kill = test(&ply2);
22
23   if (ply1.alive && ply1_kill)
24     die(&ply1);
25   if (ply2.alive && ply2_kill)
26     die(&ply2);
27
28 #if 0
29   ply1.alive = 1; /* debugging */
30 #endif
31
32   ply1.oldx = ply1.x;
33   ply1.oldy = ply1.y;
34   ply1.anim = SPR_still;
35   ply2.oldx = ply2.x;
36   ply2.oldy = ply2.y;
37   ply2.anim = SPR_still;
38
39   if (Random & 256)
40   {
41     if (ply1.alive) player(&ply1);
42     if (ply2.alive) player(&ply2);
43   }
44   else
45   {
46     if (ply2.alive) player(&ply2);
47     if (ply1.alive) player(&ply1);
48   }
49
50   if (ply1.alive)
51   {
52     if (Cave[ply1.oldy][ply1.oldx] == Zplayer)
53     {
54       Cave[ply1.oldy][ply1.oldx] = Xblank;
55       Next[ply1.oldy][ply1.oldx] = Xblank;
56     }
57
58     if (Cave[ply1.y][ply1.x] == Xblank)
59     {
60       Cave[ply1.y][ply1.x] = Zplayer;
61       Next[ply1.y][ply1.x] = Zplayer;
62     }
63   }
64
65   if (ply2.alive)
66   {
67     if (Cave[ply2.oldy][ply2.oldx] == Zplayer)
68     {
69       Cave[ply2.oldy][ply2.oldx] = Xblank;
70       Next[ply2.oldy][ply2.oldx] = Xblank;
71     }
72
73     if (Cave[ply2.y][ply2.x] == Xblank)
74     {
75       Cave[ply2.y][ply2.x] = Zplayer;
76       Next[ply2.y][ply2.x] = Zplayer;
77     }
78   }
79 }
80
81 static int test(struct PLAYER *ply)
82 {
83   register unsigned int x = ply->x;
84   register unsigned int y = ply->y;
85
86   if (lev.time == 0)
87     return(1);
88
89   switch(Cave[y-1][x])
90   {
91     case Xbug_n:
92     case Xbug_e:
93     case Xbug_s:
94     case Xbug_w:
95     case Xbug_gon:
96     case Xbug_goe:
97     case Xbug_gos:
98     case Xbug_gow:
99     case Xtank_n:
100     case Xtank_e:
101     case Xtank_s:
102     case Xtank_w:
103     case Xtank_gon:
104     case Xtank_goe:
105     case Xtank_gos:
106     case Xtank_gow:
107       return(1);
108   }
109
110   switch(Cave[y][x+1])
111   {
112     case Xbug_n:
113     case Xbug_e:
114     case Xbug_s:
115     case Xbug_w:
116     case Xbug_gon:
117     case Xbug_goe:
118     case Xbug_gos:
119     case Xbug_gow:
120     case Xtank_n:
121     case Xtank_e:
122     case Xtank_s:
123     case Xtank_w:
124     case Xtank_gon:
125     case Xtank_goe:
126     case Xtank_gos:
127     case Xtank_gow:
128       return(1);
129   }
130
131   switch(Cave[y+1][x])
132   {
133     case Xbug_n:
134     case Xbug_e:
135     case Xbug_s:
136     case Xbug_w:
137     case Xbug_gon:
138     case Xbug_goe:
139     case Xbug_gos:
140     case Xbug_gow:
141     case Xtank_n:
142     case Xtank_e:
143     case Xtank_s:
144     case Xtank_w:
145     case Xtank_gon:
146     case Xtank_goe:
147     case Xtank_gos:
148     case Xtank_gow:
149       return(1);
150   }
151
152   switch(Cave[y][x-1])
153   {
154     case Xbug_n:
155     case Xbug_e:
156     case Xbug_s:
157     case Xbug_w:
158     case Xbug_gon:
159     case Xbug_goe:
160     case Xbug_gos:
161     case Xbug_gow:
162     case Xtank_n:
163     case Xtank_e:
164     case Xtank_s:
165     case Xtank_w:
166     case Xtank_gon:
167     case Xtank_goe:
168     case Xtank_gos:
169     case Xtank_gow:
170       return(1);
171   }
172
173   switch(Cave[y][x])
174   {
175     case Xblank:
176     case Yacid_splash_eB:
177     case Yacid_splash_wB:
178     case Zplayer:
179     case Xdynamite_1:
180     case Xdynamite_2:
181     case Xdynamite_3:
182     case Xdynamite_4:
183       return(0);
184   }
185
186   return(1);
187 }
188
189 static void die(struct PLAYER *ply)
190 {
191   register unsigned int x = ply->x;
192   register unsigned int y = ply->y;
193
194   ply->alive = 0;
195
196   switch(Cave[y-1][x])
197   {
198     case Xbug_n:
199     case Xbug_e:
200     case Xbug_s:
201     case Xbug_w:
202     case Xbug_gon:
203     case Xbug_goe:
204     case Xbug_gos:
205     case Xbug_gow:
206       Cave[y-1][x] = Xboom_bug;
207       break;
208
209     case Xtank_n:
210     case Xtank_e:
211     case Xtank_s:
212     case Xtank_w:
213     case Xtank_gon:
214     case Xtank_goe:
215     case Xtank_gos:
216     case Xtank_gow:
217       Cave[y-1][x] = Xboom_bomb;
218       break;
219   }
220
221   switch(Cave[y][x+1])
222   {
223     case Xbug_n:
224     case Xbug_e:
225     case Xbug_s:
226     case Xbug_w:
227     case Xbug_gon:
228     case Xbug_goe:
229     case Xbug_gos:
230     case Xbug_gow:
231       Cave[y][x+1] = Xboom_bug;
232       break;
233
234     case Xtank_n:
235     case Xtank_e:
236     case Xtank_s:
237     case Xtank_w:
238     case Xtank_gon:
239     case Xtank_goe:
240     case Xtank_gos:
241     case Xtank_gow:
242       Cave[y][x+1] = Xboom_bomb;
243       break;
244   }
245
246   switch(Cave[y+1][x])
247   {
248     case Xbug_n:
249     case Xbug_e:
250     case Xbug_s:
251     case Xbug_w:
252     case Xbug_gon:
253     case Xbug_goe:
254     case Xbug_gos:
255     case Xbug_gow:
256       Cave[y+1][x] = Xboom_bug;
257       break;
258
259     case Xtank_n:
260     case Xtank_e:
261     case Xtank_s:
262     case Xtank_w:
263     case Xtank_gon:
264     case Xtank_goe:
265     case Xtank_gos:
266     case Xtank_gow:
267       Cave[y+1][x] = Xboom_bomb;
268       break;
269   }
270
271   switch(Cave[y][x-1])
272   {
273     case Xbug_n:
274     case Xbug_e:
275     case Xbug_s:
276     case Xbug_w:
277     case Xbug_gon:
278     case Xbug_goe:
279     case Xbug_gos:
280     case Xbug_gow:
281       Cave[y][x-1] = Xboom_bug;
282       break;
283
284     case Xtank_n:
285     case Xtank_e:
286     case Xtank_s:
287     case Xtank_w:
288     case Xtank_gon:
289     case Xtank_goe:
290     case Xtank_gos:
291     case Xtank_gow:
292       Cave[y][x-1] = Xboom_bomb;
293       break;
294   }
295
296   switch(Cave[y][x])
297   {
298     case Xexit_1:
299     case Xexit_2:
300     case Xexit_3:
301       play[SAMPLE_exit] = 1;
302       break;
303
304     default:
305       play[SAMPLE_die] = 1;
306       break;
307   }
308
309   Cave[y][x] = Xboom_1;
310   Boom[y][x] = Xblank;
311 }
312
313 static void player(struct PLAYER *ply)
314 {
315   register unsigned int x = ply->x;
316   register unsigned int y = ply->y;
317   unsigned int anim = 0;        /* initialized to make compilers happy */
318   int dx = 0, dy = 0;
319
320   if ((ply->joy_spin = !ply->joy_spin))
321   {
322     if (ply->joy_n)
323     {
324       y--;
325       dy = -1;
326       anim = 0;
327       /* north */
328     }
329     else if (ply->joy_e)
330     {
331       x++;
332       dx = 1;
333       anim = 1;
334       /* east */
335     }
336     else if (ply->joy_s)
337     {
338       y++;
339       dy = 1;
340       anim = 2;
341       /* south */
342     }
343     else if (ply->joy_w)
344     {
345       x--;
346       dx = -1;
347       anim = 3;
348       /* west */
349     }
350   }
351   else
352   {
353     if (ply->joy_w)
354     {
355       x--;
356       dx = -1;
357       anim = 3;
358       /* west */
359     }
360     else if (ply->joy_s)
361     {
362       y++;
363       dy = 1;
364       anim = 2;
365       /* south */
366     }
367     else if (ply->joy_e)
368     {
369       x++;
370       dx = 1;
371       anim = 1;
372       /* east */
373     }
374     else if (ply->joy_n)
375     {
376       y--;
377       dy = -1;
378       anim = 0;
379       /* north */
380     }
381   }
382
383   if (dx == 0 && dy == 0)
384   {
385     ply->joy_stick = 0;
386
387     if (ply->joy_fire)
388     {
389       if (++ply->dynamite_cnt == 5 && ply->dynamite)
390       {
391         Cave[y][x] = Xdynamite_1;
392         play[SAMPLE_dynamite] = 1;
393         ply->dynamite--;
394       }
395     }
396     else
397     {
398       ply->dynamite_cnt = 0;
399     }
400
401     Random += 7; /* bit more random if we dont move */
402
403     return;
404   }
405
406   ply->joy_stick = 1;
407   ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
408   ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
409
410   if (ply->joy_fire == 0)
411   {
412     switch(Cave[y][x])
413     {
414       /* fire is released */
415       case Xblank:
416       case Yacid_splash_eB:
417       case Yacid_splash_wB:
418         Cave[y][x] = Zplayer;
419         Next[y][x] = Zplayer;
420         play[SAMPLE_blank] = 1;
421         ply->anim = SPR_walk + anim;
422         ply->x = x;
423         ply->y = y;
424         break;
425
426       case Xboom_android:
427       case Xboom_1:
428       case Xbug_n:
429       case Xbug_e:
430       case Xbug_s:
431       case Xbug_w:
432       case Xbug_gon:
433       case Xbug_goe:
434       case Xbug_gos:
435       case Xbug_gow:
436       case Xtank_n:
437       case Xtank_e:
438       case Xtank_s:
439       case Xtank_w:
440       case Xtank_gon:
441       case Xtank_goe:
442       case Xtank_gos:
443       case Xtank_gow:
444       case Xacid_1:
445       case Xacid_2:
446       case Xacid_3:
447       case Xacid_4:
448       case Xacid_5:
449       case Xacid_6:
450       case Xacid_7:
451       case Xacid_8:
452         ply->anim = SPR_walk + anim;
453         ply->x = x;
454         ply->y = y;
455         break;
456
457       case Xgrass:
458         Cave[y][x] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
459                       (dx > 0 ? Ygrass_eB : Ygrass_wB));
460         Next[y][x] = Zplayer;
461         play[SAMPLE_dirt] = 1;
462         ply->anim = SPR_walk + anim;
463         ply->x = x;
464         ply->y = y;
465         break;
466
467       case Xdirt:
468         Cave[y][x] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
469                       (dx > 0 ? Ydirt_eB : Ydirt_wB));
470         Next[y][x] = Zplayer;
471         play[SAMPLE_dirt] = 1;
472         ply->anim = SPR_walk + anim;
473         ply->x = x;
474         ply->y = y;
475         break;
476
477       case Xdiamond:
478       case Xdiamond_pause:
479         Cave[y][x] = Ydiamond_eat;
480         Next[y][x] = Zplayer;
481         play[SAMPLE_collect] = 1;
482         lev.score += lev.diamond_score;
483         lev.required = lev.required < 3 ? 0 : lev.required - 3;
484         ply->anim = SPR_walk + anim;
485         ply->x = x;
486         ply->y = y;
487         break;
488
489       case Xemerald:
490       case Xemerald_pause:
491         Cave[y][x] = Yemerald_eat;
492         Next[y][x] = Zplayer;
493         play[SAMPLE_collect] = 1;
494         lev.score += lev.emerald_score;
495         lev.required = lev.required < 1 ? 0 : lev.required - 1;
496         ply->anim = SPR_walk + anim;
497         ply->x = x;
498         ply->y = y;
499         break;
500
501       case Xdynamite:
502         Cave[y][x] = Ydynamite_eat;
503         Next[y][x] = Zplayer;
504         play[SAMPLE_collect] = 1;
505         lev.score += lev.dynamite_score;
506         ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
507         ply->anim = SPR_walk + anim;
508         ply->x = x;
509         ply->y = y;
510         break;
511
512       case Xkey_1:
513         ply->keys |= 0x01;
514         goto key_walk;
515
516       case Xkey_2:
517         ply->keys |= 0x02;
518         goto key_walk;
519
520       case Xkey_3:
521         ply->keys |= 0x04;
522         goto key_walk;
523
524       case Xkey_4:
525         ply->keys |= 0x08;
526         goto key_walk;
527
528       case Xkey_5:
529         ply->keys |= 0x10;
530         goto key_walk;
531
532       case Xkey_6:
533         ply->keys |= 0x20;
534         goto key_walk;
535
536       case Xkey_7:
537         ply->keys |= 0x40;
538         goto key_walk;
539
540       case Xkey_8:
541         ply->keys |= 0x80;
542         goto key_walk;
543
544       key_walk:
545
546         Cave[y][x] = Yball_eat;
547         Next[y][x] = Zplayer;
548         play[SAMPLE_collect] = 1;
549         lev.score += lev.key_score;
550         ply->anim = SPR_walk + anim;
551         ply->x = x;
552         ply->y = y;
553         break;
554
555       case Xlenses:
556         Cave[y][x] = Yball_eat;
557         Next[y][x] = Zplayer;
558         play[SAMPLE_collect] = 1;
559         lev.score += lev.lenses_score;
560         lev.lenses_cnt = lev.lenses_time;
561         ply->anim = SPR_walk + anim;
562         ply->x = x;
563         ply->y = y;
564         break;
565
566       case Xmagnify:
567         Cave[y][x] = Yball_eat;
568         Next[y][x] = Zplayer;
569         play[SAMPLE_collect] = 1;
570         lev.score += lev.magnify_score;
571         lev.magnify_cnt = lev.magnify_time;
572         ply->anim = SPR_walk + anim;
573         ply->x = x;
574         ply->y = y;
575         break;
576
577       case Xstone:
578         if (dy)
579           break;
580
581         switch(Cave[y][x+dx])
582         {
583           case Xacid_1:
584           case Xacid_2:
585           case Xacid_3:
586           case Xacid_4:
587           case Xacid_5:
588           case Xacid_6:
589           case Xacid_7:
590           case Xacid_8:
591             if (Cave[y-1][x+dx+1] == Xblank)
592               Cave[y-1][x+dx+1] = Yacid_splash_eB;
593             if (Cave[y-1][x+dx-1] == Xblank)
594               Cave[y-1][x+dx-1] = Yacid_splash_wB;
595             play[SAMPLE_acid] = 1;
596             goto stone_walk;
597
598           case Xblank:
599           case Yacid_splash_eB:
600           case Yacid_splash_wB:
601             Cave[y][x+dx] = dx > 0 ? Ystone_e : Ystone_w;
602             Next[y][x+dx] = Xstone_pause;
603
604           stone_walk:
605
606             Cave[y][x] = dx > 0 ? Ystone_eB : Ystone_wB;
607             Next[y][x] = Zplayer;
608             play[SAMPLE_roll] = 1;
609             ply->x = x;
610         }
611
612         ply->anim = SPR_push + anim;
613         break;
614
615       case Xbomb:
616         if (dy)
617           break;
618
619         switch(Cave[y][x+dx])
620         {
621           case Xacid_1:
622           case Xacid_2:
623           case Xacid_3:
624           case Xacid_4:
625           case Xacid_5:
626           case Xacid_6:
627           case Xacid_7:
628           case Xacid_8:
629             if (Cave[y-1][x+dx+1] == Xblank)
630               Cave[y-1][x+dx+1] = Yacid_splash_eB;
631             if (Cave[y-1][x+dx-1] == Xblank)
632               Cave[y-1][x+dx-1] = Yacid_splash_wB;
633             play[SAMPLE_acid] = 1;
634             goto bomb_walk;
635
636           case Xblank:
637           case Yacid_splash_eB:
638           case Yacid_splash_wB:
639             Cave[y][x+dx] = dx > 0 ? Ybomb_e : Ybomb_w;
640             Next[y][x+dx] = Xbomb_pause;
641
642           bomb_walk:
643
644             Cave[y][x] = dx > 0 ? Ybomb_eB : Ybomb_wB;
645             Next[y][x] = Zplayer;
646             play[SAMPLE_roll] = 1;
647             ply->x = x;
648         }
649
650         ply->anim = SPR_push + anim;
651         break;
652
653       case Xnut:
654         if (dy)
655           break;
656
657         switch(Cave[y][x+dx])
658         {
659           case Xacid_1:
660           case Xacid_2:
661           case Xacid_3:
662           case Xacid_4:
663           case Xacid_5:
664           case Xacid_6:
665           case Xacid_7:
666           case Xacid_8:
667             if (Cave[y-1][x+dx+1] == Xblank)
668               Cave[y-1][x+dx+1] = Yacid_splash_eB;
669             if (Cave[y-1][x+dx-1] == Xblank)
670               Cave[y-1][x+dx-1] = Yacid_splash_wB;
671             play[SAMPLE_acid] = 1;
672             goto nut_walk;
673
674           case Xblank:
675           case Yacid_splash_eB:
676           case Yacid_splash_wB:
677             Cave[y][x+dx] = dx > 0 ? Ynut_e : Ynut_w;
678             Next[y][x+dx] = Xnut_pause;
679
680           nut_walk:
681
682             Cave[y][x] = dx > 0 ? Ynut_eB : Ynut_wB;
683             Next[y][x] = Zplayer;
684             play[SAMPLE_roll] = 1;
685             ply->x = x;
686         }
687
688         ply->anim = SPR_push + anim;
689         break;
690
691       case Xspring:
692         if (dy)
693           break;
694
695         switch(Cave[y][x+dx])
696         {
697           case Xalien:
698           case Xalien_pause:
699             Cave[y][x] = dx > 0 ? Yspring_kill_eB : Yspring_kill_wB;
700             Cave[y][x+dx] = dx > 0 ? Yspring_kill_e : Yspring_kill_w;
701             Next[y][x] = Zplayer;
702             Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
703             play[SAMPLE_slurp] = 1;
704             lev.score += lev.slurp_score;
705             ply->x = x;
706             break;
707
708           case Xacid_1:
709           case Xacid_2:
710           case Xacid_3:
711           case Xacid_4:
712           case Xacid_5:
713           case Xacid_6:
714           case Xacid_7:
715           case Xacid_8:
716             if (Cave[y-1][x+dx+1] == Xblank)
717               Cave[y-1][x+dx+1] = Yacid_splash_eB;
718             if (Cave[y-1][x+dx-1] == Xblank)
719               Cave[y-1][x+dx-1] = Yacid_splash_wB;
720             play[SAMPLE_acid] = 1;
721             goto spring_walk;
722
723           case Xblank:
724           case Yacid_splash_eB:
725           case Yacid_splash_wB:
726             Cave[y][x+dx] = dx > 0 ? Yspring_e : Yspring_w;
727             Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
728
729           spring_walk:
730             Cave[y][x] = dx > 0 ? Yspring_eB : Yspring_wB;
731             Next[y][x] = Zplayer;
732             play[SAMPLE_roll] = 1;
733             ply->x = x;
734         }
735
736         ply->anim = SPR_push + anim;
737         break;
738
739       case Xspring_pause:
740       case Xstone_pause:
741       case Xbomb_pause:
742       case Xnut_pause:
743       case Xsand_stonein_1:
744       case Xsand_stonein_2:
745       case Xsand_stonein_3:
746       case Xsand_stonein_4:
747         if (dy)
748           break;
749
750         ply->anim = SPR_push + anim;
751         break;
752
753       case Xballoon:
754         switch(Cave[y+dy][x+dx])
755         {
756           case Xacid_1:
757           case Xacid_2:
758           case Xacid_3:
759           case Xacid_4:
760           case Xacid_5:
761           case Xacid_6:
762           case Xacid_7:
763           case Xacid_8:
764             if (Cave[y+dy-1][x+dx+1] == Xblank)
765               Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
766             if (Cave[y+dy-1][x+dx-1] == Xblank)
767               Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
768             play[SAMPLE_acid] = 1;
769             goto balloon_walk;
770
771           case Xblank:
772           case Yacid_splash_eB:
773           case Yacid_splash_wB:
774             Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
775                                 (dx > 0 ? Yballoon_e : Yballoon_w));
776             Next[y+dy][x+dx] = Xballoon;
777
778           balloon_walk:
779             Cave[y][x] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
780                           (dx > 0 ? Yballoon_eB : Yballoon_wB));
781             Next[y][x] = Zplayer;
782             play[SAMPLE_push] = 1;
783             ply->x = x;
784             ply->y = y;
785         }
786
787         ply->anim = SPR_push + anim;
788         break;
789
790       case Xandroid:
791       case Xandroid_1_n:
792       case Xandroid_2_n:
793       case Xandroid_1_e:
794       case Xandroid_2_e:
795       case Xandroid_1_s:
796       case Xandroid_2_s:
797       case Xandroid_1_w:
798       case Xandroid_2_w:
799         switch(Cave[y+dy][x+dx])
800         {
801           case Xacid_1:
802           case Xacid_2:
803           case Xacid_3:
804           case Xacid_4:
805           case Xacid_5:
806           case Xacid_6:
807           case Xacid_7:
808           case Xacid_8:
809             if (Cave[y+dy-1][x+dx+1] == Xblank)
810               Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
811             if (Cave[y+dy-1][x+dx-1] == Xblank)
812               Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
813             play[SAMPLE_acid] = 1;
814             goto android_walk;
815
816           case Xblank:
817           case Yacid_splash_eB:
818           case Yacid_splash_wB:
819             Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
820                                 (dx > 0 ? Yandroid_e : Yandroid_w));
821             Next[y+dy][x+dx] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
822                                 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
823
824           android_walk:
825             Cave[y][x] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
826                           (dx > 0 ? Yandroid_eB : Yandroid_wB));
827             Next[y][x] = Zplayer;
828             play[SAMPLE_push] = 1;
829             ply->x = x;
830             ply->y = y;
831         }
832
833         ply->anim = SPR_push + anim;
834         break;
835
836       case Xdoor_1:
837       case Xfake_door_1:
838         if (ply->keys & 0x01)
839           goto door_walk;
840         else
841           break;
842
843       case Xdoor_2:
844       case Xfake_door_2:
845         if (ply->keys & 0x02)
846           goto door_walk;
847         else
848           break;
849
850       case Xdoor_3:
851       case Xfake_door_3:
852         if (ply->keys & 0x04)
853           goto door_walk;
854         else
855           break;
856
857       case Xdoor_4:
858       case Xfake_door_4:
859         if (ply->keys & 0x08)
860           goto door_walk;
861         else
862           break;
863
864       case Xdoor_5:
865       case Xfake_door_5:
866         if (ply->keys & 0x10)
867           goto door_walk;
868         else
869           break;
870
871       case Xdoor_6:
872       case Xfake_door_6:
873         if (ply->keys & 0x20)
874           goto door_walk;
875         else
876           break;
877
878       case Xdoor_7:
879       case Xfake_door_7:
880         if (ply->keys & 0x40)
881           goto door_walk;
882         else
883           break;
884
885       case Xdoor_8:
886       case Xfake_door_8:
887         if (ply->keys & 0x80)
888           goto door_walk;
889         else
890           break;
891
892       door_walk:
893         if (!tab_blank[Cave[y+dy][x+dx]])
894           break;
895
896         Cave[y+dy][x+dx] = Zplayer;
897         Next[y+dy][x+dx] = Zplayer;
898         play[SAMPLE_door] = 1;
899         ply->anim = SPR_walk + anim;
900         ply->x = x + dx;
901         ply->y = y + dy;
902         break;
903
904       case Xwheel:
905         play[SAMPLE_press] = 1;
906         lev.wheel_cnt = lev.wheel_time;
907         lev.wheel_x = x;
908         lev.wheel_y = y;
909         break;
910
911       case Xwind_n:
912         lev.wind_direction = 0;
913         goto wind_walk;
914
915       case Xwind_e:
916         lev.wind_direction = 1;
917         goto wind_walk;
918
919       case Xwind_s:
920         lev.wind_direction = 2;
921         goto wind_walk;
922
923       case Xwind_w:
924         lev.wind_direction = 3;
925         goto wind_walk;
926
927       case Xwind_nesw:
928         lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
929         goto wind_walk;
930
931       wind_walk:
932         play[SAMPLE_press] = 1;
933         lev.wind_cnt = lev.wind_time;
934         break;
935
936       case Xwind_stop:
937         play[SAMPLE_press] = 1;
938         lev.wind_cnt = 0;
939         break;
940
941       case Xswitch:
942         play[SAMPLE_press] = 1;
943         lev.ball_cnt = lev.ball_time;
944         lev.ball_state = !lev.ball_state;
945         break;
946
947       case Xplant:
948         Cave[y][x] = Yplant;
949         Next[y][x] = Xplant;
950         play[SAMPLE_blank] = 1;
951         ply->anim = SPR_walk + anim;
952         ply->x = x;
953         ply->y = y;
954         break;
955
956       case Xexit_1:
957       case Xexit_2:
958       case Xexit_3:
959         play[SAMPLE_exit] = 1;
960         if (--lev.home == 0)
961           lev.score += lev.time * lev.exit_score / 100;
962         ply->anim = SPR_walk + anim;
963         ply->x = x;
964         ply->y = y;
965         break;
966     }
967   }
968   else
969   {
970     switch(Cave[y][x])
971     {
972       /* fire is pressed */
973
974       case Xgrass:
975       case Xdirt:
976         Cave[y][x] = Yball_eat;
977         Next[y][x] = Xblank;
978         play[SAMPLE_dirt] = 1;
979         ply->anim = SPR_spray + anim;
980         break;
981
982       case Xdiamond:
983       case Xdiamond_pause:
984         Cave[y][x] = Ydiamond_eat;
985         Next[y][x] = Xblank;
986         play[SAMPLE_collect] = 1;
987         lev.score += lev.diamond_score;
988         lev.required = lev.required < 3 ? 0 : lev.required - 3;
989         ply->anim = SPR_walk + anim;
990         break;
991
992       case Xemerald:
993       case Xemerald_pause:
994         Cave[y][x] = Yemerald_eat;
995         Next[y][x] = Xblank;
996         play[SAMPLE_collect] = 1;
997         lev.score += lev.emerald_score;
998         lev.required = lev.required < 1 ? 0 : lev.required - 1;
999         ply->anim = SPR_walk + anim;
1000         break;
1001
1002       case Xdynamite:
1003         Cave[y][x] = Ydynamite_eat;
1004         Next[y][x] = Xblank;
1005         play[SAMPLE_collect] = 1;
1006         lev.score += lev.dynamite_score;
1007         ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1008         ply->anim = SPR_walk + anim;
1009         break;
1010
1011       case Xkey_1:
1012         ply->keys |= 0x01;
1013         goto key_shoot;
1014
1015       case Xkey_2:
1016         ply->keys |= 0x02;
1017         goto key_shoot;
1018
1019       case Xkey_3:
1020         ply->keys |= 0x04;
1021         goto key_shoot;
1022
1023       case Xkey_4:
1024         ply->keys |= 0x08;
1025         goto key_shoot;
1026
1027       case Xkey_5:
1028         ply->keys |= 0x10;
1029         goto key_shoot;
1030
1031       case Xkey_6:
1032         ply->keys |= 0x20;
1033         goto key_shoot;
1034
1035       case Xkey_7:
1036         ply->keys |= 0x40;
1037         goto key_shoot;
1038
1039       case Xkey_8:
1040         ply->keys |= 0x80;
1041         goto key_shoot;
1042
1043       key_shoot:
1044         Cave[y][x] = Yball_eat;
1045         Next[y][x] = Xblank;
1046         play[SAMPLE_collect] = 1;
1047         lev.score += lev.key_score;
1048         ply->anim = SPR_walk + anim;
1049         break;
1050
1051       case Xlenses:
1052         Cave[y][x] = Yball_eat;
1053         Next[y][x] = Xblank;
1054         play[SAMPLE_collect] = 1;
1055         lev.score += lev.lenses_score;
1056         lev.lenses_cnt = lev.lenses_time;
1057         ply->anim = SPR_walk + anim;
1058         break;
1059
1060       case Xmagnify:
1061         Cave[y][x] = Yball_eat;
1062         Next[y][x] = Xblank;
1063         play[SAMPLE_collect] = 1;
1064         lev.score += lev.magnify_score;
1065         lev.magnify_cnt = lev.magnify_time;
1066         ply->anim = SPR_walk + anim;
1067         break;
1068     }
1069   }
1070 }