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