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