rnd-20040814-1-src
[rocksndiamonds.git] / src / libem / synchro_1.c
1
2 /* first part of synchro.
3  *
4  * game logic for players.
5  *
6  * large switch statement for tiles the player interacts with.
7  */
8
9 #include "tile.h"
10 #include "level.h"
11 #include "sample.h"
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         char ply1_kill = test(&ply1); /* must test for death and actually kill separately */
20         char ply2_kill = test(&ply2);
21         if(ply1.alive && ply1_kill) die(&ply1);
22         if(ply2.alive && ply2_kill) die(&ply2);
23
24 #if 0
25         ply1.alive = 1; /* debugging */
26 #endif
27
28         ply1.oldx = ply1.x;
29         ply1.oldy = ply1.y;
30         ply1.anim = SPR_still;
31         ply2.oldx = ply2.x;
32         ply2.oldy = ply2.y;
33         ply2.anim = SPR_still;
34
35         if(Random & 256) {
36                 if(ply1.alive) player(&ply1);
37                 if(ply2.alive) player(&ply2);
38         } else {
39                 if(ply2.alive) player(&ply2);
40                 if(ply1.alive) player(&ply1);
41         }
42         if(ply1.alive) {
43                 if(Cave[ply1.oldy][ply1.oldx] == Zplayer) {
44                         Cave[ply1.oldy][ply1.oldx] = Xblank;
45                         Next[ply1.oldy][ply1.oldx] = Xblank;
46                 }
47                 if(Cave[ply1.y][ply1.x] == Xblank) {
48                         Cave[ply1.y][ply1.x] = Zplayer;
49                         Next[ply1.y][ply1.x] = Zplayer;
50                 }
51         }
52         if(ply2.alive) {
53                 if(Cave[ply2.oldy][ply2.oldx] == Zplayer) {
54                         Cave[ply2.oldy][ply2.oldx] = Xblank;
55                         Next[ply2.oldy][ply2.oldx] = Xblank;
56                 }
57                 if(Cave[ply2.y][ply2.x] == Xblank) {
58                         Cave[ply2.y][ply2.x] = Zplayer;
59                         Next[ply2.y][ply2.x] = Zplayer;
60                 }
61         }
62 }
63
64 static int test(struct PLAYER *ply)
65 {
66         register unsigned int x = ply->x;
67         register unsigned int y = ply->y;
68
69         if(lev.time == 0) return(1);
70
71         switch(Cave[y-1][x]) {
72         case Xbug_n:
73         case Xbug_e:
74         case Xbug_s:
75         case Xbug_w:
76         case Xbug_gon:
77         case Xbug_goe:
78         case Xbug_gos:
79         case Xbug_gow:
80         case Xtank_n:
81         case Xtank_e:
82         case Xtank_s:
83         case Xtank_w:
84         case Xtank_gon:
85         case Xtank_goe:
86         case Xtank_gos:
87         case Xtank_gow:
88                 return(1);
89         }
90         switch(Cave[y][x+1]) {
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         switch(Cave[y+1][x]) {
110         case Xbug_n:
111         case Xbug_e:
112         case Xbug_s:
113         case Xbug_w:
114         case Xbug_gon:
115         case Xbug_goe:
116         case Xbug_gos:
117         case Xbug_gow:
118         case Xtank_n:
119         case Xtank_e:
120         case Xtank_s:
121         case Xtank_w:
122         case Xtank_gon:
123         case Xtank_goe:
124         case Xtank_gos:
125         case Xtank_gow:
126                 return(1);
127         }
128         switch(Cave[y][x-1]) {
129         case Xbug_n:
130         case Xbug_e:
131         case Xbug_s:
132         case Xbug_w:
133         case Xbug_gon:
134         case Xbug_goe:
135         case Xbug_gos:
136         case Xbug_gow:
137         case Xtank_n:
138         case Xtank_e:
139         case Xtank_s:
140         case Xtank_w:
141         case Xtank_gon:
142         case Xtank_goe:
143         case Xtank_gos:
144         case Xtank_gow:
145                 return(1);
146         }
147         switch(Cave[y][x]) {
148         case Xblank:
149         case Yacid_splash_eB:
150         case Yacid_splash_wB:
151         case Zplayer:
152         case Xdynamite_1:
153         case Xdynamite_2:
154         case Xdynamite_3:
155         case Xdynamite_4:
156                 return(0);
157         }
158         return(1);
159 }
160
161 static void die(struct PLAYER *ply)
162 {
163         register unsigned int x = ply->x;
164         register unsigned int y = ply->y;
165
166         ply->alive = 0;
167
168         switch(Cave[y-1][x]) {
169         case Xbug_n:
170         case Xbug_e:
171         case Xbug_s:
172         case Xbug_w:
173         case Xbug_gon:
174         case Xbug_goe:
175         case Xbug_gos:
176         case Xbug_gow:
177                 Cave[y-1][x] = Xboom_bug; break;
178         case Xtank_n:
179         case Xtank_e:
180         case Xtank_s:
181         case Xtank_w:
182         case Xtank_gon:
183         case Xtank_goe:
184         case Xtank_gos:
185         case Xtank_gow:
186                 Cave[y-1][x] = Xboom_bomb; break;
187         }
188         switch(Cave[y][x+1]) {
189         case Xbug_n:
190         case Xbug_e:
191         case Xbug_s:
192         case Xbug_w:
193         case Xbug_gon:
194         case Xbug_goe:
195         case Xbug_gos:
196         case Xbug_gow:
197                 Cave[y][x+1] = Xboom_bug; break;
198         case Xtank_n:
199         case Xtank_e:
200         case Xtank_s:
201         case Xtank_w:
202         case Xtank_gon:
203         case Xtank_goe:
204         case Xtank_gos:
205         case Xtank_gow:
206                 Cave[y][x+1] = Xboom_bomb; break;
207         }
208         switch(Cave[y+1][x]) {
209         case Xbug_n:
210         case Xbug_e:
211         case Xbug_s:
212         case Xbug_w:
213         case Xbug_gon:
214         case Xbug_goe:
215         case Xbug_gos:
216         case Xbug_gow:
217                 Cave[y+1][x] = Xboom_bug; break;
218         case Xtank_n:
219         case Xtank_e:
220         case Xtank_s:
221         case Xtank_w:
222         case Xtank_gon:
223         case Xtank_goe:
224         case Xtank_gos:
225         case Xtank_gow:
226                 Cave[y+1][x] = Xboom_bomb; break;
227         }
228         switch(Cave[y][x-1]) {
229         case Xbug_n:
230         case Xbug_e:
231         case Xbug_s:
232         case Xbug_w:
233         case Xbug_gon:
234         case Xbug_goe:
235         case Xbug_gos:
236         case Xbug_gow:
237                 Cave[y][x-1] = Xboom_bug; break;
238         case Xtank_n:
239         case Xtank_e:
240         case Xtank_s:
241         case Xtank_w:
242         case Xtank_gon:
243         case Xtank_goe:
244         case Xtank_gos:
245         case Xtank_gow:
246                 Cave[y][x-1] = Xboom_bomb; break;
247         }
248         switch(Cave[y][x]) {
249         case Xexit_1:
250         case Xexit_2:
251         case Xexit_3:
252                 play[SAMPLE_exit] = 1; break;
253         default:
254                 play[SAMPLE_die] = 1; break;
255         }
256         Cave[y][x] = Xboom_1;
257         Boom[y][x] = Xblank;
258 }
259
260 static void player(struct PLAYER *ply)
261 {
262         register unsigned int x = ply->x;
263         register unsigned int y = ply->y;
264         unsigned int anim = 0;  /* initialized to make compilers happy */
265         int dx = 0, dy = 0;
266
267         if((ply->joy_spin = !ply->joy_spin)) {
268                 if(ply->joy_n) {
269                         y--; dy = -1; anim = 0; /* north */
270                 } else if(ply->joy_e) {
271                         x++; dx = 1; anim = 1; /* east */
272                 } else if(ply->joy_s) {
273                         y++; dy = 1; anim = 2; /* south */
274                 } else if(ply->joy_w) {
275                         x--; dx = -1; anim = 3; /* west */
276                 }
277         } else {
278                 if(ply->joy_w) {
279                         x--; dx = -1; anim = 3; /* west */
280                 } else if(ply->joy_s) {
281                         y++; dy = 1; anim = 2; /* south */
282                 } else if(ply->joy_e) {
283                         x++; dx = 1; anim = 1; /* east */
284                 } else if(ply->joy_n) {
285                         y--; dy = -1; anim = 0; /* north */
286                 }
287         }
288         if(dx == 0 && dy == 0) {
289                 ply->joy_stick = 0;
290                 if(ply->joy_fire) {
291                         if(++ply->dynamite_cnt == 5 && ply->dynamite) {
292                                 Cave[y][x] = Xdynamite_1;
293                                 play[SAMPLE_dynamite] = 1;
294                                 ply->dynamite--;
295                         }
296                 } else {
297                         ply->dynamite_cnt = 0;
298                 }
299                 Random += 7; /* bit more random if we dont move */
300                 return;
301         }
302         ply->joy_stick = 1;
303         ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
304         ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
305
306         if(ply->joy_fire == 0) {
307                 switch(Cave[y][x]) { /* fire is released */
308                 case Xblank:
309                 case Yacid_splash_eB:
310                 case Yacid_splash_wB:
311                         Cave[y][x] = Zplayer;
312                         Next[y][x] = Zplayer;
313                         play[SAMPLE_blank] = 1;
314                         ply->anim = SPR_walk + anim;
315                         ply->x = x;
316                         ply->y = y;
317                         break;
318                 case Xboom_android:
319                 case Xboom_1:
320                 case Xbug_n:
321                 case Xbug_e:
322                 case Xbug_s:
323                 case Xbug_w:
324                 case Xbug_gon:
325                 case Xbug_goe:
326                 case Xbug_gos:
327                 case Xbug_gow:
328                 case Xtank_n:
329                 case Xtank_e:
330                 case Xtank_s:
331                 case Xtank_w:
332                 case Xtank_gon:
333                 case Xtank_goe:
334                 case Xtank_gos:
335                 case Xtank_gow:
336                 case Xacid_1:
337                 case Xacid_2:
338                 case Xacid_3:
339                 case Xacid_4:
340                 case Xacid_5:
341                 case Xacid_6:
342                 case Xacid_7:
343                 case Xacid_8:
344                         ply->anim = SPR_walk + anim;
345                         ply->x = x;
346                         ply->y = y;
347                         break;
348                 case Xgrass:
349                         Cave[y][x] = dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) : (dx > 0 ? Ygrass_eB : Ygrass_wB);
350                         Next[y][x] = Zplayer;
351                         play[SAMPLE_dirt] = 1;
352                         ply->anim = SPR_walk + anim;
353                         ply->x = x;
354                         ply->y = y;
355                         break;
356                 case Xdirt:
357                         Cave[y][x] = dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) : (dx > 0 ? Ydirt_eB : Ydirt_wB);
358                         Next[y][x] = Zplayer;
359                         play[SAMPLE_dirt] = 1;
360                         ply->anim = SPR_walk + anim;
361                         ply->x = x;
362                         ply->y = y;
363                         break;
364                 case Xdiamond:
365                 case Xdiamond_pause:
366                         Cave[y][x] = Ydiamond_eat;
367                         Next[y][x] = Zplayer;
368                         play[SAMPLE_collect] = 1;
369                         lev.score += lev.diamond_score;
370                         lev.required = lev.required < 3 ? 0 : lev.required - 3;
371                         ply->anim = SPR_walk + anim;
372                         ply->x = x;
373                         ply->y = y;
374                         break;
375                 case Xemerald:
376                 case Xemerald_pause:
377                         Cave[y][x] = Yemerald_eat;
378                         Next[y][x] = Zplayer;
379                         play[SAMPLE_collect] = 1;
380                         lev.score += lev.emerald_score;
381                         lev.required = lev.required < 1 ? 0 : lev.required - 1;
382                         ply->anim = SPR_walk + anim;
383                         ply->x = x;
384                         ply->y = y;
385                         break;
386                 case Xdynamite:
387                         Cave[y][x] = Ydynamite_eat;
388                         Next[y][x] = Zplayer;
389                         play[SAMPLE_collect] = 1;
390                         lev.score += lev.dynamite_score;
391                         ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
392                         ply->anim = SPR_walk + anim;
393                         ply->x = x;
394                         ply->y = y;
395                         break;
396                 case Xkey_1:
397                         ply->keys |= 0x01; goto key_walk;
398                 case Xkey_2:
399                         ply->keys |= 0x02; goto key_walk;
400                 case Xkey_3:
401                         ply->keys |= 0x04; goto key_walk;
402                 case Xkey_4:
403                         ply->keys |= 0x08; goto key_walk;
404                 case Xkey_5:
405                         ply->keys |= 0x10; goto key_walk;
406                 case Xkey_6:
407                         ply->keys |= 0x20; goto key_walk;
408                 case Xkey_7:
409                         ply->keys |= 0x40; goto key_walk;
410                 case Xkey_8:
411                         ply->keys |= 0x80; goto key_walk;
412                 key_walk:
413                         Cave[y][x] = Yball_eat;
414                         Next[y][x] = Zplayer;
415                         play[SAMPLE_collect] = 1;
416                         lev.score += lev.key_score;
417                         ply->anim = SPR_walk + anim;
418                         ply->x = x;
419                         ply->y = y;
420                         break;
421                 case Xlenses:
422                         Cave[y][x] = Yball_eat;
423                         Next[y][x] = Zplayer;
424                         play[SAMPLE_collect] = 1;
425                         lev.score += lev.lenses_score;
426                         lev.lenses_cnt = lev.lenses_time;
427                         ply->anim = SPR_walk + anim;
428                         ply->x = x;
429                         ply->y = y;
430                         break;
431                 case Xmagnify:
432                         Cave[y][x] = Yball_eat;
433                         Next[y][x] = Zplayer;
434                         play[SAMPLE_collect] = 1;
435                         lev.score += lev.magnify_score;
436                         lev.magnify_cnt = lev.magnify_time;
437                         ply->anim = SPR_walk + anim;
438                         ply->x = x;
439                         ply->y = y;
440                         break;
441                 case Xstone:
442                         if(dy) break;
443                         switch(Cave[y][x+dx]) {
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                                 if(Cave[y-1][x+dx+1] == Xblank) Cave[y-1][x+dx+1] = Yacid_splash_eB;
453                                 if(Cave[y-1][x+dx-1] == Xblank) Cave[y-1][x+dx-1] = Yacid_splash_wB;
454                                 play[SAMPLE_acid] = 1;
455                                 goto stone_walk;
456                         case Xblank:
457                         case Yacid_splash_eB:
458                         case Yacid_splash_wB:
459                                 Cave[y][x+dx] = dx > 0 ? Ystone_e : Ystone_w;
460                                 Next[y][x+dx] = Xstone_pause;
461                         stone_walk:
462                                 Cave[y][x] = dx > 0 ? Ystone_eB : Ystone_wB;
463                                 Next[y][x] = Zplayer;
464                                 play[SAMPLE_roll] = 1;
465                                 ply->x = x;
466                         }
467                         ply->anim = SPR_push + anim;
468                         break;
469                 case Xbomb:
470                         if(dy) break;
471                         switch(Cave[y][x+dx]) {
472                         case Xacid_1:
473                         case Xacid_2:
474                         case Xacid_3:
475                         case Xacid_4:
476                         case Xacid_5:
477                         case Xacid_6:
478                         case Xacid_7:
479                         case Xacid_8:
480                                 if(Cave[y-1][x+dx+1] == Xblank) Cave[y-1][x+dx+1] = Yacid_splash_eB;
481                                 if(Cave[y-1][x+dx-1] == Xblank) Cave[y-1][x+dx-1] = Yacid_splash_wB;
482                                 play[SAMPLE_acid] = 1;
483                                 goto bomb_walk;
484                         case Xblank:
485                         case Yacid_splash_eB:
486                         case Yacid_splash_wB:
487                                 Cave[y][x+dx] = dx > 0 ? Ybomb_e : Ybomb_w;
488                                 Next[y][x+dx] = Xbomb_pause;
489                         bomb_walk:
490                                 Cave[y][x] = dx > 0 ? Ybomb_eB : Ybomb_wB;
491                                 Next[y][x] = Zplayer;
492                                 play[SAMPLE_roll] = 1;
493                                 ply->x = x;
494                         }
495                         ply->anim = SPR_push + anim;
496                         break;
497                 case Xnut:
498                         if(dy) break;
499                         switch(Cave[y][x+dx]) {
500                         case Xacid_1:
501                         case Xacid_2:
502                         case Xacid_3:
503                         case Xacid_4:
504                         case Xacid_5:
505                         case Xacid_6:
506                         case Xacid_7:
507                         case Xacid_8:
508                                 if(Cave[y-1][x+dx+1] == Xblank) Cave[y-1][x+dx+1] = Yacid_splash_eB;
509                                 if(Cave[y-1][x+dx-1] == Xblank) Cave[y-1][x+dx-1] = Yacid_splash_wB;
510                                 play[SAMPLE_acid] = 1;
511                                 goto nut_walk;
512                         case Xblank:
513                         case Yacid_splash_eB:
514                         case Yacid_splash_wB:
515                                 Cave[y][x+dx] = dx > 0 ? Ynut_e : Ynut_w;
516                                 Next[y][x+dx] = Xnut_pause;
517                         nut_walk:
518                                 Cave[y][x] = dx > 0 ? Ynut_eB : Ynut_wB;
519                                 Next[y][x] = Zplayer;
520                                 play[SAMPLE_roll] = 1;
521                                 ply->x = x;
522                         }
523                         ply->anim = SPR_push + anim;
524                         break;
525                 case Xspring:
526                         if(dy) break;
527                         switch(Cave[y][x+dx]) {
528                         case Xalien:
529                         case Xalien_pause:
530                                 Cave[y][x] = dx > 0 ? Yspring_kill_eB : Yspring_kill_wB;
531                                 Cave[y][x+dx] = dx > 0 ? Yspring_kill_e : Yspring_kill_w;
532                                 Next[y][x] = Zplayer;
533                                 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
534                                 play[SAMPLE_slurp] = 1;
535                                 lev.score += lev.slurp_score;
536                                 ply->x = x;
537                                 break;
538                         case Xacid_1:
539                         case Xacid_2:
540                         case Xacid_3:
541                         case Xacid_4:
542                         case Xacid_5:
543                         case Xacid_6:
544                         case Xacid_7:
545                         case Xacid_8:
546                                 if(Cave[y-1][x+dx+1] == Xblank) Cave[y-1][x+dx+1] = Yacid_splash_eB;
547                                 if(Cave[y-1][x+dx-1] == Xblank) Cave[y-1][x+dx-1] = Yacid_splash_wB;
548                                 play[SAMPLE_acid] = 1;
549                                 goto spring_walk;
550                         case Xblank:
551                         case Yacid_splash_eB:
552                         case Yacid_splash_wB:
553                                 Cave[y][x+dx] = dx > 0 ? Yspring_e : Yspring_w;
554                                 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
555                         spring_walk:
556                                 Cave[y][x] = dx > 0 ? Yspring_eB : Yspring_wB;
557                                 Next[y][x] = Zplayer;
558                                 play[SAMPLE_roll] = 1;
559                                 ply->x = x;
560                         }
561                         ply->anim = SPR_push + anim;
562                         break;
563                 case Xspring_pause:
564                 case Xstone_pause:
565                 case Xbomb_pause:
566                 case Xnut_pause:
567                 case Xsand_stonein_1:
568                 case Xsand_stonein_2:
569                 case Xsand_stonein_3:
570                 case Xsand_stonein_4:
571                         if(dy) break;
572                         ply->anim = SPR_push + anim;
573                         break;
574                 case Xballoon:
575                         switch(Cave[y+dy][x+dx]) {
576                         case Xacid_1:
577                         case Xacid_2:
578                         case Xacid_3:
579                         case Xacid_4:
580                         case Xacid_5:
581                         case Xacid_6:
582                         case Xacid_7:
583                         case Xacid_8:
584                                 if(Cave[y+dy-1][x+dx+1] == Xblank) Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
585                                 if(Cave[y+dy-1][x+dx-1] == Xblank) Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
586                                 play[SAMPLE_acid] = 1;
587                                 goto balloon_walk;
588                         case Xblank:
589                         case Yacid_splash_eB:
590                         case Yacid_splash_wB:
591                                 Cave[y+dy][x+dx] = dy ? (dy < 0 ? Yballoon_n : Yballoon_s) : (dx > 0 ? Yballoon_e : Yballoon_w);
592                                 Next[y+dy][x+dx] = Xballoon;
593                         balloon_walk:
594                                 Cave[y][x] = dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) : (dx > 0 ? Yballoon_eB : Yballoon_wB);
595                                 Next[y][x] = Zplayer;
596                                 play[SAMPLE_push] = 1;
597                                 ply->x = x;
598                                 ply->y = y;
599                         }
600                         ply->anim = SPR_push + anim;
601                         break;
602                 case Xandroid:
603                 case Xandroid_1_n:
604                 case Xandroid_2_n:
605                 case Xandroid_1_e:
606                 case Xandroid_2_e:
607                 case Xandroid_1_s:
608                 case Xandroid_2_s:
609                 case Xandroid_1_w:
610                 case Xandroid_2_w:
611                         switch(Cave[y+dy][x+dx]) {
612                         case Xacid_1:
613                         case Xacid_2:
614                         case Xacid_3:
615                         case Xacid_4:
616                         case Xacid_5:
617                         case Xacid_6:
618                         case Xacid_7:
619                         case Xacid_8:
620                                 if(Cave[y+dy-1][x+dx+1] == Xblank) Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
621                                 if(Cave[y+dy-1][x+dx-1] == Xblank) Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
622                                 play[SAMPLE_acid] = 1;
623                                 goto android_walk;
624                         case Xblank:
625                         case Yacid_splash_eB:
626                         case Yacid_splash_wB:
627                                 Cave[y+dy][x+dx] = dy ? (dy < 0 ? Yandroid_n : Yandroid_s) : (dx > 0 ? Yandroid_e : Yandroid_w);
628                                 Next[y+dy][x+dx] = dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) : (dx > 0 ? Xandroid_2_e : Xandroid_2_w);
629                         android_walk:
630                                 Cave[y][x] = dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) : (dx > 0 ? Yandroid_eB : Yandroid_wB);
631                                 Next[y][x] = Zplayer;
632                                 play[SAMPLE_push] = 1;
633                                 ply->x = x;
634                                 ply->y = y;
635                         }
636                         ply->anim = SPR_push + anim;
637                         break;
638                 case Xdoor_1:
639                 case Xfake_door_1:
640                         if(ply->keys & 0x01) goto door_walk; else break;
641                 case Xdoor_2:
642                 case Xfake_door_2:
643                         if(ply->keys & 0x02) goto door_walk; else break;
644                 case Xdoor_3:
645                 case Xfake_door_3:
646                         if(ply->keys & 0x04) goto door_walk; else break;
647                 case Xdoor_4:
648                 case Xfake_door_4:
649                         if(ply->keys & 0x08) goto door_walk; else break;
650                 case Xdoor_5:
651                 case Xfake_door_5:
652                         if(ply->keys & 0x10) goto door_walk; else break;
653                 case Xdoor_6:
654                 case Xfake_door_6:
655                         if(ply->keys & 0x20) goto door_walk; else break;
656                 case Xdoor_7:
657                 case Xfake_door_7:
658                         if(ply->keys & 0x40) goto door_walk; else break;
659                 case Xdoor_8:
660                 case Xfake_door_8:
661                         if(ply->keys & 0x80) goto door_walk; else break;
662                 door_walk:
663                         if(!tab_blank[Cave[y+dy][x+dx]]) break;
664                         Cave[y+dy][x+dx] = Zplayer;
665                         Next[y+dy][x+dx] = Zplayer;
666                         play[SAMPLE_door] = 1;
667                         ply->anim = SPR_walk + anim;
668                         ply->x = x + dx;
669                         ply->y = y + dy;
670                         break;
671                 case Xwheel:
672                         play[SAMPLE_press] = 1;
673                         lev.wheel_cnt = lev.wheel_time;
674                         lev.wheel_x = x;
675                         lev.wheel_y = y;
676                         break;
677                 case Xwind_n:
678                         lev.wind_direction = 0; goto wind_walk;
679                 case Xwind_e:
680                         lev.wind_direction = 1; goto wind_walk;
681                 case Xwind_s:
682                         lev.wind_direction = 2; goto wind_walk;
683                 case Xwind_w:
684                         lev.wind_direction = 3; goto wind_walk;
685                 case Xwind_nesw:
686                         lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3); goto wind_walk;
687                 wind_walk:
688                         play[SAMPLE_press] = 1;
689                         lev.wind_cnt = lev.wind_time;
690                         break;
691                 case Xwind_stop:
692                         play[SAMPLE_press] = 1;
693                         lev.wind_cnt = 0;
694                         break;
695                 case Xswitch:
696                         play[SAMPLE_press] = 1;
697                         lev.ball_cnt = lev.ball_time;
698                         lev.ball_state = !lev.ball_state;
699                         break;
700                 case Xplant:
701                         Cave[y][x] = Yplant;
702                         Next[y][x] = Xplant;
703                         play[SAMPLE_blank] = 1;
704                         ply->anim = SPR_walk + anim;
705                         ply->x = x;
706                         ply->y = y;
707                         break;
708                 case Xexit_1:
709                 case Xexit_2:
710                 case Xexit_3:
711                         play[SAMPLE_exit] = 1;
712                         if(--lev.home == 0) lev.score += lev.time * lev.exit_score / 100;
713                         ply->anim = SPR_walk + anim;
714                         ply->x = x;
715                         ply->y = y;
716                         break;
717                 }
718         } else {
719                 switch(Cave[y][x]) { /* fire is pressed */
720                 case Xgrass:
721                 case Xdirt:
722                         Cave[y][x] = Yball_eat;
723                         Next[y][x] = Xblank;
724                         play[SAMPLE_dirt] = 1;
725                         ply->anim = SPR_spray + anim;
726                         break;
727                 case Xdiamond:
728                 case Xdiamond_pause:
729                         Cave[y][x] = Ydiamond_eat;
730                         Next[y][x] = Xblank;
731                         play[SAMPLE_collect] = 1;
732                         lev.score += lev.diamond_score;
733                         lev.required = lev.required < 3 ? 0 : lev.required - 3;
734                         ply->anim = SPR_walk + anim;
735                         break;
736                 case Xemerald:
737                 case Xemerald_pause:
738                         Cave[y][x] = Yemerald_eat;
739                         Next[y][x] = Xblank;
740                         play[SAMPLE_collect] = 1;
741                         lev.score += lev.emerald_score;
742                         lev.required = lev.required < 1 ? 0 : lev.required - 1;
743                         ply->anim = SPR_walk + anim;
744                         break;
745                 case Xdynamite:
746                         Cave[y][x] = Ydynamite_eat;
747                         Next[y][x] = Xblank;
748                         play[SAMPLE_collect] = 1;
749                         lev.score += lev.dynamite_score;
750                         ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
751                         ply->anim = SPR_walk + anim;
752                         break;
753                 case Xkey_1:
754                         ply->keys |= 0x01; goto key_shoot;
755                 case Xkey_2:
756                         ply->keys |= 0x02; goto key_shoot;
757                 case Xkey_3:
758                         ply->keys |= 0x04; goto key_shoot;
759                 case Xkey_4:
760                         ply->keys |= 0x08; goto key_shoot;
761                 case Xkey_5:
762                         ply->keys |= 0x10; goto key_shoot;
763                 case Xkey_6:
764                         ply->keys |= 0x20; goto key_shoot;
765                 case Xkey_7:
766                         ply->keys |= 0x40; goto key_shoot;
767                 case Xkey_8:
768                         ply->keys |= 0x80; goto key_shoot;
769                 key_shoot:
770                         Cave[y][x] = Yball_eat;
771                         Next[y][x] = Xblank;
772                         play[SAMPLE_collect] = 1;
773                         lev.score += lev.key_score;
774                         ply->anim = SPR_walk + anim;
775                         break;
776                 case Xlenses:
777                         Cave[y][x] = Yball_eat;
778                         Next[y][x] = Xblank;
779                         play[SAMPLE_collect] = 1;
780                         lev.score += lev.lenses_score;
781                         lev.lenses_cnt = lev.lenses_time;
782                         ply->anim = SPR_walk + anim;
783                         break;
784                 case Xmagnify:
785                         Cave[y][x] = Yball_eat;
786                         Next[y][x] = Xblank;
787                         play[SAMPLE_collect] = 1;
788                         lev.score += lev.magnify_score;
789                         lev.magnify_cnt = lev.magnify_time;
790                         ply->anim = SPR_walk + anim;
791                         break;
792                 }
793         }
794 }