5 * my own version of the emerald mine engine
11 #define SPRING_ROLL /* spring rolling off round things continues to roll */
12 #define USE_CHANGED_ACID_STUFF
14 #define RANDOM_RAW (seed = seed << 31 | seed >> 1)
15 #define RANDOM(x) (RANDOM_RAW & (x - 1))
17 static unsigned int seed;
20 static void Lboom_generic(int x, int y, int element, int element_middle)
22 Boom[x-1][y-1] = element;
23 Boom[x][y-1] = element;
24 Boom[x+1][y-1] = element;
25 Boom[x-1][y] = element;
26 Boom[x][y] = element_middle;
27 Boom[x+1][y] = element;
28 Boom[x-1][y+1] = element;
29 Boom[x][y+1] = element;
30 Boom[x+1][y+1] = element;
33 static void Lboom_bug(int x, int y, int by_element)
37 Lboom_generic(x, y, Xemerald, Xdiamond);
39 #if PLAY_ELEMENT_SOUND
40 play_element_sound(x, y, SOUND_boom, by_element);
44 static void Lboom_tank(int x, int y, int by_element)
48 Lboom_generic(x, y, Xblank, Xblank);
50 #if PLAY_ELEMENT_SOUND
51 play_element_sound(x, y, SOUND_boom, by_element);
55 static void Lboom_eater(int x, int y, int by_element)
59 Boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
60 Boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
61 Boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
62 Boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
63 Boom[x][y] = lev.eater_array[lev.eater_pos][4];
64 Boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
65 Boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
66 Boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
67 Boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
69 lev.eater_pos = (lev.eater_pos + 1) & 7;
71 #if PLAY_ELEMENT_SOUND
72 play_element_sound(x, y, SOUND_boom, by_element);
76 static boolean player_killed(struct PLAYER *ply)
84 if (lev.killed_out_of_time && setup.time_limit)
181 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
197 static void kill_player(struct PLAYER *ply)
214 Cave[x][y-1] = Xboom_bug;
225 Cave[x][y-1] = Xboom_bomb;
239 Cave[x+1][y] = Xboom_bug;
250 Cave[x+1][y] = Xboom_bomb;
264 Cave[x][y+1] = Xboom_bug;
275 Cave[x][y+1] = Xboom_bomb;
289 Cave[x-1][y] = Xboom_bug;
300 Cave[x-1][y] = Xboom_bomb;
311 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
315 play_element_sound(x, y, SOUND_die, Zplayer);
321 #ifdef USE_CHANGED_ACID_STUFF
334 Cave[x][y] = Xboom_1;
340 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
342 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
347 boolean result = TRUE;
349 if (!dx && !dy) /* no direction specified */
352 if (dx && dy && ply->joy_snap) /* more than one direction specified */
355 if (ply->joy_snap == 0) /* player wants to move */
357 int element = Cave[x][y];
361 /* fire is released */
365 Cave[x][y] = Zplayer;
366 Next[x][y] = Zplayer;
367 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
377 play_element_sound(x, y, SOUND_blank, Xblank);
378 ply->anim = PLY_walk_n + anim;
383 #ifdef USE_CHANGED_ACID_STUFF
392 if (Cave[x+1][y-1] == Xblank)
393 Cave[x+1][y-1] = Xacid_splash_e;
394 if (Cave[x-1][y-1] == Xblank)
395 Cave[x-1][y-1] = Xacid_splash_w;
396 play_element_sound(x, y, SOUND_acid, Xacid_1);
418 #ifndef USE_CHANGED_ACID_STUFF
428 ply->anim = PLY_walk_n + anim;
434 Cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
435 (dx > 0 ? Ygrass_eB : Ygrass_wB));
436 Next[x][y] = Zplayer;
437 play_element_sound(x, y, SOUND_dirt, Xgrass);
438 ply->anim = PLY_walk_n + anim;
444 Cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
445 (dx > 0 ? Ydirt_eB : Ydirt_wB));
446 Next[x][y] = Zplayer;
447 play_element_sound(x, y, SOUND_dirt, Xdirt);
448 ply->anim = PLY_walk_n + anim;
455 Cave[x][y] = Ydiamond_blank;
456 Next[x][y] = Zplayer;
457 play_element_sound(x, y, SOUND_collect, element);
458 lev.score += lev.diamond_score;
459 lev.required = lev.required < 3 ? 0 : lev.required - 3;
460 game.snapshot.collected_item = TRUE;
461 ply->anim = PLY_walk_n + anim;
468 Cave[x][y] = Yemerald_blank;
469 Next[x][y] = Zplayer;
470 play_element_sound(x, y, SOUND_collect, element);
471 lev.score += lev.emerald_score;
472 lev.required = lev.required < 1 ? 0 : lev.required - 1;
473 game.snapshot.collected_item = TRUE;
474 ply->anim = PLY_walk_n + anim;
480 Cave[x][y] = Ydynamite_blank;
481 Next[x][y] = Zplayer;
482 play_element_sound(x, y, SOUND_collect, element);
483 lev.score += lev.dynamite_score;
484 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
485 ply->anim = PLY_walk_n + anim;
492 Cave[x][y] = Ykey_1_blank;
497 Cave[x][y] = Ykey_2_blank;
502 Cave[x][y] = Ykey_3_blank;
507 Cave[x][y] = Ykey_4_blank;
512 Cave[x][y] = Ykey_5_blank;
517 Cave[x][y] = Ykey_6_blank;
522 Cave[x][y] = Ykey_7_blank;
527 Cave[x][y] = Ykey_8_blank;
532 Next[x][y] = Zplayer;
533 play_element_sound(x, y, SOUND_collect, element);
534 lev.score += lev.key_score;
535 ply->anim = PLY_walk_n + anim;
541 Cave[x][y] = Ylenses_blank;
542 Next[x][y] = Zplayer;
543 play_element_sound(x, y, SOUND_collect, element);
544 lev.score += lev.lenses_score;
545 lev.lenses_cnt = lev.lenses_time;
546 ply->anim = PLY_walk_n + anim;
552 Cave[x][y] = Ymagnify_blank;
553 Next[x][y] = Zplayer;
554 play_element_sound(x, y, SOUND_collect, element);
555 lev.score += lev.magnify_score;
556 lev.magnify_cnt = lev.magnify_time;
557 ply->anim = PLY_walk_n + anim;
566 switch(Cave[x+dx][y])
571 Cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
572 Next[x+dx][y] = Xstone_pause;
583 if (Cave[x+dx+1][y-1] == Xblank)
584 Cave[x+dx+1][y-1] = Xacid_splash_e;
585 if (Cave[x+dx-1][y-1] == Xblank)
586 Cave[x+dx-1][y-1] = Xacid_splash_w;
587 play_element_sound(x, y, SOUND_acid, Xacid_1);
591 Cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
592 Next[x][y] = Zplayer;
593 play_element_sound(x, y, SOUND_roll, Xstone);
598 ply->anim = PLY_push_n + anim;
605 switch(Cave[x+dx][y])
610 Cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
611 Next[x+dx][y] = Xbomb_pause;
622 if (Cave[x+dx+1][y-1] == Xblank)
623 Cave[x+dx+1][y-1] = Xacid_splash_e;
624 if (Cave[x+dx-1][y-1] == Xblank)
625 Cave[x+dx-1][y-1] = Xacid_splash_w;
626 play_element_sound(x, y, SOUND_acid, Xacid_1);
630 Cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
631 Next[x][y] = Zplayer;
632 play_element_sound(x, y, SOUND_roll, Xbomb);
637 ply->anim = PLY_push_n + anim;
644 switch(Cave[x+dx][y])
649 Cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
650 Next[x+dx][y] = Xnut_pause;
661 if (Cave[x+dx+1][y-1] == Xblank)
662 Cave[x+dx+1][y-1] = Xacid_splash_e;
663 if (Cave[x+dx-1][y-1] == Xblank)
664 Cave[x+dx-1][y-1] = Xacid_splash_w;
665 play_element_sound(x, y, SOUND_acid, Xacid_1);
669 Cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
670 Next[x][y] = Zplayer;
671 play_element_sound(x, y, SOUND_roll, Xnut);
676 ply->anim = PLY_push_n + anim;
683 switch(Cave[x+dx][y])
688 Cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
689 Next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
700 if (Cave[x+dx+1][y-1] == Xblank)
701 Cave[x+dx+1][y-1] = Xacid_splash_e;
702 if (Cave[x+dx-1][y-1] == Xblank)
703 Cave[x+dx-1][y-1] = Xacid_splash_w;
704 play_element_sound(x, y, SOUND_acid, Xacid_1);
708 Cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
709 Next[x][y] = Zplayer;
710 play_element_sound(x, y, SOUND_roll, Xspring);
716 Cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
717 Cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
718 Next[x][y] = Zplayer;
719 Next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
720 play_element_sound(x, y, SOUND_slurp, Xalien);
721 lev.score += lev.slurp_score;
726 ply->anim = PLY_push_n + anim;
733 case Xsand_stonein_1:
734 case Xsand_stonein_2:
735 case Xsand_stonein_3:
736 case Xsand_stonein_4:
740 ply->anim = PLY_push_n + anim;
744 switch(Cave[x+dx][y+dy])
749 Cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
750 (dx > 0 ? Yballoon_e : Yballoon_w));
751 Next[x+dx][y+dy] = Xballoon;
762 if (Cave[x+dx+1][y+dy-1] == Xblank)
763 Cave[x+dx+1][y+dy-1] = Xacid_splash_e;
764 if (Cave[x+dx-1][y+dy-1] == Xblank)
765 Cave[x+dx-1][y+dy-1] = Xacid_splash_w;
766 play_element_sound(x, y, SOUND_acid, Xacid_1);
770 Cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
771 (dx > 0 ? Yballoon_eB : Yballoon_wB));
772 Next[x][y] = Zplayer;
773 play_element_sound(x, y, SOUND_push, Xballoon);
779 ply->anim = PLY_push_n + anim;
791 switch(Cave[x+dx][y+dy])
796 Cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
797 (dx > 0 ? Yandroid_e : Yandroid_w));
798 Next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
799 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
810 if (Cave[x+dx+1][y+dy-1] == Xblank)
811 Cave[x+dx+1][y+dy-1] = Xacid_splash_e;
812 if (Cave[x+dx-1][y+dy-1] == Xblank)
813 Cave[x+dx-1][y+dy-1] = Xacid_splash_w;
814 play_element_sound(x, y, SOUND_acid, Xacid_1);
818 Cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
819 (dx > 0 ? Yandroid_eB : Yandroid_wB));
820 Next[x][y] = Zplayer;
821 play_element_sound(x, y, SOUND_push, Xandroid);
827 ply->anim = PLY_push_n + anim;
832 if (ply->keys & 0x01)
839 if (ply->keys & 0x02)
846 if (ply->keys & 0x04)
853 if (ply->keys & 0x08)
860 if (ply->keys & 0x10)
867 if (ply->keys & 0x20)
874 if (ply->keys & 0x40)
881 if (ply->keys & 0x80)
888 if (!tab_blank[Cave[x+dx][y+dy]])
891 Cave[x+dx][y+dy] = Zplayer;
892 Next[x+dx][y+dy] = Zplayer;
893 play_element_sound(x, y, SOUND_door, element);
894 ply->anim = PLY_walk_n + anim;
900 play_element_sound(x, y, SOUND_press, element);
901 lev.wheel_cnt = lev.wheel_time;
907 lev.wind_direction = 0;
911 lev.wind_direction = 1;
915 lev.wind_direction = 2;
919 lev.wind_direction = 3;
923 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
928 play_element_sound(x, y, SOUND_press, element);
929 lev.wind_cnt = lev.wind_time;
933 play_element_sound(x, y, SOUND_press, element);
938 play_element_sound(x, y, SOUND_press, element);
939 lev.ball_cnt = lev.ball_time;
940 lev.ball_state = !lev.ball_state;
946 play_element_sound(x, y, SOUND_blank, Xplant);
947 ply->anim = PLY_walk_n + anim;
958 game_em.level_solved = TRUE;
960 ply->anim = PLY_walk_n + anim;
967 if (ply->x == oldx && ply->y == oldy) /* no movement */
970 else /* player wants to snap */
972 int element = Cave[x][y];
976 /* fire is pressed */
979 Cave[x][y] = Ygrass_blank;
981 play_element_sound(x, y, SOUND_dirt, element);
982 ply->anim = PLY_shoot_n + anim;
986 Cave[x][y] = Ydirt_blank;
988 play_element_sound(x, y, SOUND_dirt, element);
989 ply->anim = PLY_shoot_n + anim;
994 Cave[x][y] = Ydiamond_blank;
996 play_element_sound(x, y, SOUND_collect, element);
997 lev.score += lev.diamond_score;
998 lev.required = lev.required < 3 ? 0 : lev.required - 3;
999 game.snapshot.collected_item = TRUE;
1000 ply->anim = PLY_walk_n + anim;
1004 case Xemerald_pause:
1005 Cave[x][y] = Yemerald_blank;
1006 Next[x][y] = Xblank;
1007 play_element_sound(x, y, SOUND_collect, element);
1008 lev.score += lev.emerald_score;
1009 lev.required = lev.required < 1 ? 0 : lev.required - 1;
1010 game.snapshot.collected_item = TRUE;
1011 ply->anim = PLY_walk_n + anim;
1015 Cave[x][y] = Ydynamite_blank;
1016 Next[x][y] = Xblank;
1017 play_element_sound(x, y, SOUND_collect, element);
1018 lev.score += lev.dynamite_score;
1019 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1020 ply->anim = PLY_walk_n + anim;
1025 Cave[x][y] = Ykey_1_blank;
1030 Cave[x][y] = Ykey_2_blank;
1035 Cave[x][y] = Ykey_3_blank;
1040 Cave[x][y] = Ykey_4_blank;
1045 Cave[x][y] = Ykey_5_blank;
1050 Cave[x][y] = Ykey_6_blank;
1055 Cave[x][y] = Ykey_7_blank;
1060 Cave[x][y] = Ykey_8_blank;
1065 Next[x][y] = Xblank;
1066 play_element_sound(x, y, SOUND_collect, element);
1067 lev.score += lev.key_score;
1068 ply->anim = PLY_walk_n + anim;
1072 Cave[x][y] = Ylenses_blank;
1073 Next[x][y] = Xblank;
1074 play_element_sound(x, y, SOUND_collect, element);
1075 lev.score += lev.lenses_score;
1076 lev.lenses_cnt = lev.lenses_time;
1077 ply->anim = PLY_walk_n + anim;
1081 Cave[x][y] = Ymagnify_blank;
1082 Next[x][y] = Xblank;
1083 play_element_sound(x, y, SOUND_collect, element);
1084 lev.score += lev.magnify_score;
1085 lev.magnify_cnt = lev.magnify_time;
1086 ply->anim = PLY_walk_n + anim;
1097 static void check_player(struct PLAYER *ply)
1105 game_em.last_player_direction[ply->num] = MV_NONE;
1107 if (ply->joy_w) /* west */
1112 else if (ply->joy_e) /* east */
1118 if (ply->joy_n) /* north */
1123 else if (ply->joy_s) /* south */
1135 boolean players_visible_before_move;
1136 boolean players_visible_after_move;
1139 players_visible_before_move = checkIfAllPlayersFitToScreen();
1144 players_visible_after_move = checkIfAllPlayersFitToScreen();
1147 player is allowed to move only in the following cases:
1148 - it is not needed to display all players (not focussed to all players)
1149 - all players are (still or again) visible after the move
1150 - some players were already outside visible screen area before the move
1152 can_move = (game.centered_player_nr != -1 ||
1153 players_visible_after_move ||
1154 !players_visible_before_move);
1161 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
1167 if (dx == 0 && dy == 0)
1173 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1175 Cave[x][y] = Xdynamite_1;
1176 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1182 ply->dynamite_cnt = 0;
1185 RandomEM += 7; /* be a bit more random if the player doesn't move */
1191 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
1192 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1193 ply->joy_spin = !ply->joy_spin;
1195 if (ply->joy_snap == 0) /* player wants to move */
1197 boolean moved = FALSE;
1199 if (ply->last_move_dir & MV_HORIZONTAL)
1201 if (!(moved = player_digfield(ply, 0, dy)))
1202 moved = player_digfield(ply, dx, 0);
1206 if (!(moved = player_digfield(ply, dx, 0)))
1207 moved = player_digfield(ply, 0, dy);
1213 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1214 else if (oldy != ply->y)
1215 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1217 game_em.any_player_moving = TRUE;
1218 game_em.last_moving_player = ply->num;
1219 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1222 else /* player wants to snap */
1224 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1228 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1230 int distance, distance_shortest = EM_MAX_CAVE_WIDTH + EM_MAX_CAVE_HEIGHT;
1233 /* default values if no players are alive anymore */
1237 for (i = 0; i < MAX_PLAYERS; i++)
1242 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1244 if (distance < distance_shortest)
1249 distance_shortest = distance;
1254 static void Lacid_1(int x, int y)
1256 Next[x][y] = Xacid_2;
1259 static void Lacid_2(int x, int y)
1261 Next[x][y] = Xacid_3;
1264 static void Lacid_3(int x, int y)
1266 Next[x][y] = Xacid_4;
1269 static void Lacid_4(int x, int y)
1271 Next[x][y] = Xacid_5;
1274 static void Lacid_5(int x, int y)
1276 Next[x][y] = Xacid_6;
1279 static void Lacid_6(int x, int y)
1281 Next[x][y] = Xacid_7;
1284 static void Lacid_7(int x, int y)
1286 Next[x][y] = Xacid_8;
1289 static void Lacid_8(int x, int y)
1291 Next[x][y] = Xacid_1;
1294 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1295 static void Lfake_acid_1(int x, int y)
1297 Next[x][y] = Xfake_acid_2;
1300 static void Lfake_acid_2(int x, int y)
1302 Next[x][y] = Xfake_acid_3;
1305 static void Lfake_acid_3(int x, int y)
1307 Next[x][y] = Xfake_acid_4;
1310 static void Lfake_acid_4(int x, int y)
1312 Next[x][y] = Xfake_acid_5;
1315 static void Lfake_acid_5(int x, int y)
1317 Next[x][y] = Xfake_acid_6;
1320 static void Lfake_acid_6(int x, int y)
1322 Next[x][y] = Xfake_acid_7;
1325 static void Lfake_acid_7(int x, int y)
1327 Next[x][y] = Xfake_acid_8;
1330 static void Lfake_acid_8(int x, int y)
1332 Next[x][y] = Xfake_acid_1;
1336 static void Landroid(int x, int y)
1340 if (lev.android_clone_cnt == 0)
1342 if (Cave[x-1][y-1] != Xblank &&
1343 Cave[x][y-1] != Xblank &&
1344 Cave[x+1][y-1] != Xblank &&
1345 Cave[x-1][y] != Xblank &&
1346 Cave[x+1][y] != Xblank &&
1347 Cave[x-1][y+1] != Xblank &&
1348 Cave[x][y+1] != Xblank &&
1349 Cave[x+1][y+1] != Xblank)
1354 /* randomly find an object to clone */
1356 case 0: /* S,NE,W,NW,SE,E,SW,N */
1357 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1358 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1359 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1360 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1361 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1362 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1363 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1364 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1367 case 1: /* NW,SE,N,S,NE,SW,E,W */
1368 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1369 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1370 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1371 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1372 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1373 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1374 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1375 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1378 case 2: /* SW,E,S,W,N,NW,SE,NE */
1379 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1380 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1381 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1382 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1383 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1384 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1385 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1386 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1389 case 3: /* N,SE,NE,E,W,S,NW,SW */
1390 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1391 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1392 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1393 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1394 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1395 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1396 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1397 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1400 case 4: /* SE,NW,E,NE,SW,W,N,S */
1401 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1402 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1403 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1404 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1405 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1406 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1407 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1408 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1411 case 5: /* NE,W,SE,SW,S,N,E,NW */
1412 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1413 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1414 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1415 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1416 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1417 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1418 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1419 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1422 case 6: /* E,N,SW,S,NW,NE,SE,W */
1423 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1424 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1425 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1426 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1427 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1428 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1429 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1430 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1433 case 7: /* W,SW,NW,N,E,SE,NE,S */
1434 temp = lev.android_array[Cave[x-1][y]]; if (temp != Xblank) break;
1435 temp = lev.android_array[Cave[x-1][y+1]]; if (temp != Xblank) break;
1436 temp = lev.android_array[Cave[x-1][y-1]]; if (temp != Xblank) break;
1437 temp = lev.android_array[Cave[x][y-1]]; if (temp != Xblank) break;
1438 temp = lev.android_array[Cave[x+1][y]]; if (temp != Xblank) break;
1439 temp = lev.android_array[Cave[x+1][y+1]]; if (temp != Xblank) break;
1440 temp = lev.android_array[Cave[x+1][y-1]]; if (temp != Xblank) break;
1441 temp = lev.android_array[Cave[x][y+1]]; if (temp != Xblank) break;
1445 Next[x][y] = temp; /* the item we chose to clone */
1446 play_element_sound(x, y, SOUND_android_clone, temp);
1450 /* randomly find a direction to move */
1452 case 0: /* S,NE,W,NW,SE,E,SW,N */
1453 if (Cave[x][y+1] == Xblank) goto android_s;
1454 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1455 if (Cave[x-1][y] == Xblank) goto android_w;
1456 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1457 if (Cave[x+1][y+1] == Xblank) goto android_se;
1458 if (Cave[x+1][y] == Xblank) goto android_e;
1459 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1460 if (Cave[x][y-1] == Xblank) goto android_n;
1463 case 1: /* NW,SE,N,S,NE,SW,E,W */
1464 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1465 if (Cave[x+1][y+1] == Xblank) goto android_se;
1466 if (Cave[x][y-1] == Xblank) goto android_n;
1467 if (Cave[x][y+1] == Xblank) goto android_s;
1468 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1469 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1470 if (Cave[x+1][y] == Xblank) goto android_e;
1471 if (Cave[x-1][y] == Xblank) goto android_w;
1474 case 2: /* SW,E,S,W,N,NW,SE,NE */
1475 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1476 if (Cave[x+1][y] == Xblank) goto android_e;
1477 if (Cave[x][y+1] == Xblank) goto android_s;
1478 if (Cave[x-1][y] == Xblank) goto android_w;
1479 if (Cave[x][y-1] == Xblank) goto android_n;
1480 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1481 if (Cave[x+1][y+1] == Xblank) goto android_se;
1482 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1485 case 3: /* N,SE,NE,E,W,S,NW,SW */
1486 if (Cave[x][y-1] == Xblank) goto android_n;
1487 if (Cave[x+1][y+1] == Xblank) goto android_se;
1488 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1489 if (Cave[x+1][y] == Xblank) goto android_e;
1490 if (Cave[x-1][y] == Xblank) goto android_w;
1491 if (Cave[x][y+1] == Xblank) goto android_s;
1492 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1493 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1496 case 4: /* SE,NW,E,NE,SW,W,N,S */
1497 if (Cave[x+1][y+1] == Xblank) goto android_se;
1498 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1499 if (Cave[x+1][y] == Xblank) goto android_e;
1500 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1501 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1502 if (Cave[x-1][y] == Xblank) goto android_w;
1503 if (Cave[x][y-1] == Xblank) goto android_n;
1504 if (Cave[x][y+1] == Xblank) goto android_s;
1507 case 5: /* NE,W,SE,SW,S,N,E,NW */
1508 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1509 if (Cave[x-1][y] == Xblank) goto android_w;
1510 if (Cave[x+1][y+1] == Xblank) goto android_se;
1511 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1512 if (Cave[x][y+1] == Xblank) goto android_s;
1513 if (Cave[x][y-1] == Xblank) goto android_n;
1514 if (Cave[x+1][y] == Xblank) goto android_e;
1515 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1518 case 6: /* E,N,SW,S,NW,NE,SE,W */
1519 if (Cave[x+1][y] == Xblank) goto android_e;
1520 if (Cave[x][y-1] == Xblank) goto android_n;
1521 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1522 if (Cave[x][y+1] == Xblank) goto android_s;
1523 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1524 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1525 if (Cave[x+1][y+1] == Xblank) goto android_se;
1526 if (Cave[x-1][y] == Xblank) goto android_w;
1529 case 7: /* W,SW,NW,N,E,SE,NE,S */
1530 if (Cave[x-1][y] == Xblank) goto android_w;
1531 if (Cave[x-1][y+1] == Xblank) goto android_sw;
1532 if (Cave[x-1][y-1] == Xblank) goto android_nw;
1533 if (Cave[x][y-1] == Xblank) goto android_n;
1534 if (Cave[x+1][y] == Xblank) goto android_e;
1535 if (Cave[x+1][y+1] == Xblank) goto android_se;
1536 if (Cave[x+1][y-1] == Xblank) goto android_ne;
1537 if (Cave[x][y+1] == Xblank) goto android_s;
1543 if (lev.android_move_cnt == 0)
1545 if (Cave[x-1][y-1] == Zplayer ||
1546 Cave[x][y-1] == Zplayer ||
1547 Cave[x+1][y-1] == Zplayer ||
1548 Cave[x-1][y] == Zplayer ||
1549 Cave[x+1][y] == Zplayer ||
1550 Cave[x-1][y+1] == Zplayer ||
1551 Cave[x][y+1] == Zplayer ||
1552 Cave[x+1][y+1] == Zplayer)
1555 set_nearest_player_xy(x, y, &dx, &dy);
1557 Next[x][y] = Xblank; /* assume we will move */
1558 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1564 /* attempt clockwise move first if direct path is blocked */
1566 case 0: /* north west */
1567 if (tab_android_move[Cave[x-1][y-1]]) goto android_nw;
1568 if (tab_android_move[Cave[x][y-1]]) goto android_n;
1569 if (tab_android_move[Cave[x-1][y]]) goto android_w;
1573 if (tab_android_move[Cave[x][y-1]]) goto android_n;
1574 if (tab_android_move[Cave[x+1][y-1]]) goto android_ne;
1575 if (tab_android_move[Cave[x-1][y-1]]) goto android_nw;
1578 case 2: /* north east */
1579 if (tab_android_move[Cave[x+1][y-1]]) goto android_ne;
1580 if (tab_android_move[Cave[x+1][y]]) goto android_e;
1581 if (tab_android_move[Cave[x][y-1]]) goto android_n;
1585 if (tab_android_move[Cave[x-1][y]]) goto android_w;
1586 if (tab_android_move[Cave[x-1][y-1]]) goto android_nw;
1587 if (tab_android_move[Cave[x-1][y+1]]) goto android_sw;
1590 case 4: /* nowhere */
1594 if (tab_android_move[Cave[x+1][y]]) goto android_e;
1595 if (tab_android_move[Cave[x+1][y+1]]) goto android_se;
1596 if (tab_android_move[Cave[x+1][y-1]]) goto android_ne;
1599 case 6: /* south west */
1600 if (tab_android_move[Cave[x-1][y+1]]) goto android_sw;
1601 if (tab_android_move[Cave[x-1][y]]) goto android_w;
1602 if (tab_android_move[Cave[x][y+1]]) goto android_s;
1606 if (tab_android_move[Cave[x][y+1]]) goto android_s;
1607 if (tab_android_move[Cave[x-1][y+1]]) goto android_sw;
1608 if (tab_android_move[Cave[x+1][y+1]]) goto android_se;
1611 case 8: /* south east */
1612 if (tab_android_move[Cave[x+1][y+1]]) goto android_se;
1613 if (tab_android_move[Cave[x][y+1]]) goto android_s;
1614 if (tab_android_move[Cave[x+1][y]]) goto android_e;
1622 /* attempt counterclockwise move first if direct path is blocked */
1624 case 0: /* north west */
1625 if (tab_android_move[Cave[x-1][y-1]]) goto android_nw;
1626 if (tab_android_move[Cave[x-1][y]]) goto android_w;
1627 if (tab_android_move[Cave[x][y-1]]) goto android_n;
1631 if (tab_android_move[Cave[x][y-1]]) goto android_n;
1632 if (tab_android_move[Cave[x-1][y-1]]) goto android_nw;
1633 if (tab_android_move[Cave[x+1][y-1]]) goto android_ne;
1636 case 2: /* north east */
1637 if (tab_android_move[Cave[x+1][y-1]]) goto android_ne;
1638 if (tab_android_move[Cave[x][y-1]]) goto android_n;
1639 if (tab_android_move[Cave[x+1][y]]) goto android_e;
1643 if (tab_android_move[Cave[x-1][y]]) goto android_w;
1644 if (tab_android_move[Cave[x-1][y+1]]) goto android_sw;
1645 if (tab_android_move[Cave[x-1][y-1]]) goto android_nw;
1648 case 4: /* nowhere */
1652 if (tab_android_move[Cave[x+1][y]]) goto android_e;
1653 if (tab_android_move[Cave[x+1][y-1]]) goto android_ne;
1654 if (tab_android_move[Cave[x+1][y+1]]) goto android_se;
1657 case 6: /* south west */
1658 if (tab_android_move[Cave[x-1][y+1]]) goto android_sw;
1659 if (tab_android_move[Cave[x][y+1]]) goto android_s;
1660 if (tab_android_move[Cave[x-1][y]]) goto android_w;
1664 if (tab_android_move[Cave[x][y+1]]) goto android_s;
1665 if (tab_android_move[Cave[x+1][y+1]]) goto android_se;
1666 if (tab_android_move[Cave[x-1][y+1]]) goto android_sw;
1669 case 8: /* south east */
1670 if (tab_android_move[Cave[x+1][y+1]]) goto android_se;
1671 if (tab_android_move[Cave[x+1][y]]) goto android_e;
1672 if (tab_android_move[Cave[x][y+1]]) goto android_s;
1679 Next[x][y] = Xandroid;
1683 Cave[x][y] = Yandroid_nB;
1684 Cave[x][y-1] = Yandroid_n;
1685 Next[x][y-1] = Xandroid;
1686 play_element_sound(x, y, SOUND_android_move, Xandroid);
1690 Cave[x][y] = Yandroid_neB;
1691 Cave[x+1][y-1] = Yandroid_ne;
1692 Next[x+1][y-1] = Xandroid;
1693 play_element_sound(x, y, SOUND_android_move, Xandroid);
1697 Cave[x][y] = Yandroid_eB;
1698 Cave[x+1][y] = Yandroid_e;
1699 Next[x+1][y] = Xandroid;
1700 play_element_sound(x, y, SOUND_android_move, Xandroid);
1704 Cave[x][y] = Yandroid_seB;
1705 Cave[x+1][y+1] = Yandroid_se;
1706 Next[x+1][y+1] = Xandroid;
1707 play_element_sound(x, y, SOUND_android_move, Xandroid);
1711 Cave[x][y] = Yandroid_sB;
1712 Cave[x][y+1] = Yandroid_s;
1713 Next[x][y+1] = Xandroid;
1714 play_element_sound(x, y, SOUND_android_move, Xandroid);
1718 Cave[x][y] = Yandroid_swB;
1719 Cave[x-1][y+1] = Yandroid_sw;
1720 Next[x-1][y+1] = Xandroid;
1721 play_element_sound(x, y, SOUND_android_move, Xandroid);
1725 Cave[x][y] = Yandroid_wB;
1726 Cave[x-1][y] = Yandroid_w;
1727 Next[x-1][y] = Xandroid;
1728 play_element_sound(x, y, SOUND_android_move, Xandroid);
1732 Cave[x][y] = Yandroid_nwB;
1733 Cave[x-1][y-1] = Yandroid_nw;
1734 Next[x-1][y-1] = Xandroid;
1735 play_element_sound(x, y, SOUND_android_move, Xandroid);
1739 static void Landroid_1_n(int x, int y)
1741 switch (Cave[x][y-1])
1744 case Xacid_splash_e:
1745 case Xacid_splash_w:
1746 Cave[x][y] = Yandroid_nB;
1747 Next[x][y] = Xblank;
1748 Cave[x][y-1] = Yandroid_n;
1749 Next[x][y-1] = Xandroid;
1750 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
1761 Cave[x][y] = Yandroid_nB;
1762 Next[x][y] = Xblank;
1763 if (Cave[x+1][y-2] == Xblank)
1764 Cave[x+1][y-2] = Xacid_splash_e;
1765 if (Cave[x-1][y-2] == Xblank)
1766 Cave[x-1][y-2] = Xacid_splash_w;
1767 play_element_sound(x, y, SOUND_acid, Xacid_1);
1776 static void Landroid_2_n(int x, int y)
1778 switch (Cave[x][y-1])
1781 case Xacid_splash_e:
1782 case Xacid_splash_w:
1783 Cave[x][y] = Yandroid_nB;
1784 Next[x][y] = Xblank;
1785 Cave[x][y-1] = Yandroid_n;
1786 Next[x][y-1] = Xandroid_1_n;
1787 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
1798 Cave[x][y] = Yandroid_nB;
1799 Next[x][y] = Xblank;
1800 if (Cave[x+1][y-2] == Xblank)
1801 Cave[x+1][y-2] = Xacid_splash_e;
1802 if (Cave[x-1][y-2] == Xblank)
1803 Cave[x-1][y-2] = Xacid_splash_w;
1804 play_element_sound(x, y, SOUND_acid, Xacid_1);
1813 static void Landroid_1_e(int x, int y)
1815 switch (Cave[x+1][y])
1818 case Xacid_splash_e:
1819 case Xacid_splash_w:
1820 Cave[x][y] = Yandroid_eB;
1821 Next[x][y] = Xblank;
1822 Cave[x+1][y] = Yandroid_e;
1823 Next[x+1][y] = Xandroid;
1824 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
1835 Cave[x][y] = Yandroid_eB;
1836 Next[x][y] = Xblank;
1837 if (Cave[x+2][y-1] == Xblank)
1838 Cave[x+2][y-1] = Xacid_splash_e;
1839 if (Cave[x][y-1] == Xblank)
1840 Cave[x][y-1] = Xacid_splash_w;
1841 play_element_sound(x, y, SOUND_acid, Xacid_1);
1850 static void Landroid_2_e(int x, int y)
1852 switch (Cave[x+1][y])
1855 case Xacid_splash_e:
1856 case Xacid_splash_w:
1857 Cave[x][y] = Yandroid_eB;
1858 Next[x][y] = Xblank;
1859 Cave[x+1][y] = Yandroid_e;
1860 Next[x+1][y] = Xandroid_1_e;
1861 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
1872 Cave[x][y] = Yandroid_eB;
1873 Next[x][y] = Xblank;
1874 if (Cave[x+2][y-1] == Xblank)
1875 Cave[x+2][y-1] = Xacid_splash_e;
1876 if (Cave[x][y-1] == Xblank)
1877 Cave[x][y-1] = Xacid_splash_w;
1878 play_element_sound(x, y, SOUND_acid, Xacid_1);
1887 static void Landroid_1_s(int x, int y)
1889 switch (Cave[x][y+1])
1892 case Xacid_splash_e:
1893 case Xacid_splash_w:
1894 Cave[x][y] = Yandroid_sB;
1895 Next[x][y] = Xblank;
1896 Cave[x][y+1] = Yandroid_s;
1897 Next[x][y+1] = Xandroid;
1898 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
1909 Cave[x][y] = Yandroid_sB;
1910 Next[x][y] = Xblank;
1911 if (Cave[x+1][y] == Xblank)
1912 Cave[x+1][y] = Xacid_splash_e;
1913 if (Cave[x-1][y] == Xblank)
1914 Cave[x-1][y] = Xacid_splash_w;
1915 play_element_sound(x, y, SOUND_acid, Xacid_1);
1924 static void Landroid_2_s(int x, int y)
1926 switch (Cave[x][y+1])
1929 case Xacid_splash_e:
1930 case Xacid_splash_w:
1931 Cave[x][y] = Yandroid_sB;
1932 Next[x][y] = Xblank;
1933 Cave[x][y+1] = Yandroid_s;
1934 Next[x][y+1] = Xandroid_1_s;
1935 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
1946 Cave[x][y] = Yandroid_sB;
1947 Next[x][y] = Xblank;
1948 if (Cave[x+1][y] == Xblank)
1949 Cave[x+1][y] = Xacid_splash_e;
1950 if (Cave[x-1][y] == Xblank)
1951 Cave[x-1][y] = Xacid_splash_w;
1952 play_element_sound(x, y, SOUND_acid, Xacid_1);
1961 static void Landroid_1_w(int x, int y)
1963 switch (Cave[x-1][y])
1966 case Xacid_splash_e:
1967 case Xacid_splash_w:
1968 Cave[x][y] = Yandroid_wB;
1969 Next[x][y] = Xblank;
1970 Cave[x-1][y] = Yandroid_w;
1971 Next[x-1][y] = Xandroid;
1972 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
1983 Cave[x][y] = Yandroid_wB;
1984 Next[x][y] = Xblank;
1985 if (Cave[x][y-1] == Xblank)
1986 Cave[x][y-1] = Xacid_splash_e;
1987 if (Cave[x-2][y-1] == Xblank)
1988 Cave[x-2][y-1] = Xacid_splash_w;
1989 play_element_sound(x, y, SOUND_acid, Xacid_1);
1998 static void Landroid_2_w(int x, int y)
2000 switch (Cave[x-1][y])
2003 case Xacid_splash_e:
2004 case Xacid_splash_w:
2005 Cave[x][y] = Yandroid_wB;
2006 Next[x][y] = Xblank;
2007 Cave[x-1][y] = Yandroid_w;
2008 Next[x-1][y] = Xandroid_1_w;
2009 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2020 Cave[x][y] = Yandroid_wB;
2021 Next[x][y] = Xblank;
2022 if (Cave[x][y-1] == Xblank)
2023 Cave[x][y-1] = Xacid_splash_e;
2024 if (Cave[x-2][y-1] == Xblank)
2025 Cave[x-2][y-1] = Xacid_splash_w;
2026 play_element_sound(x, y, SOUND_acid, Xacid_1);
2035 static void Leater_n(int x, int y)
2037 if (Cave[x+1][y] == Xdiamond)
2039 Cave[x+1][y] = Ydiamond_blank;
2040 Next[x+1][y] = Xblank;
2041 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2045 if (Cave[x][y+1] == Xdiamond)
2047 Cave[x][y+1] = Ydiamond_blank;
2048 Next[x][y+1] = Xblank;
2049 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2053 if (Cave[x-1][y] == Xdiamond)
2055 Cave[x-1][y] = Ydiamond_blank;
2056 Next[x-1][y] = Xblank;
2057 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2061 if (Cave[x][y-1] == Xdiamond)
2063 Cave[x][y-1] = Ydiamond_blank;
2064 Next[x][y-1] = Xblank;
2065 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2069 switch (Cave[x][y-1])
2072 case Xacid_splash_e:
2073 case Xacid_splash_w:
2077 Cave[x][y] = Yeater_nB;
2078 Next[x][y] = Xblank;
2079 Cave[x][y-1] = Yeater_n;
2080 Next[x][y-1] = Xeater_n;
2091 Cave[x][y] = Yeater_nB;
2092 Next[x][y] = Xblank;
2093 if (Cave[x+1][y-2] == Xblank)
2094 Cave[x+1][y-2] = Xacid_splash_e;
2095 if (Cave[x-1][y-2] == Xblank)
2096 Cave[x-1][y-2] = Xacid_splash_w;
2097 play_element_sound(x, y, SOUND_acid, Xacid_1);
2101 Next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2102 play_element_sound(x, y, SOUND_eater, Xeater_n);
2107 static void Leater_e(int x, int y)
2109 if (Cave[x][y+1] == Xdiamond)
2111 Cave[x][y+1] = Ydiamond_blank;
2112 Next[x][y+1] = Xblank;
2113 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2117 if (Cave[x-1][y] == Xdiamond)
2119 Cave[x-1][y] = Ydiamond_blank;
2120 Next[x-1][y] = Xblank;
2121 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2125 if (Cave[x][y-1] == Xdiamond)
2127 Cave[x][y-1] = Ydiamond_blank;
2128 Next[x][y-1] = Xblank;
2129 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2133 if (Cave[x+1][y] == Xdiamond)
2135 Cave[x+1][y] = Ydiamond_blank;
2136 Next[x+1][y] = Xblank;
2137 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2141 switch (Cave[x+1][y])
2144 case Xacid_splash_e:
2145 case Xacid_splash_w:
2149 Cave[x][y] = Yeater_eB;
2150 Next[x][y] = Xblank;
2151 Cave[x+1][y] = Yeater_e;
2152 Next[x+1][y] = Xeater_e;
2163 Cave[x][y] = Yeater_eB;
2164 Next[x][y] = Xblank;
2165 if (Cave[x+2][y-1] == Xblank)
2166 Cave[x+2][y-1] = Xacid_splash_e;
2167 if (Cave[x][y-1] == Xblank)
2168 Cave[x][y-1] = Xacid_splash_w;
2169 play_element_sound(x, y, SOUND_acid, Xacid_1);
2173 Next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2174 play_element_sound(x, y, SOUND_eater, Xeater_e);
2179 static void Leater_s(int x, int y)
2181 if (Cave[x-1][y] == Xdiamond)
2183 Cave[x-1][y] = Ydiamond_blank;
2184 Next[x-1][y] = Xblank;
2185 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2189 if (Cave[x][y-1] == Xdiamond)
2191 Cave[x][y-1] = Ydiamond_blank;
2192 Next[x][y-1] = Xblank;
2193 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2197 if (Cave[x+1][y] == Xdiamond)
2199 Cave[x+1][y] = Ydiamond_blank;
2200 Next[x+1][y] = Xblank;
2201 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2205 if (Cave[x][y+1] == Xdiamond)
2207 Cave[x][y+1] = Ydiamond_blank;
2208 Next[x][y+1] = Xblank;
2209 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2213 switch (Cave[x][y+1])
2216 case Xacid_splash_e:
2217 case Xacid_splash_w:
2221 Cave[x][y] = Yeater_sB;
2222 Next[x][y] = Xblank;
2223 Cave[x][y+1] = Yeater_s;
2224 Next[x][y+1] = Xeater_s;
2235 Cave[x][y] = Yeater_sB;
2236 Next[x][y] = Xblank;
2237 if (Cave[x+1][y] == Xblank)
2238 Cave[x+1][y] = Xacid_splash_e;
2239 if (Cave[x-1][y] == Xblank)
2240 Cave[x-1][y] = Xacid_splash_w;
2241 play_element_sound(x, y, SOUND_acid, Xacid_1);
2245 Next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2246 play_element_sound(x, y, SOUND_eater, Xeater_s);
2251 static void Leater_w(int x, int y)
2253 if (Cave[x][y-1] == Xdiamond)
2255 Cave[x][y-1] = Ydiamond_blank;
2256 Next[x][y-1] = Xblank;
2257 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2261 if (Cave[x+1][y] == Xdiamond)
2263 Cave[x+1][y] = Ydiamond_blank;
2264 Next[x+1][y] = Xblank;
2265 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2269 if (Cave[x][y+1] == Xdiamond)
2271 Cave[x][y+1] = Ydiamond_blank;
2272 Next[x][y+1] = Xblank;
2273 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2277 if (Cave[x-1][y] == Xdiamond)
2279 Cave[x-1][y] = Ydiamond_blank;
2280 Next[x-1][y] = Xblank;
2281 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2285 switch (Cave[x-1][y])
2288 case Xacid_splash_e:
2289 case Xacid_splash_w:
2293 Cave[x][y] = Yeater_wB;
2294 Next[x][y] = Xblank;
2295 Cave[x-1][y] = Yeater_w;
2296 Next[x-1][y] = Xeater_w;
2307 Cave[x][y] = Yeater_wB;
2308 Next[x][y] = Xblank;
2309 if (Cave[x][y-1] == Xblank)
2310 Cave[x][y-1] = Xacid_splash_e;
2311 if (Cave[x-2][y-1] == Xblank)
2312 Cave[x-2][y-1] = Xacid_splash_w;
2313 play_element_sound(x, y, SOUND_acid, Xacid_1);
2317 Next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2318 play_element_sound(x, y, SOUND_eater, Xeater_w);
2323 static void Lalien(int x, int y)
2334 set_nearest_player_xy(x, y, &dx, &dy);
2341 switch (Cave[x][y-1])
2344 case Xacid_splash_e:
2345 case Xacid_splash_w:
2349 Cave[x][y] = Yalien_nB;
2350 Next[x][y] = Xblank;
2351 Cave[x][y-1] = Yalien_n;
2352 Next[x][y-1] = Xalien_pause;
2353 play_element_sound(x, y, SOUND_alien, Xalien);
2364 Cave[x][y] = Yalien_nB;
2365 Next[x][y] = Xblank;
2366 if (Cave[x+1][y-2] == Xblank)
2367 Cave[x+1][y-2] = Xacid_splash_e;
2368 if (Cave[x-1][y-2] == Xblank)
2369 Cave[x-1][y-2] = Xacid_splash_w;
2370 play_element_sound(x, y, SOUND_acid, Xacid_1);
2376 switch (Cave[x][y+1])
2379 case Xacid_splash_e:
2380 case Xacid_splash_w:
2384 Cave[x][y] = Yalien_sB;
2385 Next[x][y] = Xblank;
2386 Cave[x][y+1] = Yalien_s;
2387 Next[x][y+1] = Xalien_pause;
2388 play_element_sound(x, y, SOUND_alien, Xalien);
2399 Cave[x][y] = Yalien_sB;
2400 Next[x][y] = Xblank;
2401 if (Cave[x+1][y] == Xblank)
2402 Cave[x+1][y] = Xacid_splash_e;
2403 if (Cave[x-1][y] == Xblank)
2404 Cave[x-1][y] = Xacid_splash_w;
2405 play_element_sound(x, y, SOUND_acid, Xacid_1);
2414 switch (Cave[x+1][y])
2417 case Xacid_splash_e:
2418 case Xacid_splash_w:
2422 Cave[x][y] = Yalien_eB;
2423 Next[x][y] = Xblank;
2424 Cave[x+1][y] = Yalien_e;
2425 Next[x+1][y] = Xalien_pause;
2426 play_element_sound(x, y, SOUND_alien, Xalien);
2437 Cave[x][y] = Yalien_eB;
2438 Next[x][y] = Xblank;
2439 if (Cave[x+2][y-1] == Xblank)
2440 Cave[x+2][y-1] = Xacid_splash_e;
2441 if (Cave[x][y-1] == Xblank)
2442 Cave[x][y-1] = Xacid_splash_w;
2443 play_element_sound(x, y, SOUND_acid, Xacid_1);
2449 switch (Cave[x-1][y])
2452 case Xacid_splash_e:
2453 case Xacid_splash_w:
2457 Cave[x][y] = Yalien_wB;
2458 Next[x][y] = Xblank;
2459 Cave[x-1][y] = Yalien_w;
2460 Next[x-1][y] = Xalien_pause;
2461 play_element_sound(x, y, SOUND_alien, Xalien);
2472 Cave[x][y] = Yalien_wB;
2473 Next[x][y] = Xblank;
2474 if (Cave[x][y-1] == Xblank)
2475 Cave[x][y-1] = Xacid_splash_e;
2476 if (Cave[x-2][y-1] == Xblank)
2477 Cave[x-2][y-1] = Xacid_splash_w;
2478 play_element_sound(x, y, SOUND_acid, Xacid_1);
2485 static void Lalien_pause(int x, int y)
2487 Next[x][y] = Xalien;
2490 static void Lbug_n(int x, int y)
2492 switch (Cave[x][y-1])
2495 case Xacid_splash_e:
2496 case Xacid_splash_w:
2500 Cave[x][y] = Ybug_nB;
2501 Next[x][y] = Xblank;
2502 Cave[x][y-1] = Ybug_n;
2503 Next[x][y-1] = Xbug_1_n;
2504 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2515 Cave[x][y] = Ybug_nB;
2516 Next[x][y] = Xblank;
2517 if (Cave[x+1][y-2] == Xblank)
2518 Cave[x+1][y-2] = Xacid_splash_e;
2519 if (Cave[x-1][y-2] == Xblank)
2520 Cave[x-1][y-2] = Xacid_splash_w;
2521 play_element_sound(x, y, SOUND_acid, Xacid_1);
2525 Cave[x][y] = Ybug_n_w;
2526 Next[x][y] = Xbug_2_w;
2527 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2532 static void Lbug_1_n(int x, int y)
2534 if (tab_amoeba[Cave[x][y-1]] ||
2535 tab_amoeba[Cave[x+1][y]] ||
2536 tab_amoeba[Cave[x][y+1]] ||
2537 tab_amoeba[Cave[x-1][y]])
2539 Lboom_bug(x, y, Xbug_1_n);
2544 switch (Cave[x+1][y])
2547 case Xacid_splash_e:
2548 case Xacid_splash_w:
2560 Cave[x][y] = Ybug_n_e;
2561 Next[x][y] = Xbug_2_e;
2562 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2571 static void Lbug_2_n(int x, int y)
2573 if (tab_amoeba[Cave[x][y-1]] ||
2574 tab_amoeba[Cave[x+1][y]] ||
2575 tab_amoeba[Cave[x][y+1]] ||
2576 tab_amoeba[Cave[x-1][y]])
2578 Lboom_bug(x, y, Xbug_2_n);
2586 static void Lbug_e(int x, int y)
2588 switch (Cave[x+1][y])
2591 case Xacid_splash_e:
2592 case Xacid_splash_w:
2596 Cave[x][y] = Ybug_eB;
2597 Next[x][y] = Xblank;
2598 Cave[x+1][y] = Ybug_e;
2599 Next[x+1][y] = Xbug_1_e;
2600 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2611 Cave[x][y] = Ybug_eB;
2612 Next[x][y] = Xblank;
2613 if (Cave[x+2][y-1] == Xblank)
2614 Cave[x+2][y-1] = Xacid_splash_e;
2615 if (Cave[x][y-1] == Xblank)
2616 Cave[x][y-1] = Xacid_splash_w;
2617 play_element_sound(x, y, SOUND_acid, Xacid_1);
2621 Cave[x][y] = Ybug_e_n;
2622 Next[x][y] = Xbug_2_n;
2623 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2628 static void Lbug_1_e(int x, int y)
2630 if (tab_amoeba[Cave[x][y-1]] ||
2631 tab_amoeba[Cave[x+1][y]] ||
2632 tab_amoeba[Cave[x][y+1]] ||
2633 tab_amoeba[Cave[x-1][y]])
2635 Lboom_bug(x, y, Xbug_1_e);
2640 switch (Cave[x][y+1])
2643 case Xacid_splash_e:
2644 case Xacid_splash_w:
2656 Cave[x][y] = Ybug_e_s;
2657 Next[x][y] = Xbug_2_s;
2658 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2667 static void Lbug_2_e(int x, int y)
2669 if (tab_amoeba[Cave[x][y-1]] ||
2670 tab_amoeba[Cave[x+1][y]] ||
2671 tab_amoeba[Cave[x][y+1]] ||
2672 tab_amoeba[Cave[x-1][y]])
2674 Lboom_bug(x, y, Xbug_2_e);
2682 static void Lbug_s(int x, int y)
2684 switch (Cave[x][y+1])
2687 case Xacid_splash_e:
2688 case Xacid_splash_w:
2692 Cave[x][y] = Ybug_sB;
2693 Next[x][y] = Xblank;
2694 Cave[x][y+1] = Ybug_s;
2695 Next[x][y+1] = Xbug_1_s;
2696 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2707 Cave[x][y] = Ybug_sB;
2708 Next[x][y] = Xblank;
2709 if (Cave[x+1][y] == Xblank)
2710 Cave[x+1][y] = Xacid_splash_e;
2711 if (Cave[x-1][y] == Xblank)
2712 Cave[x-1][y] = Xacid_splash_w;
2713 play_element_sound(x, y, SOUND_acid, Xacid_1);
2717 Cave[x][y] = Ybug_s_e;
2718 Next[x][y] = Xbug_2_e;
2719 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2724 static void Lbug_1_s(int x, int y)
2726 if (tab_amoeba[Cave[x][y-1]] ||
2727 tab_amoeba[Cave[x+1][y]] ||
2728 tab_amoeba[Cave[x][y+1]] ||
2729 tab_amoeba[Cave[x-1][y]])
2731 Lboom_bug(x, y, Xbug_1_s);
2736 switch (Cave[x-1][y])
2739 case Xacid_splash_e:
2740 case Xacid_splash_w:
2752 Cave[x][y] = Ybug_s_w;
2753 Next[x][y] = Xbug_2_w;
2754 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2763 static void Lbug_2_s(int x, int y)
2765 if (tab_amoeba[Cave[x][y-1]] ||
2766 tab_amoeba[Cave[x+1][y]] ||
2767 tab_amoeba[Cave[x][y+1]] ||
2768 tab_amoeba[Cave[x-1][y]])
2770 Lboom_bug(x, y, Xbug_2_s);
2778 static void Lbug_w(int x, int y)
2780 switch (Cave[x-1][y])
2783 case Xacid_splash_e:
2784 case Xacid_splash_w:
2788 Cave[x][y] = Ybug_wB;
2789 Next[x][y] = Xblank;
2790 Cave[x-1][y] = Ybug_w;
2791 Next[x-1][y] = Xbug_1_w;
2792 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
2803 Cave[x][y] = Ybug_wB;
2804 Next[x][y] = Xblank;
2805 if (Cave[x][y-1] == Xblank)
2806 Cave[x][y-1] = Xacid_splash_e;
2807 if (Cave[x-2][y-1] == Xblank)
2808 Cave[x-2][y-1] = Xacid_splash_w;
2809 play_element_sound(x, y, SOUND_acid, Xacid_1);
2813 Cave[x][y] = Ybug_w_s;
2814 Next[x][y] = Xbug_2_s;
2815 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
2820 static void Lbug_1_w(int x, int y)
2822 if (tab_amoeba[Cave[x][y-1]] ||
2823 tab_amoeba[Cave[x+1][y]] ||
2824 tab_amoeba[Cave[x][y+1]] ||
2825 tab_amoeba[Cave[x-1][y]])
2827 Lboom_bug(x, y, Xbug_1_w);
2832 switch (Cave[x][y-1])
2835 case Xacid_splash_e:
2836 case Xacid_splash_w:
2848 Cave[x][y] = Ybug_w_n;
2849 Next[x][y] = Xbug_2_n;
2850 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
2859 static void Lbug_2_w(int x, int y)
2861 if (tab_amoeba[Cave[x][y-1]] ||
2862 tab_amoeba[Cave[x+1][y]] ||
2863 tab_amoeba[Cave[x][y+1]] ||
2864 tab_amoeba[Cave[x-1][y]])
2866 Lboom_bug(x, y, Xbug_2_w);
2874 static void Ltank_n(int x, int y)
2876 switch (Cave[x][y-1])
2879 case Xacid_splash_e:
2880 case Xacid_splash_w:
2884 Cave[x][y] = Ytank_nB;
2885 Next[x][y] = Xblank;
2886 Cave[x][y-1] = Ytank_n;
2887 Next[x][y-1] = Xtank_1_n;
2888 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
2899 Cave[x][y] = Ytank_nB;
2900 Next[x][y] = Xblank;
2901 if (Cave[x+1][y-2] == Xblank)
2902 Cave[x+1][y-2] = Xacid_splash_e;
2903 if (Cave[x-1][y-2] == Xblank)
2904 Cave[x-1][y-2] = Xacid_splash_w;
2905 play_element_sound(x, y, SOUND_acid, Xacid_1);
2909 Cave[x][y] = Ytank_n_e;
2910 Next[x][y] = Xtank_2_e;
2911 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
2916 static void Ltank_1_n(int x, int y)
2918 if (tab_amoeba[Cave[x][y-1]] ||
2919 tab_amoeba[Cave[x+1][y]] ||
2920 tab_amoeba[Cave[x][y+1]] ||
2921 tab_amoeba[Cave[x-1][y]])
2923 Lboom_tank(x, y, Xtank_1_n);
2928 switch (Cave[x-1][y])
2931 case Xacid_splash_e:
2932 case Xacid_splash_w:
2944 Cave[x][y] = Ytank_n_w;
2945 Next[x][y] = Xtank_2_w;
2946 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
2955 static void Ltank_2_n(int x, int y)
2957 if (tab_amoeba[Cave[x][y-1]] ||
2958 tab_amoeba[Cave[x+1][y]] ||
2959 tab_amoeba[Cave[x][y+1]] ||
2960 tab_amoeba[Cave[x-1][y]])
2962 Lboom_tank(x, y, Xtank_2_n);
2970 static void Ltank_e(int x, int y)
2972 switch (Cave[x+1][y])
2975 case Xacid_splash_e:
2976 case Xacid_splash_w:
2980 Cave[x][y] = Ytank_eB;
2981 Next[x][y] = Xblank;
2982 Cave[x+1][y] = Ytank_e;
2983 Next[x+1][y] = Xtank_1_e;
2984 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
2995 Cave[x][y] = Ytank_eB;
2996 Next[x][y] = Xblank;
2997 if (Cave[x+2][y-1] == Xblank)
2998 Cave[x+2][y-1] = Xacid_splash_e;
2999 if (Cave[x][y-1] == Xblank)
3000 Cave[x][y-1] = Xacid_splash_w;
3001 play_element_sound(x, y, SOUND_acid, Xacid_1);
3005 Cave[x][y] = Ytank_e_s;
3006 Next[x][y] = Xtank_2_s;
3007 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3012 static void Ltank_1_e(int x, int y)
3014 if (tab_amoeba[Cave[x][y-1]] ||
3015 tab_amoeba[Cave[x+1][y]] ||
3016 tab_amoeba[Cave[x][y+1]] ||
3017 tab_amoeba[Cave[x-1][y]])
3019 Lboom_tank(x, y, Xtank_1_e);
3024 switch (Cave[x][y-1])
3027 case Xacid_splash_e:
3028 case Xacid_splash_w:
3040 Cave[x][y] = Ytank_e_n;
3041 Next[x][y] = Xtank_2_n;
3042 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3051 static void Ltank_2_e(int x, int y)
3053 if (tab_amoeba[Cave[x][y-1]] ||
3054 tab_amoeba[Cave[x+1][y]] ||
3055 tab_amoeba[Cave[x][y+1]] ||
3056 tab_amoeba[Cave[x-1][y]])
3058 Lboom_tank(x, y, Xtank_2_e);
3066 static void Ltank_s(int x, int y)
3068 switch (Cave[x][y+1])
3071 case Xacid_splash_e:
3072 case Xacid_splash_w:
3076 Cave[x][y] = Ytank_sB;
3077 Next[x][y] = Xblank;
3078 Cave[x][y+1] = Ytank_s;
3079 Next[x][y+1] = Xtank_1_s;
3080 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3091 Cave[x][y] = Ytank_sB;
3092 Next[x][y] = Xblank;
3093 if (Cave[x+1][y] == Xblank)
3094 Cave[x+1][y] = Xacid_splash_e;
3095 if (Cave[x-1][y] == Xblank)
3096 Cave[x-1][y] = Xacid_splash_w;
3097 play_element_sound(x, y, SOUND_acid, Xacid_1);
3101 Cave[x][y] = Ytank_s_w;
3102 Next[x][y] = Xtank_2_w;
3103 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3108 static void Ltank_1_s(int x, int y)
3110 if (tab_amoeba[Cave[x][y-1]] ||
3111 tab_amoeba[Cave[x+1][y]] ||
3112 tab_amoeba[Cave[x][y+1]] ||
3113 tab_amoeba[Cave[x-1][y]])
3115 Lboom_tank(x, y, Xtank_1_s);
3120 switch (Cave[x+1][y])
3123 case Xacid_splash_e:
3124 case Xacid_splash_w:
3136 Cave[x][y] = Ytank_s_e;
3137 Next[x][y] = Xtank_2_e;
3138 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3147 static void Ltank_2_s(int x, int y)
3149 if (tab_amoeba[Cave[x][y-1]] ||
3150 tab_amoeba[Cave[x+1][y]] ||
3151 tab_amoeba[Cave[x][y+1]] ||
3152 tab_amoeba[Cave[x-1][y]])
3154 Lboom_tank(x, y, Xtank_2_s);
3162 static void Ltank_w(int x, int y)
3164 switch (Cave[x-1][y])
3167 case Xacid_splash_e:
3168 case Xacid_splash_w:
3172 Cave[x][y] = Ytank_wB;
3173 Next[x][y] = Xblank;
3174 Cave[x-1][y] = Ytank_w;
3175 Next[x-1][y] = Xtank_1_w;
3176 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3187 Cave[x][y] = Ytank_wB;
3188 Next[x][y] = Xblank;
3189 if (Cave[x][y-1] == Xblank)
3190 Cave[x][y-1] = Xacid_splash_e;
3191 if (Cave[x-2][y-1] == Xblank)
3192 Cave[x-2][y-1] = Xacid_splash_w;
3193 play_element_sound(x, y, SOUND_acid, Xacid_1);
3197 Cave[x][y] = Ytank_w_n;
3198 Next[x][y] = Xtank_2_n;
3199 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3204 static void Ltank_1_w(int x, int y)
3206 if (tab_amoeba[Cave[x][y-1]] ||
3207 tab_amoeba[Cave[x+1][y]] ||
3208 tab_amoeba[Cave[x][y+1]] ||
3209 tab_amoeba[Cave[x-1][y]])
3211 Lboom_tank(x, y, Xtank_1_w);
3216 switch (Cave[x][y+1])
3219 case Xacid_splash_e:
3220 case Xacid_splash_w:
3232 Cave[x][y] = Ytank_w_s;
3233 Next[x][y] = Xtank_2_s;
3234 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3243 static void Ltank_2_w(int x, int y)
3245 if (tab_amoeba[Cave[x][y-1]] ||
3246 tab_amoeba[Cave[x+1][y]] ||
3247 tab_amoeba[Cave[x][y+1]] ||
3248 tab_amoeba[Cave[x-1][y]])
3250 Lboom_tank(x, y, Xtank_2_w);
3258 static void Lemerald(int x, int y)
3260 switch (Cave[x][y+1])
3263 case Xacid_splash_e:
3264 case Xacid_splash_w:
3265 Cave[x][y] = Yemerald_sB;
3266 Next[x][y] = Xblank;
3267 Cave[x][y+1] = Yemerald_s;
3268 Next[x][y+1] = Xemerald_fall;
3279 Cave[x][y] = Yemerald_sB;
3280 Next[x][y] = Xblank;
3281 if (Cave[x+1][y] == Xblank)
3282 Cave[x+1][y] = Xacid_splash_e;
3283 if (Cave[x-1][y] == Xblank)
3284 Cave[x-1][y] = Xacid_splash_w;
3285 play_element_sound(x, y, SOUND_acid, Xacid_1);
3304 case Xemerald_pause:
3306 case Xdiamond_pause:
3343 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
3345 Cave[x][y] = Yemerald_eB;
3346 Next[x][y] = Xblank;
3347 Cave[x+1][y] = Yemerald_e;
3348 Next[x+1][y] = Xemerald_pause;
3352 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
3354 Cave[x][y] = Yemerald_wB;
3355 Next[x][y] = Xblank;
3356 Cave[x-1][y] = Yemerald_w;
3357 Next[x-1][y] = Xemerald_pause;
3363 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
3365 Cave[x][y] = Yemerald_wB;
3366 Next[x][y] = Xblank;
3367 Cave[x-1][y] = Yemerald_w;
3368 Next[x-1][y] = Xemerald_pause;
3372 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
3374 Cave[x][y] = Yemerald_eB;
3375 Next[x][y] = Xblank;
3376 Cave[x+1][y] = Yemerald_e;
3377 Next[x+1][y] = Xemerald_pause;
3383 if (++lev.shine_cnt > 50)
3385 lev.shine_cnt = RANDOM(8);
3386 Cave[x][y] = Xemerald_shine;
3393 static void Lemerald_pause(int x, int y)
3395 switch (Cave[x][y+1])
3398 case Xacid_splash_e:
3399 case Xacid_splash_w:
3400 Cave[x][y] = Yemerald_sB;
3401 Next[x][y] = Xblank;
3402 Cave[x][y+1] = Yemerald_s;
3403 Next[x][y+1] = Xemerald_fall;
3414 Cave[x][y] = Yemerald_sB;
3415 Next[x][y] = Xblank;
3416 if (Cave[x+1][y] == Xblank)
3417 Cave[x+1][y] = Xacid_splash_e;
3418 if (Cave[x-1][y] == Xblank)
3419 Cave[x-1][y] = Xacid_splash_w;
3420 play_element_sound(x, y, SOUND_acid, Xacid_1);
3424 Cave[x][y] = Xemerald;
3425 Next[x][y] = Xemerald;
3430 static void Lemerald_fall(int x, int y)
3432 switch (Cave[x][y+1])
3435 case Xacid_splash_e:
3436 case Xacid_splash_w:
3438 Cave[x][y] = Yemerald_sB;
3439 Next[x][y] = Xblank;
3440 Cave[x][y+1] = Yemerald_s;
3441 Next[x][y+1] = Xemerald_fall;
3452 Cave[x][y] = Yemerald_sB;
3453 Next[x][y] = Xblank;
3454 if (Cave[x+1][y] == Xblank)
3455 Cave[x+1][y] = Xacid_splash_e;
3456 if (Cave[x-1][y] == Xblank)
3457 Cave[x-1][y] = Xacid_splash_w;
3458 play_element_sound(x, y, SOUND_acid, Xacid_1);
3462 if (lev.wonderwall_time)
3464 lev.wonderwall_state = 1;
3465 Cave[x][y] = Yemerald_sB;
3466 if (tab_blank[Cave[x][y+2]])
3468 Cave[x][y+2] = Ydiamond_s;
3469 Next[x][y+2] = Xdiamond_fall;
3472 Next[x][y] = Xblank;
3473 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3478 Cave[x][y] = Xemerald;
3479 Next[x][y] = Xemerald;
3480 play_element_sound(x, y, SOUND_diamond, Xemerald);
3485 static void Ldiamond(int x, int y)
3487 switch (Cave[x][y+1])
3490 case Xacid_splash_e:
3491 case Xacid_splash_w:
3492 Cave[x][y] = Ydiamond_sB;
3493 Next[x][y] = Xblank;
3494 Cave[x][y+1] = Ydiamond_s;
3495 Next[x][y+1] = Xdiamond_fall;
3506 Cave[x][y] = Ydiamond_sB;
3507 Next[x][y] = Xblank;
3508 if (Cave[x+1][y] == Xblank)
3509 Cave[x+1][y] = Xacid_splash_e;
3510 if (Cave[x-1][y] == Xblank)
3511 Cave[x-1][y] = Xacid_splash_w;
3512 play_element_sound(x, y, SOUND_acid, Xacid_1);
3531 case Xemerald_pause:
3533 case Xdiamond_pause:
3570 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
3572 Cave[x][y] = Ydiamond_eB;
3573 Next[x][y] = Xblank;
3574 Cave[x+1][y] = Ydiamond_e;
3575 Next[x+1][y] = Xdiamond_pause;
3579 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
3581 Cave[x][y] = Ydiamond_wB;
3582 Next[x][y] = Xblank;
3583 Cave[x-1][y] = Ydiamond_w;
3584 Next[x-1][y] = Xdiamond_pause;
3590 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
3592 Cave[x][y] = Ydiamond_wB;
3593 Next[x][y] = Xblank;
3594 Cave[x-1][y] = Ydiamond_w;
3595 Next[x-1][y] = Xdiamond_pause;
3599 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
3601 Cave[x][y] = Ydiamond_eB;
3602 Next[x][y] = Xblank;
3603 Cave[x+1][y] = Ydiamond_e;
3604 Next[x+1][y] = Xdiamond_pause;
3610 if (++lev.shine_cnt > 50)
3612 lev.shine_cnt = RANDOM(8);
3613 Cave[x][y] = Xdiamond_shine;
3620 static void Ldiamond_pause(int x, int y)
3622 switch (Cave[x][y+1])
3625 case Xacid_splash_e:
3626 case Xacid_splash_w:
3627 Cave[x][y] = Ydiamond_sB;
3628 Next[x][y] = Xblank;
3629 Cave[x][y+1] = Ydiamond_s;
3630 Next[x][y+1] = Xdiamond_fall;
3641 Cave[x][y] = Ydiamond_sB;
3642 Next[x][y] = Xblank;
3643 if (Cave[x+1][y] == Xblank)
3644 Cave[x+1][y] = Xacid_splash_e;
3645 if (Cave[x-1][y] == Xblank)
3646 Cave[x-1][y] = Xacid_splash_w;
3647 play_element_sound(x, y, SOUND_acid, Xacid_1);
3651 Cave[x][y] = Xdiamond;
3652 Next[x][y] = Xdiamond;
3657 static void Ldiamond_fall(int x, int y)
3659 switch (Cave[x][y+1])
3662 case Xacid_splash_e:
3663 case Xacid_splash_w:
3665 Cave[x][y] = Ydiamond_sB;
3666 Next[x][y] = Xblank;
3667 Cave[x][y+1] = Ydiamond_s;
3668 Next[x][y+1] = Xdiamond_fall;
3679 Cave[x][y] = Ydiamond_sB;
3680 Next[x][y] = Xblank;
3681 if (Cave[x+1][y] == Xblank)
3682 Cave[x+1][y] = Xacid_splash_e;
3683 if (Cave[x-1][y] == Xblank)
3684 Cave[x-1][y] = Xacid_splash_w;
3685 play_element_sound(x, y, SOUND_acid, Xacid_1);
3689 if (lev.wonderwall_time)
3691 lev.wonderwall_state = 1;
3692 Cave[x][y] = Ydiamond_sB;
3693 if (tab_blank[Cave[x][y+2]])
3695 Cave[x][y+2] = Ystone_s;
3696 Next[x][y+2] = Xstone_fall;
3699 Next[x][y] = Xblank;
3700 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3705 Cave[x][y] = Xdiamond;
3706 Next[x][y] = Xdiamond;
3707 play_element_sound(x, y, SOUND_diamond, Xdiamond);
3712 static void Lstone(int x, int y)
3714 switch (Cave[x][y+1])
3717 case Xacid_splash_e:
3718 case Xacid_splash_w:
3721 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3731 Cave[x][y] = Ystone_sB;
3732 Next[x][y] = Xblank;
3733 Cave[x][y+1] = Ystone_s;
3734 Next[x][y+1] = Xstone_fall;
3745 Cave[x][y] = Ystone_sB;
3746 Next[x][y] = Xblank;
3747 if (Cave[x+1][y] == Xblank)
3748 Cave[x+1][y] = Xacid_splash_e;
3749 if (Cave[x-1][y] == Xblank)
3750 Cave[x-1][y] = Xacid_splash_w;
3751 play_element_sound(x, y, SOUND_acid, Xacid_1);
3755 Cave[x][y] = Xsand_stonein_1;
3756 Next[x][y] = Xsand_stonein_2;
3757 Cave[x][y+1] = Xsand_sandstone_1;
3758 Next[x][y+1] = Xsand_sandstone_2;
3777 case Xemerald_pause:
3779 case Xdiamond_pause:
3809 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
3811 Cave[x][y] = Ystone_eB;
3812 Next[x][y] = Xblank;
3813 Cave[x+1][y] = Ystone_e;
3814 Next[x+1][y] = Xstone_pause;
3818 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
3820 Cave[x][y] = Ystone_wB;
3821 Next[x][y] = Xblank;
3822 Cave[x-1][y] = Ystone_w;
3823 Next[x-1][y] = Xstone_pause;
3829 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
3831 Cave[x][y] = Ystone_wB;
3832 Next[x][y] = Xblank;
3833 Cave[x-1][y] = Ystone_w;
3834 Next[x-1][y] = Xstone_pause;
3838 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
3840 Cave[x][y] = Ystone_eB;
3841 Next[x][y] = Xblank;
3842 Cave[x+1][y] = Ystone_e;
3843 Next[x+1][y] = Xstone_pause;
3850 static void Lstone_pause(int x, int y)
3852 switch (Cave[x][y+1])
3855 case Xacid_splash_e:
3856 case Xacid_splash_w:
3857 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3867 Cave[x][y] = Ystone_sB;
3868 Next[x][y] = Xblank;
3869 Cave[x][y+1] = Ystone_s;
3870 Next[x][y+1] = Xstone_fall;
3881 Cave[x][y] = Ystone_sB;
3882 Next[x][y] = Xblank;
3883 if (Cave[x+1][y] == Xblank)
3884 Cave[x+1][y] = Xacid_splash_e;
3885 if (Cave[x-1][y] == Xblank)
3886 Cave[x-1][y] = Xacid_splash_w;
3887 play_element_sound(x, y, SOUND_acid, Xacid_1);
3891 Cave[x][y] = Xstone;
3892 Next[x][y] = Xstone;
3897 static void Lstone_fall(int x, int y)
3899 switch (Cave[x][y+1])
3902 case Xacid_splash_e:
3903 case Xacid_splash_w:
3905 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3915 Cave[x][y] = Ystone_sB;
3916 Next[x][y] = Xblank;
3917 Cave[x][y+1] = Ystone_s;
3918 Next[x][y+1] = Xstone_fall;
3929 Cave[x][y] = Ystone_sB;
3930 Next[x][y] = Xblank;
3931 if (Cave[x+1][y] == Xblank)
3932 Cave[x+1][y] = Xacid_splash_e;
3933 if (Cave[x-1][y] == Xblank)
3934 Cave[x-1][y] = Xacid_splash_w;
3935 play_element_sound(x, y, SOUND_acid, Xacid_1);
3940 Next[x][y] = Xstone;
3941 Cave[x][y+1] = Ynut_stone;
3942 Next[x][y+1] = Xemerald;
3943 play_element_sound(x, y, SOUND_crack, Xnut);
3944 score += lev.nut_score;
3955 Cave[x][y] = Ystone_sB;
3956 Cave[x][y+1] = Ybug_stone;
3957 Lboom_bug(x, y+1, Xstone_fall);
3958 score += lev.bug_score;
3969 Cave[x][y] = Ystone_sB;
3970 Cave[x][y+1] = Ytank_stone;
3971 Lboom_tank(x, y+1, Xstone_fall);
3972 score += lev.tank_score;
3978 switch (Cave[x+1][y+1])
3981 case Xacid_splash_e:
3982 case Xacid_splash_w:
3985 Cave[x][y+1] = Xspring_e;
3989 Cave[x][y+1] = Xspring_w;
3995 switch (Cave[x-1][y+1])
3998 case Xacid_splash_e:
3999 case Xacid_splash_w:
4002 Cave[x][y+1] = Xspring_w;
4005 Cave[x][y+1] = Xspring_e;
4010 Next[x][y] = Xstone;
4017 Cave[x][y] = Ystone_sB;
4018 Cave[x][y+1] = Yeater_stone;
4019 Lboom_eater(x, y+1, Xstone_fall);
4020 score += lev.eater_score;
4025 Cave[x][y] = Ystone_sB;
4026 Cave[x][y+1] = Yalien_stone;
4027 Lboom_tank(x, y+1, Xstone_fall);
4028 score += lev.alien_score;
4032 case Xdiamond_pause:
4033 switch (Cave[x][y+2])
4036 case Xacid_splash_e:
4037 case Xacid_splash_w:
4081 Next[x][y] = Xstone;
4082 play_element_sound(x, y, SOUND_stone, Xstone);
4086 Cave[x][y] = Ystone_sB;
4087 Next[x][y] = Xblank;
4088 Cave[x][y+1] = Ydiamond_stone;
4089 Next[x][y+1] = Xstone_pause;
4090 play_element_sound(x, y, SOUND_squash, Xdiamond);
4095 Cave[x][y+1] = Ybomb_blank;
4096 Lboom_tank(x, y+1, Xstone_fall);
4100 if (lev.wonderwall_time)
4102 lev.wonderwall_state = 1;
4103 Cave[x][y] = Ystone_sB;
4105 if (tab_blank[Cave[x][y+2]])
4107 Cave[x][y+2] = Yemerald_s;
4108 Next[x][y+2] = Xemerald_fall;
4111 Next[x][y] = Xblank;
4112 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4117 Cave[x][y] = Xstone;
4118 Next[x][y] = Xstone;
4119 play_element_sound(x, y, SOUND_stone, Xstone);
4124 static void Lbomb(int x, int y)
4126 switch (Cave[x][y+1])
4129 case Xacid_splash_e:
4130 case Xacid_splash_w:
4131 Cave[x][y] = Ybomb_sB;
4132 Next[x][y] = Xblank;
4133 Cave[x][y+1] = Ybomb_s;
4134 Next[x][y+1] = Xbomb_fall;
4145 Cave[x][y] = Ybomb_sB;
4146 Next[x][y] = Xblank;
4147 if (Cave[x+1][y] == Xblank)
4148 Cave[x+1][y] = Xacid_splash_e;
4149 if (Cave[x-1][y] == Xblank)
4150 Cave[x-1][y] = Xacid_splash_w;
4151 play_element_sound(x, y, SOUND_acid, Xacid_1);
4170 case Xemerald_pause:
4172 case Xdiamond_pause:
4200 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
4202 Cave[x][y] = Ybomb_eB;
4203 Next[x][y] = Xblank;
4204 Cave[x+1][y] = Ybomb_e;
4205 Next[x+1][y] = Xbomb_pause;
4209 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
4211 Cave[x][y] = Ybomb_wB;
4212 Next[x][y] = Xblank;
4213 Cave[x-1][y] = Ybomb_w;
4214 Next[x-1][y] = Xbomb_pause;
4220 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
4222 Cave[x][y] = Ybomb_wB;
4223 Next[x][y] = Xblank;
4224 Cave[x-1][y] = Ybomb_w;
4225 Next[x-1][y] = Xbomb_pause;
4229 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
4231 Cave[x][y] = Ybomb_eB;
4232 Next[x][y] = Xblank;
4233 Cave[x+1][y] = Ybomb_e;
4234 Next[x+1][y] = Xbomb_pause;
4241 static void Lbomb_pause(int x, int y)
4243 switch (Cave[x][y+1])
4246 case Xacid_splash_e:
4247 case Xacid_splash_w:
4248 Cave[x][y] = Ybomb_sB;
4249 Next[x][y] = Xblank;
4250 Cave[x][y+1] = Ybomb_s;
4251 Next[x][y+1] = Xbomb_fall;
4262 Cave[x][y] = Ybomb_sB;
4263 Next[x][y] = Xblank;
4264 if (Cave[x+1][y] == Xblank)
4265 Cave[x+1][y] = Xacid_splash_e;
4266 if (Cave[x-1][y] == Xblank)
4267 Cave[x-1][y] = Xacid_splash_w;
4268 play_element_sound(x, y, SOUND_acid, Xacid_1);
4278 static void Lbomb_fall(int x, int y)
4280 switch (Cave[x][y+1])
4283 case Xacid_splash_e:
4284 case Xacid_splash_w:
4285 Cave[x][y] = Ybomb_sB;
4286 Next[x][y] = Xblank;
4287 Cave[x][y+1] = Ybomb_s;
4288 Next[x][y+1] = Xbomb_fall;
4299 Cave[x][y] = Ybomb_sB;
4300 Next[x][y] = Xblank;
4301 if (Cave[x+1][y] == Xblank)
4302 Cave[x+1][y] = Xacid_splash_e;
4303 if (Cave[x-1][y] == Xblank)
4304 Cave[x-1][y] = Xacid_splash_w;
4305 play_element_sound(x, y, SOUND_acid, Xacid_1);
4309 Cave[x][y] = Ybomb_blank;
4310 Lboom_tank(x, y, Xbomb_fall);
4315 static void Lnut(int x, int y)
4317 switch (Cave[x][y+1])
4320 case Xacid_splash_e:
4321 case Xacid_splash_w:
4322 Cave[x][y] = Ynut_sB;
4323 Next[x][y] = Xblank;
4324 Cave[x][y+1] = Ynut_s;
4325 Next[x][y+1] = Xnut_fall;
4336 Cave[x][y] = Ynut_sB;
4337 Next[x][y] = Xblank;
4338 if (Cave[x+1][y] == Xblank)
4339 Cave[x+1][y] = Xacid_splash_e;
4340 if (Cave[x-1][y] == Xblank)
4341 Cave[x-1][y] = Xacid_splash_w;
4342 play_element_sound(x, y, SOUND_acid, Xacid_1);
4361 case Xemerald_pause:
4363 case Xdiamond_pause:
4391 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
4393 Cave[x][y] = Ynut_eB;
4394 Next[x][y] = Xblank;
4395 Cave[x+1][y] = Ynut_e;
4396 Next[x+1][y] = Xnut_pause;
4400 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
4402 Cave[x][y] = Ynut_wB;
4403 Next[x][y] = Xblank;
4404 Cave[x-1][y] = Ynut_w;
4405 Next[x-1][y] = Xnut_pause;
4411 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
4413 Cave[x][y] = Ynut_wB;
4414 Next[x][y] = Xblank;
4415 Cave[x-1][y] = Ynut_w;
4416 Next[x-1][y] = Xnut_pause;
4420 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
4422 Cave[x][y] = Ynut_eB;
4423 Next[x][y] = Xblank;
4424 Cave[x+1][y] = Ynut_e;
4425 Next[x+1][y] = Xnut_pause;
4432 static void Lnut_pause(int x, int y)
4434 switch (Cave[x][y+1])
4437 case Xacid_splash_e:
4438 case Xacid_splash_w:
4439 Cave[x][y] = Ynut_sB;
4440 Next[x][y] = Xblank;
4441 Cave[x][y+1] = Ynut_s;
4442 Next[x][y+1] = Xnut_fall;
4453 Cave[x][y] = Ynut_sB;
4454 Next[x][y] = Xblank;
4455 if (Cave[x+1][y] == Xblank)
4456 Cave[x+1][y] = Xacid_splash_e;
4457 if (Cave[x-1][y] == Xblank)
4458 Cave[x-1][y] = Xacid_splash_w;
4459 play_element_sound(x, y, SOUND_acid, Xacid_1);
4469 static void Lnut_fall(int x, int y)
4471 switch (Cave[x][y+1])
4474 case Xacid_splash_e:
4475 case Xacid_splash_w:
4477 Cave[x][y] = Ynut_sB;
4478 Next[x][y] = Xblank;
4479 Cave[x][y+1] = Ynut_s;
4480 Next[x][y+1] = Xnut_fall;
4491 Cave[x][y] = Ynut_sB;
4492 Next[x][y] = Xblank;
4493 if (Cave[x+1][y] == Xblank)
4494 Cave[x+1][y] = Xacid_splash_e;
4495 if (Cave[x-1][y] == Xblank)
4496 Cave[x-1][y] = Xacid_splash_w;
4497 play_element_sound(x, y, SOUND_acid, Xacid_1);
4503 play_element_sound(x, y, SOUND_nut, Xnut);
4508 static void Lspring(int x, int y)
4510 switch (Cave[x][y+1])
4513 case Xacid_splash_e:
4514 case Xacid_splash_w:
4517 Cave[x][y] = Yspring_sB;
4518 Next[x][y] = Xblank;
4519 Cave[x][y+1] = Yspring_s;
4520 Next[x][y+1] = Xspring_fall;
4531 Cave[x][y] = Yspring_sB;
4532 Next[x][y] = Xblank;
4533 if (Cave[x+1][y] == Xblank)
4534 Cave[x+1][y] = Xacid_splash_e;
4535 if (Cave[x-1][y] == Xblank)
4536 Cave[x-1][y] = Xacid_splash_w;
4537 play_element_sound(x, y, SOUND_acid, Xacid_1);
4556 case Xemerald_pause:
4558 case Xdiamond_pause:
4586 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
4588 Cave[x][y] = Yspring_eB;
4589 Next[x][y] = Xblank;
4590 Cave[x+1][y] = Yspring_e;
4591 if (Cave[x][y+1] == Xbumper)
4592 Cave[x][y+1] = XbumperB;
4595 Next[x+1][y] = Xspring_e;
4597 Next[x+1][y] = Xspring_pause;
4602 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
4604 Cave[x][y] = Yspring_wB;
4605 Next[x][y] = Xblank;
4606 Cave[x-1][y] = Yspring_w;
4607 if (Cave[x][y+1] == Xbumper)
4608 Cave[x][y+1] = XbumperB;
4611 Next[x-1][y] = Xspring_w;
4613 Next[x-1][y] = Xspring_pause;
4620 if (tab_blank[Cave[x-1][y]] && tab_acid[Cave[x-1][y+1]])
4622 Cave[x][y] = Yspring_wB;
4623 Next[x][y] = Xblank;
4624 Cave[x-1][y] = Yspring_w;
4625 if (Cave[x][y+1] == Xbumper)
4626 Cave[x][y+1] = XbumperB;
4629 Next[x-1][y] = Xspring_w;
4631 Next[x-1][y] = Xspring_pause;
4636 if (tab_blank[Cave[x+1][y]] && tab_acid[Cave[x+1][y+1]])
4638 Cave[x][y] = Yspring_eB;
4639 Next[x][y] = Xblank;
4640 Cave[x+1][y] = Yspring_e;
4641 if (Cave[x][y+1] == Xbumper)
4642 Cave[x][y+1] = XbumperB;
4645 Next[x+1][y] = Xspring_e;
4647 Next[x+1][y] = Xspring_pause;
4655 static void Lspring_pause(int x, int y)
4657 switch (Cave[x][y+1])
4660 case Xacid_splash_e:
4661 case Xacid_splash_w:
4662 Cave[x][y] = Yspring_sB;
4663 Next[x][y] = Xblank;
4664 Cave[x][y+1] = Yspring_s;
4665 Next[x][y+1] = Xspring_fall;
4676 Cave[x][y] = Yspring_sB;
4677 Next[x][y] = Xblank;
4678 if (Cave[x+1][y] == Xblank)
4679 Cave[x+1][y] = Xacid_splash_e;
4680 if (Cave[x-1][y] == Xblank)
4681 Cave[x-1][y] = Xacid_splash_w;
4682 play_element_sound(x, y, SOUND_acid, Xacid_1);
4686 Cave[x][y] = Xspring;
4687 Next[x][y] = Xspring;
4692 static void Lspring_e(int x, int y)
4694 switch (Cave[x][y+1])
4697 case Xacid_splash_e:
4698 case Xacid_splash_w:
4699 Cave[x][y] = Yspring_sB;
4700 Next[x][y] = Xblank;
4701 Cave[x][y+1] = Yspring_s;
4702 Next[x][y+1] = Xspring_fall;
4713 Cave[x][y] = Yspring_sB;
4714 Next[x][y] = Xblank;
4715 if (Cave[x+1][y] == Xblank)
4716 Cave[x+1][y] = Xacid_splash_e;
4717 if (Cave[x-1][y] == Xblank)
4718 Cave[x-1][y] = Xacid_splash_w;
4719 play_element_sound(x, y, SOUND_acid, Xacid_1);
4723 Cave[x][y+1] = XbumperB;
4726 switch (Cave[x+1][y])
4729 case Xacid_splash_e:
4730 case Xacid_splash_w:
4735 Cave[x][y] = Yspring_eB;
4736 Next[x][y] = Xblank;
4737 Cave[x+1][y] = Yspring_e;
4738 Next[x+1][y] = Xspring_e;
4749 Cave[x][y] = Yspring_eB;
4750 Next[x][y] = Xblank;
4751 if (Cave[x+2][y-1] == Xblank)
4752 Cave[x+2][y-1] = Xacid_splash_e;
4753 if (Cave[x][y-1] == Xblank)
4754 Cave[x][y-1] = Xacid_splash_w;
4755 play_element_sound(x, y, SOUND_acid, Xacid_1);
4764 Cave[x][y] = Yspring_alien_eB;
4765 Next[x][y] = Xblank;
4766 Cave[x+1][y] = Yspring_alien_e;
4767 Next[x+1][y] = Xspring_e;
4768 play_element_sound(x, y, SOUND_slurp, Xalien);
4769 score += lev.slurp_score;
4774 Cave[x+1][y] = XbumperB;
4775 Next[x][y] = Xspring_w;
4776 play_element_sound(x, y, SOUND_spring, Xspring);
4780 Cave[x][y] = Xspring;
4781 Next[x][y] = Xspring;
4782 play_element_sound(x, y, SOUND_spring, Xspring);
4787 static void Lspring_w(int x, int y)
4789 switch (Cave[x][y+1])
4792 case Xacid_splash_e:
4793 case Xacid_splash_w:
4794 Cave[x][y] = Yspring_sB;
4795 Next[x][y] = Xblank;
4796 Cave[x][y+1] = Yspring_s;
4797 Next[x][y+1] = Xspring_fall;
4808 Cave[x][y] = Yspring_sB;
4809 Next[x][y] = Xblank;
4810 if (Cave[x+1][y] == Xblank)
4811 Cave[x+1][y] = Xacid_splash_e;
4812 if (Cave[x-1][y] == Xblank)
4813 Cave[x-1][y] = Xacid_splash_w;
4814 play_element_sound(x, y, SOUND_acid, Xacid_1);
4818 Cave[x][y+1] = XbumperB;
4821 switch (Cave[x-1][y])
4824 case Xacid_splash_e:
4825 case Xacid_splash_w:
4830 Cave[x][y] = Yspring_wB;
4831 Next[x][y] = Xblank;
4832 Cave[x-1][y] = Yspring_w;
4833 Next[x-1][y] = Xspring_w;
4844 Cave[x][y] = Yspring_wB;
4845 Next[x][y] = Xblank;
4846 if (Cave[x][y-1] == Xblank)
4847 Cave[x][y-1] = Xacid_splash_e;
4848 if (Cave[x-2][y-1] == Xblank)
4849 Cave[x-2][y-1] = Xacid_splash_w;
4850 play_element_sound(x, y, SOUND_acid, Xacid_1);
4859 Cave[x][y] = Yspring_alien_wB;
4860 Next[x][y] = Xblank;
4861 Cave[x-1][y] = Yspring_alien_w;
4862 Next[x-1][y] = Xspring_w;
4863 play_element_sound(x, y, SOUND_slurp, Xalien);
4864 score += lev.slurp_score;
4869 Cave[x-1][y] = XbumperB;
4870 Next[x][y] = Xspring_e;
4871 play_element_sound(x, y, SOUND_spring, Xspring);
4875 Cave[x][y] = Xspring;
4876 Next[x][y] = Xspring;
4877 play_element_sound(x, y, SOUND_spring, Xspring);
4882 static void Lspring_fall(int x, int y)
4884 switch (Cave[x][y+1])
4887 case Xacid_splash_e:
4888 case Xacid_splash_w:
4890 Cave[x][y] = Yspring_sB;
4891 Next[x][y] = Xblank;
4892 Cave[x][y+1] = Yspring_s;
4893 Next[x][y+1] = Xspring_fall;
4904 Cave[x][y] = Yspring_sB;
4905 Next[x][y] = Xblank;
4906 if (Cave[x+1][y] == Xblank)
4907 Cave[x+1][y] = Xacid_splash_e;
4908 if (Cave[x-1][y] == Xblank)
4909 Cave[x-1][y] = Xacid_splash_w;
4910 play_element_sound(x, y, SOUND_acid, Xacid_1);
4915 Cave[x][y+1] = Ybomb_blank;
4916 Lboom_tank(x, y+1, Xspring_fall);
4927 Cave[x][y] = Yspring_sB;
4928 Cave[x][y+1] = Ybug_spring;
4929 Lboom_bug(x, y+1, Xspring_fall);
4930 score += lev.bug_score;
4941 Cave[x][y] = Yspring_sB;
4942 Cave[x][y+1] = Ytank_spring;
4943 Lboom_tank(x, y+1, Xspring_fall);
4944 score += lev.tank_score;
4951 Cave[x][y] = Yspring_sB;
4952 Cave[x][y+1] = Yeater_spring;
4953 Lboom_eater(x, y+1, Xspring_fall);
4954 score += lev.eater_score;
4959 Cave[x][y] = Yspring_sB;
4960 Cave[x][y+1] = Yalien_spring;
4961 Lboom_tank(x, y+1, Xspring_fall);
4962 score += lev.alien_score;
4966 Cave[x][y] = Xspring;
4967 Next[x][y] = Xspring;
4968 play_element_sound(x, y, SOUND_spring, Xspring);
4973 static void Lpush_emerald_e(int x, int y)
4975 switch (Cave[x+1][y])
4985 Cave[x][y] = Xemerald;
4986 Next[x][y] = Xemerald;
4990 Cave[x][y] = Yemerald_eB;
4991 Next[x][y] = Xblank;
4992 Cave[x+1][y] = Yemerald_e;
4993 Next[x+1][y] = Xemerald_pause;
4998 static void Lpush_emerald_w(int x, int y)
5000 switch (Cave[x-1][y])
5010 Cave[x][y] = Xemerald;
5011 Next[x][y] = Xemerald;
5015 Cave[x][y] = Yemerald_wB;
5016 Next[x][y] = Xblank;
5017 Cave[x-1][y] = Yemerald_w;
5018 Next[x-1][y] = Xemerald_pause;
5023 static void Lpush_diamond_e(int x, int y)
5025 switch (Cave[x+1][y])
5035 Cave[x][y] = Xdiamond;
5036 Next[x][y] = Xdiamond;
5040 Cave[x][y] = Ydiamond_eB;
5041 Next[x][y] = Xblank;
5042 Cave[x+1][y] = Ydiamond_e;
5043 Next[x+1][y] = Xdiamond_pause;
5048 static void Lpush_diamond_w(int x, int y)
5050 switch (Cave[x-1][y])
5060 Cave[x][y] = Xdiamond;
5061 Next[x][y] = Xdiamond;
5065 Cave[x][y] = Ydiamond_wB;
5066 Next[x][y] = Xblank;
5067 Cave[x-1][y] = Ydiamond_w;
5068 Next[x-1][y] = Xdiamond_pause;
5073 static void Lpush_stone_e(int x, int y)
5075 switch (Cave[x+1][y])
5085 Cave[x][y] = Xstone;
5086 Next[x][y] = Xstone;
5090 Cave[x][y] = Ystone_eB;
5091 Next[x][y] = Xblank;
5092 Cave[x+1][y] = Ystone_e;
5093 Next[x+1][y] = Xstone_pause;
5098 static void Lpush_stone_w(int x, int y)
5100 switch (Cave[x-1][y])
5110 Cave[x][y] = Xstone;
5111 Next[x][y] = Xstone;
5115 Cave[x][y] = Ystone_wB;
5116 Next[x][y] = Xblank;
5117 Cave[x-1][y] = Ystone_w;
5118 Next[x-1][y] = Xstone_pause;
5123 static void Lpush_bomb_e(int x, int y)
5125 switch (Cave[x+1][y])
5140 Cave[x][y] = Ybomb_eB;
5141 Next[x][y] = Xblank;
5142 Cave[x+1][y] = Ybomb_e;
5143 Next[x+1][y] = Xbomb_pause;
5148 static void Lpush_bomb_w(int x, int y)
5150 switch (Cave[x-1][y])
5165 Cave[x][y] = Ybomb_wB;
5166 Next[x][y] = Xblank;
5167 Cave[x-1][y] = Ybomb_w;
5168 Next[x-1][y] = Xbomb_pause;
5173 static void Lpush_nut_e(int x, int y)
5175 switch (Cave[x+1][y])
5190 Cave[x][y] = Ynut_eB;
5191 Next[x][y] = Xblank;
5192 Cave[x+1][y] = Ynut_e;
5193 Next[x+1][y] = Xnut_pause;
5198 static void Lpush_nut_w(int x, int y)
5200 switch (Cave[x-1][y])
5215 Cave[x][y] = Ynut_wB;
5216 Next[x][y] = Xblank;
5217 Cave[x-1][y] = Ynut_w;
5218 Next[x-1][y] = Xnut_pause;
5223 static void Lpush_spring_e(int x, int y)
5225 switch (Cave[x+1][y])
5235 Cave[x][y] = Xspring;
5236 Next[x][y] = Xspring;
5240 Cave[x][y] = Yspring_eB;
5241 Next[x][y] = Xblank;
5242 Cave[x+1][y] = Yspring_e;
5243 Next[x+1][y] = Xspring_e;
5248 static void Lpush_spring_w(int x, int y)
5250 switch (Cave[x-1][y])
5260 Cave[x][y] = Xspring;
5261 Next[x][y] = Xspring;
5265 Cave[x][y] = Yspring_wB;
5266 Next[x][y] = Xblank;
5267 Cave[x-1][y] = Yspring_w;
5268 Next[x-1][y] = Xspring_w;
5273 static void Ldynamite_1(int x, int y)
5275 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
5276 Next[x][y] = Xdynamite_2;
5279 static void Ldynamite_2(int x, int y)
5281 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
5282 Next[x][y] = Xdynamite_3;
5285 static void Ldynamite_3(int x, int y)
5287 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
5288 Next[x][y] = Xdynamite_4;
5291 static void Ldynamite_4(int x, int y)
5293 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
5294 Next[x][y] = Zdynamite;
5296 Lboom_generic(x, y, Xblank, Xblank);
5299 static void Lfake_door_1(int x, int y)
5301 if (lev.magnify_cnt)
5302 Cave[x][y] = Xdoor_1;
5305 static void Lfake_door_2(int x, int y)
5307 if (lev.magnify_cnt)
5308 Cave[x][y] = Xdoor_2;
5311 static void Lfake_door_3(int x, int y)
5313 if (lev.magnify_cnt)
5314 Cave[x][y] = Xdoor_3;
5317 static void Lfake_door_4(int x, int y)
5319 if (lev.magnify_cnt)
5320 Cave[x][y] = Xdoor_4;
5323 static void Lfake_door_5(int x, int y)
5325 if (lev.magnify_cnt)
5326 Cave[x][y] = Xdoor_5;
5329 static void Lfake_door_6(int x, int y)
5331 if (lev.magnify_cnt)
5332 Cave[x][y] = Xdoor_6;
5335 static void Lfake_door_7(int x, int y)
5337 if (lev.magnify_cnt)
5338 Cave[x][y] = Xdoor_7;
5341 static void Lfake_door_8(int x, int y)
5343 if (lev.magnify_cnt)
5344 Cave[x][y] = Xdoor_8;
5347 static void Lballoon(int x, int y)
5349 if (lev.wind_cnt == 0)
5352 switch (lev.wind_direction)
5355 switch (Cave[x][y-1])
5358 case Xacid_splash_e:
5359 case Xacid_splash_w:
5360 Cave[x][y] = Yballoon_nB;
5361 Next[x][y] = Xblank;
5362 Cave[x][y-1] = Yballoon_n;
5363 Next[x][y-1] = Xballoon;
5374 Cave[x][y] = Yballoon_nB;
5375 Next[x][y] = Xblank;
5376 if (Cave[x+1][y-2] == Xblank)
5377 Cave[x+1][y-2] = Xacid_splash_e;
5378 if (Cave[x-1][y-2] == Xblank)
5379 Cave[x-1][y-2] = Xacid_splash_w;
5380 play_element_sound(x, y, SOUND_acid, Xacid_1);
5386 switch (Cave[x+1][y])
5389 case Xacid_splash_e:
5390 case Xacid_splash_w:
5391 Cave[x][y] = Yballoon_eB;
5392 Next[x][y] = Xblank;
5393 Cave[x+1][y] = Yballoon_e;
5394 Next[x+1][y] = Xballoon;
5405 Cave[x][y] = Yballoon_eB;
5406 Next[x][y] = Xblank;
5407 if (Cave[x+2][y-1] == Xblank)
5408 Cave[x+2][y-1] = Xacid_splash_e;
5409 if (Cave[x][y-1] == Xblank)
5410 Cave[x][y-1] = Xacid_splash_w;
5411 play_element_sound(x, y, SOUND_acid, Xacid_1);
5417 switch (Cave[x][y+1])
5420 case Xacid_splash_e:
5421 case Xacid_splash_w:
5422 Cave[x][y] = Yballoon_sB;
5423 Next[x][y] = Xblank;
5424 Cave[x][y+1] = Yballoon_s;
5425 Next[x][y+1] = Xballoon;
5436 Cave[x][y] = Yballoon_sB;
5437 Next[x][y] = Xblank;
5438 if (Cave[x+1][y] == Xblank)
5439 Cave[x+1][y] = Xacid_splash_e;
5440 if (Cave[x-1][y] == Xblank)
5441 Cave[x-1][y] = Xacid_splash_w;
5442 play_element_sound(x, y, SOUND_acid, Xacid_1);
5448 switch (Cave[x-1][y])
5451 case Xacid_splash_e:
5452 case Xacid_splash_w:
5453 Cave[x][y] = Yballoon_wB;
5454 Next[x][y] = Xblank;
5455 Cave[x-1][y] = Yballoon_w;
5456 Next[x-1][y] = Xballoon;
5467 Cave[x][y] = Yballoon_wB;
5468 Next[x][y] = Xblank;
5469 if (Cave[x][y-1] == Xblank)
5470 Cave[x][y-1] = Xacid_splash_e;
5471 if (Cave[x-2][y-1] == Xblank)
5472 Cave[x-2][y-1] = Xacid_splash_w;
5473 play_element_sound(x, y, SOUND_acid, Xacid_1);
5480 static void Lball_common(int x, int y)
5482 play_element_sound(x, y, SOUND_ball, Xball_1);
5484 if (lev.ball_random)
5489 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
5490 tab_blank[Cave[x-1][y-1]])
5492 Cave[x-1][y-1] = Yball_blank;
5493 Next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
5498 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
5499 tab_blank[Cave[x][y-1]])
5501 Cave[x][y-1] = Yball_blank;
5502 Next[x][y-1] = lev.ball_array[lev.ball_pos][1];
5507 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
5508 tab_blank[Cave[x+1][y-1]])
5510 Cave[x+1][y-1] = Yball_blank;
5511 Next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
5516 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
5517 tab_blank[Cave[x-1][y]])
5519 Cave[x-1][y] = Yball_blank;
5520 Next[x-1][y] = lev.ball_array[lev.ball_pos][3];
5525 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
5526 tab_blank[Cave[x+1][y]])
5528 Cave[x+1][y] = Yball_blank;
5529 Next[x+1][y] = lev.ball_array[lev.ball_pos][4];
5534 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
5535 tab_blank[Cave[x-1][y+1]])
5537 Cave[x-1][y+1] = Yball_blank;
5538 Next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
5543 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
5544 tab_blank[Cave[x][y+1]])
5546 Cave[x][y+1] = Yball_blank;
5547 Next[x][y+1] = lev.ball_array[lev.ball_pos][6];
5552 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
5553 tab_blank[Cave[x+1][y+1]])
5555 Cave[x+1][y+1] = Yball_blank;
5556 Next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
5563 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
5564 tab_blank[Cave[x-1][y-1]])
5566 Cave[x-1][y-1] = Yball_blank;
5567 Next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
5570 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
5571 tab_blank[Cave[x][y-1]])
5573 Cave[x][y-1] = Yball_blank;
5574 Next[x][y-1] = lev.ball_array[lev.ball_pos][1];
5577 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
5578 tab_blank[Cave[x+1][y-1]])
5580 Cave[x+1][y-1] = Yball_blank;
5581 Next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
5584 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
5585 tab_blank[Cave[x-1][y]])
5587 Cave[x-1][y] = Yball_blank;
5588 Next[x-1][y] = lev.ball_array[lev.ball_pos][3];
5591 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
5592 tab_blank[Cave[x+1][y]])
5594 Cave[x+1][y] = Yball_blank;
5595 Next[x+1][y] = lev.ball_array[lev.ball_pos][4];
5598 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
5599 tab_blank[Cave[x-1][y+1]])
5601 Cave[x-1][y+1] = Yball_blank;
5602 Next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
5605 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
5606 tab_blank[Cave[x][y+1]])
5608 Cave[x][y+1] = Yball_blank;
5609 Next[x][y+1] = lev.ball_array[lev.ball_pos][6];
5612 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
5613 tab_blank[Cave[x+1][y+1]])
5615 Cave[x+1][y+1] = Yball_blank;
5616 Next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
5620 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
5623 static void Lball_1(int x, int y)
5625 if (lev.ball_state == 0)
5628 Cave[x][y] = Yball_1;
5629 Next[x][y] = Xball_2;
5636 static void Lball_2(int x, int y)
5638 if (lev.ball_state == 0)
5641 Cave[x][y] = Yball_2;
5642 Next[x][y] = Xball_1;
5649 static void Ldrip(int x, int y)
5651 Next[x][y] = Xdrip_fall;
5654 static void Ldrip_fall(int x, int y)
5658 switch (Cave[x][y+1])
5661 case Xacid_splash_e:
5662 case Xacid_splash_w:
5666 Cave[x][y] = Ydrip_1_sB;
5667 Next[x][y] = Xdrip_stretchB;
5668 Cave[x][y+1] = Ydrip_1_s;
5669 Next[x][y+1] = Xdrip_stretch;
5680 Cave[x][y] = Ydrip_1_sB;
5681 Next[x][y] = Xdrip_stretchB;
5682 if (Cave[x+1][y] == Xblank)
5683 Cave[x+1][y] = Xacid_splash_e;
5684 if (Cave[x-1][y] == Xblank)
5685 Cave[x-1][y] = Xacid_splash_w;
5686 play_element_sound(x, y, SOUND_acid, Xacid_1);
5692 case 0: temp = Xamoeba_1; break;
5693 case 1: temp = Xamoeba_2; break;
5694 case 2: temp = Xamoeba_3; break;
5695 case 3: temp = Xamoeba_4; break;
5696 case 4: temp = Xamoeba_5; break;
5697 case 5: temp = Xamoeba_6; break;
5698 case 6: temp = Xamoeba_7; break;
5699 case 7: temp = Xamoeba_8; break;
5704 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
5709 static void Ldrip_stretch(int x, int y)
5711 Cave[x][y] = Ydrip_2_s;
5712 Next[x][y] = Xdrip_fall;
5715 static void Ldrip_stretchB(int x, int y)
5717 Cave[x][y] = Ydrip_2_sB;
5718 Next[x][y] = Xblank;
5721 static void Lwonderwall(int x, int y)
5723 if (lev.wonderwall_time && lev.wonderwall_state)
5725 Cave[x][y] = XwonderwallB;
5726 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
5730 static void Lwheel(int x, int y)
5732 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
5733 Cave[x][y] = XwheelB;
5736 static void Lswitch(int x, int y)
5739 Cave[x][y] = XswitchB;
5742 static void Lfake_blank(int x, int y)
5745 Cave[x][y] = Xfake_blankB;
5748 static void Lfake_grass(int x, int y)
5750 if (lev.magnify_cnt)
5751 Cave[x][y] = Xfake_grassB;
5754 static void Lfake_amoeba(int x, int y)
5757 Cave[x][y] = Xfake_amoebaB;
5760 static void Lsand_stone(int x, int y)
5762 switch (Cave[x][y+1])
5765 case Xacid_splash_e:
5766 case Xacid_splash_w:
5767 Cave[x][y] = Xsand_stonesand_quickout_1;
5768 Next[x][y] = Xsand_stonesand_quickout_2;
5769 Cave[x][y+1] = Xsand_stoneout_1;
5770 Next[x][y+1] = Xsand_stoneout_2;
5781 Cave[x][y] = Xsand_stonesand_quickout_1;
5782 Next[x][y] = Xsand_stonesand_quickout_2;
5783 if (Cave[x+1][y] == Xblank)
5784 Cave[x+1][y] = Xacid_splash_e;
5785 if (Cave[x-1][y] == Xblank)
5786 Cave[x-1][y] = Xacid_splash_w;
5787 play_element_sound(x, y, SOUND_acid, Xacid_1);
5791 Cave[x][y] = Xsand_stonesand_1;
5792 Next[x][y] = Xsand_stonesand_2;
5793 Cave[x][y+1] = Xsand_sandstone_1;
5794 Next[x][y+1] = Xsand_sandstone_2;
5799 static void Lsand_stonein_1(int x, int y)
5801 Next[x][y] = Xsand_stonein_2;
5804 static void Lsand_stonein_2(int x, int y)
5806 Next[x][y] = Xsand_stonein_3;
5809 static void Lsand_stonein_3(int x, int y)
5811 Next[x][y] = Xsand_stonein_4;
5814 static void Lsand_stonein_4(int x, int y)
5816 Next[x][y] = Xblank;
5819 static void Lsand_sandstone_1(int x, int y)
5821 Next[x][y] = Xsand_sandstone_2;
5824 static void Lsand_sandstone_2(int x, int y)
5826 Next[x][y] = Xsand_sandstone_3;
5829 static void Lsand_sandstone_3(int x, int y)
5831 Next[x][y] = Xsand_sandstone_4;
5834 static void Lsand_sandstone_4(int x, int y)
5836 Next[x][y] = Xsand_stone;
5839 static void Lsand_stonesand_1(int x, int y)
5841 Next[x][y] = Xsand_stonesand_2;
5844 static void Lsand_stonesand_2(int x, int y)
5846 Next[x][y] = Xsand_stonesand_3;
5849 static void Lsand_stonesand_3(int x, int y)
5851 Next[x][y] = Xsand_stonesand_4;
5854 static void Lsand_stonesand_4(int x, int y)
5859 static void Lsand_stoneout_1(int x, int y)
5861 Next[x][y] = Xsand_stoneout_2;
5864 static void Lsand_stoneout_2(int x, int y)
5866 Next[x][y] = Xstone_fall;
5869 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5870 static void Lsand_stonesand_quickout_1(int x, int y)
5872 Next[x][y] = Xsand_stonesand_quickout_2;
5875 static void Lsand_stonesand_quickout_2(int x, int y)
5881 static void Lslidewall_ns(int x, int y)
5883 if (tab_blank[Cave[x][y-1]])
5885 Cave[x][y-1] = Yslidewall_ns_blank;
5886 Next[x][y-1] = Xslidewall_ns;
5887 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ns);
5890 if (tab_blank[Cave[x][y+1]])
5892 Cave[x][y+1] = Yslidewall_ns_blank;
5893 Next[x][y+1] = Xslidewall_ns;
5894 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ns);
5898 static void Lslidewall_ew(int x, int y)
5900 if (tab_blank[Cave[x+1][y]])
5902 Cave[x+1][y] = Yslidewall_ew_blank;
5903 Next[x+1][y] = Xslidewall_ew;
5904 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ew);
5907 if (tab_blank[Cave[x-1][y]])
5909 Cave[x-1][y] = Yslidewall_ew_blank;
5910 Next[x-1][y] = Xslidewall_ew;
5911 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ew);
5915 static void Lexit(int x, int y)
5917 if (lev.required > 0)
5920 switch (RANDOM(64) / 21)
5923 Cave[x][y] = Xexit_1;
5924 Next[x][y] = Xexit_2;
5928 Cave[x][y] = Xexit_2;
5929 Next[x][y] = Xexit_3;
5933 Cave[x][y] = Xexit_3;
5934 Next[x][y] = Xexit_1;
5938 play_element_sound(x, y, SOUND_exit_open, Xexit);
5941 static void Lexit_1(int x, int y)
5943 Next[x][y] = Xexit_2;
5946 static void Lexit_2(int x, int y)
5948 Next[x][y] = Xexit_3;
5951 static void Lexit_3(int x, int y)
5953 Next[x][y] = Xexit_1;
5956 static void Lpause(int x, int y)
5958 Next[x][y] = Xblank;
5961 static void Lamoeba(int x, int y)
5966 case Xacid_splash_e:
5967 case Xacid_splash_w:
5973 if (tab_amoeba[Cave[x][y-1]] ||
5974 tab_amoeba[Cave[x+1][y]] ||
5975 tab_amoeba[Cave[x][y+1]] ||
5976 tab_amoeba[Cave[x-1][y]])
5981 static void Lexplode(int x, int y)
5986 Cave[x][y] = Xboom_1;
5987 Cave[x][y-1] = tab_explode_normal[Cave[x][y-1]];
5988 Cave[x-1][y] = tab_explode_normal[Cave[x-1][y]];
5989 Cave[x+1][y] = tab_explode_normal[Cave[x+1][y]];
5990 Cave[x][y+1] = tab_explode_normal[Cave[x][y+1]];
5991 Cave[x-1][y-1] = tab_explode_normal[Cave[x-1][y-1]];
5992 Cave[x+1][y-1] = tab_explode_normal[Cave[x+1][y-1]];
5993 Cave[x-1][y+1] = tab_explode_normal[Cave[x-1][y+1]];
5994 Cave[x+1][y+1] = tab_explode_normal[Cave[x+1][y+1]];
5998 Cave[x][y] = Xboom_1;
5999 Cave[x][y-1] = tab_explode_dynamite[Cave[x][y-1]];
6000 Cave[x-1][y] = tab_explode_dynamite[Cave[x-1][y]];
6001 Cave[x+1][y] = tab_explode_dynamite[Cave[x+1][y]];
6002 Cave[x][y+1] = tab_explode_dynamite[Cave[x][y+1]];
6003 Cave[x-1][y-1] = tab_explode_dynamite[Cave[x-1][y-1]];
6004 Cave[x+1][y-1] = tab_explode_dynamite[Cave[x+1][y-1]];
6005 Cave[x-1][y+1] = tab_explode_dynamite[Cave[x-1][y+1]];
6006 Cave[x+1][y+1] = tab_explode_dynamite[Cave[x+1][y+1]];
6011 static void Lboom_1(int x, int y)
6013 Next[x][y] = Xboom_2;
6014 #if !PLAY_ELEMENT_SOUND
6015 if (x != lev.exit_x && y != lev.exit_y)
6016 play_sound(x, y, SOUND_boom);
6018 lev.exit_x = lev.exit_y = -1;
6022 static void Lboom_2(int x, int y)
6024 Next[x][y] = Boom[x][y];
6027 static void Lboom_android(int x, int y)
6029 #if PLAY_ELEMENT_SOUND
6030 play_element_sound(x, y, SOUND_boom, Xandroid);
6036 static void handle_tile(int x, int y)
6040 case Xacid_1: Lacid_1(x, y); break;
6041 case Xacid_2: Lacid_2(x, y); break;
6042 case Xacid_3: Lacid_3(x, y); break;
6043 case Xacid_4: Lacid_4(x, y); break;
6044 case Xacid_5: Lacid_5(x, y); break;
6045 case Xacid_6: Lacid_6(x, y); break;
6046 case Xacid_7: Lacid_7(x, y); break;
6047 case Xacid_8: Lacid_8(x, y); break;
6049 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6050 case Xfake_acid_1: Lfake_acid_1(x, y); break;
6051 case Xfake_acid_2: Lfake_acid_2(x, y); break;
6052 case Xfake_acid_3: Lfake_acid_3(x, y); break;
6053 case Xfake_acid_4: Lfake_acid_4(x, y); break;
6054 case Xfake_acid_5: Lfake_acid_5(x, y); break;
6055 case Xfake_acid_6: Lfake_acid_6(x, y); break;
6056 case Xfake_acid_7: Lfake_acid_7(x, y); break;
6057 case Xfake_acid_8: Lfake_acid_8(x, y); break;
6060 case Xandroid: Landroid(x, y); break;
6061 case Xandroid_1_n: Landroid_1_n(x, y); break;
6062 case Xandroid_2_n: Landroid_2_n(x, y); break;
6063 case Xandroid_1_e: Landroid_1_e(x, y); break;
6064 case Xandroid_2_e: Landroid_2_e(x, y); break;
6065 case Xandroid_1_s: Landroid_1_s(x, y); break;
6066 case Xandroid_2_s: Landroid_2_s(x, y); break;
6067 case Xandroid_1_w: Landroid_1_w(x, y); break;
6068 case Xandroid_2_w: Landroid_2_w(x, y); break;
6070 case Xeater_n: Leater_n(x, y); break;
6071 case Xeater_e: Leater_e(x, y); break;
6072 case Xeater_s: Leater_s(x, y); break;
6073 case Xeater_w: Leater_w(x, y); break;
6075 case Xalien: Lalien(x, y); break;
6076 case Xalien_pause: Lalien_pause(x, y); break;
6078 case Xbug_1_n: Lbug_1_n(x, y); break;
6079 case Xbug_2_n: Lbug_2_n(x, y); break;
6080 case Xbug_1_e: Lbug_1_e(x, y); break;
6081 case Xbug_2_e: Lbug_2_e(x, y); break;
6082 case Xbug_1_s: Lbug_1_s(x, y); break;
6083 case Xbug_2_s: Lbug_2_s(x, y); break;
6084 case Xbug_1_w: Lbug_1_w(x, y); break;
6085 case Xbug_2_w: Lbug_2_w(x, y); break;
6087 case Xtank_1_n: Ltank_1_n(x, y); break;
6088 case Xtank_2_n: Ltank_2_n(x, y); break;
6089 case Xtank_1_e: Ltank_1_e(x, y); break;
6090 case Xtank_2_e: Ltank_2_e(x, y); break;
6091 case Xtank_1_s: Ltank_1_s(x, y); break;
6092 case Xtank_2_s: Ltank_2_s(x, y); break;
6093 case Xtank_1_w: Ltank_1_w(x, y); break;
6094 case Xtank_2_w: Ltank_2_w(x, y); break;
6096 case Xemerald: Lemerald(x, y); break;
6097 case Xemerald_pause: Lemerald_pause(x, y); break;
6098 case Xemerald_fall: Lemerald_fall(x, y); break;
6100 case Xdiamond: Ldiamond(x, y); break;
6101 case Xdiamond_pause: Ldiamond_pause(x, y); break;
6102 case Xdiamond_fall: Ldiamond_fall(x, y); break;
6104 case Xstone: Lstone(x, y); break;
6105 case Xstone_pause: Lstone_pause(x, y); break;
6106 case Xstone_fall: Lstone_fall(x, y); break;
6108 case Xbomb: Lbomb(x, y); break;
6109 case Xbomb_pause: Lbomb_pause(x, y); break;
6110 case Xbomb_fall: Lbomb_fall(x, y); break;
6112 case Xnut: Lnut(x, y); break;
6113 case Xnut_pause: Lnut_pause(x, y); break;
6114 case Xnut_fall: Lnut_fall(x, y); break;
6116 case Xspring: Lspring(x, y); break;
6117 case Xspring_pause: Lspring_pause(x, y); break;
6118 case Xspring_e: Lspring_e(x, y); break;
6119 case Xspring_w: Lspring_w(x, y); break;
6120 case Xspring_fall: Lspring_fall(x, y); break;
6122 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
6123 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
6124 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
6125 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
6126 case Xpush_stone_e: Lpush_stone_e(x, y); break;
6127 case Xpush_stone_w: Lpush_stone_w(x, y); break;
6128 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
6129 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
6130 case Xpush_nut_e: Lpush_nut_e(x, y); break;
6131 case Xpush_nut_w: Lpush_nut_w(x, y); break;
6132 case Xpush_spring_e: Lpush_spring_e(x, y); break;
6133 case Xpush_spring_w: Lpush_spring_w(x, y); break;
6135 case Xdynamite_1: Ldynamite_1(x, y); break;
6136 case Xdynamite_2: Ldynamite_2(x, y); break;
6137 case Xdynamite_3: Ldynamite_3(x, y); break;
6138 case Xdynamite_4: Ldynamite_4(x, y); break;
6140 case Xfake_door_1: Lfake_door_1(x, y); break;
6141 case Xfake_door_2: Lfake_door_2(x, y); break;
6142 case Xfake_door_3: Lfake_door_3(x, y); break;
6143 case Xfake_door_4: Lfake_door_4(x, y); break;
6144 case Xfake_door_5: Lfake_door_5(x, y); break;
6145 case Xfake_door_6: Lfake_door_6(x, y); break;
6146 case Xfake_door_7: Lfake_door_7(x, y); break;
6147 case Xfake_door_8: Lfake_door_8(x, y); break;
6149 case Xballoon: Lballoon(x, y); break;
6151 case Xball_1: Lball_1(x, y); break;
6152 case Xball_2: Lball_2(x, y); break;
6154 case Xdrip: Ldrip(x, y); break;
6155 case Xdrip_fall: Ldrip_fall(x, y); break;
6156 case Xdrip_stretch: Ldrip_stretch(x, y); break;
6157 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
6159 case Xwonderwall: Lwonderwall(x, y); break;
6161 case Xwheel: Lwheel(x, y); break;
6163 case Xswitch: Lswitch(x, y); break;
6165 case Xfake_blank: Lfake_blank(x, y); break;
6166 case Xfake_grass: Lfake_grass(x, y); break;
6167 case Xfake_amoeba: Lfake_amoeba(x, y); break;
6169 case Xsand_stone: Lsand_stone(x, y); break;
6170 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
6171 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
6172 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
6173 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
6174 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
6175 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
6176 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
6177 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
6178 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
6179 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
6180 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
6181 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
6182 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
6183 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
6184 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6185 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
6186 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
6189 case Xslidewall_ns: Lslidewall_ns(x, y); break;
6190 case Xslidewall_ew: Lslidewall_ew(x, y); break;
6192 case Xexit: Lexit(x, y); break;
6193 case Xexit_1: Lexit_1(x, y); break;
6194 case Xexit_2: Lexit_2(x, y); break;
6195 case Xexit_3: Lexit_3(x, y); break;
6197 case Xpause: Lpause(x, y); break;
6199 case Xboom_bug: Lboom_bug(x, y, Xboom_bug); break;
6200 case Xboom_bomb: Lboom_tank(x, y, Xboom_bomb); break;
6201 case Xboom_android: Lboom_android(x, y); break;
6202 case Xboom_1: Lboom_1(x, y); break;
6203 case Xboom_2: Lboom_2(x, y); break;
6212 game_em.any_player_moving = FALSE;
6213 game_em.any_player_snapping = FALSE;
6215 /* must test for death and actually kill separately */
6216 for (i = 0; i < MAX_PLAYERS; i++)
6218 boolean ply_kill = player_killed(&ply[i]);
6220 if (ply[i].alive && ply_kill)
6221 kill_player(&ply[i]);
6224 for (i = 0; i < MAX_PLAYERS; i++)
6226 ply[i].oldx = ply[i].x;
6227 ply[i].oldy = ply[i].y;
6228 ply[i].anim = PLY_still;
6231 start_check_nr = (RandomEM & 128 ? 0 : 1) * 2 + (RandomEM & 256 ? 0 : 1);
6233 for (i = 0; i < MAX_PLAYERS; i++)
6235 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
6237 if (ply[check_nr].alive)
6238 check_player(&ply[check_nr]);
6241 for (i = 0; i < MAX_PLAYERS; i++)
6246 if (Cave[ply[i].oldx][ply[i].oldy] == Zplayer)
6248 Cave[ply[i].oldx][ply[i].oldy] = Xblank;
6249 Next[ply[i].oldx][ply[i].oldy] = Xblank;
6252 if (Cave[ply[i].x][ply[i].y] == Xblank)
6254 Cave[ply[i].x][ply[i].y] = Zplayer;
6255 Next[ply[i].x][ply[i].y] = Zplayer;
6267 for (y = 1; y < HEIGHT - 1; y++)
6268 for (x = 0; x < WIDTH; x++)
6271 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
6272 lev.score += score; /* only add a score if someone is alive */
6274 game_em.game_over = TRUE;
6278 /* triple buffering */
6290 unsigned int random;
6292 /* update variables */
6294 if (lev.score > 9999)
6297 if (lev.android_move_cnt-- == 0)
6298 lev.android_move_cnt = lev.android_move_time;
6299 if (lev.android_clone_cnt-- == 0)
6300 lev.android_clone_cnt = lev.android_clone_time;
6302 if (lev.ball_cnt-- == 0)
6303 lev.ball_cnt = lev.ball_time;
6306 if (lev.magnify_cnt)
6312 if (lev.wonderwall_time && lev.wonderwall_state)
6313 lev.wonderwall_time--;
6316 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
6322 for (count = lev.amoeba_time; count--;)
6324 x = (random >> 10) % (WIDTH - 2);
6325 y = (random >> 20) % (HEIGHT - 2);
6329 random = random * 129 + 1;
6334 /* handle explosions */
6336 for (y = 1; y < HEIGHT - 1; y++)
6337 for (x = 1; x < WIDTH - 1; x++)
6340 /* triple buffering */
6342 for (y = 0; y < HEIGHT; y++)
6343 for (x = 0; x < WIDTH; x++)
6344 Next[x][y] = Cave[x][y];