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 short **cave, **next, **boom;
18 static unsigned int seed;
21 static void Lboom_generic(int x, int y, int element, int element_middle)
23 boom[x-1][y-1] = element;
24 boom[x][y-1] = element;
25 boom[x+1][y-1] = element;
26 boom[x-1][y] = element;
27 boom[x][y] = element_middle;
28 boom[x+1][y] = element;
29 boom[x-1][y+1] = element;
30 boom[x][y+1] = element;
31 boom[x+1][y+1] = element;
34 static void Lboom_bug(int x, int y, int by_element)
38 Lboom_generic(x, y, Xemerald, Xdiamond);
40 #if PLAY_ELEMENT_SOUND
41 play_element_sound(x, y, SOUND_boom, by_element);
45 static void Lboom_tank(int x, int y, int by_element)
49 Lboom_generic(x, y, Xblank, Xblank);
51 #if PLAY_ELEMENT_SOUND
52 play_element_sound(x, y, SOUND_boom, by_element);
56 static void Lboom_eater(int x, int y, int by_element)
60 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
61 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
62 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
63 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
64 boom[x][y] = lev.eater_array[lev.eater_pos][4];
65 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
66 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
67 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
68 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
70 lev.eater_pos = (lev.eater_pos + 1) & 7;
72 #if PLAY_ELEMENT_SOUND
73 play_element_sound(x, y, SOUND_boom, by_element);
77 static boolean player_killed(struct PLAYER *ply)
85 if (lev.killed_out_of_time && setup.time_limit)
109 switch (cave[x+1][y])
130 switch (cave[x][y+1])
151 switch (cave[x-1][y])
182 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
198 static void kill_player(struct PLAYER *ply)
205 switch (cave[x][y-1])
215 cave[x][y-1] = Xboom_bug;
226 cave[x][y-1] = Xboom_bomb;
230 switch (cave[x+1][y])
240 cave[x+1][y] = Xboom_bug;
251 cave[x+1][y] = Xboom_bomb;
255 switch (cave[x][y+1])
265 cave[x][y+1] = Xboom_bug;
276 cave[x][y+1] = Xboom_bomb;
280 switch (cave[x-1][y])
290 cave[x-1][y] = Xboom_bug;
301 cave[x-1][y] = Xboom_bomb;
312 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
316 play_element_sound(x, y, SOUND_die, Zplayer);
322 #ifdef USE_CHANGED_ACID_STUFF
335 cave[x][y] = Xboom_1;
341 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
343 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
348 boolean result = TRUE;
350 if (!dx && !dy) /* no direction specified */
353 if (dx && dy && ply->joy_snap) /* more than one direction specified */
356 if (ply->joy_snap == 0) /* player wants to move */
358 int element = cave[x][y];
362 /* fire is released */
366 cave[x][y] = Zplayer;
367 next[x][y] = Zplayer;
368 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
378 play_element_sound(x, y, SOUND_blank, Xblank);
379 ply->anim = PLY_walk_n + anim;
384 #ifdef USE_CHANGED_ACID_STUFF
393 if (cave[x+1][y-1] == Xblank)
394 cave[x+1][y-1] = Xacid_splash_e;
395 if (cave[x-1][y-1] == Xblank)
396 cave[x-1][y-1] = Xacid_splash_w;
397 play_element_sound(x, y, SOUND_acid, Xacid_1);
419 #ifndef USE_CHANGED_ACID_STUFF
429 ply->anim = PLY_walk_n + anim;
435 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
436 (dx > 0 ? Ygrass_eB : Ygrass_wB));
437 next[x][y] = Zplayer;
438 play_element_sound(x, y, SOUND_dirt, Xgrass);
439 ply->anim = PLY_walk_n + anim;
445 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
446 (dx > 0 ? Ydirt_eB : Ydirt_wB));
447 next[x][y] = Zplayer;
448 play_element_sound(x, y, SOUND_dirt, Xdirt);
449 ply->anim = PLY_walk_n + anim;
456 cave[x][y] = Ydiamond_blank;
457 next[x][y] = Zplayer;
458 play_element_sound(x, y, SOUND_collect, element);
459 lev.score += lev.diamond_score;
460 lev.required = lev.required < 3 ? 0 : lev.required - 3;
461 game.snapshot.collected_item = TRUE;
462 ply->anim = PLY_walk_n + anim;
469 cave[x][y] = Yemerald_blank;
470 next[x][y] = Zplayer;
471 play_element_sound(x, y, SOUND_collect, element);
472 lev.score += lev.emerald_score;
473 lev.required = lev.required < 1 ? 0 : lev.required - 1;
474 game.snapshot.collected_item = TRUE;
475 ply->anim = PLY_walk_n + anim;
481 cave[x][y] = Ydynamite_blank;
482 next[x][y] = Zplayer;
483 play_element_sound(x, y, SOUND_collect, element);
484 lev.score += lev.dynamite_score;
485 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
486 ply->anim = PLY_walk_n + anim;
493 cave[x][y] = Ykey_1_blank;
498 cave[x][y] = Ykey_2_blank;
503 cave[x][y] = Ykey_3_blank;
508 cave[x][y] = Ykey_4_blank;
513 cave[x][y] = Ykey_5_blank;
518 cave[x][y] = Ykey_6_blank;
523 cave[x][y] = Ykey_7_blank;
528 cave[x][y] = Ykey_8_blank;
533 next[x][y] = Zplayer;
534 play_element_sound(x, y, SOUND_collect, element);
535 lev.score += lev.key_score;
536 ply->anim = PLY_walk_n + anim;
542 cave[x][y] = Ylenses_blank;
543 next[x][y] = Zplayer;
544 play_element_sound(x, y, SOUND_collect, element);
545 lev.score += lev.lenses_score;
546 lev.lenses_cnt = lev.lenses_time;
547 ply->anim = PLY_walk_n + anim;
553 cave[x][y] = Ymagnify_blank;
554 next[x][y] = Zplayer;
555 play_element_sound(x, y, SOUND_collect, element);
556 lev.score += lev.magnify_score;
557 lev.magnify_cnt = lev.magnify_time;
558 ply->anim = PLY_walk_n + anim;
567 switch (cave[x+dx][y])
572 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
573 next[x+dx][y] = Xstone_pause;
584 if (cave[x+dx+1][y-1] == Xblank)
585 cave[x+dx+1][y-1] = Xacid_splash_e;
586 if (cave[x+dx-1][y-1] == Xblank)
587 cave[x+dx-1][y-1] = Xacid_splash_w;
588 play_element_sound(x, y, SOUND_acid, Xacid_1);
592 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
593 next[x][y] = Zplayer;
594 play_element_sound(x, y, SOUND_roll, Xstone);
599 ply->anim = PLY_push_n + anim;
606 switch (cave[x+dx][y])
611 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
612 next[x+dx][y] = Xbomb_pause;
623 if (cave[x+dx+1][y-1] == Xblank)
624 cave[x+dx+1][y-1] = Xacid_splash_e;
625 if (cave[x+dx-1][y-1] == Xblank)
626 cave[x+dx-1][y-1] = Xacid_splash_w;
627 play_element_sound(x, y, SOUND_acid, Xacid_1);
631 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
632 next[x][y] = Zplayer;
633 play_element_sound(x, y, SOUND_roll, Xbomb);
638 ply->anim = PLY_push_n + anim;
645 switch (cave[x+dx][y])
650 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
651 next[x+dx][y] = Xnut_pause;
662 if (cave[x+dx+1][y-1] == Xblank)
663 cave[x+dx+1][y-1] = Xacid_splash_e;
664 if (cave[x+dx-1][y-1] == Xblank)
665 cave[x+dx-1][y-1] = Xacid_splash_w;
666 play_element_sound(x, y, SOUND_acid, Xacid_1);
670 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
671 next[x][y] = Zplayer;
672 play_element_sound(x, y, SOUND_roll, Xnut);
677 ply->anim = PLY_push_n + anim;
684 switch (cave[x+dx][y])
689 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
690 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
701 if (cave[x+dx+1][y-1] == Xblank)
702 cave[x+dx+1][y-1] = Xacid_splash_e;
703 if (cave[x+dx-1][y-1] == Xblank)
704 cave[x+dx-1][y-1] = Xacid_splash_w;
705 play_element_sound(x, y, SOUND_acid, Xacid_1);
709 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
710 next[x][y] = Zplayer;
711 play_element_sound(x, y, SOUND_roll, Xspring);
717 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
718 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
719 next[x][y] = Zplayer;
720 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
721 play_element_sound(x, y, SOUND_slurp, Xalien);
722 lev.score += lev.slurp_score;
727 ply->anim = PLY_push_n + anim;
734 case Xsand_stonein_1:
735 case Xsand_stonein_2:
736 case Xsand_stonein_3:
737 case Xsand_stonein_4:
741 ply->anim = PLY_push_n + anim;
745 switch (cave[x+dx][y+dy])
750 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
751 (dx > 0 ? Yballoon_e : Yballoon_w));
752 next[x+dx][y+dy] = Xballoon;
763 if (cave[x+dx+1][y+dy-1] == Xblank)
764 cave[x+dx+1][y+dy-1] = Xacid_splash_e;
765 if (cave[x+dx-1][y+dy-1] == Xblank)
766 cave[x+dx-1][y+dy-1] = Xacid_splash_w;
767 play_element_sound(x, y, SOUND_acid, Xacid_1);
771 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
772 (dx > 0 ? Yballoon_eB : Yballoon_wB));
773 next[x][y] = Zplayer;
774 play_element_sound(x, y, SOUND_push, Xballoon);
780 ply->anim = PLY_push_n + anim;
792 switch (cave[x+dx][y+dy])
797 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
798 (dx > 0 ? Yandroid_e : Yandroid_w));
799 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
800 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
811 if (cave[x+dx+1][y+dy-1] == Xblank)
812 cave[x+dx+1][y+dy-1] = Xacid_splash_e;
813 if (cave[x+dx-1][y+dy-1] == Xblank)
814 cave[x+dx-1][y+dy-1] = Xacid_splash_w;
815 play_element_sound(x, y, SOUND_acid, Xacid_1);
819 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
820 (dx > 0 ? Yandroid_eB : Yandroid_wB));
821 next[x][y] = Zplayer;
822 play_element_sound(x, y, SOUND_push, Xandroid);
828 ply->anim = PLY_push_n + anim;
833 if (ply->keys & 0x01)
840 if (ply->keys & 0x02)
847 if (ply->keys & 0x04)
854 if (ply->keys & 0x08)
861 if (ply->keys & 0x10)
868 if (ply->keys & 0x20)
875 if (ply->keys & 0x40)
882 if (ply->keys & 0x80)
889 if (!tab_blank[cave[x+dx][y+dy]])
892 cave[x+dx][y+dy] = Zplayer;
893 next[x+dx][y+dy] = Zplayer;
894 play_element_sound(x, y, SOUND_door, element);
895 ply->anim = PLY_walk_n + anim;
901 play_element_sound(x, y, SOUND_press, element);
902 lev.wheel_cnt = lev.wheel_time;
908 lev.wind_direction = 0;
912 lev.wind_direction = 1;
916 lev.wind_direction = 2;
920 lev.wind_direction = 3;
924 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
929 play_element_sound(x, y, SOUND_press, element);
930 lev.wind_cnt = lev.wind_time;
934 play_element_sound(x, y, SOUND_press, element);
939 play_element_sound(x, y, SOUND_press, element);
940 lev.ball_cnt = lev.ball_time;
941 lev.ball_state = !lev.ball_state;
947 play_element_sound(x, y, SOUND_blank, Xplant);
948 ply->anim = PLY_walk_n + anim;
959 game_em.level_solved = TRUE;
961 ply->anim = PLY_walk_n + anim;
968 if (ply->x == oldx && ply->y == oldy) /* no movement */
971 else /* player wants to snap */
973 int element = cave[x][y];
977 /* fire is pressed */
980 cave[x][y] = Ygrass_blank;
982 play_element_sound(x, y, SOUND_dirt, element);
983 ply->anim = PLY_shoot_n + anim;
987 cave[x][y] = Ydirt_blank;
989 play_element_sound(x, y, SOUND_dirt, element);
990 ply->anim = PLY_shoot_n + anim;
995 cave[x][y] = Ydiamond_blank;
997 play_element_sound(x, y, SOUND_collect, element);
998 lev.score += lev.diamond_score;
999 lev.required = lev.required < 3 ? 0 : lev.required - 3;
1000 game.snapshot.collected_item = TRUE;
1001 ply->anim = PLY_walk_n + anim;
1005 case Xemerald_pause:
1006 cave[x][y] = Yemerald_blank;
1007 next[x][y] = Xblank;
1008 play_element_sound(x, y, SOUND_collect, element);
1009 lev.score += lev.emerald_score;
1010 lev.required = lev.required < 1 ? 0 : lev.required - 1;
1011 game.snapshot.collected_item = TRUE;
1012 ply->anim = PLY_walk_n + anim;
1016 cave[x][y] = Ydynamite_blank;
1017 next[x][y] = Xblank;
1018 play_element_sound(x, y, SOUND_collect, element);
1019 lev.score += lev.dynamite_score;
1020 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1021 ply->anim = PLY_walk_n + anim;
1026 cave[x][y] = Ykey_1_blank;
1031 cave[x][y] = Ykey_2_blank;
1036 cave[x][y] = Ykey_3_blank;
1041 cave[x][y] = Ykey_4_blank;
1046 cave[x][y] = Ykey_5_blank;
1051 cave[x][y] = Ykey_6_blank;
1056 cave[x][y] = Ykey_7_blank;
1061 cave[x][y] = Ykey_8_blank;
1066 next[x][y] = Xblank;
1067 play_element_sound(x, y, SOUND_collect, element);
1068 lev.score += lev.key_score;
1069 ply->anim = PLY_walk_n + anim;
1073 cave[x][y] = Ylenses_blank;
1074 next[x][y] = Xblank;
1075 play_element_sound(x, y, SOUND_collect, element);
1076 lev.score += lev.lenses_score;
1077 lev.lenses_cnt = lev.lenses_time;
1078 ply->anim = PLY_walk_n + anim;
1082 cave[x][y] = Ymagnify_blank;
1083 next[x][y] = Xblank;
1084 play_element_sound(x, y, SOUND_collect, element);
1085 lev.score += lev.magnify_score;
1086 lev.magnify_cnt = lev.magnify_time;
1087 ply->anim = PLY_walk_n + anim;
1098 static void check_player(struct PLAYER *ply)
1106 game_em.last_player_direction[ply->num] = MV_NONE;
1108 if (ply->joy_w) /* west */
1113 else if (ply->joy_e) /* east */
1119 if (ply->joy_n) /* north */
1124 else if (ply->joy_s) /* south */
1136 boolean players_visible_before_move;
1137 boolean players_visible_after_move;
1140 players_visible_before_move = checkIfAllPlayersFitToScreen();
1145 players_visible_after_move = checkIfAllPlayersFitToScreen();
1148 player is allowed to move only in the following cases:
1149 - it is not needed to display all players (not focussed to all players)
1150 - all players are (still or again) visible after the move
1151 - some players were already outside visible screen area before the move
1153 can_move = (game.centered_player_nr != -1 ||
1154 players_visible_after_move ||
1155 !players_visible_before_move);
1162 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
1168 if (dx == 0 && dy == 0)
1174 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1176 cave[x][y] = Xdynamite_1;
1177 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1183 ply->dynamite_cnt = 0;
1186 RandomEM += 7; /* be a bit more random if the player doesn't move */
1192 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
1193 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1194 ply->joy_spin = !ply->joy_spin;
1196 if (ply->joy_snap == 0) /* player wants to move */
1198 boolean moved = FALSE;
1200 if (ply->last_move_dir & MV_HORIZONTAL)
1202 if (!(moved = player_digfield(ply, 0, dy)))
1203 moved = player_digfield(ply, dx, 0);
1207 if (!(moved = player_digfield(ply, dx, 0)))
1208 moved = player_digfield(ply, 0, dy);
1214 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1215 else if (oldy != ply->y)
1216 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1218 game_em.any_player_moving = TRUE;
1219 game_em.last_moving_player = ply->num;
1220 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1223 else /* player wants to snap */
1225 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1229 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1231 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1234 /* default values if no players are alive anymore */
1238 for (i = 0; i < MAX_PLAYERS; i++)
1243 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1245 if (distance < distance_shortest)
1250 distance_shortest = distance;
1255 static void Lacid_1(int x, int y)
1257 next[x][y] = Xacid_2;
1260 static void Lacid_2(int x, int y)
1262 next[x][y] = Xacid_3;
1265 static void Lacid_3(int x, int y)
1267 next[x][y] = Xacid_4;
1270 static void Lacid_4(int x, int y)
1272 next[x][y] = Xacid_5;
1275 static void Lacid_5(int x, int y)
1277 next[x][y] = Xacid_6;
1280 static void Lacid_6(int x, int y)
1282 next[x][y] = Xacid_7;
1285 static void Lacid_7(int x, int y)
1287 next[x][y] = Xacid_8;
1290 static void Lacid_8(int x, int y)
1292 next[x][y] = Xacid_1;
1295 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1296 static void Lfake_acid_1(int x, int y)
1298 next[x][y] = Xfake_acid_2;
1301 static void Lfake_acid_2(int x, int y)
1303 next[x][y] = Xfake_acid_3;
1306 static void Lfake_acid_3(int x, int y)
1308 next[x][y] = Xfake_acid_4;
1311 static void Lfake_acid_4(int x, int y)
1313 next[x][y] = Xfake_acid_5;
1316 static void Lfake_acid_5(int x, int y)
1318 next[x][y] = Xfake_acid_6;
1321 static void Lfake_acid_6(int x, int y)
1323 next[x][y] = Xfake_acid_7;
1326 static void Lfake_acid_7(int x, int y)
1328 next[x][y] = Xfake_acid_8;
1331 static void Lfake_acid_8(int x, int y)
1333 next[x][y] = Xfake_acid_1;
1337 static void Landroid(int x, int y)
1341 if (lev.android_clone_cnt == 0)
1343 if (cave[x-1][y-1] != Xblank &&
1344 cave[x][y-1] != Xblank &&
1345 cave[x+1][y-1] != Xblank &&
1346 cave[x-1][y] != Xblank &&
1347 cave[x+1][y] != Xblank &&
1348 cave[x-1][y+1] != Xblank &&
1349 cave[x][y+1] != Xblank &&
1350 cave[x+1][y+1] != Xblank)
1355 /* randomly find an object to clone */
1357 case 0: /* S,NE,W,NW,SE,E,SW,N */
1358 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1359 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1360 temp = lev.android_array[cave[x-1][y]]; 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+1]]; if (temp != Xblank) break;
1363 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1364 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1365 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1368 case 1: /* NW,SE,N,S,NE,SW,E,W */
1369 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1370 temp = lev.android_array[cave[x+1][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][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+1]]; if (temp != Xblank) break;
1375 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1376 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1379 case 2: /* SW,E,S,W,N,NW,SE,NE */
1380 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1381 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1382 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1383 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1384 temp = lev.android_array[cave[x][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;
1387 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1390 case 3: /* N,SE,NE,E,W,S,NW,SW */
1391 temp = lev.android_array[cave[x][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-1]]; if (temp != Xblank) break;
1394 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1395 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1396 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1397 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1398 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1401 case 4: /* SE,NW,E,NE,SW,W,N,S */
1402 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1403 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1404 temp = lev.android_array[cave[x+1][y]]; 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+1]]; if (temp != Xblank) break;
1407 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1408 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1409 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1412 case 5: /* NE,W,SE,SW,S,N,E,NW */
1413 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1414 temp = lev.android_array[cave[x-1][y]]; 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-1][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][y-1]]; if (temp != Xblank) break;
1419 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1420 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1423 case 6: /* E,N,SW,S,NW,NE,SE,W */
1424 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1425 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1426 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1427 temp = lev.android_array[cave[x][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+1]]; if (temp != Xblank) break;
1431 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1434 case 7: /* W,SW,NW,N,E,SE,NE,S */
1435 temp = lev.android_array[cave[x-1][y]]; 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-1][y-1]]; if (temp != Xblank) break;
1438 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1439 temp = lev.android_array[cave[x+1][y]]; 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+1][y-1]]; if (temp != Xblank) break;
1442 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1446 next[x][y] = temp; /* the item we chose to clone */
1447 play_element_sound(x, y, SOUND_android_clone, temp);
1451 /* randomly find a direction to move */
1453 case 0: /* S,NE,W,NW,SE,E,SW,N */
1454 if (cave[x][y+1] == Xblank) goto android_s;
1455 if (cave[x+1][y-1] == Xblank) goto android_ne;
1456 if (cave[x-1][y] == Xblank) goto android_w;
1457 if (cave[x-1][y-1] == Xblank) goto android_nw;
1458 if (cave[x+1][y+1] == Xblank) goto android_se;
1459 if (cave[x+1][y] == Xblank) goto android_e;
1460 if (cave[x-1][y+1] == Xblank) goto android_sw;
1461 if (cave[x][y-1] == Xblank) goto android_n;
1464 case 1: /* NW,SE,N,S,NE,SW,E,W */
1465 if (cave[x-1][y-1] == Xblank) goto android_nw;
1466 if (cave[x+1][y+1] == Xblank) goto android_se;
1467 if (cave[x][y-1] == Xblank) goto android_n;
1468 if (cave[x][y+1] == Xblank) goto android_s;
1469 if (cave[x+1][y-1] == Xblank) goto android_ne;
1470 if (cave[x-1][y+1] == Xblank) goto android_sw;
1471 if (cave[x+1][y] == Xblank) goto android_e;
1472 if (cave[x-1][y] == Xblank) goto android_w;
1475 case 2: /* SW,E,S,W,N,NW,SE,NE */
1476 if (cave[x-1][y+1] == Xblank) goto android_sw;
1477 if (cave[x+1][y] == Xblank) goto android_e;
1478 if (cave[x][y+1] == Xblank) goto android_s;
1479 if (cave[x-1][y] == Xblank) goto android_w;
1480 if (cave[x][y-1] == Xblank) goto android_n;
1481 if (cave[x-1][y-1] == Xblank) goto android_nw;
1482 if (cave[x+1][y+1] == Xblank) goto android_se;
1483 if (cave[x+1][y-1] == Xblank) goto android_ne;
1486 case 3: /* N,SE,NE,E,W,S,NW,SW */
1487 if (cave[x][y-1] == Xblank) goto android_n;
1488 if (cave[x+1][y+1] == Xblank) goto android_se;
1489 if (cave[x+1][y-1] == Xblank) goto android_ne;
1490 if (cave[x+1][y] == Xblank) goto android_e;
1491 if (cave[x-1][y] == Xblank) goto android_w;
1492 if (cave[x][y+1] == Xblank) goto android_s;
1493 if (cave[x-1][y-1] == Xblank) goto android_nw;
1494 if (cave[x-1][y+1] == Xblank) goto android_sw;
1497 case 4: /* SE,NW,E,NE,SW,W,N,S */
1498 if (cave[x+1][y+1] == Xblank) goto android_se;
1499 if (cave[x-1][y-1] == Xblank) goto android_nw;
1500 if (cave[x+1][y] == Xblank) goto android_e;
1501 if (cave[x+1][y-1] == Xblank) goto android_ne;
1502 if (cave[x-1][y+1] == Xblank) goto android_sw;
1503 if (cave[x-1][y] == Xblank) goto android_w;
1504 if (cave[x][y-1] == Xblank) goto android_n;
1505 if (cave[x][y+1] == Xblank) goto android_s;
1508 case 5: /* NE,W,SE,SW,S,N,E,NW */
1509 if (cave[x+1][y-1] == Xblank) goto android_ne;
1510 if (cave[x-1][y] == Xblank) goto android_w;
1511 if (cave[x+1][y+1] == Xblank) goto android_se;
1512 if (cave[x-1][y+1] == Xblank) goto android_sw;
1513 if (cave[x][y+1] == Xblank) goto android_s;
1514 if (cave[x][y-1] == Xblank) goto android_n;
1515 if (cave[x+1][y] == Xblank) goto android_e;
1516 if (cave[x-1][y-1] == Xblank) goto android_nw;
1519 case 6: /* E,N,SW,S,NW,NE,SE,W */
1520 if (cave[x+1][y] == Xblank) goto android_e;
1521 if (cave[x][y-1] == Xblank) goto android_n;
1522 if (cave[x-1][y+1] == Xblank) goto android_sw;
1523 if (cave[x][y+1] == Xblank) goto android_s;
1524 if (cave[x-1][y-1] == Xblank) goto android_nw;
1525 if (cave[x+1][y-1] == Xblank) goto android_ne;
1526 if (cave[x+1][y+1] == Xblank) goto android_se;
1527 if (cave[x-1][y] == Xblank) goto android_w;
1530 case 7: /* W,SW,NW,N,E,SE,NE,S */
1531 if (cave[x-1][y] == Xblank) goto android_w;
1532 if (cave[x-1][y+1] == Xblank) goto android_sw;
1533 if (cave[x-1][y-1] == Xblank) goto android_nw;
1534 if (cave[x][y-1] == Xblank) goto android_n;
1535 if (cave[x+1][y] == Xblank) goto android_e;
1536 if (cave[x+1][y+1] == Xblank) goto android_se;
1537 if (cave[x+1][y-1] == Xblank) goto android_ne;
1538 if (cave[x][y+1] == Xblank) goto android_s;
1544 if (lev.android_move_cnt == 0)
1546 if (cave[x-1][y-1] == Zplayer ||
1547 cave[x][y-1] == Zplayer ||
1548 cave[x+1][y-1] == Zplayer ||
1549 cave[x-1][y] == Zplayer ||
1550 cave[x+1][y] == Zplayer ||
1551 cave[x-1][y+1] == Zplayer ||
1552 cave[x][y+1] == Zplayer ||
1553 cave[x+1][y+1] == Zplayer)
1556 set_nearest_player_xy(x, y, &dx, &dy);
1558 next[x][y] = Xblank; /* assume we will move */
1559 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1565 /* attempt clockwise move first if direct path is blocked */
1567 case 0: /* north west */
1568 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1569 if (tab_android_move[cave[x][y-1]]) goto android_n;
1570 if (tab_android_move[cave[x-1][y]]) goto android_w;
1574 if (tab_android_move[cave[x][y-1]]) goto android_n;
1575 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1576 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1579 case 2: /* north east */
1580 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1581 if (tab_android_move[cave[x+1][y]]) goto android_e;
1582 if (tab_android_move[cave[x][y-1]]) goto android_n;
1586 if (tab_android_move[cave[x-1][y]]) goto android_w;
1587 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1588 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1591 case 4: /* nowhere */
1595 if (tab_android_move[cave[x+1][y]]) goto android_e;
1596 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1597 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1600 case 6: /* south west */
1601 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1602 if (tab_android_move[cave[x-1][y]]) goto android_w;
1603 if (tab_android_move[cave[x][y+1]]) goto android_s;
1607 if (tab_android_move[cave[x][y+1]]) goto android_s;
1608 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1609 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1612 case 8: /* south east */
1613 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1614 if (tab_android_move[cave[x][y+1]]) goto android_s;
1615 if (tab_android_move[cave[x+1][y]]) goto android_e;
1623 /* attempt counterclockwise move first if direct path is blocked */
1625 case 0: /* north west */
1626 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1627 if (tab_android_move[cave[x-1][y]]) goto android_w;
1628 if (tab_android_move[cave[x][y-1]]) goto android_n;
1632 if (tab_android_move[cave[x][y-1]]) goto android_n;
1633 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1634 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1637 case 2: /* north east */
1638 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1639 if (tab_android_move[cave[x][y-1]]) goto android_n;
1640 if (tab_android_move[cave[x+1][y]]) goto android_e;
1644 if (tab_android_move[cave[x-1][y]]) goto android_w;
1645 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1646 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1649 case 4: /* nowhere */
1653 if (tab_android_move[cave[x+1][y]]) goto android_e;
1654 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1655 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1658 case 6: /* south west */
1659 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1660 if (tab_android_move[cave[x][y+1]]) goto android_s;
1661 if (tab_android_move[cave[x-1][y]]) goto android_w;
1665 if (tab_android_move[cave[x][y+1]]) goto android_s;
1666 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1667 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1670 case 8: /* south east */
1671 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1672 if (tab_android_move[cave[x+1][y]]) goto android_e;
1673 if (tab_android_move[cave[x][y+1]]) goto android_s;
1680 next[x][y] = Xandroid;
1684 cave[x][y] = Yandroid_nB;
1685 cave[x][y-1] = Yandroid_n;
1686 next[x][y-1] = Xandroid;
1687 play_element_sound(x, y, SOUND_android_move, Xandroid);
1691 cave[x][y] = Yandroid_neB;
1692 cave[x+1][y-1] = Yandroid_ne;
1693 next[x+1][y-1] = Xandroid;
1694 play_element_sound(x, y, SOUND_android_move, Xandroid);
1698 cave[x][y] = Yandroid_eB;
1699 cave[x+1][y] = Yandroid_e;
1700 next[x+1][y] = Xandroid;
1701 play_element_sound(x, y, SOUND_android_move, Xandroid);
1705 cave[x][y] = Yandroid_seB;
1706 cave[x+1][y+1] = Yandroid_se;
1707 next[x+1][y+1] = Xandroid;
1708 play_element_sound(x, y, SOUND_android_move, Xandroid);
1712 cave[x][y] = Yandroid_sB;
1713 cave[x][y+1] = Yandroid_s;
1714 next[x][y+1] = Xandroid;
1715 play_element_sound(x, y, SOUND_android_move, Xandroid);
1719 cave[x][y] = Yandroid_swB;
1720 cave[x-1][y+1] = Yandroid_sw;
1721 next[x-1][y+1] = Xandroid;
1722 play_element_sound(x, y, SOUND_android_move, Xandroid);
1726 cave[x][y] = Yandroid_wB;
1727 cave[x-1][y] = Yandroid_w;
1728 next[x-1][y] = Xandroid;
1729 play_element_sound(x, y, SOUND_android_move, Xandroid);
1733 cave[x][y] = Yandroid_nwB;
1734 cave[x-1][y-1] = Yandroid_nw;
1735 next[x-1][y-1] = Xandroid;
1736 play_element_sound(x, y, SOUND_android_move, Xandroid);
1740 static void Landroid_1_n(int x, int y)
1742 switch (cave[x][y-1])
1745 case Xacid_splash_e:
1746 case Xacid_splash_w:
1747 cave[x][y] = Yandroid_nB;
1748 next[x][y] = Xblank;
1749 cave[x][y-1] = Yandroid_n;
1750 next[x][y-1] = Xandroid;
1751 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
1762 cave[x][y] = Yandroid_nB;
1763 next[x][y] = Xblank;
1764 if (cave[x+1][y-2] == Xblank)
1765 cave[x+1][y-2] = Xacid_splash_e;
1766 if (cave[x-1][y-2] == Xblank)
1767 cave[x-1][y-2] = Xacid_splash_w;
1768 play_element_sound(x, y, SOUND_acid, Xacid_1);
1777 static void Landroid_2_n(int x, int y)
1779 switch (cave[x][y-1])
1782 case Xacid_splash_e:
1783 case Xacid_splash_w:
1784 cave[x][y] = Yandroid_nB;
1785 next[x][y] = Xblank;
1786 cave[x][y-1] = Yandroid_n;
1787 next[x][y-1] = Xandroid_1_n;
1788 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
1799 cave[x][y] = Yandroid_nB;
1800 next[x][y] = Xblank;
1801 if (cave[x+1][y-2] == Xblank)
1802 cave[x+1][y-2] = Xacid_splash_e;
1803 if (cave[x-1][y-2] == Xblank)
1804 cave[x-1][y-2] = Xacid_splash_w;
1805 play_element_sound(x, y, SOUND_acid, Xacid_1);
1814 static void Landroid_1_e(int x, int y)
1816 switch (cave[x+1][y])
1819 case Xacid_splash_e:
1820 case Xacid_splash_w:
1821 cave[x][y] = Yandroid_eB;
1822 next[x][y] = Xblank;
1823 cave[x+1][y] = Yandroid_e;
1824 next[x+1][y] = Xandroid;
1825 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
1836 cave[x][y] = Yandroid_eB;
1837 next[x][y] = Xblank;
1838 if (cave[x+2][y-1] == Xblank)
1839 cave[x+2][y-1] = Xacid_splash_e;
1840 if (cave[x][y-1] == Xblank)
1841 cave[x][y-1] = Xacid_splash_w;
1842 play_element_sound(x, y, SOUND_acid, Xacid_1);
1851 static void Landroid_2_e(int x, int y)
1853 switch (cave[x+1][y])
1856 case Xacid_splash_e:
1857 case Xacid_splash_w:
1858 cave[x][y] = Yandroid_eB;
1859 next[x][y] = Xblank;
1860 cave[x+1][y] = Yandroid_e;
1861 next[x+1][y] = Xandroid_1_e;
1862 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
1873 cave[x][y] = Yandroid_eB;
1874 next[x][y] = Xblank;
1875 if (cave[x+2][y-1] == Xblank)
1876 cave[x+2][y-1] = Xacid_splash_e;
1877 if (cave[x][y-1] == Xblank)
1878 cave[x][y-1] = Xacid_splash_w;
1879 play_element_sound(x, y, SOUND_acid, Xacid_1);
1888 static void Landroid_1_s(int x, int y)
1890 switch (cave[x][y+1])
1893 case Xacid_splash_e:
1894 case Xacid_splash_w:
1895 cave[x][y] = Yandroid_sB;
1896 next[x][y] = Xblank;
1897 cave[x][y+1] = Yandroid_s;
1898 next[x][y+1] = Xandroid;
1899 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
1910 cave[x][y] = Yandroid_sB;
1911 next[x][y] = Xblank;
1912 if (cave[x+1][y] == Xblank)
1913 cave[x+1][y] = Xacid_splash_e;
1914 if (cave[x-1][y] == Xblank)
1915 cave[x-1][y] = Xacid_splash_w;
1916 play_element_sound(x, y, SOUND_acid, Xacid_1);
1925 static void Landroid_2_s(int x, int y)
1927 switch (cave[x][y+1])
1930 case Xacid_splash_e:
1931 case Xacid_splash_w:
1932 cave[x][y] = Yandroid_sB;
1933 next[x][y] = Xblank;
1934 cave[x][y+1] = Yandroid_s;
1935 next[x][y+1] = Xandroid_1_s;
1936 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
1947 cave[x][y] = Yandroid_sB;
1948 next[x][y] = Xblank;
1949 if (cave[x+1][y] == Xblank)
1950 cave[x+1][y] = Xacid_splash_e;
1951 if (cave[x-1][y] == Xblank)
1952 cave[x-1][y] = Xacid_splash_w;
1953 play_element_sound(x, y, SOUND_acid, Xacid_1);
1962 static void Landroid_1_w(int x, int y)
1964 switch (cave[x-1][y])
1967 case Xacid_splash_e:
1968 case Xacid_splash_w:
1969 cave[x][y] = Yandroid_wB;
1970 next[x][y] = Xblank;
1971 cave[x-1][y] = Yandroid_w;
1972 next[x-1][y] = Xandroid;
1973 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
1984 cave[x][y] = Yandroid_wB;
1985 next[x][y] = Xblank;
1986 if (cave[x][y-1] == Xblank)
1987 cave[x][y-1] = Xacid_splash_e;
1988 if (cave[x-2][y-1] == Xblank)
1989 cave[x-2][y-1] = Xacid_splash_w;
1990 play_element_sound(x, y, SOUND_acid, Xacid_1);
1999 static void Landroid_2_w(int x, int y)
2001 switch (cave[x-1][y])
2004 case Xacid_splash_e:
2005 case Xacid_splash_w:
2006 cave[x][y] = Yandroid_wB;
2007 next[x][y] = Xblank;
2008 cave[x-1][y] = Yandroid_w;
2009 next[x-1][y] = Xandroid_1_w;
2010 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2021 cave[x][y] = Yandroid_wB;
2022 next[x][y] = Xblank;
2023 if (cave[x][y-1] == Xblank)
2024 cave[x][y-1] = Xacid_splash_e;
2025 if (cave[x-2][y-1] == Xblank)
2026 cave[x-2][y-1] = Xacid_splash_w;
2027 play_element_sound(x, y, SOUND_acid, Xacid_1);
2036 static void Leater_n(int x, int y)
2038 if (cave[x+1][y] == Xdiamond)
2040 cave[x+1][y] = Ydiamond_blank;
2041 next[x+1][y] = Xblank;
2042 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2046 if (cave[x][y+1] == Xdiamond)
2048 cave[x][y+1] = Ydiamond_blank;
2049 next[x][y+1] = Xblank;
2050 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2054 if (cave[x-1][y] == Xdiamond)
2056 cave[x-1][y] = Ydiamond_blank;
2057 next[x-1][y] = Xblank;
2058 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2062 if (cave[x][y-1] == Xdiamond)
2064 cave[x][y-1] = Ydiamond_blank;
2065 next[x][y-1] = Xblank;
2066 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2070 switch (cave[x][y-1])
2073 case Xacid_splash_e:
2074 case Xacid_splash_w:
2078 cave[x][y] = Yeater_nB;
2079 next[x][y] = Xblank;
2080 cave[x][y-1] = Yeater_n;
2081 next[x][y-1] = Xeater_n;
2092 cave[x][y] = Yeater_nB;
2093 next[x][y] = Xblank;
2094 if (cave[x+1][y-2] == Xblank)
2095 cave[x+1][y-2] = Xacid_splash_e;
2096 if (cave[x-1][y-2] == Xblank)
2097 cave[x-1][y-2] = Xacid_splash_w;
2098 play_element_sound(x, y, SOUND_acid, Xacid_1);
2102 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2103 play_element_sound(x, y, SOUND_eater, Xeater_n);
2108 static void Leater_e(int x, int y)
2110 if (cave[x][y+1] == Xdiamond)
2112 cave[x][y+1] = Ydiamond_blank;
2113 next[x][y+1] = Xblank;
2114 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2118 if (cave[x-1][y] == Xdiamond)
2120 cave[x-1][y] = Ydiamond_blank;
2121 next[x-1][y] = Xblank;
2122 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2126 if (cave[x][y-1] == Xdiamond)
2128 cave[x][y-1] = Ydiamond_blank;
2129 next[x][y-1] = Xblank;
2130 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2134 if (cave[x+1][y] == Xdiamond)
2136 cave[x+1][y] = Ydiamond_blank;
2137 next[x+1][y] = Xblank;
2138 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2142 switch (cave[x+1][y])
2145 case Xacid_splash_e:
2146 case Xacid_splash_w:
2150 cave[x][y] = Yeater_eB;
2151 next[x][y] = Xblank;
2152 cave[x+1][y] = Yeater_e;
2153 next[x+1][y] = Xeater_e;
2164 cave[x][y] = Yeater_eB;
2165 next[x][y] = Xblank;
2166 if (cave[x+2][y-1] == Xblank)
2167 cave[x+2][y-1] = Xacid_splash_e;
2168 if (cave[x][y-1] == Xblank)
2169 cave[x][y-1] = Xacid_splash_w;
2170 play_element_sound(x, y, SOUND_acid, Xacid_1);
2174 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2175 play_element_sound(x, y, SOUND_eater, Xeater_e);
2180 static void Leater_s(int x, int y)
2182 if (cave[x-1][y] == Xdiamond)
2184 cave[x-1][y] = Ydiamond_blank;
2185 next[x-1][y] = Xblank;
2186 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2190 if (cave[x][y-1] == Xdiamond)
2192 cave[x][y-1] = Ydiamond_blank;
2193 next[x][y-1] = Xblank;
2194 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2198 if (cave[x+1][y] == Xdiamond)
2200 cave[x+1][y] = Ydiamond_blank;
2201 next[x+1][y] = Xblank;
2202 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2206 if (cave[x][y+1] == Xdiamond)
2208 cave[x][y+1] = Ydiamond_blank;
2209 next[x][y+1] = Xblank;
2210 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2214 switch (cave[x][y+1])
2217 case Xacid_splash_e:
2218 case Xacid_splash_w:
2222 cave[x][y] = Yeater_sB;
2223 next[x][y] = Xblank;
2224 cave[x][y+1] = Yeater_s;
2225 next[x][y+1] = Xeater_s;
2236 cave[x][y] = Yeater_sB;
2237 next[x][y] = Xblank;
2238 if (cave[x+1][y] == Xblank)
2239 cave[x+1][y] = Xacid_splash_e;
2240 if (cave[x-1][y] == Xblank)
2241 cave[x-1][y] = Xacid_splash_w;
2242 play_element_sound(x, y, SOUND_acid, Xacid_1);
2246 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2247 play_element_sound(x, y, SOUND_eater, Xeater_s);
2252 static void Leater_w(int x, int y)
2254 if (cave[x][y-1] == Xdiamond)
2256 cave[x][y-1] = Ydiamond_blank;
2257 next[x][y-1] = Xblank;
2258 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2262 if (cave[x+1][y] == Xdiamond)
2264 cave[x+1][y] = Ydiamond_blank;
2265 next[x+1][y] = Xblank;
2266 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2270 if (cave[x][y+1] == Xdiamond)
2272 cave[x][y+1] = Ydiamond_blank;
2273 next[x][y+1] = Xblank;
2274 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2278 if (cave[x-1][y] == Xdiamond)
2280 cave[x-1][y] = Ydiamond_blank;
2281 next[x-1][y] = Xblank;
2282 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2286 switch (cave[x-1][y])
2289 case Xacid_splash_e:
2290 case Xacid_splash_w:
2294 cave[x][y] = Yeater_wB;
2295 next[x][y] = Xblank;
2296 cave[x-1][y] = Yeater_w;
2297 next[x-1][y] = Xeater_w;
2308 cave[x][y] = Yeater_wB;
2309 next[x][y] = Xblank;
2310 if (cave[x][y-1] == Xblank)
2311 cave[x][y-1] = Xacid_splash_e;
2312 if (cave[x-2][y-1] == Xblank)
2313 cave[x-2][y-1] = Xacid_splash_w;
2314 play_element_sound(x, y, SOUND_acid, Xacid_1);
2318 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2319 play_element_sound(x, y, SOUND_eater, Xeater_w);
2324 static void Lalien(int x, int y)
2335 set_nearest_player_xy(x, y, &dx, &dy);
2342 switch (cave[x][y-1])
2345 case Xacid_splash_e:
2346 case Xacid_splash_w:
2350 cave[x][y] = Yalien_nB;
2351 next[x][y] = Xblank;
2352 cave[x][y-1] = Yalien_n;
2353 next[x][y-1] = Xalien_pause;
2354 play_element_sound(x, y, SOUND_alien, Xalien);
2365 cave[x][y] = Yalien_nB;
2366 next[x][y] = Xblank;
2367 if (cave[x+1][y-2] == Xblank)
2368 cave[x+1][y-2] = Xacid_splash_e;
2369 if (cave[x-1][y-2] == Xblank)
2370 cave[x-1][y-2] = Xacid_splash_w;
2371 play_element_sound(x, y, SOUND_acid, Xacid_1);
2377 switch (cave[x][y+1])
2380 case Xacid_splash_e:
2381 case Xacid_splash_w:
2385 cave[x][y] = Yalien_sB;
2386 next[x][y] = Xblank;
2387 cave[x][y+1] = Yalien_s;
2388 next[x][y+1] = Xalien_pause;
2389 play_element_sound(x, y, SOUND_alien, Xalien);
2400 cave[x][y] = Yalien_sB;
2401 next[x][y] = Xblank;
2402 if (cave[x+1][y] == Xblank)
2403 cave[x+1][y] = Xacid_splash_e;
2404 if (cave[x-1][y] == Xblank)
2405 cave[x-1][y] = Xacid_splash_w;
2406 play_element_sound(x, y, SOUND_acid, Xacid_1);
2415 switch (cave[x+1][y])
2418 case Xacid_splash_e:
2419 case Xacid_splash_w:
2423 cave[x][y] = Yalien_eB;
2424 next[x][y] = Xblank;
2425 cave[x+1][y] = Yalien_e;
2426 next[x+1][y] = Xalien_pause;
2427 play_element_sound(x, y, SOUND_alien, Xalien);
2438 cave[x][y] = Yalien_eB;
2439 next[x][y] = Xblank;
2440 if (cave[x+2][y-1] == Xblank)
2441 cave[x+2][y-1] = Xacid_splash_e;
2442 if (cave[x][y-1] == Xblank)
2443 cave[x][y-1] = Xacid_splash_w;
2444 play_element_sound(x, y, SOUND_acid, Xacid_1);
2450 switch (cave[x-1][y])
2453 case Xacid_splash_e:
2454 case Xacid_splash_w:
2458 cave[x][y] = Yalien_wB;
2459 next[x][y] = Xblank;
2460 cave[x-1][y] = Yalien_w;
2461 next[x-1][y] = Xalien_pause;
2462 play_element_sound(x, y, SOUND_alien, Xalien);
2473 cave[x][y] = Yalien_wB;
2474 next[x][y] = Xblank;
2475 if (cave[x][y-1] == Xblank)
2476 cave[x][y-1] = Xacid_splash_e;
2477 if (cave[x-2][y-1] == Xblank)
2478 cave[x-2][y-1] = Xacid_splash_w;
2479 play_element_sound(x, y, SOUND_acid, Xacid_1);
2486 static void Lalien_pause(int x, int y)
2488 next[x][y] = Xalien;
2491 static void Lbug_n(int x, int y)
2493 switch (cave[x][y-1])
2496 case Xacid_splash_e:
2497 case Xacid_splash_w:
2501 cave[x][y] = Ybug_nB;
2502 next[x][y] = Xblank;
2503 cave[x][y-1] = Ybug_n;
2504 next[x][y-1] = Xbug_1_n;
2505 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2516 cave[x][y] = Ybug_nB;
2517 next[x][y] = Xblank;
2518 if (cave[x+1][y-2] == Xblank)
2519 cave[x+1][y-2] = Xacid_splash_e;
2520 if (cave[x-1][y-2] == Xblank)
2521 cave[x-1][y-2] = Xacid_splash_w;
2522 play_element_sound(x, y, SOUND_acid, Xacid_1);
2526 cave[x][y] = Ybug_n_w;
2527 next[x][y] = Xbug_2_w;
2528 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2533 static void Lbug_1_n(int x, int y)
2535 if (tab_amoeba[cave[x][y-1]] ||
2536 tab_amoeba[cave[x+1][y]] ||
2537 tab_amoeba[cave[x][y+1]] ||
2538 tab_amoeba[cave[x-1][y]])
2540 Lboom_bug(x, y, Xbug_1_n);
2545 switch (cave[x+1][y])
2548 case Xacid_splash_e:
2549 case Xacid_splash_w:
2561 cave[x][y] = Ybug_n_e;
2562 next[x][y] = Xbug_2_e;
2563 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2572 static void Lbug_2_n(int x, int y)
2574 if (tab_amoeba[cave[x][y-1]] ||
2575 tab_amoeba[cave[x+1][y]] ||
2576 tab_amoeba[cave[x][y+1]] ||
2577 tab_amoeba[cave[x-1][y]])
2579 Lboom_bug(x, y, Xbug_2_n);
2587 static void Lbug_e(int x, int y)
2589 switch (cave[x+1][y])
2592 case Xacid_splash_e:
2593 case Xacid_splash_w:
2597 cave[x][y] = Ybug_eB;
2598 next[x][y] = Xblank;
2599 cave[x+1][y] = Ybug_e;
2600 next[x+1][y] = Xbug_1_e;
2601 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2612 cave[x][y] = Ybug_eB;
2613 next[x][y] = Xblank;
2614 if (cave[x+2][y-1] == Xblank)
2615 cave[x+2][y-1] = Xacid_splash_e;
2616 if (cave[x][y-1] == Xblank)
2617 cave[x][y-1] = Xacid_splash_w;
2618 play_element_sound(x, y, SOUND_acid, Xacid_1);
2622 cave[x][y] = Ybug_e_n;
2623 next[x][y] = Xbug_2_n;
2624 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2629 static void Lbug_1_e(int x, int y)
2631 if (tab_amoeba[cave[x][y-1]] ||
2632 tab_amoeba[cave[x+1][y]] ||
2633 tab_amoeba[cave[x][y+1]] ||
2634 tab_amoeba[cave[x-1][y]])
2636 Lboom_bug(x, y, Xbug_1_e);
2641 switch (cave[x][y+1])
2644 case Xacid_splash_e:
2645 case Xacid_splash_w:
2657 cave[x][y] = Ybug_e_s;
2658 next[x][y] = Xbug_2_s;
2659 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2668 static void Lbug_2_e(int x, int y)
2670 if (tab_amoeba[cave[x][y-1]] ||
2671 tab_amoeba[cave[x+1][y]] ||
2672 tab_amoeba[cave[x][y+1]] ||
2673 tab_amoeba[cave[x-1][y]])
2675 Lboom_bug(x, y, Xbug_2_e);
2683 static void Lbug_s(int x, int y)
2685 switch (cave[x][y+1])
2688 case Xacid_splash_e:
2689 case Xacid_splash_w:
2693 cave[x][y] = Ybug_sB;
2694 next[x][y] = Xblank;
2695 cave[x][y+1] = Ybug_s;
2696 next[x][y+1] = Xbug_1_s;
2697 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2708 cave[x][y] = Ybug_sB;
2709 next[x][y] = Xblank;
2710 if (cave[x+1][y] == Xblank)
2711 cave[x+1][y] = Xacid_splash_e;
2712 if (cave[x-1][y] == Xblank)
2713 cave[x-1][y] = Xacid_splash_w;
2714 play_element_sound(x, y, SOUND_acid, Xacid_1);
2718 cave[x][y] = Ybug_s_e;
2719 next[x][y] = Xbug_2_e;
2720 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2725 static void Lbug_1_s(int x, int y)
2727 if (tab_amoeba[cave[x][y-1]] ||
2728 tab_amoeba[cave[x+1][y]] ||
2729 tab_amoeba[cave[x][y+1]] ||
2730 tab_amoeba[cave[x-1][y]])
2732 Lboom_bug(x, y, Xbug_1_s);
2737 switch (cave[x-1][y])
2740 case Xacid_splash_e:
2741 case Xacid_splash_w:
2753 cave[x][y] = Ybug_s_w;
2754 next[x][y] = Xbug_2_w;
2755 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2764 static void Lbug_2_s(int x, int y)
2766 if (tab_amoeba[cave[x][y-1]] ||
2767 tab_amoeba[cave[x+1][y]] ||
2768 tab_amoeba[cave[x][y+1]] ||
2769 tab_amoeba[cave[x-1][y]])
2771 Lboom_bug(x, y, Xbug_2_s);
2779 static void Lbug_w(int x, int y)
2781 switch (cave[x-1][y])
2784 case Xacid_splash_e:
2785 case Xacid_splash_w:
2789 cave[x][y] = Ybug_wB;
2790 next[x][y] = Xblank;
2791 cave[x-1][y] = Ybug_w;
2792 next[x-1][y] = Xbug_1_w;
2793 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
2804 cave[x][y] = Ybug_wB;
2805 next[x][y] = Xblank;
2806 if (cave[x][y-1] == Xblank)
2807 cave[x][y-1] = Xacid_splash_e;
2808 if (cave[x-2][y-1] == Xblank)
2809 cave[x-2][y-1] = Xacid_splash_w;
2810 play_element_sound(x, y, SOUND_acid, Xacid_1);
2814 cave[x][y] = Ybug_w_s;
2815 next[x][y] = Xbug_2_s;
2816 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
2821 static void Lbug_1_w(int x, int y)
2823 if (tab_amoeba[cave[x][y-1]] ||
2824 tab_amoeba[cave[x+1][y]] ||
2825 tab_amoeba[cave[x][y+1]] ||
2826 tab_amoeba[cave[x-1][y]])
2828 Lboom_bug(x, y, Xbug_1_w);
2833 switch (cave[x][y-1])
2836 case Xacid_splash_e:
2837 case Xacid_splash_w:
2849 cave[x][y] = Ybug_w_n;
2850 next[x][y] = Xbug_2_n;
2851 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
2860 static void Lbug_2_w(int x, int y)
2862 if (tab_amoeba[cave[x][y-1]] ||
2863 tab_amoeba[cave[x+1][y]] ||
2864 tab_amoeba[cave[x][y+1]] ||
2865 tab_amoeba[cave[x-1][y]])
2867 Lboom_bug(x, y, Xbug_2_w);
2875 static void Ltank_n(int x, int y)
2877 switch (cave[x][y-1])
2880 case Xacid_splash_e:
2881 case Xacid_splash_w:
2885 cave[x][y] = Ytank_nB;
2886 next[x][y] = Xblank;
2887 cave[x][y-1] = Ytank_n;
2888 next[x][y-1] = Xtank_1_n;
2889 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
2900 cave[x][y] = Ytank_nB;
2901 next[x][y] = Xblank;
2902 if (cave[x+1][y-2] == Xblank)
2903 cave[x+1][y-2] = Xacid_splash_e;
2904 if (cave[x-1][y-2] == Xblank)
2905 cave[x-1][y-2] = Xacid_splash_w;
2906 play_element_sound(x, y, SOUND_acid, Xacid_1);
2910 cave[x][y] = Ytank_n_e;
2911 next[x][y] = Xtank_2_e;
2912 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
2917 static void Ltank_1_n(int x, int y)
2919 if (tab_amoeba[cave[x][y-1]] ||
2920 tab_amoeba[cave[x+1][y]] ||
2921 tab_amoeba[cave[x][y+1]] ||
2922 tab_amoeba[cave[x-1][y]])
2924 Lboom_tank(x, y, Xtank_1_n);
2929 switch (cave[x-1][y])
2932 case Xacid_splash_e:
2933 case Xacid_splash_w:
2945 cave[x][y] = Ytank_n_w;
2946 next[x][y] = Xtank_2_w;
2947 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
2956 static void Ltank_2_n(int x, int y)
2958 if (tab_amoeba[cave[x][y-1]] ||
2959 tab_amoeba[cave[x+1][y]] ||
2960 tab_amoeba[cave[x][y+1]] ||
2961 tab_amoeba[cave[x-1][y]])
2963 Lboom_tank(x, y, Xtank_2_n);
2971 static void Ltank_e(int x, int y)
2973 switch (cave[x+1][y])
2976 case Xacid_splash_e:
2977 case Xacid_splash_w:
2981 cave[x][y] = Ytank_eB;
2982 next[x][y] = Xblank;
2983 cave[x+1][y] = Ytank_e;
2984 next[x+1][y] = Xtank_1_e;
2985 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
2996 cave[x][y] = Ytank_eB;
2997 next[x][y] = Xblank;
2998 if (cave[x+2][y-1] == Xblank)
2999 cave[x+2][y-1] = Xacid_splash_e;
3000 if (cave[x][y-1] == Xblank)
3001 cave[x][y-1] = Xacid_splash_w;
3002 play_element_sound(x, y, SOUND_acid, Xacid_1);
3006 cave[x][y] = Ytank_e_s;
3007 next[x][y] = Xtank_2_s;
3008 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3013 static void Ltank_1_e(int x, int y)
3015 if (tab_amoeba[cave[x][y-1]] ||
3016 tab_amoeba[cave[x+1][y]] ||
3017 tab_amoeba[cave[x][y+1]] ||
3018 tab_amoeba[cave[x-1][y]])
3020 Lboom_tank(x, y, Xtank_1_e);
3025 switch (cave[x][y-1])
3028 case Xacid_splash_e:
3029 case Xacid_splash_w:
3041 cave[x][y] = Ytank_e_n;
3042 next[x][y] = Xtank_2_n;
3043 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3052 static void Ltank_2_e(int x, int y)
3054 if (tab_amoeba[cave[x][y-1]] ||
3055 tab_amoeba[cave[x+1][y]] ||
3056 tab_amoeba[cave[x][y+1]] ||
3057 tab_amoeba[cave[x-1][y]])
3059 Lboom_tank(x, y, Xtank_2_e);
3067 static void Ltank_s(int x, int y)
3069 switch (cave[x][y+1])
3072 case Xacid_splash_e:
3073 case Xacid_splash_w:
3077 cave[x][y] = Ytank_sB;
3078 next[x][y] = Xblank;
3079 cave[x][y+1] = Ytank_s;
3080 next[x][y+1] = Xtank_1_s;
3081 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3092 cave[x][y] = Ytank_sB;
3093 next[x][y] = Xblank;
3094 if (cave[x+1][y] == Xblank)
3095 cave[x+1][y] = Xacid_splash_e;
3096 if (cave[x-1][y] == Xblank)
3097 cave[x-1][y] = Xacid_splash_w;
3098 play_element_sound(x, y, SOUND_acid, Xacid_1);
3102 cave[x][y] = Ytank_s_w;
3103 next[x][y] = Xtank_2_w;
3104 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3109 static void Ltank_1_s(int x, int y)
3111 if (tab_amoeba[cave[x][y-1]] ||
3112 tab_amoeba[cave[x+1][y]] ||
3113 tab_amoeba[cave[x][y+1]] ||
3114 tab_amoeba[cave[x-1][y]])
3116 Lboom_tank(x, y, Xtank_1_s);
3121 switch (cave[x+1][y])
3124 case Xacid_splash_e:
3125 case Xacid_splash_w:
3137 cave[x][y] = Ytank_s_e;
3138 next[x][y] = Xtank_2_e;
3139 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3148 static void Ltank_2_s(int x, int y)
3150 if (tab_amoeba[cave[x][y-1]] ||
3151 tab_amoeba[cave[x+1][y]] ||
3152 tab_amoeba[cave[x][y+1]] ||
3153 tab_amoeba[cave[x-1][y]])
3155 Lboom_tank(x, y, Xtank_2_s);
3163 static void Ltank_w(int x, int y)
3165 switch (cave[x-1][y])
3168 case Xacid_splash_e:
3169 case Xacid_splash_w:
3173 cave[x][y] = Ytank_wB;
3174 next[x][y] = Xblank;
3175 cave[x-1][y] = Ytank_w;
3176 next[x-1][y] = Xtank_1_w;
3177 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3188 cave[x][y] = Ytank_wB;
3189 next[x][y] = Xblank;
3190 if (cave[x][y-1] == Xblank)
3191 cave[x][y-1] = Xacid_splash_e;
3192 if (cave[x-2][y-1] == Xblank)
3193 cave[x-2][y-1] = Xacid_splash_w;
3194 play_element_sound(x, y, SOUND_acid, Xacid_1);
3198 cave[x][y] = Ytank_w_n;
3199 next[x][y] = Xtank_2_n;
3200 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3205 static void Ltank_1_w(int x, int y)
3207 if (tab_amoeba[cave[x][y-1]] ||
3208 tab_amoeba[cave[x+1][y]] ||
3209 tab_amoeba[cave[x][y+1]] ||
3210 tab_amoeba[cave[x-1][y]])
3212 Lboom_tank(x, y, Xtank_1_w);
3217 switch (cave[x][y+1])
3220 case Xacid_splash_e:
3221 case Xacid_splash_w:
3233 cave[x][y] = Ytank_w_s;
3234 next[x][y] = Xtank_2_s;
3235 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3244 static void Ltank_2_w(int x, int y)
3246 if (tab_amoeba[cave[x][y-1]] ||
3247 tab_amoeba[cave[x+1][y]] ||
3248 tab_amoeba[cave[x][y+1]] ||
3249 tab_amoeba[cave[x-1][y]])
3251 Lboom_tank(x, y, Xtank_2_w);
3259 static void Lemerald(int x, int y)
3261 switch (cave[x][y+1])
3264 case Xacid_splash_e:
3265 case Xacid_splash_w:
3266 cave[x][y] = Yemerald_sB;
3267 next[x][y] = Xblank;
3268 cave[x][y+1] = Yemerald_s;
3269 next[x][y+1] = Xemerald_fall;
3280 cave[x][y] = Yemerald_sB;
3281 next[x][y] = Xblank;
3282 if (cave[x+1][y] == Xblank)
3283 cave[x+1][y] = Xacid_splash_e;
3284 if (cave[x-1][y] == Xblank)
3285 cave[x-1][y] = Xacid_splash_w;
3286 play_element_sound(x, y, SOUND_acid, Xacid_1);
3305 case Xemerald_pause:
3307 case Xdiamond_pause:
3344 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3346 cave[x][y] = Yemerald_eB;
3347 next[x][y] = Xblank;
3348 cave[x+1][y] = Yemerald_e;
3349 next[x+1][y] = Xemerald_pause;
3353 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3355 cave[x][y] = Yemerald_wB;
3356 next[x][y] = Xblank;
3357 cave[x-1][y] = Yemerald_w;
3358 next[x-1][y] = Xemerald_pause;
3364 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3366 cave[x][y] = Yemerald_wB;
3367 next[x][y] = Xblank;
3368 cave[x-1][y] = Yemerald_w;
3369 next[x-1][y] = Xemerald_pause;
3373 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3375 cave[x][y] = Yemerald_eB;
3376 next[x][y] = Xblank;
3377 cave[x+1][y] = Yemerald_e;
3378 next[x+1][y] = Xemerald_pause;
3384 if (++lev.shine_cnt > 50)
3386 lev.shine_cnt = RANDOM(8);
3387 cave[x][y] = Xemerald_shine;
3394 static void Lemerald_pause(int x, int y)
3396 switch (cave[x][y+1])
3399 case Xacid_splash_e:
3400 case Xacid_splash_w:
3401 cave[x][y] = Yemerald_sB;
3402 next[x][y] = Xblank;
3403 cave[x][y+1] = Yemerald_s;
3404 next[x][y+1] = Xemerald_fall;
3415 cave[x][y] = Yemerald_sB;
3416 next[x][y] = Xblank;
3417 if (cave[x+1][y] == Xblank)
3418 cave[x+1][y] = Xacid_splash_e;
3419 if (cave[x-1][y] == Xblank)
3420 cave[x-1][y] = Xacid_splash_w;
3421 play_element_sound(x, y, SOUND_acid, Xacid_1);
3425 cave[x][y] = Xemerald;
3426 next[x][y] = Xemerald;
3431 static void Lemerald_fall(int x, int y)
3433 switch (cave[x][y+1])
3436 case Xacid_splash_e:
3437 case Xacid_splash_w:
3439 cave[x][y] = Yemerald_sB;
3440 next[x][y] = Xblank;
3441 cave[x][y+1] = Yemerald_s;
3442 next[x][y+1] = Xemerald_fall;
3453 cave[x][y] = Yemerald_sB;
3454 next[x][y] = Xblank;
3455 if (cave[x+1][y] == Xblank)
3456 cave[x+1][y] = Xacid_splash_e;
3457 if (cave[x-1][y] == Xblank)
3458 cave[x-1][y] = Xacid_splash_w;
3459 play_element_sound(x, y, SOUND_acid, Xacid_1);
3463 if (lev.wonderwall_time)
3465 lev.wonderwall_state = 1;
3466 cave[x][y] = Yemerald_sB;
3467 if (tab_blank[cave[x][y+2]])
3469 cave[x][y+2] = Ydiamond_s;
3470 next[x][y+2] = Xdiamond_fall;
3473 next[x][y] = Xblank;
3474 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3479 cave[x][y] = Xemerald;
3480 next[x][y] = Xemerald;
3481 play_element_sound(x, y, SOUND_diamond, Xemerald);
3486 static void Ldiamond(int x, int y)
3488 switch (cave[x][y+1])
3491 case Xacid_splash_e:
3492 case Xacid_splash_w:
3493 cave[x][y] = Ydiamond_sB;
3494 next[x][y] = Xblank;
3495 cave[x][y+1] = Ydiamond_s;
3496 next[x][y+1] = Xdiamond_fall;
3507 cave[x][y] = Ydiamond_sB;
3508 next[x][y] = Xblank;
3509 if (cave[x+1][y] == Xblank)
3510 cave[x+1][y] = Xacid_splash_e;
3511 if (cave[x-1][y] == Xblank)
3512 cave[x-1][y] = Xacid_splash_w;
3513 play_element_sound(x, y, SOUND_acid, Xacid_1);
3532 case Xemerald_pause:
3534 case Xdiamond_pause:
3571 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3573 cave[x][y] = Ydiamond_eB;
3574 next[x][y] = Xblank;
3575 cave[x+1][y] = Ydiamond_e;
3576 next[x+1][y] = Xdiamond_pause;
3580 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3582 cave[x][y] = Ydiamond_wB;
3583 next[x][y] = Xblank;
3584 cave[x-1][y] = Ydiamond_w;
3585 next[x-1][y] = Xdiamond_pause;
3591 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3593 cave[x][y] = Ydiamond_wB;
3594 next[x][y] = Xblank;
3595 cave[x-1][y] = Ydiamond_w;
3596 next[x-1][y] = Xdiamond_pause;
3600 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3602 cave[x][y] = Ydiamond_eB;
3603 next[x][y] = Xblank;
3604 cave[x+1][y] = Ydiamond_e;
3605 next[x+1][y] = Xdiamond_pause;
3611 if (++lev.shine_cnt > 50)
3613 lev.shine_cnt = RANDOM(8);
3614 cave[x][y] = Xdiamond_shine;
3621 static void Ldiamond_pause(int x, int y)
3623 switch (cave[x][y+1])
3626 case Xacid_splash_e:
3627 case Xacid_splash_w:
3628 cave[x][y] = Ydiamond_sB;
3629 next[x][y] = Xblank;
3630 cave[x][y+1] = Ydiamond_s;
3631 next[x][y+1] = Xdiamond_fall;
3642 cave[x][y] = Ydiamond_sB;
3643 next[x][y] = Xblank;
3644 if (cave[x+1][y] == Xblank)
3645 cave[x+1][y] = Xacid_splash_e;
3646 if (cave[x-1][y] == Xblank)
3647 cave[x-1][y] = Xacid_splash_w;
3648 play_element_sound(x, y, SOUND_acid, Xacid_1);
3652 cave[x][y] = Xdiamond;
3653 next[x][y] = Xdiamond;
3658 static void Ldiamond_fall(int x, int y)
3660 switch (cave[x][y+1])
3663 case Xacid_splash_e:
3664 case Xacid_splash_w:
3666 cave[x][y] = Ydiamond_sB;
3667 next[x][y] = Xblank;
3668 cave[x][y+1] = Ydiamond_s;
3669 next[x][y+1] = Xdiamond_fall;
3680 cave[x][y] = Ydiamond_sB;
3681 next[x][y] = Xblank;
3682 if (cave[x+1][y] == Xblank)
3683 cave[x+1][y] = Xacid_splash_e;
3684 if (cave[x-1][y] == Xblank)
3685 cave[x-1][y] = Xacid_splash_w;
3686 play_element_sound(x, y, SOUND_acid, Xacid_1);
3690 if (lev.wonderwall_time)
3692 lev.wonderwall_state = 1;
3693 cave[x][y] = Ydiamond_sB;
3694 if (tab_blank[cave[x][y+2]])
3696 cave[x][y+2] = Ystone_s;
3697 next[x][y+2] = Xstone_fall;
3700 next[x][y] = Xblank;
3701 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3706 cave[x][y] = Xdiamond;
3707 next[x][y] = Xdiamond;
3708 play_element_sound(x, y, SOUND_diamond, Xdiamond);
3713 static void Lstone(int x, int y)
3715 switch (cave[x][y+1])
3718 case Xacid_splash_e:
3719 case Xacid_splash_w:
3722 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3732 cave[x][y] = Ystone_sB;
3733 next[x][y] = Xblank;
3734 cave[x][y+1] = Ystone_s;
3735 next[x][y+1] = Xstone_fall;
3746 cave[x][y] = Ystone_sB;
3747 next[x][y] = Xblank;
3748 if (cave[x+1][y] == Xblank)
3749 cave[x+1][y] = Xacid_splash_e;
3750 if (cave[x-1][y] == Xblank)
3751 cave[x-1][y] = Xacid_splash_w;
3752 play_element_sound(x, y, SOUND_acid, Xacid_1);
3756 cave[x][y] = Xsand_stonein_1;
3757 next[x][y] = Xsand_stonein_2;
3758 cave[x][y+1] = Xsand_sandstone_1;
3759 next[x][y+1] = Xsand_sandstone_2;
3778 case Xemerald_pause:
3780 case Xdiamond_pause:
3810 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3812 cave[x][y] = Ystone_eB;
3813 next[x][y] = Xblank;
3814 cave[x+1][y] = Ystone_e;
3815 next[x+1][y] = Xstone_pause;
3819 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3821 cave[x][y] = Ystone_wB;
3822 next[x][y] = Xblank;
3823 cave[x-1][y] = Ystone_w;
3824 next[x-1][y] = Xstone_pause;
3830 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3832 cave[x][y] = Ystone_wB;
3833 next[x][y] = Xblank;
3834 cave[x-1][y] = Ystone_w;
3835 next[x-1][y] = Xstone_pause;
3839 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3841 cave[x][y] = Ystone_eB;
3842 next[x][y] = Xblank;
3843 cave[x+1][y] = Ystone_e;
3844 next[x+1][y] = Xstone_pause;
3851 static void Lstone_pause(int x, int y)
3853 switch (cave[x][y+1])
3856 case Xacid_splash_e:
3857 case Xacid_splash_w:
3858 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3868 cave[x][y] = Ystone_sB;
3869 next[x][y] = Xblank;
3870 cave[x][y+1] = Ystone_s;
3871 next[x][y+1] = Xstone_fall;
3882 cave[x][y] = Ystone_sB;
3883 next[x][y] = Xblank;
3884 if (cave[x+1][y] == Xblank)
3885 cave[x+1][y] = Xacid_splash_e;
3886 if (cave[x-1][y] == Xblank)
3887 cave[x-1][y] = Xacid_splash_w;
3888 play_element_sound(x, y, SOUND_acid, Xacid_1);
3892 cave[x][y] = Xstone;
3893 next[x][y] = Xstone;
3898 static void Lstone_fall(int x, int y)
3900 switch (cave[x][y+1])
3903 case Xacid_splash_e:
3904 case Xacid_splash_w:
3906 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3916 cave[x][y] = Ystone_sB;
3917 next[x][y] = Xblank;
3918 cave[x][y+1] = Ystone_s;
3919 next[x][y+1] = Xstone_fall;
3930 cave[x][y] = Ystone_sB;
3931 next[x][y] = Xblank;
3932 if (cave[x+1][y] == Xblank)
3933 cave[x+1][y] = Xacid_splash_e;
3934 if (cave[x-1][y] == Xblank)
3935 cave[x-1][y] = Xacid_splash_w;
3936 play_element_sound(x, y, SOUND_acid, Xacid_1);
3941 next[x][y] = Xstone;
3942 cave[x][y+1] = Ynut_stone;
3943 next[x][y+1] = Xemerald;
3944 play_element_sound(x, y, SOUND_crack, Xnut);
3945 score += lev.nut_score;
3956 cave[x][y] = Ystone_sB;
3957 cave[x][y+1] = Ybug_stone;
3958 Lboom_bug(x, y+1, Xstone_fall);
3959 score += lev.bug_score;
3970 cave[x][y] = Ystone_sB;
3971 cave[x][y+1] = Ytank_stone;
3972 Lboom_tank(x, y+1, Xstone_fall);
3973 score += lev.tank_score;
3979 switch (cave[x+1][y+1])
3982 case Xacid_splash_e:
3983 case Xacid_splash_w:
3986 cave[x][y+1] = Xspring_e;
3990 cave[x][y+1] = Xspring_w;
3996 switch (cave[x-1][y+1])
3999 case Xacid_splash_e:
4000 case Xacid_splash_w:
4003 cave[x][y+1] = Xspring_w;
4006 cave[x][y+1] = Xspring_e;
4011 next[x][y] = Xstone;
4018 cave[x][y] = Ystone_sB;
4019 cave[x][y+1] = Yeater_stone;
4020 Lboom_eater(x, y+1, Xstone_fall);
4021 score += lev.eater_score;
4026 cave[x][y] = Ystone_sB;
4027 cave[x][y+1] = Yalien_stone;
4028 Lboom_tank(x, y+1, Xstone_fall);
4029 score += lev.alien_score;
4033 case Xdiamond_pause:
4034 switch (cave[x][y+2])
4037 case Xacid_splash_e:
4038 case Xacid_splash_w:
4082 next[x][y] = Xstone;
4083 play_element_sound(x, y, SOUND_stone, Xstone);
4087 cave[x][y] = Ystone_sB;
4088 next[x][y] = Xblank;
4089 cave[x][y+1] = Ydiamond_stone;
4090 next[x][y+1] = Xstone_pause;
4091 play_element_sound(x, y, SOUND_squash, Xdiamond);
4096 cave[x][y+1] = Ybomb_blank;
4097 Lboom_tank(x, y+1, Xstone_fall);
4101 if (lev.wonderwall_time)
4103 lev.wonderwall_state = 1;
4104 cave[x][y] = Ystone_sB;
4106 if (tab_blank[cave[x][y+2]])
4108 cave[x][y+2] = Yemerald_s;
4109 next[x][y+2] = Xemerald_fall;
4112 next[x][y] = Xblank;
4113 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4118 cave[x][y] = Xstone;
4119 next[x][y] = Xstone;
4120 play_element_sound(x, y, SOUND_stone, Xstone);
4125 static void Lbomb(int x, int y)
4127 switch (cave[x][y+1])
4130 case Xacid_splash_e:
4131 case Xacid_splash_w:
4132 cave[x][y] = Ybomb_sB;
4133 next[x][y] = Xblank;
4134 cave[x][y+1] = Ybomb_s;
4135 next[x][y+1] = Xbomb_fall;
4146 cave[x][y] = Ybomb_sB;
4147 next[x][y] = Xblank;
4148 if (cave[x+1][y] == Xblank)
4149 cave[x+1][y] = Xacid_splash_e;
4150 if (cave[x-1][y] == Xblank)
4151 cave[x-1][y] = Xacid_splash_w;
4152 play_element_sound(x, y, SOUND_acid, Xacid_1);
4171 case Xemerald_pause:
4173 case Xdiamond_pause:
4201 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4203 cave[x][y] = Ybomb_eB;
4204 next[x][y] = Xblank;
4205 cave[x+1][y] = Ybomb_e;
4206 next[x+1][y] = Xbomb_pause;
4210 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4212 cave[x][y] = Ybomb_wB;
4213 next[x][y] = Xblank;
4214 cave[x-1][y] = Ybomb_w;
4215 next[x-1][y] = Xbomb_pause;
4221 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4223 cave[x][y] = Ybomb_wB;
4224 next[x][y] = Xblank;
4225 cave[x-1][y] = Ybomb_w;
4226 next[x-1][y] = Xbomb_pause;
4230 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4232 cave[x][y] = Ybomb_eB;
4233 next[x][y] = Xblank;
4234 cave[x+1][y] = Ybomb_e;
4235 next[x+1][y] = Xbomb_pause;
4242 static void Lbomb_pause(int x, int y)
4244 switch (cave[x][y+1])
4247 case Xacid_splash_e:
4248 case Xacid_splash_w:
4249 cave[x][y] = Ybomb_sB;
4250 next[x][y] = Xblank;
4251 cave[x][y+1] = Ybomb_s;
4252 next[x][y+1] = Xbomb_fall;
4263 cave[x][y] = Ybomb_sB;
4264 next[x][y] = Xblank;
4265 if (cave[x+1][y] == Xblank)
4266 cave[x+1][y] = Xacid_splash_e;
4267 if (cave[x-1][y] == Xblank)
4268 cave[x-1][y] = Xacid_splash_w;
4269 play_element_sound(x, y, SOUND_acid, Xacid_1);
4279 static void Lbomb_fall(int x, int y)
4281 switch (cave[x][y+1])
4284 case Xacid_splash_e:
4285 case Xacid_splash_w:
4286 cave[x][y] = Ybomb_sB;
4287 next[x][y] = Xblank;
4288 cave[x][y+1] = Ybomb_s;
4289 next[x][y+1] = Xbomb_fall;
4300 cave[x][y] = Ybomb_sB;
4301 next[x][y] = Xblank;
4302 if (cave[x+1][y] == Xblank)
4303 cave[x+1][y] = Xacid_splash_e;
4304 if (cave[x-1][y] == Xblank)
4305 cave[x-1][y] = Xacid_splash_w;
4306 play_element_sound(x, y, SOUND_acid, Xacid_1);
4310 cave[x][y] = Ybomb_blank;
4311 Lboom_tank(x, y, Xbomb_fall);
4316 static void Lnut(int x, int y)
4318 switch (cave[x][y+1])
4321 case Xacid_splash_e:
4322 case Xacid_splash_w:
4323 cave[x][y] = Ynut_sB;
4324 next[x][y] = Xblank;
4325 cave[x][y+1] = Ynut_s;
4326 next[x][y+1] = Xnut_fall;
4337 cave[x][y] = Ynut_sB;
4338 next[x][y] = Xblank;
4339 if (cave[x+1][y] == Xblank)
4340 cave[x+1][y] = Xacid_splash_e;
4341 if (cave[x-1][y] == Xblank)
4342 cave[x-1][y] = Xacid_splash_w;
4343 play_element_sound(x, y, SOUND_acid, Xacid_1);
4362 case Xemerald_pause:
4364 case Xdiamond_pause:
4392 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4394 cave[x][y] = Ynut_eB;
4395 next[x][y] = Xblank;
4396 cave[x+1][y] = Ynut_e;
4397 next[x+1][y] = Xnut_pause;
4401 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4403 cave[x][y] = Ynut_wB;
4404 next[x][y] = Xblank;
4405 cave[x-1][y] = Ynut_w;
4406 next[x-1][y] = Xnut_pause;
4412 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4414 cave[x][y] = Ynut_wB;
4415 next[x][y] = Xblank;
4416 cave[x-1][y] = Ynut_w;
4417 next[x-1][y] = Xnut_pause;
4421 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4423 cave[x][y] = Ynut_eB;
4424 next[x][y] = Xblank;
4425 cave[x+1][y] = Ynut_e;
4426 next[x+1][y] = Xnut_pause;
4433 static void Lnut_pause(int x, int y)
4435 switch (cave[x][y+1])
4438 case Xacid_splash_e:
4439 case Xacid_splash_w:
4440 cave[x][y] = Ynut_sB;
4441 next[x][y] = Xblank;
4442 cave[x][y+1] = Ynut_s;
4443 next[x][y+1] = Xnut_fall;
4454 cave[x][y] = Ynut_sB;
4455 next[x][y] = Xblank;
4456 if (cave[x+1][y] == Xblank)
4457 cave[x+1][y] = Xacid_splash_e;
4458 if (cave[x-1][y] == Xblank)
4459 cave[x-1][y] = Xacid_splash_w;
4460 play_element_sound(x, y, SOUND_acid, Xacid_1);
4470 static void Lnut_fall(int x, int y)
4472 switch (cave[x][y+1])
4475 case Xacid_splash_e:
4476 case Xacid_splash_w:
4478 cave[x][y] = Ynut_sB;
4479 next[x][y] = Xblank;
4480 cave[x][y+1] = Ynut_s;
4481 next[x][y+1] = Xnut_fall;
4492 cave[x][y] = Ynut_sB;
4493 next[x][y] = Xblank;
4494 if (cave[x+1][y] == Xblank)
4495 cave[x+1][y] = Xacid_splash_e;
4496 if (cave[x-1][y] == Xblank)
4497 cave[x-1][y] = Xacid_splash_w;
4498 play_element_sound(x, y, SOUND_acid, Xacid_1);
4504 play_element_sound(x, y, SOUND_nut, Xnut);
4509 static void Lspring(int x, int y)
4511 switch (cave[x][y+1])
4514 case Xacid_splash_e:
4515 case Xacid_splash_w:
4518 cave[x][y] = Yspring_sB;
4519 next[x][y] = Xblank;
4520 cave[x][y+1] = Yspring_s;
4521 next[x][y+1] = Xspring_fall;
4532 cave[x][y] = Yspring_sB;
4533 next[x][y] = Xblank;
4534 if (cave[x+1][y] == Xblank)
4535 cave[x+1][y] = Xacid_splash_e;
4536 if (cave[x-1][y] == Xblank)
4537 cave[x-1][y] = Xacid_splash_w;
4538 play_element_sound(x, y, SOUND_acid, Xacid_1);
4557 case Xemerald_pause:
4559 case Xdiamond_pause:
4587 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4589 cave[x][y] = Yspring_eB;
4590 next[x][y] = Xblank;
4591 cave[x+1][y] = Yspring_e;
4592 if (cave[x][y+1] == Xbumper)
4593 cave[x][y+1] = XbumperB;
4596 next[x+1][y] = Xspring_e;
4598 next[x+1][y] = Xspring_pause;
4603 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4605 cave[x][y] = Yspring_wB;
4606 next[x][y] = Xblank;
4607 cave[x-1][y] = Yspring_w;
4608 if (cave[x][y+1] == Xbumper)
4609 cave[x][y+1] = XbumperB;
4612 next[x-1][y] = Xspring_w;
4614 next[x-1][y] = Xspring_pause;
4621 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4623 cave[x][y] = Yspring_wB;
4624 next[x][y] = Xblank;
4625 cave[x-1][y] = Yspring_w;
4626 if (cave[x][y+1] == Xbumper)
4627 cave[x][y+1] = XbumperB;
4630 next[x-1][y] = Xspring_w;
4632 next[x-1][y] = Xspring_pause;
4637 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4639 cave[x][y] = Yspring_eB;
4640 next[x][y] = Xblank;
4641 cave[x+1][y] = Yspring_e;
4642 if (cave[x][y+1] == Xbumper)
4643 cave[x][y+1] = XbumperB;
4646 next[x+1][y] = Xspring_e;
4648 next[x+1][y] = Xspring_pause;
4656 static void Lspring_pause(int x, int y)
4658 switch (cave[x][y+1])
4661 case Xacid_splash_e:
4662 case Xacid_splash_w:
4663 cave[x][y] = Yspring_sB;
4664 next[x][y] = Xblank;
4665 cave[x][y+1] = Yspring_s;
4666 next[x][y+1] = Xspring_fall;
4677 cave[x][y] = Yspring_sB;
4678 next[x][y] = Xblank;
4679 if (cave[x+1][y] == Xblank)
4680 cave[x+1][y] = Xacid_splash_e;
4681 if (cave[x-1][y] == Xblank)
4682 cave[x-1][y] = Xacid_splash_w;
4683 play_element_sound(x, y, SOUND_acid, Xacid_1);
4687 cave[x][y] = Xspring;
4688 next[x][y] = Xspring;
4693 static void Lspring_e(int x, int y)
4695 switch (cave[x][y+1])
4698 case Xacid_splash_e:
4699 case Xacid_splash_w:
4700 cave[x][y] = Yspring_sB;
4701 next[x][y] = Xblank;
4702 cave[x][y+1] = Yspring_s;
4703 next[x][y+1] = Xspring_fall;
4714 cave[x][y] = Yspring_sB;
4715 next[x][y] = Xblank;
4716 if (cave[x+1][y] == Xblank)
4717 cave[x+1][y] = Xacid_splash_e;
4718 if (cave[x-1][y] == Xblank)
4719 cave[x-1][y] = Xacid_splash_w;
4720 play_element_sound(x, y, SOUND_acid, Xacid_1);
4724 cave[x][y+1] = XbumperB;
4727 switch (cave[x+1][y])
4730 case Xacid_splash_e:
4731 case Xacid_splash_w:
4736 cave[x][y] = Yspring_eB;
4737 next[x][y] = Xblank;
4738 cave[x+1][y] = Yspring_e;
4739 next[x+1][y] = Xspring_e;
4750 cave[x][y] = Yspring_eB;
4751 next[x][y] = Xblank;
4752 if (cave[x+2][y-1] == Xblank)
4753 cave[x+2][y-1] = Xacid_splash_e;
4754 if (cave[x][y-1] == Xblank)
4755 cave[x][y-1] = Xacid_splash_w;
4756 play_element_sound(x, y, SOUND_acid, Xacid_1);
4765 cave[x][y] = Yspring_alien_eB;
4766 next[x][y] = Xblank;
4767 cave[x+1][y] = Yspring_alien_e;
4768 next[x+1][y] = Xspring_e;
4769 play_element_sound(x, y, SOUND_slurp, Xalien);
4770 score += lev.slurp_score;
4775 cave[x+1][y] = XbumperB;
4776 next[x][y] = Xspring_w;
4777 play_element_sound(x, y, SOUND_spring, Xspring);
4781 cave[x][y] = Xspring;
4782 next[x][y] = Xspring;
4783 play_element_sound(x, y, SOUND_spring, Xspring);
4788 static void Lspring_w(int x, int y)
4790 switch (cave[x][y+1])
4793 case Xacid_splash_e:
4794 case Xacid_splash_w:
4795 cave[x][y] = Yspring_sB;
4796 next[x][y] = Xblank;
4797 cave[x][y+1] = Yspring_s;
4798 next[x][y+1] = Xspring_fall;
4809 cave[x][y] = Yspring_sB;
4810 next[x][y] = Xblank;
4811 if (cave[x+1][y] == Xblank)
4812 cave[x+1][y] = Xacid_splash_e;
4813 if (cave[x-1][y] == Xblank)
4814 cave[x-1][y] = Xacid_splash_w;
4815 play_element_sound(x, y, SOUND_acid, Xacid_1);
4819 cave[x][y+1] = XbumperB;
4822 switch (cave[x-1][y])
4825 case Xacid_splash_e:
4826 case Xacid_splash_w:
4831 cave[x][y] = Yspring_wB;
4832 next[x][y] = Xblank;
4833 cave[x-1][y] = Yspring_w;
4834 next[x-1][y] = Xspring_w;
4845 cave[x][y] = Yspring_wB;
4846 next[x][y] = Xblank;
4847 if (cave[x][y-1] == Xblank)
4848 cave[x][y-1] = Xacid_splash_e;
4849 if (cave[x-2][y-1] == Xblank)
4850 cave[x-2][y-1] = Xacid_splash_w;
4851 play_element_sound(x, y, SOUND_acid, Xacid_1);
4860 cave[x][y] = Yspring_alien_wB;
4861 next[x][y] = Xblank;
4862 cave[x-1][y] = Yspring_alien_w;
4863 next[x-1][y] = Xspring_w;
4864 play_element_sound(x, y, SOUND_slurp, Xalien);
4865 score += lev.slurp_score;
4870 cave[x-1][y] = XbumperB;
4871 next[x][y] = Xspring_e;
4872 play_element_sound(x, y, SOUND_spring, Xspring);
4876 cave[x][y] = Xspring;
4877 next[x][y] = Xspring;
4878 play_element_sound(x, y, SOUND_spring, Xspring);
4883 static void Lspring_fall(int x, int y)
4885 switch (cave[x][y+1])
4888 case Xacid_splash_e:
4889 case Xacid_splash_w:
4891 cave[x][y] = Yspring_sB;
4892 next[x][y] = Xblank;
4893 cave[x][y+1] = Yspring_s;
4894 next[x][y+1] = Xspring_fall;
4905 cave[x][y] = Yspring_sB;
4906 next[x][y] = Xblank;
4907 if (cave[x+1][y] == Xblank)
4908 cave[x+1][y] = Xacid_splash_e;
4909 if (cave[x-1][y] == Xblank)
4910 cave[x-1][y] = Xacid_splash_w;
4911 play_element_sound(x, y, SOUND_acid, Xacid_1);
4916 cave[x][y+1] = Ybomb_blank;
4917 Lboom_tank(x, y+1, Xspring_fall);
4928 cave[x][y] = Yspring_sB;
4929 cave[x][y+1] = Ybug_spring;
4930 Lboom_bug(x, y+1, Xspring_fall);
4931 score += lev.bug_score;
4942 cave[x][y] = Yspring_sB;
4943 cave[x][y+1] = Ytank_spring;
4944 Lboom_tank(x, y+1, Xspring_fall);
4945 score += lev.tank_score;
4952 cave[x][y] = Yspring_sB;
4953 cave[x][y+1] = Yeater_spring;
4954 Lboom_eater(x, y+1, Xspring_fall);
4955 score += lev.eater_score;
4960 cave[x][y] = Yspring_sB;
4961 cave[x][y+1] = Yalien_spring;
4962 Lboom_tank(x, y+1, Xspring_fall);
4963 score += lev.alien_score;
4967 cave[x][y] = Xspring;
4968 next[x][y] = Xspring;
4969 play_element_sound(x, y, SOUND_spring, Xspring);
4974 static void Lpush_emerald_e(int x, int y)
4976 switch (cave[x+1][y])
4986 cave[x][y] = Xemerald;
4987 next[x][y] = Xemerald;
4991 cave[x][y] = Yemerald_eB;
4992 next[x][y] = Xblank;
4993 cave[x+1][y] = Yemerald_e;
4994 next[x+1][y] = Xemerald_pause;
4999 static void Lpush_emerald_w(int x, int y)
5001 switch (cave[x-1][y])
5011 cave[x][y] = Xemerald;
5012 next[x][y] = Xemerald;
5016 cave[x][y] = Yemerald_wB;
5017 next[x][y] = Xblank;
5018 cave[x-1][y] = Yemerald_w;
5019 next[x-1][y] = Xemerald_pause;
5024 static void Lpush_diamond_e(int x, int y)
5026 switch (cave[x+1][y])
5036 cave[x][y] = Xdiamond;
5037 next[x][y] = Xdiamond;
5041 cave[x][y] = Ydiamond_eB;
5042 next[x][y] = Xblank;
5043 cave[x+1][y] = Ydiamond_e;
5044 next[x+1][y] = Xdiamond_pause;
5049 static void Lpush_diamond_w(int x, int y)
5051 switch (cave[x-1][y])
5061 cave[x][y] = Xdiamond;
5062 next[x][y] = Xdiamond;
5066 cave[x][y] = Ydiamond_wB;
5067 next[x][y] = Xblank;
5068 cave[x-1][y] = Ydiamond_w;
5069 next[x-1][y] = Xdiamond_pause;
5074 static void Lpush_stone_e(int x, int y)
5076 switch (cave[x+1][y])
5086 cave[x][y] = Xstone;
5087 next[x][y] = Xstone;
5091 cave[x][y] = Ystone_eB;
5092 next[x][y] = Xblank;
5093 cave[x+1][y] = Ystone_e;
5094 next[x+1][y] = Xstone_pause;
5099 static void Lpush_stone_w(int x, int y)
5101 switch (cave[x-1][y])
5111 cave[x][y] = Xstone;
5112 next[x][y] = Xstone;
5116 cave[x][y] = Ystone_wB;
5117 next[x][y] = Xblank;
5118 cave[x-1][y] = Ystone_w;
5119 next[x-1][y] = Xstone_pause;
5124 static void Lpush_bomb_e(int x, int y)
5126 switch (cave[x+1][y])
5141 cave[x][y] = Ybomb_eB;
5142 next[x][y] = Xblank;
5143 cave[x+1][y] = Ybomb_e;
5144 next[x+1][y] = Xbomb_pause;
5149 static void Lpush_bomb_w(int x, int y)
5151 switch (cave[x-1][y])
5166 cave[x][y] = Ybomb_wB;
5167 next[x][y] = Xblank;
5168 cave[x-1][y] = Ybomb_w;
5169 next[x-1][y] = Xbomb_pause;
5174 static void Lpush_nut_e(int x, int y)
5176 switch (cave[x+1][y])
5191 cave[x][y] = Ynut_eB;
5192 next[x][y] = Xblank;
5193 cave[x+1][y] = Ynut_e;
5194 next[x+1][y] = Xnut_pause;
5199 static void Lpush_nut_w(int x, int y)
5201 switch (cave[x-1][y])
5216 cave[x][y] = Ynut_wB;
5217 next[x][y] = Xblank;
5218 cave[x-1][y] = Ynut_w;
5219 next[x-1][y] = Xnut_pause;
5224 static void Lpush_spring_e(int x, int y)
5226 switch (cave[x+1][y])
5236 cave[x][y] = Xspring;
5237 next[x][y] = Xspring;
5241 cave[x][y] = Yspring_eB;
5242 next[x][y] = Xblank;
5243 cave[x+1][y] = Yspring_e;
5244 next[x+1][y] = Xspring_e;
5249 static void Lpush_spring_w(int x, int y)
5251 switch (cave[x-1][y])
5261 cave[x][y] = Xspring;
5262 next[x][y] = Xspring;
5266 cave[x][y] = Yspring_wB;
5267 next[x][y] = Xblank;
5268 cave[x-1][y] = Yspring_w;
5269 next[x-1][y] = Xspring_w;
5274 static void Ldynamite_1(int x, int y)
5276 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
5277 next[x][y] = Xdynamite_2;
5280 static void Ldynamite_2(int x, int y)
5282 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
5283 next[x][y] = Xdynamite_3;
5286 static void Ldynamite_3(int x, int y)
5288 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
5289 next[x][y] = Xdynamite_4;
5292 static void Ldynamite_4(int x, int y)
5294 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
5295 next[x][y] = Zdynamite;
5297 Lboom_generic(x, y, Xblank, Xblank);
5300 static void Lfake_door_1(int x, int y)
5302 if (lev.magnify_cnt)
5303 cave[x][y] = Xdoor_1;
5306 static void Lfake_door_2(int x, int y)
5308 if (lev.magnify_cnt)
5309 cave[x][y] = Xdoor_2;
5312 static void Lfake_door_3(int x, int y)
5314 if (lev.magnify_cnt)
5315 cave[x][y] = Xdoor_3;
5318 static void Lfake_door_4(int x, int y)
5320 if (lev.magnify_cnt)
5321 cave[x][y] = Xdoor_4;
5324 static void Lfake_door_5(int x, int y)
5326 if (lev.magnify_cnt)
5327 cave[x][y] = Xdoor_5;
5330 static void Lfake_door_6(int x, int y)
5332 if (lev.magnify_cnt)
5333 cave[x][y] = Xdoor_6;
5336 static void Lfake_door_7(int x, int y)
5338 if (lev.magnify_cnt)
5339 cave[x][y] = Xdoor_7;
5342 static void Lfake_door_8(int x, int y)
5344 if (lev.magnify_cnt)
5345 cave[x][y] = Xdoor_8;
5348 static void Lballoon(int x, int y)
5350 if (lev.wind_cnt == 0)
5353 switch (lev.wind_direction)
5356 switch (cave[x][y-1])
5359 case Xacid_splash_e:
5360 case Xacid_splash_w:
5361 cave[x][y] = Yballoon_nB;
5362 next[x][y] = Xblank;
5363 cave[x][y-1] = Yballoon_n;
5364 next[x][y-1] = Xballoon;
5375 cave[x][y] = Yballoon_nB;
5376 next[x][y] = Xblank;
5377 if (cave[x+1][y-2] == Xblank)
5378 cave[x+1][y-2] = Xacid_splash_e;
5379 if (cave[x-1][y-2] == Xblank)
5380 cave[x-1][y-2] = Xacid_splash_w;
5381 play_element_sound(x, y, SOUND_acid, Xacid_1);
5387 switch (cave[x+1][y])
5390 case Xacid_splash_e:
5391 case Xacid_splash_w:
5392 cave[x][y] = Yballoon_eB;
5393 next[x][y] = Xblank;
5394 cave[x+1][y] = Yballoon_e;
5395 next[x+1][y] = Xballoon;
5406 cave[x][y] = Yballoon_eB;
5407 next[x][y] = Xblank;
5408 if (cave[x+2][y-1] == Xblank)
5409 cave[x+2][y-1] = Xacid_splash_e;
5410 if (cave[x][y-1] == Xblank)
5411 cave[x][y-1] = Xacid_splash_w;
5412 play_element_sound(x, y, SOUND_acid, Xacid_1);
5418 switch (cave[x][y+1])
5421 case Xacid_splash_e:
5422 case Xacid_splash_w:
5423 cave[x][y] = Yballoon_sB;
5424 next[x][y] = Xblank;
5425 cave[x][y+1] = Yballoon_s;
5426 next[x][y+1] = Xballoon;
5437 cave[x][y] = Yballoon_sB;
5438 next[x][y] = Xblank;
5439 if (cave[x+1][y] == Xblank)
5440 cave[x+1][y] = Xacid_splash_e;
5441 if (cave[x-1][y] == Xblank)
5442 cave[x-1][y] = Xacid_splash_w;
5443 play_element_sound(x, y, SOUND_acid, Xacid_1);
5449 switch (cave[x-1][y])
5452 case Xacid_splash_e:
5453 case Xacid_splash_w:
5454 cave[x][y] = Yballoon_wB;
5455 next[x][y] = Xblank;
5456 cave[x-1][y] = Yballoon_w;
5457 next[x-1][y] = Xballoon;
5468 cave[x][y] = Yballoon_wB;
5469 next[x][y] = Xblank;
5470 if (cave[x][y-1] == Xblank)
5471 cave[x][y-1] = Xacid_splash_e;
5472 if (cave[x-2][y-1] == Xblank)
5473 cave[x-2][y-1] = Xacid_splash_w;
5474 play_element_sound(x, y, SOUND_acid, Xacid_1);
5481 static void Lball_common(int x, int y)
5483 play_element_sound(x, y, SOUND_ball, Xball_1);
5485 if (lev.ball_random)
5490 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
5491 tab_blank[cave[x-1][y-1]])
5493 cave[x-1][y-1] = Yball_blank;
5494 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
5499 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
5500 tab_blank[cave[x][y-1]])
5502 cave[x][y-1] = Yball_blank;
5503 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
5508 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
5509 tab_blank[cave[x+1][y-1]])
5511 cave[x+1][y-1] = Yball_blank;
5512 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
5517 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
5518 tab_blank[cave[x-1][y]])
5520 cave[x-1][y] = Yball_blank;
5521 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
5526 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
5527 tab_blank[cave[x+1][y]])
5529 cave[x+1][y] = Yball_blank;
5530 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
5535 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
5536 tab_blank[cave[x-1][y+1]])
5538 cave[x-1][y+1] = Yball_blank;
5539 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
5544 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
5545 tab_blank[cave[x][y+1]])
5547 cave[x][y+1] = Yball_blank;
5548 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
5553 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
5554 tab_blank[cave[x+1][y+1]])
5556 cave[x+1][y+1] = Yball_blank;
5557 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
5564 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
5565 tab_blank[cave[x-1][y-1]])
5567 cave[x-1][y-1] = Yball_blank;
5568 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
5571 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
5572 tab_blank[cave[x][y-1]])
5574 cave[x][y-1] = Yball_blank;
5575 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
5578 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
5579 tab_blank[cave[x+1][y-1]])
5581 cave[x+1][y-1] = Yball_blank;
5582 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
5585 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
5586 tab_blank[cave[x-1][y]])
5588 cave[x-1][y] = Yball_blank;
5589 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
5592 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
5593 tab_blank[cave[x+1][y]])
5595 cave[x+1][y] = Yball_blank;
5596 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
5599 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
5600 tab_blank[cave[x-1][y+1]])
5602 cave[x-1][y+1] = Yball_blank;
5603 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
5606 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
5607 tab_blank[cave[x][y+1]])
5609 cave[x][y+1] = Yball_blank;
5610 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
5613 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
5614 tab_blank[cave[x+1][y+1]])
5616 cave[x+1][y+1] = Yball_blank;
5617 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
5621 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
5624 static void Lball_1(int x, int y)
5626 if (lev.ball_state == 0)
5629 cave[x][y] = Yball_1;
5630 next[x][y] = Xball_2;
5637 static void Lball_2(int x, int y)
5639 if (lev.ball_state == 0)
5642 cave[x][y] = Yball_2;
5643 next[x][y] = Xball_1;
5650 static void Ldrip(int x, int y)
5652 next[x][y] = Xdrip_fall;
5655 static void Ldrip_fall(int x, int y)
5659 switch (cave[x][y+1])
5662 case Xacid_splash_e:
5663 case Xacid_splash_w:
5667 cave[x][y] = Ydrip_1_sB;
5668 next[x][y] = Xdrip_stretchB;
5669 cave[x][y+1] = Ydrip_1_s;
5670 next[x][y+1] = Xdrip_stretch;
5681 cave[x][y] = Ydrip_1_sB;
5682 next[x][y] = Xdrip_stretchB;
5683 if (cave[x+1][y] == Xblank)
5684 cave[x+1][y] = Xacid_splash_e;
5685 if (cave[x-1][y] == Xblank)
5686 cave[x-1][y] = Xacid_splash_w;
5687 play_element_sound(x, y, SOUND_acid, Xacid_1);
5693 case 0: temp = Xamoeba_1; break;
5694 case 1: temp = Xamoeba_2; break;
5695 case 2: temp = Xamoeba_3; break;
5696 case 3: temp = Xamoeba_4; break;
5697 case 4: temp = Xamoeba_5; break;
5698 case 5: temp = Xamoeba_6; break;
5699 case 6: temp = Xamoeba_7; break;
5700 case 7: temp = Xamoeba_8; break;
5705 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
5710 static void Ldrip_stretch(int x, int y)
5712 cave[x][y] = Ydrip_2_s;
5713 next[x][y] = Xdrip_fall;
5716 static void Ldrip_stretchB(int x, int y)
5718 cave[x][y] = Ydrip_2_sB;
5719 next[x][y] = Xblank;
5722 static void Lwonderwall(int x, int y)
5724 if (lev.wonderwall_time && lev.wonderwall_state)
5726 cave[x][y] = XwonderwallB;
5727 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
5731 static void Lwheel(int x, int y)
5733 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
5734 cave[x][y] = XwheelB;
5737 static void Lswitch(int x, int y)
5740 cave[x][y] = XswitchB;
5743 static void Lfake_blank(int x, int y)
5746 cave[x][y] = Xfake_blankB;
5749 static void Lfake_grass(int x, int y)
5751 if (lev.magnify_cnt)
5752 cave[x][y] = Xfake_grassB;
5755 static void Lfake_amoeba(int x, int y)
5758 cave[x][y] = Xfake_amoebaB;
5761 static void Lsand_stone(int x, int y)
5763 switch (cave[x][y+1])
5766 case Xacid_splash_e:
5767 case Xacid_splash_w:
5768 cave[x][y] = Xsand_stonesand_quickout_1;
5769 next[x][y] = Xsand_stonesand_quickout_2;
5770 cave[x][y+1] = Xsand_stoneout_1;
5771 next[x][y+1] = Xsand_stoneout_2;
5782 cave[x][y] = Xsand_stonesand_quickout_1;
5783 next[x][y] = Xsand_stonesand_quickout_2;
5784 if (cave[x+1][y] == Xblank)
5785 cave[x+1][y] = Xacid_splash_e;
5786 if (cave[x-1][y] == Xblank)
5787 cave[x-1][y] = Xacid_splash_w;
5788 play_element_sound(x, y, SOUND_acid, Xacid_1);
5792 cave[x][y] = Xsand_stonesand_1;
5793 next[x][y] = Xsand_stonesand_2;
5794 cave[x][y+1] = Xsand_sandstone_1;
5795 next[x][y+1] = Xsand_sandstone_2;
5800 static void Lsand_stonein_1(int x, int y)
5802 next[x][y] = Xsand_stonein_2;
5805 static void Lsand_stonein_2(int x, int y)
5807 next[x][y] = Xsand_stonein_3;
5810 static void Lsand_stonein_3(int x, int y)
5812 next[x][y] = Xsand_stonein_4;
5815 static void Lsand_stonein_4(int x, int y)
5817 next[x][y] = Xblank;
5820 static void Lsand_sandstone_1(int x, int y)
5822 next[x][y] = Xsand_sandstone_2;
5825 static void Lsand_sandstone_2(int x, int y)
5827 next[x][y] = Xsand_sandstone_3;
5830 static void Lsand_sandstone_3(int x, int y)
5832 next[x][y] = Xsand_sandstone_4;
5835 static void Lsand_sandstone_4(int x, int y)
5837 next[x][y] = Xsand_stone;
5840 static void Lsand_stonesand_1(int x, int y)
5842 next[x][y] = Xsand_stonesand_2;
5845 static void Lsand_stonesand_2(int x, int y)
5847 next[x][y] = Xsand_stonesand_3;
5850 static void Lsand_stonesand_3(int x, int y)
5852 next[x][y] = Xsand_stonesand_4;
5855 static void Lsand_stonesand_4(int x, int y)
5860 static void Lsand_stoneout_1(int x, int y)
5862 next[x][y] = Xsand_stoneout_2;
5865 static void Lsand_stoneout_2(int x, int y)
5867 next[x][y] = Xstone_fall;
5870 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5871 static void Lsand_stonesand_quickout_1(int x, int y)
5873 next[x][y] = Xsand_stonesand_quickout_2;
5876 static void Lsand_stonesand_quickout_2(int x, int y)
5882 static void Lslidewall_ns(int x, int y)
5884 if (tab_blank[cave[x][y-1]])
5886 cave[x][y-1] = Yslidewall_ns_blank;
5887 next[x][y-1] = Xslidewall_ns;
5888 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ns);
5891 if (tab_blank[cave[x][y+1]])
5893 cave[x][y+1] = Yslidewall_ns_blank;
5894 next[x][y+1] = Xslidewall_ns;
5895 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ns);
5899 static void Lslidewall_ew(int x, int y)
5901 if (tab_blank[cave[x+1][y]])
5903 cave[x+1][y] = Yslidewall_ew_blank;
5904 next[x+1][y] = Xslidewall_ew;
5905 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ew);
5908 if (tab_blank[cave[x-1][y]])
5910 cave[x-1][y] = Yslidewall_ew_blank;
5911 next[x-1][y] = Xslidewall_ew;
5912 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ew);
5916 static void Lexit(int x, int y)
5918 if (lev.required > 0)
5921 switch (RANDOM(64) / 21)
5924 cave[x][y] = Xexit_1;
5925 next[x][y] = Xexit_2;
5929 cave[x][y] = Xexit_2;
5930 next[x][y] = Xexit_3;
5934 cave[x][y] = Xexit_3;
5935 next[x][y] = Xexit_1;
5939 play_element_sound(x, y, SOUND_exit_open, Xexit);
5942 static void Lexit_1(int x, int y)
5944 next[x][y] = Xexit_2;
5947 static void Lexit_2(int x, int y)
5949 next[x][y] = Xexit_3;
5952 static void Lexit_3(int x, int y)
5954 next[x][y] = Xexit_1;
5957 static void Lpause(int x, int y)
5959 next[x][y] = Xblank;
5962 static void Lamoeba(int x, int y)
5967 case Xacid_splash_e:
5968 case Xacid_splash_w:
5974 if (tab_amoeba[cave[x][y-1]] ||
5975 tab_amoeba[cave[x+1][y]] ||
5976 tab_amoeba[cave[x][y+1]] ||
5977 tab_amoeba[cave[x-1][y]])
5982 static void Lexplode(int x, int y)
5987 cave[x][y] = Xboom_1;
5988 cave[x][y-1] = tab_explode_normal[cave[x][y-1]];
5989 cave[x-1][y] = tab_explode_normal[cave[x-1][y]];
5990 cave[x+1][y] = tab_explode_normal[cave[x+1][y]];
5991 cave[x][y+1] = tab_explode_normal[cave[x][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]];
5995 cave[x+1][y+1] = tab_explode_normal[cave[x+1][y+1]];
5999 cave[x][y] = Xboom_1;
6000 cave[x][y-1] = tab_explode_dynamite[cave[x][y-1]];
6001 cave[x-1][y] = tab_explode_dynamite[cave[x-1][y]];
6002 cave[x+1][y] = tab_explode_dynamite[cave[x+1][y]];
6003 cave[x][y+1] = tab_explode_dynamite[cave[x][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]];
6007 cave[x+1][y+1] = tab_explode_dynamite[cave[x+1][y+1]];
6012 static void Lboom_1(int x, int y)
6014 next[x][y] = Xboom_2;
6015 #if !PLAY_ELEMENT_SOUND
6016 if (x != lev.exit_x && y != lev.exit_y)
6017 play_sound(x, y, SOUND_boom);
6019 lev.exit_x = lev.exit_y = -1;
6023 static void Lboom_2(int x, int y)
6025 next[x][y] = boom[x][y];
6028 static void Lboom_android(int x, int y)
6030 #if PLAY_ELEMENT_SOUND
6031 play_element_sound(x, y, SOUND_boom, Xandroid);
6037 static void handle_tile(int x, int y)
6041 case Xacid_1: Lacid_1(x, y); break;
6042 case Xacid_2: Lacid_2(x, y); break;
6043 case Xacid_3: Lacid_3(x, y); break;
6044 case Xacid_4: Lacid_4(x, y); break;
6045 case Xacid_5: Lacid_5(x, y); break;
6046 case Xacid_6: Lacid_6(x, y); break;
6047 case Xacid_7: Lacid_7(x, y); break;
6048 case Xacid_8: Lacid_8(x, y); break;
6050 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6051 case Xfake_acid_1: Lfake_acid_1(x, y); break;
6052 case Xfake_acid_2: Lfake_acid_2(x, y); break;
6053 case Xfake_acid_3: Lfake_acid_3(x, y); break;
6054 case Xfake_acid_4: Lfake_acid_4(x, y); break;
6055 case Xfake_acid_5: Lfake_acid_5(x, y); break;
6056 case Xfake_acid_6: Lfake_acid_6(x, y); break;
6057 case Xfake_acid_7: Lfake_acid_7(x, y); break;
6058 case Xfake_acid_8: Lfake_acid_8(x, y); break;
6061 case Xandroid: Landroid(x, y); break;
6062 case Xandroid_1_n: Landroid_1_n(x, y); break;
6063 case Xandroid_2_n: Landroid_2_n(x, y); break;
6064 case Xandroid_1_e: Landroid_1_e(x, y); break;
6065 case Xandroid_2_e: Landroid_2_e(x, y); break;
6066 case Xandroid_1_s: Landroid_1_s(x, y); break;
6067 case Xandroid_2_s: Landroid_2_s(x, y); break;
6068 case Xandroid_1_w: Landroid_1_w(x, y); break;
6069 case Xandroid_2_w: Landroid_2_w(x, y); break;
6071 case Xeater_n: Leater_n(x, y); break;
6072 case Xeater_e: Leater_e(x, y); break;
6073 case Xeater_s: Leater_s(x, y); break;
6074 case Xeater_w: Leater_w(x, y); break;
6076 case Xalien: Lalien(x, y); break;
6077 case Xalien_pause: Lalien_pause(x, y); break;
6079 case Xbug_1_n: Lbug_1_n(x, y); break;
6080 case Xbug_2_n: Lbug_2_n(x, y); break;
6081 case Xbug_1_e: Lbug_1_e(x, y); break;
6082 case Xbug_2_e: Lbug_2_e(x, y); break;
6083 case Xbug_1_s: Lbug_1_s(x, y); break;
6084 case Xbug_2_s: Lbug_2_s(x, y); break;
6085 case Xbug_1_w: Lbug_1_w(x, y); break;
6086 case Xbug_2_w: Lbug_2_w(x, y); break;
6088 case Xtank_1_n: Ltank_1_n(x, y); break;
6089 case Xtank_2_n: Ltank_2_n(x, y); break;
6090 case Xtank_1_e: Ltank_1_e(x, y); break;
6091 case Xtank_2_e: Ltank_2_e(x, y); break;
6092 case Xtank_1_s: Ltank_1_s(x, y); break;
6093 case Xtank_2_s: Ltank_2_s(x, y); break;
6094 case Xtank_1_w: Ltank_1_w(x, y); break;
6095 case Xtank_2_w: Ltank_2_w(x, y); break;
6097 case Xemerald: Lemerald(x, y); break;
6098 case Xemerald_pause: Lemerald_pause(x, y); break;
6099 case Xemerald_fall: Lemerald_fall(x, y); break;
6101 case Xdiamond: Ldiamond(x, y); break;
6102 case Xdiamond_pause: Ldiamond_pause(x, y); break;
6103 case Xdiamond_fall: Ldiamond_fall(x, y); break;
6105 case Xstone: Lstone(x, y); break;
6106 case Xstone_pause: Lstone_pause(x, y); break;
6107 case Xstone_fall: Lstone_fall(x, y); break;
6109 case Xbomb: Lbomb(x, y); break;
6110 case Xbomb_pause: Lbomb_pause(x, y); break;
6111 case Xbomb_fall: Lbomb_fall(x, y); break;
6113 case Xnut: Lnut(x, y); break;
6114 case Xnut_pause: Lnut_pause(x, y); break;
6115 case Xnut_fall: Lnut_fall(x, y); break;
6117 case Xspring: Lspring(x, y); break;
6118 case Xspring_pause: Lspring_pause(x, y); break;
6119 case Xspring_e: Lspring_e(x, y); break;
6120 case Xspring_w: Lspring_w(x, y); break;
6121 case Xspring_fall: Lspring_fall(x, y); break;
6123 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
6124 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
6125 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
6126 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
6127 case Xpush_stone_e: Lpush_stone_e(x, y); break;
6128 case Xpush_stone_w: Lpush_stone_w(x, y); break;
6129 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
6130 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
6131 case Xpush_nut_e: Lpush_nut_e(x, y); break;
6132 case Xpush_nut_w: Lpush_nut_w(x, y); break;
6133 case Xpush_spring_e: Lpush_spring_e(x, y); break;
6134 case Xpush_spring_w: Lpush_spring_w(x, y); break;
6136 case Xdynamite_1: Ldynamite_1(x, y); break;
6137 case Xdynamite_2: Ldynamite_2(x, y); break;
6138 case Xdynamite_3: Ldynamite_3(x, y); break;
6139 case Xdynamite_4: Ldynamite_4(x, y); break;
6141 case Xfake_door_1: Lfake_door_1(x, y); break;
6142 case Xfake_door_2: Lfake_door_2(x, y); break;
6143 case Xfake_door_3: Lfake_door_3(x, y); break;
6144 case Xfake_door_4: Lfake_door_4(x, y); break;
6145 case Xfake_door_5: Lfake_door_5(x, y); break;
6146 case Xfake_door_6: Lfake_door_6(x, y); break;
6147 case Xfake_door_7: Lfake_door_7(x, y); break;
6148 case Xfake_door_8: Lfake_door_8(x, y); break;
6150 case Xballoon: Lballoon(x, y); break;
6152 case Xball_1: Lball_1(x, y); break;
6153 case Xball_2: Lball_2(x, y); break;
6155 case Xdrip: Ldrip(x, y); break;
6156 case Xdrip_fall: Ldrip_fall(x, y); break;
6157 case Xdrip_stretch: Ldrip_stretch(x, y); break;
6158 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
6160 case Xwonderwall: Lwonderwall(x, y); break;
6162 case Xwheel: Lwheel(x, y); break;
6164 case Xswitch: Lswitch(x, y); break;
6166 case Xfake_blank: Lfake_blank(x, y); break;
6167 case Xfake_grass: Lfake_grass(x, y); break;
6168 case Xfake_amoeba: Lfake_amoeba(x, y); break;
6170 case Xsand_stone: Lsand_stone(x, y); break;
6171 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
6172 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
6173 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
6174 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
6175 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
6176 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
6177 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
6178 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
6179 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
6180 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
6181 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
6182 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
6183 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
6184 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
6185 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6186 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
6187 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
6190 case Xslidewall_ns: Lslidewall_ns(x, y); break;
6191 case Xslidewall_ew: Lslidewall_ew(x, y); break;
6193 case Xexit: Lexit(x, y); break;
6194 case Xexit_1: Lexit_1(x, y); break;
6195 case Xexit_2: Lexit_2(x, y); break;
6196 case Xexit_3: Lexit_3(x, y); break;
6198 case Xpause: Lpause(x, y); break;
6200 case Xboom_bug: Lboom_bug(x, y, Xboom_bug); break;
6201 case Xboom_bomb: Lboom_tank(x, y, Xboom_bomb); break;
6202 case Xboom_android: Lboom_android(x, y); break;
6203 case Xboom_1: Lboom_1(x, y); break;
6204 case Xboom_2: Lboom_2(x, y); break;
6217 game_em.any_player_moving = FALSE;
6218 game_em.any_player_snapping = FALSE;
6220 /* must test for death and actually kill separately */
6221 for (i = 0; i < MAX_PLAYERS; i++)
6223 boolean ply_kill = player_killed(&ply[i]);
6225 if (ply[i].alive && ply_kill)
6226 kill_player(&ply[i]);
6229 for (i = 0; i < MAX_PLAYERS; i++)
6231 ply[i].oldx = ply[i].x;
6232 ply[i].oldy = ply[i].y;
6233 ply[i].anim = PLY_still;
6236 start_check_nr = (RandomEM & 128 ? 0 : 1) * 2 + (RandomEM & 256 ? 0 : 1);
6238 for (i = 0; i < MAX_PLAYERS; i++)
6240 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
6242 if (ply[check_nr].alive)
6243 check_player(&ply[check_nr]);
6246 for (i = 0; i < MAX_PLAYERS; i++)
6251 if (cave[ply[i].oldx][ply[i].oldy] == Zplayer)
6253 cave[ply[i].oldx][ply[i].oldy] = Xblank;
6254 next[ply[i].oldx][ply[i].oldy] = Xblank;
6257 if (cave[ply[i].x][ply[i].y] == Xblank)
6259 cave[ply[i].x][ply[i].y] = Zplayer;
6260 next[ply[i].x][ply[i].y] = Zplayer;
6276 for (y = 1; y < CAVE_BUFFER_HEIGHT - 1; y++)
6277 for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
6280 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
6281 lev.score += score; /* only add a score if someone is alive */
6283 game_em.game_over = TRUE;
6287 /* triple buffering */
6288 void *temp = lev.cave;
6289 lev.cave = lev.next;
6290 lev.next = lev.draw;
6299 unsigned int random;
6305 /* update variables */
6307 if (lev.score > 9999)
6310 if (lev.android_move_cnt-- == 0)
6311 lev.android_move_cnt = lev.android_move_time;
6312 if (lev.android_clone_cnt-- == 0)
6313 lev.android_clone_cnt = lev.android_clone_time;
6315 if (lev.ball_cnt-- == 0)
6316 lev.ball_cnt = lev.ball_time;
6319 if (lev.magnify_cnt)
6325 if (lev.wonderwall_time && lev.wonderwall_state)
6326 lev.wonderwall_time--;
6329 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
6335 for (count = lev.amoeba_time; count--;)
6337 x = CAVE_BUFFER_XOFFSET - 1 + (random >> 10) % CAVE_WIDTH;
6338 y = CAVE_BUFFER_YOFFSET - 1 + (random >> 20) % CAVE_HEIGHT;
6342 random = random * 129 + 1;
6347 /* handle explosions */
6349 for (y = 1; y < CAVE_BUFFER_HEIGHT - 1; y++)
6350 for (x = 1; x < CAVE_BUFFER_WIDTH - 1; x++)
6353 /* triple buffering */
6355 for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
6356 for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
6357 next[x][y] = cave[x][y];