5 * my own version of the emerald mine engine
11 #define SPRING_ROLL /* spring rolling off round things continues to roll */
12 #define ACID_ROLL /* rolling objects go into acid rather than remove it */
13 #define ACID_PLAYER /* player gets killed by acid, but without explosion */
15 #define RANDOM_BUG /* handle problem with old tapes using 64-bit random */
17 #define RANDOM(x) ((seed = seed << 31 | seed >> 1) % x)
19 static short **cave, **next, **boom;
20 static unsigned int seed;
23 static const byte is_blank[GAME_TILE_MAX] =
38 static const byte is_blank_or_acid[GAME_TILE_MAX] =
61 static const byte is_player[GAME_TILE_MAX] =
64 [Xfake_acid_1_player] = 1,
65 [Xfake_acid_2_player] = 1,
66 [Xfake_acid_3_player] = 1,
67 [Xfake_acid_4_player] = 1,
68 [Xfake_acid_5_player] = 1,
69 [Xfake_acid_6_player] = 1,
70 [Xfake_acid_7_player] = 1,
71 [Xfake_acid_8_player] = 1
74 static const byte add_player[GAME_TILE_MAX] =
77 [Xsplash_e] = Zplayer,
78 [Xsplash_w] = Zplayer,
79 [Xfake_acid_1] = Xfake_acid_1_player,
80 [Xfake_acid_2] = Xfake_acid_2_player,
81 [Xfake_acid_3] = Xfake_acid_3_player,
82 [Xfake_acid_4] = Xfake_acid_4_player,
83 [Xfake_acid_5] = Xfake_acid_5_player,
84 [Xfake_acid_6] = Xfake_acid_6_player,
85 [Xfake_acid_7] = Xfake_acid_7_player,
86 [Xfake_acid_8] = Xfake_acid_8_player
89 static const byte remove_player[GAME_TILE_MAX] =
92 [Xfake_acid_1_player] = Xfake_acid_1,
93 [Xfake_acid_2_player] = Xfake_acid_2,
94 [Xfake_acid_3_player] = Xfake_acid_3,
95 [Xfake_acid_4_player] = Xfake_acid_4,
96 [Xfake_acid_5_player] = Xfake_acid_5,
97 [Xfake_acid_6_player] = Xfake_acid_6,
98 [Xfake_acid_7_player] = Xfake_acid_7,
99 [Xfake_acid_8_player] = Xfake_acid_8
102 static const byte is_amoeba[GAME_TILE_MAX] =
116 static byte is_android_blank[GAME_TILE_MAX] =
131 static const byte is_android_walkable[GAME_TILE_MAX] =
147 static void Lboom_generic(int x, int y, int element, int element_middle)
149 boom[x-1][y-1] = element;
150 boom[x][y-1] = element;
151 boom[x+1][y-1] = element;
152 boom[x-1][y] = element;
153 boom[x][y] = element_middle;
154 boom[x+1][y] = element;
155 boom[x-1][y+1] = element;
156 boom[x][y+1] = element;
157 boom[x+1][y+1] = element;
160 static void Lboom_bug(int x, int y)
162 if (game_em.use_old_explosions)
165 Lboom_generic(x, y, Xemerald, Xdiamond);
167 #if PLAY_ELEMENT_SOUND
168 play_element_sound(x, y, SOUND_boom, Xbug_1_n);
172 static void Lboom_tank(int x, int y)
174 if (game_em.use_old_explosions)
177 Lboom_generic(x, y, Xblank, Xblank);
179 #if PLAY_ELEMENT_SOUND
180 play_element_sound(x, y, SOUND_boom, Xtank_1_n);
184 static void Lboom_eater(int x, int y)
186 if (game_em.use_old_explosions)
189 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
190 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
191 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
192 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
193 boom[x][y] = lev.eater_array[lev.eater_pos][4];
194 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
195 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
196 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
197 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
199 lev.eater_pos = (lev.eater_pos + 1) % lev.num_eater_arrays;
201 #if PLAY_ELEMENT_SOUND
202 play_element_sound(x, y, SOUND_boom, Xeater_n);
206 static void Lboom_bug_old(int x, int y)
208 if (!game_em.use_old_explosions)
214 static void Lboom_tank_old(int x, int y)
216 if (!game_em.use_old_explosions)
222 static void Lboom_eater_old(int x, int y)
224 if (!game_em.use_old_explosions)
230 static void Lboom_bug_new(int x, int y, boolean chain_explosion)
232 if (game_em.use_old_explosions)
241 static void Lboom_tank_new(int x, int y, boolean chain_explosion)
243 if (game_em.use_old_explosions)
252 static void Lboom_eater_new(int x, int y, boolean chain_explosion)
254 if (game_em.use_old_explosions)
263 static void Lboom_cave_new(int x, int y, int element)
265 if (game_em.use_old_explosions)
268 cave[x][y] = element;
271 static void Lboom_next_new(int x, int y, int element)
273 if (game_em.use_old_explosions)
276 next[x][y] = element;
279 static void Lpush_element_old(int x, int y, int element)
281 if (!game_em.use_old_push_elements)
284 cave[x][y] = element;
285 next[x][y] = element;
288 static boolean player_killed(struct PLAYER *ply)
296 if (lev.killed_out_of_time && setup.time_limit)
299 switch (cave[x][y-1])
320 switch (cave[x+1][y])
341 switch (cave[x][y+1])
362 switch (cave[x-1][y])
397 case Xfake_acid_1_player:
398 case Xfake_acid_2_player:
399 case Xfake_acid_3_player:
400 case Xfake_acid_4_player:
401 case Xfake_acid_5_player:
402 case Xfake_acid_6_player:
403 case Xfake_acid_7_player:
404 case Xfake_acid_8_player:
415 static void kill_player(struct PLAYER *ply)
422 switch (cave[x][y-1])
432 cave[x][y-1] = Xboom_bug;
433 Lboom_bug_new(x, y-1, TRUE);
444 cave[x][y-1] = Xboom_tank;
445 Lboom_tank_new(x, y-1, TRUE);
449 switch (cave[x+1][y])
459 cave[x+1][y] = Xboom_bug;
460 Lboom_bug_new(x+1, y, TRUE);
471 cave[x+1][y] = Xboom_tank;
472 Lboom_tank_new(x+1, y, TRUE);
476 switch (cave[x][y+1])
486 cave[x][y+1] = Xboom_bug;
487 Lboom_bug_new(x, y+1, TRUE);
498 cave[x][y+1] = Xboom_tank;
499 Lboom_tank_new(x, y+1, TRUE);
503 switch (cave[x-1][y])
513 cave[x-1][y] = Xboom_bug;
514 Lboom_bug_new(x-1, y, TRUE);
525 cave[x-1][y] = Xboom_tank;
526 Lboom_tank_new(x-1, y, TRUE);
537 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
541 play_element_sound(x, y, SOUND_die, Zplayer);
560 cave[x][y] = Xboom_1;
566 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
568 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
573 boolean result = TRUE;
575 if (!dx && !dy) /* no direction specified */
578 if (dx && dy && ply->joy_snap) /* more than one direction specified */
581 if (!ply->joy_snap) /* player wants to move */
583 int element = cave[x][y];
587 /* fire is released */
599 cave[x][y] = add_player[element];
600 next[x][y] = add_player[element];
602 play_element_sound(x, y, SOUND_blank, Xblank);
603 ply->anim = PLY_walk_n + anim;
617 if (cave[x+1][y-1] == Xblank)
618 cave[x+1][y-1] = Xsplash_e;
619 if (cave[x-1][y-1] == Xblank)
620 cave[x-1][y-1] = Xsplash_w;
621 play_element_sound(x, y, SOUND_acid, Xacid_1);
642 ply->anim = PLY_walk_n + anim;
648 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
649 (dx > 0 ? Ygrass_eB : Ygrass_wB));
650 next[x][y] = Zplayer;
651 play_element_sound(x, y, SOUND_dirt, Xgrass);
652 ply->anim = PLY_walk_n + anim;
658 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
659 (dx > 0 ? Ydirt_eB : Ydirt_wB));
660 next[x][y] = Zplayer;
661 play_element_sound(x, y, SOUND_dirt, Xdirt);
662 ply->anim = PLY_walk_n + anim;
669 cave[x][y] = Ydiamond_blank;
670 next[x][y] = Zplayer;
671 play_element_sound(x, y, SOUND_collect, element);
672 lev.score += lev.diamond_score;
673 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
674 game.snapshot.collected_item = TRUE;
675 ply->anim = PLY_walk_n + anim;
682 cave[x][y] = Yemerald_blank;
683 next[x][y] = Zplayer;
684 play_element_sound(x, y, SOUND_collect, element);
685 lev.score += lev.emerald_score;
686 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
687 game.snapshot.collected_item = TRUE;
688 ply->anim = PLY_walk_n + anim;
694 cave[x][y] = Ydynamite_blank;
695 next[x][y] = Zplayer;
696 play_element_sound(x, y, SOUND_collect, element);
697 lev.score += lev.dynamite_score;
698 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
699 ply->anim = PLY_walk_n + anim;
706 cave[x][y] = Ykey_1_blank;
711 cave[x][y] = Ykey_2_blank;
716 cave[x][y] = Ykey_3_blank;
721 cave[x][y] = Ykey_4_blank;
726 cave[x][y] = Ykey_5_blank;
731 cave[x][y] = Ykey_6_blank;
736 cave[x][y] = Ykey_7_blank;
741 cave[x][y] = Ykey_8_blank;
746 next[x][y] = Zplayer;
747 play_element_sound(x, y, SOUND_collect, element);
748 lev.score += lev.key_score;
749 ply->anim = PLY_walk_n + anim;
755 cave[x][y] = Ylenses_blank;
756 next[x][y] = Zplayer;
757 play_element_sound(x, y, SOUND_collect, element);
758 lev.score += lev.lenses_score;
759 lev.lenses_cnt = lev.lenses_time;
760 ply->anim = PLY_walk_n + anim;
766 cave[x][y] = Ymagnify_blank;
767 next[x][y] = Zplayer;
768 play_element_sound(x, y, SOUND_collect, element);
769 lev.score += lev.magnify_score;
770 lev.magnify_cnt = lev.magnify_time;
771 ply->anim = PLY_walk_n + anim;
780 switch (cave[x+dx][y])
793 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
794 next[x+dx][y] = Xstone_pause;
805 if (cave[x+dx+1][y-1] == Xblank)
806 cave[x+dx+1][y-1] = Xsplash_e;
807 if (cave[x+dx-1][y-1] == Xblank)
808 cave[x+dx-1][y-1] = Xsplash_w;
809 play_element_sound(x, y, SOUND_acid, Xacid_1);
813 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
814 next[x][y] = Zplayer;
815 play_element_sound(x, y, SOUND_roll, Xstone);
820 ply->anim = PLY_push_n + anim;
827 switch (cave[x+dx][y])
840 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
841 next[x+dx][y] = Xbomb_pause;
852 if (cave[x+dx+1][y-1] == Xblank)
853 cave[x+dx+1][y-1] = Xsplash_e;
854 if (cave[x+dx-1][y-1] == Xblank)
855 cave[x+dx-1][y-1] = Xsplash_w;
856 play_element_sound(x, y, SOUND_acid, Xacid_1);
860 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
861 next[x][y] = Zplayer;
862 play_element_sound(x, y, SOUND_roll, Xbomb);
867 ply->anim = PLY_push_n + anim;
874 switch (cave[x+dx][y])
887 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
888 next[x+dx][y] = Xnut_pause;
899 if (cave[x+dx+1][y-1] == Xblank)
900 cave[x+dx+1][y-1] = Xsplash_e;
901 if (cave[x+dx-1][y-1] == Xblank)
902 cave[x+dx-1][y-1] = Xsplash_w;
903 play_element_sound(x, y, SOUND_acid, Xacid_1);
907 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
908 next[x][y] = Zplayer;
909 play_element_sound(x, y, SOUND_roll, Xnut);
914 ply->anim = PLY_push_n + anim;
921 switch (cave[x+dx][y])
934 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
935 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
946 if (cave[x+dx+1][y-1] == Xblank)
947 cave[x+dx+1][y-1] = Xsplash_e;
948 if (cave[x+dx-1][y-1] == Xblank)
949 cave[x+dx-1][y-1] = Xsplash_w;
950 play_element_sound(x, y, SOUND_acid, Xacid_1);
954 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
955 next[x][y] = Zplayer;
956 play_element_sound(x, y, SOUND_roll, Xspring);
962 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
963 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
964 next[x][y] = Zplayer;
965 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
966 play_element_sound(x, y, SOUND_slurp, Xalien);
967 lev.score += lev.slurp_score;
972 ply->anim = PLY_push_n + anim;
979 case Xsand_stonein_1:
980 case Xsand_stonein_2:
981 case Xsand_stonein_3:
982 case Xsand_stonein_4:
986 ply->anim = PLY_push_n + anim;
990 switch (cave[x+dx][y+dy])
1003 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
1004 (dx > 0 ? Yballoon_e : Yballoon_w));
1005 next[x+dx][y+dy] = Xballoon;
1016 if (cave[x+dx+1][y+dy-1] == Xblank)
1017 cave[x+dx+1][y+dy-1] = Xsplash_e;
1018 if (cave[x+dx-1][y+dy-1] == Xblank)
1019 cave[x+dx-1][y+dy-1] = Xsplash_w;
1020 play_element_sound(x, y, SOUND_acid, Xacid_1);
1024 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
1025 (dx > 0 ? Yballoon_eB : Yballoon_wB));
1026 next[x][y] = Zplayer;
1027 play_element_sound(x, y, SOUND_push, Xballoon);
1033 ply->anim = PLY_push_n + anim;
1045 switch (cave[x+dx][y+dy])
1058 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
1059 (dx > 0 ? Yandroid_e : Yandroid_w));
1060 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
1061 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1072 if (cave[x+dx+1][y+dy-1] == Xblank)
1073 cave[x+dx+1][y+dy-1] = Xsplash_e;
1074 if (cave[x+dx-1][y+dy-1] == Xblank)
1075 cave[x+dx-1][y+dy-1] = Xsplash_w;
1076 play_element_sound(x, y, SOUND_acid, Xacid_1);
1080 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1081 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1082 next[x][y] = Zplayer;
1083 play_element_sound(x, y, SOUND_push, Xandroid);
1089 ply->anim = PLY_push_n + anim;
1094 if (ply->keys & 0x01)
1101 if (ply->keys & 0x02)
1108 if (ply->keys & 0x04)
1115 if (ply->keys & 0x08)
1122 if (ply->keys & 0x10)
1129 if (ply->keys & 0x20)
1136 if (ply->keys & 0x40)
1143 if (ply->keys & 0x80)
1150 if (!is_blank[cave[x+dx][y+dy]])
1153 int element_next = cave[x+dx][y+dy];
1155 cave[x+dx][y+dy] = add_player[element_next];
1156 next[x+dx][y+dy] = add_player[element_next];
1158 play_element_sound(x, y, SOUND_door, element);
1159 ply->anim = PLY_walk_n + anim;
1165 play_element_sound(x, y, SOUND_press, element);
1166 lev.wheel_cnt = lev.wheel_time;
1172 lev.wind_direction = 0;
1176 lev.wind_direction = 1;
1180 lev.wind_direction = 2;
1184 lev.wind_direction = 3;
1188 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1193 play_element_sound(x, y, SOUND_press, element);
1194 lev.wind_cnt = lev.wind_time;
1198 play_element_sound(x, y, SOUND_press, element);
1203 play_element_sound(x, y, SOUND_press, element);
1204 lev.ball_cnt = lev.ball_time;
1205 lev.ball_active = !lev.ball_active;
1209 cave[x][y] = Yplant;
1210 next[x][y] = Xplant;
1211 play_element_sound(x, y, SOUND_blank, Xplant);
1212 ply->anim = PLY_walk_n + anim;
1223 game_em.level_solved = TRUE;
1225 ply->anim = PLY_walk_n + anim;
1232 if (ply->x == oldx && ply->y == oldy) /* no movement */
1235 else /* player wants to snap */
1237 int element = cave[x][y];
1241 /* fire is pressed */
1244 cave[x][y] = Ygrass_blank;
1245 next[x][y] = Xblank;
1246 play_element_sound(x, y, SOUND_dirt, element);
1247 ply->anim = PLY_shoot_n + anim;
1251 cave[x][y] = Ydirt_blank;
1252 next[x][y] = Xblank;
1253 play_element_sound(x, y, SOUND_dirt, element);
1254 ply->anim = PLY_shoot_n + anim;
1258 case Xdiamond_pause:
1259 cave[x][y] = Ydiamond_blank;
1260 next[x][y] = Xblank;
1261 play_element_sound(x, y, SOUND_collect, element);
1262 lev.score += lev.diamond_score;
1263 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
1264 game.snapshot.collected_item = TRUE;
1265 ply->anim = PLY_walk_n + anim;
1269 case Xemerald_pause:
1270 cave[x][y] = Yemerald_blank;
1271 next[x][y] = Xblank;
1272 play_element_sound(x, y, SOUND_collect, element);
1273 lev.score += lev.emerald_score;
1274 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
1275 game.snapshot.collected_item = TRUE;
1276 ply->anim = PLY_walk_n + anim;
1280 cave[x][y] = Ydynamite_blank;
1281 next[x][y] = Xblank;
1282 play_element_sound(x, y, SOUND_collect, element);
1283 lev.score += lev.dynamite_score;
1284 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1285 ply->anim = PLY_walk_n + anim;
1290 cave[x][y] = Ykey_1_blank;
1295 cave[x][y] = Ykey_2_blank;
1300 cave[x][y] = Ykey_3_blank;
1305 cave[x][y] = Ykey_4_blank;
1310 cave[x][y] = Ykey_5_blank;
1315 cave[x][y] = Ykey_6_blank;
1320 cave[x][y] = Ykey_7_blank;
1325 cave[x][y] = Ykey_8_blank;
1330 next[x][y] = Xblank;
1331 play_element_sound(x, y, SOUND_collect, element);
1332 lev.score += lev.key_score;
1333 ply->anim = PLY_walk_n + anim;
1337 cave[x][y] = Ylenses_blank;
1338 next[x][y] = Xblank;
1339 play_element_sound(x, y, SOUND_collect, element);
1340 lev.score += lev.lenses_score;
1341 lev.lenses_cnt = lev.lenses_time;
1342 ply->anim = PLY_walk_n + anim;
1346 cave[x][y] = Ymagnify_blank;
1347 next[x][y] = Xblank;
1348 play_element_sound(x, y, SOUND_collect, element);
1349 lev.score += lev.magnify_score;
1350 lev.magnify_cnt = lev.magnify_time;
1351 ply->anim = PLY_walk_n + anim;
1359 /* check for wrap-around movement */
1360 if (ply->x < lev.left ||
1361 ply->x > lev.right - 1)
1362 play_element_sound(oldx, oldy, SOUND_door, Xdoor_1);
1367 static void check_player(struct PLAYER *ply)
1375 game_em.last_player_direction[ply->num] = MV_NONE;
1377 if (ply->joy_w) /* west */
1382 else if (ply->joy_e) /* east */
1388 if (ply->joy_n) /* north */
1393 else if (ply->joy_s) /* south */
1405 boolean players_visible_before_move;
1406 boolean players_visible_after_move;
1409 players_visible_before_move = checkIfAllPlayersFitToScreen();
1414 players_visible_after_move = checkIfAllPlayersFitToScreen();
1417 player is allowed to move only in the following cases:
1418 - it is not needed to display all players (not focussed to all players)
1419 - all players are (still or again) visible after the move
1420 - some players were already outside visible screen area before the move
1422 can_move = (game.centered_player_nr != -1 ||
1423 players_visible_after_move ||
1424 !players_visible_before_move);
1440 if (dx == 0 && dy == 0)
1442 ply->joy_stick = FALSE;
1446 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1448 cave[x][y] = Xdynamite_1;
1449 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1455 ply->dynamite_cnt = 0;
1458 /* be a bit more random if the player doesn't move */
1459 game_em.random += 7;
1464 ply->joy_stick = TRUE;
1470 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1472 if (!ply->joy_snap) /* player wants to move */
1474 boolean moved = FALSE;
1476 if (ply->last_move_dir & MV_HORIZONTAL)
1478 if (!(moved = player_digfield(ply, 0, dy)))
1479 moved = player_digfield(ply, dx, 0);
1483 if (!(moved = player_digfield(ply, dx, 0)))
1484 moved = player_digfield(ply, 0, dy);
1490 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1491 else if (oldy != ply->y)
1492 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1494 game_em.any_player_moving = TRUE;
1495 game_em.last_moving_player = ply->num;
1496 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1499 else /* player wants to snap */
1501 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1505 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1507 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1510 /* default values if no players are alive anymore */
1514 for (i = 0; i < MAX_PLAYERS; i++)
1519 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1521 if (distance < distance_shortest)
1526 distance_shortest = distance;
1531 static void Lacid_1(int x, int y)
1533 next[x][y] = Xacid_2;
1536 static void Lacid_2(int x, int y)
1538 next[x][y] = Xacid_3;
1541 static void Lacid_3(int x, int y)
1543 next[x][y] = Xacid_4;
1546 static void Lacid_4(int x, int y)
1548 next[x][y] = Xacid_5;
1551 static void Lacid_5(int x, int y)
1553 next[x][y] = Xacid_6;
1556 static void Lacid_6(int x, int y)
1558 next[x][y] = Xacid_7;
1561 static void Lacid_7(int x, int y)
1563 next[x][y] = Xacid_8;
1566 static void Lacid_8(int x, int y)
1568 next[x][y] = Xacid_1;
1571 static void Lfake_acid_1(int x, int y)
1573 next[x][y] = Xfake_acid_2;
1576 static void Lfake_acid_2(int x, int y)
1578 next[x][y] = Xfake_acid_3;
1581 static void Lfake_acid_3(int x, int y)
1583 next[x][y] = Xfake_acid_4;
1586 static void Lfake_acid_4(int x, int y)
1588 next[x][y] = Xfake_acid_5;
1591 static void Lfake_acid_5(int x, int y)
1593 next[x][y] = Xfake_acid_6;
1596 static void Lfake_acid_6(int x, int y)
1598 next[x][y] = Xfake_acid_7;
1601 static void Lfake_acid_7(int x, int y)
1603 next[x][y] = Xfake_acid_8;
1606 static void Lfake_acid_8(int x, int y)
1608 next[x][y] = Xfake_acid_1;
1611 static void Landroid(int x, int y)
1615 if (lev.android_clone_cnt == 0)
1617 if (!is_android_blank[cave[x-1][y-1]] &&
1618 !is_android_blank[cave[x][y-1]] &&
1619 !is_android_blank[cave[x+1][y-1]] &&
1620 !is_android_blank[cave[x-1][y]] &&
1621 !is_android_blank[cave[x+1][y]] &&
1622 !is_android_blank[cave[x-1][y+1]] &&
1623 !is_android_blank[cave[x][y+1]] &&
1624 !is_android_blank[cave[x+1][y+1]])
1629 /* randomly find an object to clone */
1631 case 0: /* S,NE,W,NW,SE,E,SW,N */
1632 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1633 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1634 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1635 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1636 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1637 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1638 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1639 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1642 case 1: /* NW,SE,N,S,NE,SW,E,W */
1643 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1644 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1645 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1646 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1647 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1648 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1649 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1650 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1653 case 2: /* SW,E,S,W,N,NW,SE,NE */
1654 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1655 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1656 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1657 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1658 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1659 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1660 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1661 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1664 case 3: /* N,SE,NE,E,W,S,NW,SW */
1665 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1666 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1667 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1668 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1669 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1670 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1671 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1672 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1675 case 4: /* SE,NW,E,NE,SW,W,N,S */
1676 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1677 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1678 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1679 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1680 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1681 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1682 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1683 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1686 case 5: /* NE,W,SE,SW,S,N,E,NW */
1687 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1688 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1689 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1690 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1691 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1692 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1693 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1694 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1697 case 6: /* E,N,SW,S,NW,NE,SE,W */
1698 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1699 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1700 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1701 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1702 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1703 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1704 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1705 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1708 case 7: /* W,SW,NW,N,E,SE,NE,S */
1709 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1710 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1711 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1712 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1713 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1714 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1715 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1716 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1720 next[x][y] = temp; /* the item we chose to clone */
1721 play_element_sound(x, y, SOUND_android_clone, temp);
1725 /* randomly find a direction to move */
1727 case 0: /* S,NE,W,NW,SE,E,SW,N */
1728 if (is_android_blank[cave[x][y+1]]) goto android_s;
1729 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1730 if (is_android_blank[cave[x-1][y]]) goto android_w;
1731 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1732 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1733 if (is_android_blank[cave[x+1][y]]) goto android_e;
1734 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1735 if (is_android_blank[cave[x][y-1]]) goto android_n;
1738 case 1: /* NW,SE,N,S,NE,SW,E,W */
1739 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1740 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1741 if (is_android_blank[cave[x][y-1]]) goto android_n;
1742 if (is_android_blank[cave[x][y+1]]) goto android_s;
1743 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1744 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1745 if (is_android_blank[cave[x+1][y]]) goto android_e;
1746 if (is_android_blank[cave[x-1][y]]) goto android_w;
1749 case 2: /* SW,E,S,W,N,NW,SE,NE */
1750 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1751 if (is_android_blank[cave[x+1][y]]) goto android_e;
1752 if (is_android_blank[cave[x][y+1]]) goto android_s;
1753 if (is_android_blank[cave[x-1][y]]) goto android_w;
1754 if (is_android_blank[cave[x][y-1]]) goto android_n;
1755 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1756 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1757 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1760 case 3: /* N,SE,NE,E,W,S,NW,SW */
1761 if (is_android_blank[cave[x][y-1]]) goto android_n;
1762 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1763 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1764 if (is_android_blank[cave[x+1][y]]) goto android_e;
1765 if (is_android_blank[cave[x-1][y]]) goto android_w;
1766 if (is_android_blank[cave[x][y+1]]) goto android_s;
1767 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1768 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1771 case 4: /* SE,NW,E,NE,SW,W,N,S */
1772 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1773 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1774 if (is_android_blank[cave[x+1][y]]) goto android_e;
1775 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1776 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1777 if (is_android_blank[cave[x-1][y]]) goto android_w;
1778 if (is_android_blank[cave[x][y-1]]) goto android_n;
1779 if (is_android_blank[cave[x][y+1]]) goto android_s;
1782 case 5: /* NE,W,SE,SW,S,N,E,NW */
1783 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1784 if (is_android_blank[cave[x-1][y]]) goto android_w;
1785 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1786 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1787 if (is_android_blank[cave[x][y+1]]) goto android_s;
1788 if (is_android_blank[cave[x][y-1]]) goto android_n;
1789 if (is_android_blank[cave[x+1][y]]) goto android_e;
1790 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1793 case 6: /* E,N,SW,S,NW,NE,SE,W */
1794 if (is_android_blank[cave[x+1][y]]) goto android_e;
1795 if (is_android_blank[cave[x][y-1]]) goto android_n;
1796 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1797 if (is_android_blank[cave[x][y+1]]) goto android_s;
1798 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1799 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1800 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1801 if (is_android_blank[cave[x-1][y]]) goto android_w;
1804 case 7: /* W,SW,NW,N,E,SE,NE,S */
1805 if (is_android_blank[cave[x-1][y]]) goto android_w;
1806 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1807 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1808 if (is_android_blank[cave[x][y-1]]) goto android_n;
1809 if (is_android_blank[cave[x+1][y]]) goto android_e;
1810 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1811 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1812 if (is_android_blank[cave[x][y+1]]) goto android_s;
1818 if (lev.android_move_cnt == 0)
1820 if (is_player[cave[x-1][y-1]] ||
1821 is_player[cave[x][y-1]] ||
1822 is_player[cave[x+1][y-1]] ||
1823 is_player[cave[x-1][y]] ||
1824 is_player[cave[x+1][y]] ||
1825 is_player[cave[x-1][y+1]] ||
1826 is_player[cave[x][y+1]] ||
1827 is_player[cave[x+1][y+1]])
1830 set_nearest_player_xy(x, y, &dx, &dy);
1832 next[x][y] = Xblank; /* assume we will move */
1833 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1839 /* attempt clockwise move first if direct path is blocked */
1841 case 0: /* north west */
1842 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1843 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1844 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1848 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1849 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1850 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1853 case 2: /* north east */
1854 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1855 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1856 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1860 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1861 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1862 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1865 case 4: /* nowhere */
1869 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1870 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1871 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1874 case 6: /* south west */
1875 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1876 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1877 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1881 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1882 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1883 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1886 case 8: /* south east */
1887 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1888 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1889 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1897 /* attempt counterclockwise move first if direct path is blocked */
1899 case 0: /* north west */
1900 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1901 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1902 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1906 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1907 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1908 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1911 case 2: /* north east */
1912 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1913 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1914 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1918 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1919 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1920 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1923 case 4: /* nowhere */
1927 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1928 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1929 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1932 case 6: /* south west */
1933 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1934 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1935 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1939 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1940 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1941 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1944 case 8: /* south east */
1945 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1946 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1947 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1954 next[x][y] = Xandroid;
1958 cave[x][y] = Yandroid_nB;
1959 cave[x][y-1] = Yandroid_n;
1960 next[x][y-1] = Xandroid;
1961 play_element_sound(x, y, SOUND_android_move, Xandroid);
1965 cave[x][y] = Yandroid_neB;
1966 cave[x+1][y-1] = Yandroid_ne;
1967 next[x+1][y-1] = Xandroid;
1968 play_element_sound(x, y, SOUND_android_move, Xandroid);
1972 cave[x][y] = Yandroid_eB;
1973 cave[x+1][y] = Yandroid_e;
1974 next[x+1][y] = Xandroid;
1975 play_element_sound(x, y, SOUND_android_move, Xandroid);
1979 cave[x][y] = Yandroid_seB;
1980 cave[x+1][y+1] = Yandroid_se;
1981 next[x+1][y+1] = Xandroid;
1982 play_element_sound(x, y, SOUND_android_move, Xandroid);
1986 cave[x][y] = Yandroid_sB;
1987 cave[x][y+1] = Yandroid_s;
1988 next[x][y+1] = Xandroid;
1989 play_element_sound(x, y, SOUND_android_move, Xandroid);
1993 cave[x][y] = Yandroid_swB;
1994 cave[x-1][y+1] = Yandroid_sw;
1995 next[x-1][y+1] = Xandroid;
1996 play_element_sound(x, y, SOUND_android_move, Xandroid);
2000 cave[x][y] = Yandroid_wB;
2001 cave[x-1][y] = Yandroid_w;
2002 next[x-1][y] = Xandroid;
2003 play_element_sound(x, y, SOUND_android_move, Xandroid);
2007 cave[x][y] = Yandroid_nwB;
2008 cave[x-1][y-1] = Yandroid_nw;
2009 next[x-1][y-1] = Xandroid;
2010 play_element_sound(x, y, SOUND_android_move, Xandroid);
2014 static void Landroid_1_n(int x, int y)
2016 switch (cave[x][y-1])
2029 cave[x][y] = Yandroid_nB;
2030 next[x][y] = Xblank;
2031 cave[x][y-1] = Yandroid_n;
2032 next[x][y-1] = Xandroid;
2033 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
2044 cave[x][y] = Yandroid_nB;
2045 next[x][y] = Xblank;
2046 if (cave[x+1][y-2] == Xblank)
2047 cave[x+1][y-2] = Xsplash_e;
2048 if (cave[x-1][y-2] == Xblank)
2049 cave[x-1][y-2] = Xsplash_w;
2050 play_element_sound(x, y, SOUND_acid, Xacid_1);
2059 static void Landroid_2_n(int x, int y)
2061 switch (cave[x][y-1])
2074 cave[x][y] = Yandroid_nB;
2075 next[x][y] = Xblank;
2076 cave[x][y-1] = Yandroid_n;
2077 next[x][y-1] = Xandroid_1_n;
2078 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
2089 cave[x][y] = Yandroid_nB;
2090 next[x][y] = Xblank;
2091 if (cave[x+1][y-2] == Xblank)
2092 cave[x+1][y-2] = Xsplash_e;
2093 if (cave[x-1][y-2] == Xblank)
2094 cave[x-1][y-2] = Xsplash_w;
2095 play_element_sound(x, y, SOUND_acid, Xacid_1);
2104 static void Landroid_1_e(int x, int y)
2106 switch (cave[x+1][y])
2119 cave[x][y] = Yandroid_eB;
2120 next[x][y] = Xblank;
2121 cave[x+1][y] = Yandroid_e;
2122 next[x+1][y] = Xandroid;
2123 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
2134 cave[x][y] = Yandroid_eB;
2135 next[x][y] = Xblank;
2136 if (cave[x+2][y-1] == Xblank)
2137 cave[x+2][y-1] = Xsplash_e;
2138 if (cave[x][y-1] == Xblank)
2139 cave[x][y-1] = Xsplash_w;
2140 play_element_sound(x, y, SOUND_acid, Xacid_1);
2149 static void Landroid_2_e(int x, int y)
2151 switch (cave[x+1][y])
2164 cave[x][y] = Yandroid_eB;
2165 next[x][y] = Xblank;
2166 cave[x+1][y] = Yandroid_e;
2167 next[x+1][y] = Xandroid_1_e;
2168 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
2179 cave[x][y] = Yandroid_eB;
2180 next[x][y] = Xblank;
2181 if (cave[x+2][y-1] == Xblank)
2182 cave[x+2][y-1] = Xsplash_e;
2183 if (cave[x][y-1] == Xblank)
2184 cave[x][y-1] = Xsplash_w;
2185 play_element_sound(x, y, SOUND_acid, Xacid_1);
2194 static void Landroid_1_s(int x, int y)
2196 switch (cave[x][y+1])
2209 cave[x][y] = Yandroid_sB;
2210 next[x][y] = Xblank;
2211 cave[x][y+1] = Yandroid_s;
2212 next[x][y+1] = Xandroid;
2213 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
2224 cave[x][y] = Yandroid_sB;
2225 next[x][y] = Xblank;
2226 if (cave[x+1][y] == Xblank)
2227 cave[x+1][y] = Xsplash_e;
2228 if (cave[x-1][y] == Xblank)
2229 cave[x-1][y] = Xsplash_w;
2230 play_element_sound(x, y, SOUND_acid, Xacid_1);
2239 static void Landroid_2_s(int x, int y)
2241 switch (cave[x][y+1])
2254 cave[x][y] = Yandroid_sB;
2255 next[x][y] = Xblank;
2256 cave[x][y+1] = Yandroid_s;
2257 next[x][y+1] = Xandroid_1_s;
2258 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
2269 cave[x][y] = Yandroid_sB;
2270 next[x][y] = Xblank;
2271 if (cave[x+1][y] == Xblank)
2272 cave[x+1][y] = Xsplash_e;
2273 if (cave[x-1][y] == Xblank)
2274 cave[x-1][y] = Xsplash_w;
2275 play_element_sound(x, y, SOUND_acid, Xacid_1);
2284 static void Landroid_1_w(int x, int y)
2286 switch (cave[x-1][y])
2299 cave[x][y] = Yandroid_wB;
2300 next[x][y] = Xblank;
2301 cave[x-1][y] = Yandroid_w;
2302 next[x-1][y] = Xandroid;
2303 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2314 cave[x][y] = Yandroid_wB;
2315 next[x][y] = Xblank;
2316 if (cave[x][y-1] == Xblank)
2317 cave[x][y-1] = Xsplash_e;
2318 if (cave[x-2][y-1] == Xblank)
2319 cave[x-2][y-1] = Xsplash_w;
2320 play_element_sound(x, y, SOUND_acid, Xacid_1);
2329 static void Landroid_2_w(int x, int y)
2331 switch (cave[x-1][y])
2344 cave[x][y] = Yandroid_wB;
2345 next[x][y] = Xblank;
2346 cave[x-1][y] = Yandroid_w;
2347 next[x-1][y] = Xandroid_1_w;
2348 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2359 cave[x][y] = Yandroid_wB;
2360 next[x][y] = Xblank;
2361 if (cave[x][y-1] == Xblank)
2362 cave[x][y-1] = Xsplash_e;
2363 if (cave[x-2][y-1] == Xblank)
2364 cave[x-2][y-1] = Xsplash_w;
2365 play_element_sound(x, y, SOUND_acid, Xacid_1);
2374 static void Leater_n(int x, int y)
2376 if (cave[x+1][y] == Xdiamond)
2378 cave[x+1][y] = Ydiamond_blank;
2379 next[x+1][y] = Xblank;
2380 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2384 if (cave[x][y+1] == Xdiamond)
2386 cave[x][y+1] = Ydiamond_blank;
2387 next[x][y+1] = Xblank;
2388 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2392 if (cave[x-1][y] == Xdiamond)
2394 cave[x-1][y] = Ydiamond_blank;
2395 next[x-1][y] = Xblank;
2396 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2400 if (cave[x][y-1] == Xdiamond)
2402 cave[x][y-1] = Ydiamond_blank;
2403 next[x][y-1] = Xblank;
2404 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2408 switch (cave[x][y-1])
2422 case Xfake_acid_1_player:
2423 case Xfake_acid_2_player:
2424 case Xfake_acid_3_player:
2425 case Xfake_acid_4_player:
2426 case Xfake_acid_5_player:
2427 case Xfake_acid_6_player:
2428 case Xfake_acid_7_player:
2429 case Xfake_acid_8_player:
2432 cave[x][y] = Yeater_nB;
2433 next[x][y] = Xblank;
2434 cave[x][y-1] = Yeater_n;
2435 next[x][y-1] = Xeater_n;
2446 cave[x][y] = Yeater_nB;
2447 next[x][y] = Xblank;
2448 if (cave[x+1][y-2] == Xblank)
2449 cave[x+1][y-2] = Xsplash_e;
2450 if (cave[x-1][y-2] == Xblank)
2451 cave[x-1][y-2] = Xsplash_w;
2452 play_element_sound(x, y, SOUND_acid, Xacid_1);
2456 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2457 play_element_sound(x, y, SOUND_eater, Xeater_n);
2462 static void Leater_e(int x, int y)
2464 if (cave[x][y+1] == Xdiamond)
2466 cave[x][y+1] = Ydiamond_blank;
2467 next[x][y+1] = Xblank;
2468 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2472 if (cave[x-1][y] == Xdiamond)
2474 cave[x-1][y] = Ydiamond_blank;
2475 next[x-1][y] = Xblank;
2476 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2480 if (cave[x][y-1] == Xdiamond)
2482 cave[x][y-1] = Ydiamond_blank;
2483 next[x][y-1] = Xblank;
2484 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2488 if (cave[x+1][y] == Xdiamond)
2490 cave[x+1][y] = Ydiamond_blank;
2491 next[x+1][y] = Xblank;
2492 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2496 switch (cave[x+1][y])
2510 case Xfake_acid_1_player:
2511 case Xfake_acid_2_player:
2512 case Xfake_acid_3_player:
2513 case Xfake_acid_4_player:
2514 case Xfake_acid_5_player:
2515 case Xfake_acid_6_player:
2516 case Xfake_acid_7_player:
2517 case Xfake_acid_8_player:
2520 cave[x][y] = Yeater_eB;
2521 next[x][y] = Xblank;
2522 cave[x+1][y] = Yeater_e;
2523 next[x+1][y] = Xeater_e;
2534 cave[x][y] = Yeater_eB;
2535 next[x][y] = Xblank;
2536 if (cave[x+2][y-1] == Xblank)
2537 cave[x+2][y-1] = Xsplash_e;
2538 if (cave[x][y-1] == Xblank)
2539 cave[x][y-1] = Xsplash_w;
2540 play_element_sound(x, y, SOUND_acid, Xacid_1);
2544 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2545 play_element_sound(x, y, SOUND_eater, Xeater_e);
2550 static void Leater_s(int x, int y)
2552 if (cave[x-1][y] == Xdiamond)
2554 cave[x-1][y] = Ydiamond_blank;
2555 next[x-1][y] = Xblank;
2556 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2560 if (cave[x][y-1] == Xdiamond)
2562 cave[x][y-1] = Ydiamond_blank;
2563 next[x][y-1] = Xblank;
2564 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2568 if (cave[x+1][y] == Xdiamond)
2570 cave[x+1][y] = Ydiamond_blank;
2571 next[x+1][y] = Xblank;
2572 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2576 if (cave[x][y+1] == Xdiamond)
2578 cave[x][y+1] = Ydiamond_blank;
2579 next[x][y+1] = Xblank;
2580 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2584 switch (cave[x][y+1])
2598 case Xfake_acid_1_player:
2599 case Xfake_acid_2_player:
2600 case Xfake_acid_3_player:
2601 case Xfake_acid_4_player:
2602 case Xfake_acid_5_player:
2603 case Xfake_acid_6_player:
2604 case Xfake_acid_7_player:
2605 case Xfake_acid_8_player:
2608 cave[x][y] = Yeater_sB;
2609 next[x][y] = Xblank;
2610 cave[x][y+1] = Yeater_s;
2611 next[x][y+1] = Xeater_s;
2622 cave[x][y] = Yeater_sB;
2623 next[x][y] = Xblank;
2624 if (cave[x+1][y] == Xblank)
2625 cave[x+1][y] = Xsplash_e;
2626 if (cave[x-1][y] == Xblank)
2627 cave[x-1][y] = Xsplash_w;
2628 play_element_sound(x, y, SOUND_acid, Xacid_1);
2632 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2633 play_element_sound(x, y, SOUND_eater, Xeater_s);
2638 static void Leater_w(int x, int y)
2640 if (cave[x][y-1] == Xdiamond)
2642 cave[x][y-1] = Ydiamond_blank;
2643 next[x][y-1] = Xblank;
2644 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2648 if (cave[x+1][y] == Xdiamond)
2650 cave[x+1][y] = Ydiamond_blank;
2651 next[x+1][y] = Xblank;
2652 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2656 if (cave[x][y+1] == Xdiamond)
2658 cave[x][y+1] = Ydiamond_blank;
2659 next[x][y+1] = Xblank;
2660 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2664 if (cave[x-1][y] == Xdiamond)
2666 cave[x-1][y] = Ydiamond_blank;
2667 next[x-1][y] = Xblank;
2668 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2672 switch (cave[x-1][y])
2686 case Xfake_acid_1_player:
2687 case Xfake_acid_2_player:
2688 case Xfake_acid_3_player:
2689 case Xfake_acid_4_player:
2690 case Xfake_acid_5_player:
2691 case Xfake_acid_6_player:
2692 case Xfake_acid_7_player:
2693 case Xfake_acid_8_player:
2696 cave[x][y] = Yeater_wB;
2697 next[x][y] = Xblank;
2698 cave[x-1][y] = Yeater_w;
2699 next[x-1][y] = Xeater_w;
2710 cave[x][y] = Yeater_wB;
2711 next[x][y] = Xblank;
2712 if (cave[x][y-1] == Xblank)
2713 cave[x][y-1] = Xsplash_e;
2714 if (cave[x-2][y-1] == Xblank)
2715 cave[x-2][y-1] = Xsplash_w;
2716 play_element_sound(x, y, SOUND_acid, Xacid_1);
2720 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2721 play_element_sound(x, y, SOUND_eater, Xeater_w);
2726 static void Lalien(int x, int y)
2737 set_nearest_player_xy(x, y, &dx, &dy);
2744 switch (cave[x][y-1])
2758 case Xfake_acid_1_player:
2759 case Xfake_acid_2_player:
2760 case Xfake_acid_3_player:
2761 case Xfake_acid_4_player:
2762 case Xfake_acid_5_player:
2763 case Xfake_acid_6_player:
2764 case Xfake_acid_7_player:
2765 case Xfake_acid_8_player:
2768 cave[x][y] = Yalien_nB;
2769 next[x][y] = Xblank;
2770 cave[x][y-1] = Yalien_n;
2771 next[x][y-1] = Xalien_pause;
2772 play_element_sound(x, y, SOUND_alien, Xalien);
2783 cave[x][y] = Yalien_nB;
2784 next[x][y] = Xblank;
2785 if (cave[x+1][y-2] == Xblank)
2786 cave[x+1][y-2] = Xsplash_e;
2787 if (cave[x-1][y-2] == Xblank)
2788 cave[x-1][y-2] = Xsplash_w;
2789 play_element_sound(x, y, SOUND_acid, Xacid_1);
2795 switch (cave[x][y+1])
2809 case Xfake_acid_1_player:
2810 case Xfake_acid_2_player:
2811 case Xfake_acid_3_player:
2812 case Xfake_acid_4_player:
2813 case Xfake_acid_5_player:
2814 case Xfake_acid_6_player:
2815 case Xfake_acid_7_player:
2816 case Xfake_acid_8_player:
2819 cave[x][y] = Yalien_sB;
2820 next[x][y] = Xblank;
2821 cave[x][y+1] = Yalien_s;
2822 next[x][y+1] = Xalien_pause;
2823 play_element_sound(x, y, SOUND_alien, Xalien);
2834 cave[x][y] = Yalien_sB;
2835 next[x][y] = Xblank;
2836 if (cave[x+1][y] == Xblank)
2837 cave[x+1][y] = Xsplash_e;
2838 if (cave[x-1][y] == Xblank)
2839 cave[x-1][y] = Xsplash_w;
2840 play_element_sound(x, y, SOUND_acid, Xacid_1);
2849 switch (cave[x+1][y])
2863 case Xfake_acid_1_player:
2864 case Xfake_acid_2_player:
2865 case Xfake_acid_3_player:
2866 case Xfake_acid_4_player:
2867 case Xfake_acid_5_player:
2868 case Xfake_acid_6_player:
2869 case Xfake_acid_7_player:
2870 case Xfake_acid_8_player:
2873 cave[x][y] = Yalien_eB;
2874 next[x][y] = Xblank;
2875 cave[x+1][y] = Yalien_e;
2876 next[x+1][y] = Xalien_pause;
2877 play_element_sound(x, y, SOUND_alien, Xalien);
2888 cave[x][y] = Yalien_eB;
2889 next[x][y] = Xblank;
2890 if (cave[x+2][y-1] == Xblank)
2891 cave[x+2][y-1] = Xsplash_e;
2892 if (cave[x][y-1] == Xblank)
2893 cave[x][y-1] = Xsplash_w;
2894 play_element_sound(x, y, SOUND_acid, Xacid_1);
2900 switch (cave[x-1][y])
2914 case Xfake_acid_1_player:
2915 case Xfake_acid_2_player:
2916 case Xfake_acid_3_player:
2917 case Xfake_acid_4_player:
2918 case Xfake_acid_5_player:
2919 case Xfake_acid_6_player:
2920 case Xfake_acid_7_player:
2921 case Xfake_acid_8_player:
2924 cave[x][y] = Yalien_wB;
2925 next[x][y] = Xblank;
2926 cave[x-1][y] = Yalien_w;
2927 next[x-1][y] = Xalien_pause;
2928 play_element_sound(x, y, SOUND_alien, Xalien);
2939 cave[x][y] = Yalien_wB;
2940 next[x][y] = Xblank;
2941 if (cave[x][y-1] == Xblank)
2942 cave[x][y-1] = Xsplash_e;
2943 if (cave[x-2][y-1] == Xblank)
2944 cave[x-2][y-1] = Xsplash_w;
2945 play_element_sound(x, y, SOUND_acid, Xacid_1);
2952 static void Lalien_pause(int x, int y)
2954 next[x][y] = Xalien;
2957 static void Lbug_n(int x, int y)
2959 switch (cave[x][y-1])
2973 case Xfake_acid_1_player:
2974 case Xfake_acid_2_player:
2975 case Xfake_acid_3_player:
2976 case Xfake_acid_4_player:
2977 case Xfake_acid_5_player:
2978 case Xfake_acid_6_player:
2979 case Xfake_acid_7_player:
2980 case Xfake_acid_8_player:
2983 cave[x][y] = Ybug_nB;
2984 next[x][y] = Xblank;
2985 cave[x][y-1] = Ybug_n;
2986 next[x][y-1] = Xbug_1_n;
2987 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2998 cave[x][y] = Ybug_nB;
2999 next[x][y] = Xblank;
3000 if (cave[x+1][y-2] == Xblank)
3001 cave[x+1][y-2] = Xsplash_e;
3002 if (cave[x-1][y-2] == Xblank)
3003 cave[x-1][y-2] = Xsplash_w;
3004 play_element_sound(x, y, SOUND_acid, Xacid_1);
3008 cave[x][y] = Ybug_n_w;
3009 next[x][y] = Xbug_2_w;
3010 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
3015 static void Lbug_1_n(int x, int y)
3017 if (is_amoeba[cave[x][y-1]] ||
3018 is_amoeba[cave[x+1][y]] ||
3019 is_amoeba[cave[x][y+1]] ||
3020 is_amoeba[cave[x-1][y]])
3028 switch (cave[x+1][y])
3042 case Xfake_acid_1_player:
3043 case Xfake_acid_2_player:
3044 case Xfake_acid_3_player:
3045 case Xfake_acid_4_player:
3046 case Xfake_acid_5_player:
3047 case Xfake_acid_6_player:
3048 case Xfake_acid_7_player:
3049 case Xfake_acid_8_player:
3060 cave[x][y] = Ybug_n_e;
3061 next[x][y] = Xbug_2_e;
3062 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
3071 static void Lbug_2_n(int x, int y)
3073 if (is_amoeba[cave[x][y-1]] ||
3074 is_amoeba[cave[x+1][y]] ||
3075 is_amoeba[cave[x][y+1]] ||
3076 is_amoeba[cave[x-1][y]])
3087 static void Lbug_e(int x, int y)
3089 switch (cave[x+1][y])
3103 case Xfake_acid_1_player:
3104 case Xfake_acid_2_player:
3105 case Xfake_acid_3_player:
3106 case Xfake_acid_4_player:
3107 case Xfake_acid_5_player:
3108 case Xfake_acid_6_player:
3109 case Xfake_acid_7_player:
3110 case Xfake_acid_8_player:
3113 cave[x][y] = Ybug_eB;
3114 next[x][y] = Xblank;
3115 cave[x+1][y] = Ybug_e;
3116 next[x+1][y] = Xbug_1_e;
3117 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3128 cave[x][y] = Ybug_eB;
3129 next[x][y] = Xblank;
3130 if (cave[x+2][y-1] == Xblank)
3131 cave[x+2][y-1] = Xsplash_e;
3132 if (cave[x][y-1] == Xblank)
3133 cave[x][y-1] = Xsplash_w;
3134 play_element_sound(x, y, SOUND_acid, Xacid_1);
3138 cave[x][y] = Ybug_e_n;
3139 next[x][y] = Xbug_2_n;
3140 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3145 static void Lbug_1_e(int x, int y)
3147 if (is_amoeba[cave[x][y-1]] ||
3148 is_amoeba[cave[x+1][y]] ||
3149 is_amoeba[cave[x][y+1]] ||
3150 is_amoeba[cave[x-1][y]])
3158 switch (cave[x][y+1])
3172 case Xfake_acid_1_player:
3173 case Xfake_acid_2_player:
3174 case Xfake_acid_3_player:
3175 case Xfake_acid_4_player:
3176 case Xfake_acid_5_player:
3177 case Xfake_acid_6_player:
3178 case Xfake_acid_7_player:
3179 case Xfake_acid_8_player:
3190 cave[x][y] = Ybug_e_s;
3191 next[x][y] = Xbug_2_s;
3192 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3201 static void Lbug_2_e(int x, int y)
3203 if (is_amoeba[cave[x][y-1]] ||
3204 is_amoeba[cave[x+1][y]] ||
3205 is_amoeba[cave[x][y+1]] ||
3206 is_amoeba[cave[x-1][y]])
3217 static void Lbug_s(int x, int y)
3219 switch (cave[x][y+1])
3233 case Xfake_acid_1_player:
3234 case Xfake_acid_2_player:
3235 case Xfake_acid_3_player:
3236 case Xfake_acid_4_player:
3237 case Xfake_acid_5_player:
3238 case Xfake_acid_6_player:
3239 case Xfake_acid_7_player:
3240 case Xfake_acid_8_player:
3243 cave[x][y] = Ybug_sB;
3244 next[x][y] = Xblank;
3245 cave[x][y+1] = Ybug_s;
3246 next[x][y+1] = Xbug_1_s;
3247 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3258 cave[x][y] = Ybug_sB;
3259 next[x][y] = Xblank;
3260 if (cave[x+1][y] == Xblank)
3261 cave[x+1][y] = Xsplash_e;
3262 if (cave[x-1][y] == Xblank)
3263 cave[x-1][y] = Xsplash_w;
3264 play_element_sound(x, y, SOUND_acid, Xacid_1);
3268 cave[x][y] = Ybug_s_e;
3269 next[x][y] = Xbug_2_e;
3270 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3275 static void Lbug_1_s(int x, int y)
3277 if (is_amoeba[cave[x][y-1]] ||
3278 is_amoeba[cave[x+1][y]] ||
3279 is_amoeba[cave[x][y+1]] ||
3280 is_amoeba[cave[x-1][y]])
3288 switch (cave[x-1][y])
3302 case Xfake_acid_1_player:
3303 case Xfake_acid_2_player:
3304 case Xfake_acid_3_player:
3305 case Xfake_acid_4_player:
3306 case Xfake_acid_5_player:
3307 case Xfake_acid_6_player:
3308 case Xfake_acid_7_player:
3309 case Xfake_acid_8_player:
3320 cave[x][y] = Ybug_s_w;
3321 next[x][y] = Xbug_2_w;
3322 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3331 static void Lbug_2_s(int x, int y)
3333 if (is_amoeba[cave[x][y-1]] ||
3334 is_amoeba[cave[x+1][y]] ||
3335 is_amoeba[cave[x][y+1]] ||
3336 is_amoeba[cave[x-1][y]])
3347 static void Lbug_w(int x, int y)
3349 switch (cave[x-1][y])
3363 case Xfake_acid_1_player:
3364 case Xfake_acid_2_player:
3365 case Xfake_acid_3_player:
3366 case Xfake_acid_4_player:
3367 case Xfake_acid_5_player:
3368 case Xfake_acid_6_player:
3369 case Xfake_acid_7_player:
3370 case Xfake_acid_8_player:
3373 cave[x][y] = Ybug_wB;
3374 next[x][y] = Xblank;
3375 cave[x-1][y] = Ybug_w;
3376 next[x-1][y] = Xbug_1_w;
3377 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3388 cave[x][y] = Ybug_wB;
3389 next[x][y] = Xblank;
3390 if (cave[x][y-1] == Xblank)
3391 cave[x][y-1] = Xsplash_e;
3392 if (cave[x-2][y-1] == Xblank)
3393 cave[x-2][y-1] = Xsplash_w;
3394 play_element_sound(x, y, SOUND_acid, Xacid_1);
3398 cave[x][y] = Ybug_w_s;
3399 next[x][y] = Xbug_2_s;
3400 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3405 static void Lbug_1_w(int x, int y)
3407 if (is_amoeba[cave[x][y-1]] ||
3408 is_amoeba[cave[x+1][y]] ||
3409 is_amoeba[cave[x][y+1]] ||
3410 is_amoeba[cave[x-1][y]])
3418 switch (cave[x][y-1])
3432 case Xfake_acid_1_player:
3433 case Xfake_acid_2_player:
3434 case Xfake_acid_3_player:
3435 case Xfake_acid_4_player:
3436 case Xfake_acid_5_player:
3437 case Xfake_acid_6_player:
3438 case Xfake_acid_7_player:
3439 case Xfake_acid_8_player:
3450 cave[x][y] = Ybug_w_n;
3451 next[x][y] = Xbug_2_n;
3452 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3461 static void Lbug_2_w(int x, int y)
3463 if (is_amoeba[cave[x][y-1]] ||
3464 is_amoeba[cave[x+1][y]] ||
3465 is_amoeba[cave[x][y+1]] ||
3466 is_amoeba[cave[x-1][y]])
3477 static void Ltank_n(int x, int y)
3479 switch (cave[x][y-1])
3493 case Xfake_acid_1_player:
3494 case Xfake_acid_2_player:
3495 case Xfake_acid_3_player:
3496 case Xfake_acid_4_player:
3497 case Xfake_acid_5_player:
3498 case Xfake_acid_6_player:
3499 case Xfake_acid_7_player:
3500 case Xfake_acid_8_player:
3503 cave[x][y] = Ytank_nB;
3504 next[x][y] = Xblank;
3505 cave[x][y-1] = Ytank_n;
3506 next[x][y-1] = Xtank_1_n;
3507 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3518 cave[x][y] = Ytank_nB;
3519 next[x][y] = Xblank;
3520 if (cave[x+1][y-2] == Xblank)
3521 cave[x+1][y-2] = Xsplash_e;
3522 if (cave[x-1][y-2] == Xblank)
3523 cave[x-1][y-2] = Xsplash_w;
3524 play_element_sound(x, y, SOUND_acid, Xacid_1);
3528 cave[x][y] = Ytank_n_e;
3529 next[x][y] = Xtank_2_e;
3530 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3535 static void Ltank_1_n(int x, int y)
3537 if (is_amoeba[cave[x][y-1]] ||
3538 is_amoeba[cave[x+1][y]] ||
3539 is_amoeba[cave[x][y+1]] ||
3540 is_amoeba[cave[x-1][y]])
3548 switch (cave[x-1][y])
3562 case Xfake_acid_1_player:
3563 case Xfake_acid_2_player:
3564 case Xfake_acid_3_player:
3565 case Xfake_acid_4_player:
3566 case Xfake_acid_5_player:
3567 case Xfake_acid_6_player:
3568 case Xfake_acid_7_player:
3569 case Xfake_acid_8_player:
3580 cave[x][y] = Ytank_n_w;
3581 next[x][y] = Xtank_2_w;
3582 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3591 static void Ltank_2_n(int x, int y)
3593 if (is_amoeba[cave[x][y-1]] ||
3594 is_amoeba[cave[x+1][y]] ||
3595 is_amoeba[cave[x][y+1]] ||
3596 is_amoeba[cave[x-1][y]])
3607 static void Ltank_e(int x, int y)
3609 switch (cave[x+1][y])
3623 case Xfake_acid_1_player:
3624 case Xfake_acid_2_player:
3625 case Xfake_acid_3_player:
3626 case Xfake_acid_4_player:
3627 case Xfake_acid_5_player:
3628 case Xfake_acid_6_player:
3629 case Xfake_acid_7_player:
3630 case Xfake_acid_8_player:
3633 cave[x][y] = Ytank_eB;
3634 next[x][y] = Xblank;
3635 cave[x+1][y] = Ytank_e;
3636 next[x+1][y] = Xtank_1_e;
3637 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3648 cave[x][y] = Ytank_eB;
3649 next[x][y] = Xblank;
3650 if (cave[x+2][y-1] == Xblank)
3651 cave[x+2][y-1] = Xsplash_e;
3652 if (cave[x][y-1] == Xblank)
3653 cave[x][y-1] = Xsplash_w;
3654 play_element_sound(x, y, SOUND_acid, Xacid_1);
3658 cave[x][y] = Ytank_e_s;
3659 next[x][y] = Xtank_2_s;
3660 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3665 static void Ltank_1_e(int x, int y)
3667 if (is_amoeba[cave[x][y-1]] ||
3668 is_amoeba[cave[x+1][y]] ||
3669 is_amoeba[cave[x][y+1]] ||
3670 is_amoeba[cave[x-1][y]])
3678 switch (cave[x][y-1])
3692 case Xfake_acid_1_player:
3693 case Xfake_acid_2_player:
3694 case Xfake_acid_3_player:
3695 case Xfake_acid_4_player:
3696 case Xfake_acid_5_player:
3697 case Xfake_acid_6_player:
3698 case Xfake_acid_7_player:
3699 case Xfake_acid_8_player:
3710 cave[x][y] = Ytank_e_n;
3711 next[x][y] = Xtank_2_n;
3712 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3721 static void Ltank_2_e(int x, int y)
3723 if (is_amoeba[cave[x][y-1]] ||
3724 is_amoeba[cave[x+1][y]] ||
3725 is_amoeba[cave[x][y+1]] ||
3726 is_amoeba[cave[x-1][y]])
3737 static void Ltank_s(int x, int y)
3739 switch (cave[x][y+1])
3753 case Xfake_acid_1_player:
3754 case Xfake_acid_2_player:
3755 case Xfake_acid_3_player:
3756 case Xfake_acid_4_player:
3757 case Xfake_acid_5_player:
3758 case Xfake_acid_6_player:
3759 case Xfake_acid_7_player:
3760 case Xfake_acid_8_player:
3763 cave[x][y] = Ytank_sB;
3764 next[x][y] = Xblank;
3765 cave[x][y+1] = Ytank_s;
3766 next[x][y+1] = Xtank_1_s;
3767 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3778 cave[x][y] = Ytank_sB;
3779 next[x][y] = Xblank;
3780 if (cave[x+1][y] == Xblank)
3781 cave[x+1][y] = Xsplash_e;
3782 if (cave[x-1][y] == Xblank)
3783 cave[x-1][y] = Xsplash_w;
3784 play_element_sound(x, y, SOUND_acid, Xacid_1);
3788 cave[x][y] = Ytank_s_w;
3789 next[x][y] = Xtank_2_w;
3790 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3795 static void Ltank_1_s(int x, int y)
3797 if (is_amoeba[cave[x][y-1]] ||
3798 is_amoeba[cave[x+1][y]] ||
3799 is_amoeba[cave[x][y+1]] ||
3800 is_amoeba[cave[x-1][y]])
3808 switch (cave[x+1][y])
3822 case Xfake_acid_1_player:
3823 case Xfake_acid_2_player:
3824 case Xfake_acid_3_player:
3825 case Xfake_acid_4_player:
3826 case Xfake_acid_5_player:
3827 case Xfake_acid_6_player:
3828 case Xfake_acid_7_player:
3829 case Xfake_acid_8_player:
3840 cave[x][y] = Ytank_s_e;
3841 next[x][y] = Xtank_2_e;
3842 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3851 static void Ltank_2_s(int x, int y)
3853 if (is_amoeba[cave[x][y-1]] ||
3854 is_amoeba[cave[x+1][y]] ||
3855 is_amoeba[cave[x][y+1]] ||
3856 is_amoeba[cave[x-1][y]])
3867 static void Ltank_w(int x, int y)
3869 switch (cave[x-1][y])
3883 case Xfake_acid_1_player:
3884 case Xfake_acid_2_player:
3885 case Xfake_acid_3_player:
3886 case Xfake_acid_4_player:
3887 case Xfake_acid_5_player:
3888 case Xfake_acid_6_player:
3889 case Xfake_acid_7_player:
3890 case Xfake_acid_8_player:
3893 cave[x][y] = Ytank_wB;
3894 next[x][y] = Xblank;
3895 cave[x-1][y] = Ytank_w;
3896 next[x-1][y] = Xtank_1_w;
3897 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3908 cave[x][y] = Ytank_wB;
3909 next[x][y] = Xblank;
3910 if (cave[x][y-1] == Xblank)
3911 cave[x][y-1] = Xsplash_e;
3912 if (cave[x-2][y-1] == Xblank)
3913 cave[x-2][y-1] = Xsplash_w;
3914 play_element_sound(x, y, SOUND_acid, Xacid_1);
3918 cave[x][y] = Ytank_w_n;
3919 next[x][y] = Xtank_2_n;
3920 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3925 static void Ltank_1_w(int x, int y)
3927 if (is_amoeba[cave[x][y-1]] ||
3928 is_amoeba[cave[x+1][y]] ||
3929 is_amoeba[cave[x][y+1]] ||
3930 is_amoeba[cave[x-1][y]])
3938 switch (cave[x][y+1])
3952 case Xfake_acid_1_player:
3953 case Xfake_acid_2_player:
3954 case Xfake_acid_3_player:
3955 case Xfake_acid_4_player:
3956 case Xfake_acid_5_player:
3957 case Xfake_acid_6_player:
3958 case Xfake_acid_7_player:
3959 case Xfake_acid_8_player:
3970 cave[x][y] = Ytank_w_s;
3971 next[x][y] = Xtank_2_s;
3972 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3981 static void Ltank_2_w(int x, int y)
3983 if (is_amoeba[cave[x][y-1]] ||
3984 is_amoeba[cave[x+1][y]] ||
3985 is_amoeba[cave[x][y+1]] ||
3986 is_amoeba[cave[x-1][y]])
3997 static void Lemerald(int x, int y)
3999 switch (cave[x][y+1])
4012 cave[x][y] = Yemerald_sB;
4013 next[x][y] = Xblank;
4014 cave[x][y+1] = Yemerald_s;
4015 next[x][y+1] = Xemerald_fall;
4026 cave[x][y] = Yemerald_sB;
4027 next[x][y] = Xblank;
4028 if (cave[x+1][y] == Xblank)
4029 cave[x+1][y] = Xsplash_e;
4030 if (cave[x-1][y] == Xblank)
4031 cave[x-1][y] = Xsplash_w;
4032 play_element_sound(x, y, SOUND_acid, Xacid_1);
4045 case Xemerald_pause:
4047 case Xdiamond_pause:
4091 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4093 cave[x][y] = Yemerald_eB;
4094 next[x][y] = Xblank;
4095 cave[x+1][y] = Yemerald_e;
4096 next[x+1][y] = Xemerald_pause;
4097 if (cave[x][y+1] == Xbumper)
4098 cave[x][y+1] = Ybumper;
4102 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4104 cave[x][y] = Yemerald_wB;
4105 next[x][y] = Xblank;
4106 cave[x-1][y] = Yemerald_w;
4107 next[x-1][y] = Xemerald_pause;
4108 if (cave[x][y+1] == Xbumper)
4109 cave[x][y+1] = Ybumper;
4115 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4117 cave[x][y] = Yemerald_wB;
4118 next[x][y] = Xblank;
4119 cave[x-1][y] = Yemerald_w;
4120 next[x-1][y] = Xemerald_pause;
4121 if (cave[x][y+1] == Xbumper)
4122 cave[x][y+1] = Ybumper;
4126 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4128 cave[x][y] = Yemerald_eB;
4129 next[x][y] = Xblank;
4130 cave[x+1][y] = Yemerald_e;
4131 next[x+1][y] = Xemerald_pause;
4132 if (cave[x][y+1] == Xbumper)
4133 cave[x][y+1] = Ybumper;
4139 if (++lev.shine_cnt > 50)
4141 lev.shine_cnt = RANDOM(8);
4142 cave[x][y] = Xemerald_shine;
4149 static void Lemerald_pause(int x, int y)
4151 switch (cave[x][y+1])
4164 cave[x][y] = Yemerald_sB;
4165 next[x][y] = Xblank;
4166 cave[x][y+1] = Yemerald_s;
4167 next[x][y+1] = Xemerald_fall;
4178 cave[x][y] = Yemerald_sB;
4179 next[x][y] = Xblank;
4180 if (cave[x+1][y] == Xblank)
4181 cave[x+1][y] = Xsplash_e;
4182 if (cave[x-1][y] == Xblank)
4183 cave[x-1][y] = Xsplash_w;
4184 play_element_sound(x, y, SOUND_acid, Xacid_1);
4188 cave[x][y] = Xemerald;
4189 next[x][y] = Xemerald;
4194 static void Lemerald_fall(int x, int y)
4196 switch (cave[x][y+1])
4210 case Xfake_acid_1_player:
4211 case Xfake_acid_2_player:
4212 case Xfake_acid_3_player:
4213 case Xfake_acid_4_player:
4214 case Xfake_acid_5_player:
4215 case Xfake_acid_6_player:
4216 case Xfake_acid_7_player:
4217 case Xfake_acid_8_player:
4218 cave[x][y] = Yemerald_sB;
4219 next[x][y] = Xblank;
4220 cave[x][y+1] = Yemerald_s;
4221 next[x][y+1] = Xemerald_fall;
4232 cave[x][y] = Yemerald_sB;
4233 next[x][y] = Xblank;
4234 if (cave[x+1][y] == Xblank)
4235 cave[x+1][y] = Xsplash_e;
4236 if (cave[x-1][y] == Xblank)
4237 cave[x-1][y] = Xsplash_w;
4238 play_element_sound(x, y, SOUND_acid, Xacid_1);
4242 if (lev.wonderwall_time > 0)
4244 lev.wonderwall_active = TRUE;
4245 cave[x][y] = Yemerald_sB;
4246 next[x][y] = Xblank;
4247 if (is_blank[cave[x][y+2]])
4249 cave[x][y+2] = Ydiamond_s;
4250 next[x][y+2] = Xdiamond_fall;
4252 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4257 cave[x][y] = Xemerald;
4258 next[x][y] = Xemerald;
4259 play_element_sound(x, y, SOUND_diamond, Xemerald);
4264 static void Ldiamond(int x, int y)
4266 switch (cave[x][y+1])
4279 cave[x][y] = Ydiamond_sB;
4280 next[x][y] = Xblank;
4281 cave[x][y+1] = Ydiamond_s;
4282 next[x][y+1] = Xdiamond_fall;
4293 cave[x][y] = Ydiamond_sB;
4294 next[x][y] = Xblank;
4295 if (cave[x+1][y] == Xblank)
4296 cave[x+1][y] = Xsplash_e;
4297 if (cave[x-1][y] == Xblank)
4298 cave[x-1][y] = Xsplash_w;
4299 play_element_sound(x, y, SOUND_acid, Xacid_1);
4312 case Xemerald_pause:
4314 case Xdiamond_pause:
4358 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4360 cave[x][y] = Ydiamond_eB;
4361 next[x][y] = Xblank;
4362 cave[x+1][y] = Ydiamond_e;
4363 next[x+1][y] = Xdiamond_pause;
4364 if (cave[x][y+1] == Xbumper)
4365 cave[x][y+1] = Ybumper;
4369 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4371 cave[x][y] = Ydiamond_wB;
4372 next[x][y] = Xblank;
4373 cave[x-1][y] = Ydiamond_w;
4374 next[x-1][y] = Xdiamond_pause;
4375 if (cave[x][y+1] == Xbumper)
4376 cave[x][y+1] = Ybumper;
4382 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4384 cave[x][y] = Ydiamond_wB;
4385 next[x][y] = Xblank;
4386 cave[x-1][y] = Ydiamond_w;
4387 next[x-1][y] = Xdiamond_pause;
4388 if (cave[x][y+1] == Xbumper)
4389 cave[x][y+1] = Ybumper;
4393 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4395 cave[x][y] = Ydiamond_eB;
4396 next[x][y] = Xblank;
4397 cave[x+1][y] = Ydiamond_e;
4398 next[x+1][y] = Xdiamond_pause;
4399 if (cave[x][y+1] == Xbumper)
4400 cave[x][y+1] = Ybumper;
4406 if (++lev.shine_cnt > 50)
4408 lev.shine_cnt = RANDOM(8);
4409 cave[x][y] = Xdiamond_shine;
4416 static void Ldiamond_pause(int x, int y)
4418 switch (cave[x][y+1])
4431 cave[x][y] = Ydiamond_sB;
4432 next[x][y] = Xblank;
4433 cave[x][y+1] = Ydiamond_s;
4434 next[x][y+1] = Xdiamond_fall;
4445 cave[x][y] = Ydiamond_sB;
4446 next[x][y] = Xblank;
4447 if (cave[x+1][y] == Xblank)
4448 cave[x+1][y] = Xsplash_e;
4449 if (cave[x-1][y] == Xblank)
4450 cave[x-1][y] = Xsplash_w;
4451 play_element_sound(x, y, SOUND_acid, Xacid_1);
4455 cave[x][y] = Xdiamond;
4456 next[x][y] = Xdiamond;
4461 static void Ldiamond_fall(int x, int y)
4463 switch (cave[x][y+1])
4477 case Xfake_acid_1_player:
4478 case Xfake_acid_2_player:
4479 case Xfake_acid_3_player:
4480 case Xfake_acid_4_player:
4481 case Xfake_acid_5_player:
4482 case Xfake_acid_6_player:
4483 case Xfake_acid_7_player:
4484 case Xfake_acid_8_player:
4485 cave[x][y] = Ydiamond_sB;
4486 next[x][y] = Xblank;
4487 cave[x][y+1] = Ydiamond_s;
4488 next[x][y+1] = Xdiamond_fall;
4499 cave[x][y] = Ydiamond_sB;
4500 next[x][y] = Xblank;
4501 if (cave[x+1][y] == Xblank)
4502 cave[x+1][y] = Xsplash_e;
4503 if (cave[x-1][y] == Xblank)
4504 cave[x-1][y] = Xsplash_w;
4505 play_element_sound(x, y, SOUND_acid, Xacid_1);
4509 if (lev.wonderwall_time > 0)
4511 lev.wonderwall_active = TRUE;
4512 cave[x][y] = Ydiamond_sB;
4513 next[x][y] = Xblank;
4514 if (is_blank[cave[x][y+2]])
4516 cave[x][y+2] = Ystone_s;
4517 next[x][y+2] = Xstone_fall;
4519 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4524 cave[x][y] = Xdiamond;
4525 next[x][y] = Xdiamond;
4526 play_element_sound(x, y, SOUND_diamond, Xdiamond);
4531 static void Lstone(int x, int y)
4533 switch (cave[x][y+1])
4548 cave[x][y] = Ystone_sB;
4549 next[x][y] = Xblank;
4550 cave[x][y+1] = Ystone_s;
4551 next[x][y+1] = Xstone_fall;
4562 cave[x][y] = Ystone_sB;
4563 next[x][y] = Xblank;
4564 if (cave[x+1][y] == Xblank)
4565 cave[x+1][y] = Xsplash_e;
4566 if (cave[x-1][y] == Xblank)
4567 cave[x-1][y] = Xsplash_w;
4568 play_element_sound(x, y, SOUND_acid, Xacid_1);
4572 cave[x][y] = Xsand_stonein_1;
4573 next[x][y] = Xsand_stonein_2;
4574 cave[x][y+1] = Xsand_sandstone_1;
4575 next[x][y+1] = Xsand_sandstone_2;
4588 case Xemerald_pause:
4590 case Xdiamond_pause:
4627 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4629 cave[x][y] = Ystone_eB;
4630 next[x][y] = Xblank;
4631 cave[x+1][y] = Ystone_e;
4632 next[x+1][y] = Xstone_pause;
4633 if (cave[x][y+1] == Xbumper)
4634 cave[x][y+1] = Ybumper;
4638 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4640 cave[x][y] = Ystone_wB;
4641 next[x][y] = Xblank;
4642 cave[x-1][y] = Ystone_w;
4643 next[x-1][y] = Xstone_pause;
4644 if (cave[x][y+1] == Xbumper)
4645 cave[x][y+1] = Ybumper;
4651 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4653 cave[x][y] = Ystone_wB;
4654 next[x][y] = Xblank;
4655 cave[x-1][y] = Ystone_w;
4656 next[x-1][y] = Xstone_pause;
4657 if (cave[x][y+1] == Xbumper)
4658 cave[x][y+1] = Ybumper;
4662 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4664 cave[x][y] = Ystone_eB;
4665 next[x][y] = Xblank;
4666 cave[x+1][y] = Ystone_e;
4667 next[x+1][y] = Xstone_pause;
4668 if (cave[x][y+1] == Xbumper)
4669 cave[x][y+1] = Ybumper;
4676 static void Lstone_pause(int x, int y)
4678 switch (cave[x][y+1])
4691 cave[x][y] = Ystone_sB;
4692 next[x][y] = Xblank;
4693 cave[x][y+1] = Ystone_s;
4694 next[x][y+1] = Xstone_fall;
4705 cave[x][y] = Ystone_sB;
4706 next[x][y] = Xblank;
4707 if (cave[x+1][y] == Xblank)
4708 cave[x+1][y] = Xsplash_e;
4709 if (cave[x-1][y] == Xblank)
4710 cave[x-1][y] = Xsplash_w;
4711 play_element_sound(x, y, SOUND_acid, Xacid_1);
4715 cave[x][y] = Xstone;
4716 next[x][y] = Xstone;
4721 static void Lstone_fall(int x, int y)
4723 switch (cave[x][y+1])
4737 case Xfake_acid_1_player:
4738 case Xfake_acid_2_player:
4739 case Xfake_acid_3_player:
4740 case Xfake_acid_4_player:
4741 case Xfake_acid_5_player:
4742 case Xfake_acid_6_player:
4743 case Xfake_acid_7_player:
4744 case Xfake_acid_8_player:
4745 cave[x][y] = Ystone_sB;
4746 next[x][y] = Xblank;
4747 cave[x][y+1] = Ystone_s;
4748 next[x][y+1] = Xstone_fall;
4759 cave[x][y] = Ystone_sB;
4760 next[x][y] = Xblank;
4761 if (cave[x+1][y] == Xblank)
4762 cave[x+1][y] = Xsplash_e;
4763 if (cave[x-1][y] == Xblank)
4764 cave[x-1][y] = Xsplash_w;
4765 play_element_sound(x, y, SOUND_acid, Xacid_1);
4772 cave[x][y] = Ystone_sB;
4773 Lboom_next_new(x, y, Xblank);
4774 cave[x][y+1] = Yeater_stone;
4775 next[x][y+1] = Zeater;
4776 Lboom_eater_old(x, y+1);
4777 score += lev.eater_score;
4782 cave[x][y] = Ystone_sB;
4783 Lboom_next_new(x, y, Xblank);
4784 cave[x][y+1] = Yalien_stone;
4785 next[x][y+1] = Ztank;
4786 Lboom_tank_old(x, y+1);
4787 score += lev.alien_score;
4798 cave[x][y] = Ystone_sB;
4799 Lboom_next_new(x, y, Xblank);
4800 cave[x][y+1] = Ybug_stone;
4801 next[x][y+1] = Zbug;
4802 Lboom_bug_old(x, y+1);
4803 score += lev.bug_score;
4814 cave[x][y] = Ystone_sB;
4815 Lboom_next_new(x, y, Xblank);
4816 cave[x][y+1] = Ytank_stone;
4817 next[x][y+1] = Ztank;
4818 Lboom_tank_old(x, y+1);
4819 score += lev.tank_score;
4823 case Xdiamond_pause:
4824 switch (cave[x][y+2])
4838 case Xfake_acid_1_player:
4839 case Xfake_acid_2_player:
4840 case Xfake_acid_3_player:
4841 case Xfake_acid_4_player:
4842 case Xfake_acid_5_player:
4843 case Xfake_acid_6_player:
4844 case Xfake_acid_7_player:
4845 case Xfake_acid_8_player:
4888 next[x][y] = Xstone;
4889 play_element_sound(x, y, SOUND_stone, Xstone);
4893 cave[x][y] = Ystone_sB;
4894 next[x][y] = Xblank;
4895 cave[x][y+1] = Ydiamond_stone;
4896 next[x][y+1] = Xstone_pause;
4897 play_element_sound(x, y, SOUND_squash, Xdiamond);
4902 Lboom_cave_new(x, y, Xstone);
4903 Lboom_next_new(x, y, Xstone);
4904 cave[x][y+1] = Ybomb_blank;
4905 next[x][y+1] = Ztank;
4906 Lboom_tank_old(x, y+1);
4911 next[x][y] = Xstone;
4912 cave[x][y+1] = Ynut_stone;
4913 next[x][y+1] = Xemerald;
4914 play_element_sound(x, y, SOUND_crack, Xnut);
4915 score += lev.nut_score;
4921 switch (cave[x+1][y+1])
4936 cave[x][y+1] = Xspring_e;
4940 cave[x][y+1] = Xspring_w;
4946 switch (cave[x-1][y+1])
4961 cave[x][y+1] = Xspring_w;
4964 cave[x][y+1] = Xspring_e;
4969 next[x][y] = Xstone;
4973 if (lev.wonderwall_time > 0)
4975 lev.wonderwall_active = TRUE;
4976 cave[x][y] = Ystone_sB;
4977 next[x][y] = Xblank;
4978 if (is_blank[cave[x][y+2]])
4980 cave[x][y+2] = Yemerald_s;
4981 next[x][y+2] = Xemerald_fall;
4983 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4988 cave[x][y] = Xstone;
4989 next[x][y] = Xstone;
4990 play_element_sound(x, y, SOUND_stone, Xstone);
4995 static void Lbomb(int x, int y)
4997 switch (cave[x][y+1])
5010 cave[x][y] = Ybomb_sB;
5011 next[x][y] = Xblank;
5012 cave[x][y+1] = Ybomb_s;
5013 next[x][y+1] = Xbomb_fall;
5024 cave[x][y] = Ybomb_sB;
5025 next[x][y] = Xblank;
5026 if (cave[x+1][y] == Xblank)
5027 cave[x+1][y] = Xsplash_e;
5028 if (cave[x-1][y] == Xblank)
5029 cave[x-1][y] = Xsplash_w;
5030 play_element_sound(x, y, SOUND_acid, Xacid_1);
5043 case Xemerald_pause:
5045 case Xdiamond_pause:
5080 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5082 cave[x][y] = Ybomb_eB;
5083 next[x][y] = Xblank;
5084 cave[x+1][y] = Ybomb_e;
5085 next[x+1][y] = Xbomb_pause;
5086 if (cave[x][y+1] == Xbumper)
5087 cave[x][y+1] = Ybumper;
5091 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5093 cave[x][y] = Ybomb_wB;
5094 next[x][y] = Xblank;
5095 cave[x-1][y] = Ybomb_w;
5096 next[x-1][y] = Xbomb_pause;
5097 if (cave[x][y+1] == Xbumper)
5098 cave[x][y+1] = Ybumper;
5104 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5106 cave[x][y] = Ybomb_wB;
5107 next[x][y] = Xblank;
5108 cave[x-1][y] = Ybomb_w;
5109 next[x-1][y] = Xbomb_pause;
5110 if (cave[x][y+1] == Xbumper)
5111 cave[x][y+1] = Ybumper;
5115 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5117 cave[x][y] = Ybomb_eB;
5118 next[x][y] = Xblank;
5119 cave[x+1][y] = Ybomb_e;
5120 next[x+1][y] = Xbomb_pause;
5121 if (cave[x][y+1] == Xbumper)
5122 cave[x][y+1] = Ybumper;
5129 static void Lbomb_pause(int x, int y)
5131 switch (cave[x][y+1])
5144 cave[x][y] = Ybomb_sB;
5145 next[x][y] = Xblank;
5146 cave[x][y+1] = Ybomb_s;
5147 next[x][y+1] = Xbomb_fall;
5158 cave[x][y] = Ybomb_sB;
5159 next[x][y] = Xblank;
5160 if (cave[x+1][y] == Xblank)
5161 cave[x+1][y] = Xsplash_e;
5162 if (cave[x-1][y] == Xblank)
5163 cave[x-1][y] = Xsplash_w;
5164 play_element_sound(x, y, SOUND_acid, Xacid_1);
5174 static void Lbomb_fall(int x, int y)
5176 switch (cave[x][y+1])
5189 cave[x][y] = Ybomb_sB;
5190 next[x][y] = Xblank;
5191 cave[x][y+1] = Ybomb_s;
5192 next[x][y+1] = Xbomb_fall;
5203 cave[x][y] = Ybomb_sB;
5204 next[x][y] = Xblank;
5205 if (cave[x+1][y] == Xblank)
5206 cave[x+1][y] = Xsplash_e;
5207 if (cave[x-1][y] == Xblank)
5208 cave[x-1][y] = Xsplash_w;
5209 play_element_sound(x, y, SOUND_acid, Xacid_1);
5213 cave[x][y] = Ybomb_blank;
5215 Lboom_tank_old(x, y);
5220 static void Lnut(int x, int y)
5222 switch (cave[x][y+1])
5235 cave[x][y] = Ynut_sB;
5236 next[x][y] = Xblank;
5237 cave[x][y+1] = Ynut_s;
5238 next[x][y+1] = Xnut_fall;
5249 cave[x][y] = Ynut_sB;
5250 next[x][y] = Xblank;
5251 if (cave[x+1][y] == Xblank)
5252 cave[x+1][y] = Xsplash_e;
5253 if (cave[x-1][y] == Xblank)
5254 cave[x-1][y] = Xsplash_w;
5255 play_element_sound(x, y, SOUND_acid, Xacid_1);
5268 case Xemerald_pause:
5270 case Xdiamond_pause:
5305 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5307 cave[x][y] = Ynut_eB;
5308 next[x][y] = Xblank;
5309 cave[x+1][y] = Ynut_e;
5310 next[x+1][y] = Xnut_pause;
5311 if (cave[x][y+1] == Xbumper)
5312 cave[x][y+1] = Ybumper;
5316 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5318 cave[x][y] = Ynut_wB;
5319 next[x][y] = Xblank;
5320 cave[x-1][y] = Ynut_w;
5321 next[x-1][y] = Xnut_pause;
5322 if (cave[x][y+1] == Xbumper)
5323 cave[x][y+1] = Ybumper;
5329 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5331 cave[x][y] = Ynut_wB;
5332 next[x][y] = Xblank;
5333 cave[x-1][y] = Ynut_w;
5334 next[x-1][y] = Xnut_pause;
5335 if (cave[x][y+1] == Xbumper)
5336 cave[x][y+1] = Ybumper;
5340 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5342 cave[x][y] = Ynut_eB;
5343 next[x][y] = Xblank;
5344 cave[x+1][y] = Ynut_e;
5345 next[x+1][y] = Xnut_pause;
5346 if (cave[x][y+1] == Xbumper)
5347 cave[x][y+1] = Ybumper;
5354 static void Lnut_pause(int x, int y)
5356 switch (cave[x][y+1])
5369 cave[x][y] = Ynut_sB;
5370 next[x][y] = Xblank;
5371 cave[x][y+1] = Ynut_s;
5372 next[x][y+1] = Xnut_fall;
5383 cave[x][y] = Ynut_sB;
5384 next[x][y] = Xblank;
5385 if (cave[x+1][y] == Xblank)
5386 cave[x+1][y] = Xsplash_e;
5387 if (cave[x-1][y] == Xblank)
5388 cave[x-1][y] = Xsplash_w;
5389 play_element_sound(x, y, SOUND_acid, Xacid_1);
5399 static void Lnut_fall(int x, int y)
5401 switch (cave[x][y+1])
5415 case Xfake_acid_1_player:
5416 case Xfake_acid_2_player:
5417 case Xfake_acid_3_player:
5418 case Xfake_acid_4_player:
5419 case Xfake_acid_5_player:
5420 case Xfake_acid_6_player:
5421 case Xfake_acid_7_player:
5422 case Xfake_acid_8_player:
5423 cave[x][y] = Ynut_sB;
5424 next[x][y] = Xblank;
5425 cave[x][y+1] = Ynut_s;
5426 next[x][y+1] = Xnut_fall;
5437 cave[x][y] = Ynut_sB;
5438 next[x][y] = Xblank;
5439 if (cave[x+1][y] == Xblank)
5440 cave[x+1][y] = Xsplash_e;
5441 if (cave[x-1][y] == Xblank)
5442 cave[x-1][y] = Xsplash_w;
5443 play_element_sound(x, y, SOUND_acid, Xacid_1);
5449 play_element_sound(x, y, SOUND_nut, Xnut);
5454 static void Lspring(int x, int y)
5456 switch (cave[x][y+1])
5471 cave[x][y] = Yspring_sB;
5472 next[x][y] = Xblank;
5473 cave[x][y+1] = Yspring_s;
5474 next[x][y+1] = Xspring_fall;
5485 cave[x][y] = Yspring_sB;
5486 next[x][y] = Xblank;
5487 if (cave[x+1][y] == Xblank)
5488 cave[x+1][y] = Xsplash_e;
5489 if (cave[x-1][y] == Xblank)
5490 cave[x-1][y] = Xsplash_w;
5491 play_element_sound(x, y, SOUND_acid, Xacid_1);
5504 case Xemerald_pause:
5506 case Xdiamond_pause:
5541 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5543 cave[x][y] = Yspring_eB;
5544 next[x][y] = Xblank;
5545 cave[x+1][y] = Yspring_e;
5547 next[x+1][y] = Xspring_e;
5549 next[x+1][y] = Xspring_pause;
5551 if (cave[x][y+1] == Xbumper)
5552 cave[x][y+1] = Ybumper;
5556 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5558 cave[x][y] = Yspring_wB;
5559 next[x][y] = Xblank;
5560 cave[x-1][y] = Yspring_w;
5562 next[x-1][y] = Xspring_w;
5564 next[x-1][y] = Xspring_pause;
5566 if (cave[x][y+1] == Xbumper)
5567 cave[x][y+1] = Ybumper;
5573 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5575 cave[x][y] = Yspring_wB;
5576 next[x][y] = Xblank;
5577 cave[x-1][y] = Yspring_w;
5579 next[x-1][y] = Xspring_w;
5581 next[x-1][y] = Xspring_pause;
5583 if (cave[x][y+1] == Xbumper)
5584 cave[x][y+1] = Ybumper;
5588 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5590 cave[x][y] = Yspring_eB;
5591 next[x][y] = Xblank;
5592 cave[x+1][y] = Yspring_e;
5594 next[x+1][y] = Xspring_e;
5596 next[x+1][y] = Xspring_pause;
5598 if (cave[x][y+1] == Xbumper)
5599 cave[x][y+1] = Ybumper;
5606 static void Lspring_pause(int x, int y)
5608 switch (cave[x][y+1])
5621 cave[x][y] = Yspring_sB;
5622 next[x][y] = Xblank;
5623 cave[x][y+1] = Yspring_s;
5624 next[x][y+1] = Xspring_fall;
5635 cave[x][y] = Yspring_sB;
5636 next[x][y] = Xblank;
5637 if (cave[x+1][y] == Xblank)
5638 cave[x+1][y] = Xsplash_e;
5639 if (cave[x-1][y] == Xblank)
5640 cave[x-1][y] = Xsplash_w;
5641 play_element_sound(x, y, SOUND_acid, Xacid_1);
5645 cave[x][y] = Xspring;
5646 next[x][y] = Xspring;
5651 static void Lspring_e(int x, int y)
5653 switch (cave[x][y+1])
5666 cave[x][y] = Yspring_sB;
5667 next[x][y] = Xblank;
5668 cave[x][y+1] = Yspring_s;
5669 next[x][y+1] = Xspring_fall;
5680 cave[x][y] = Yspring_sB;
5681 next[x][y] = Xblank;
5682 if (cave[x+1][y] == Xblank)
5683 cave[x+1][y] = Xsplash_e;
5684 if (cave[x-1][y] == Xblank)
5685 cave[x-1][y] = Xsplash_w;
5686 play_element_sound(x, y, SOUND_acid, Xacid_1);
5690 cave[x][y+1] = Ybumper;
5693 switch (cave[x+1][y])
5710 cave[x][y] = Yspring_eB;
5711 next[x][y] = Xblank;
5712 cave[x+1][y] = Yspring_e;
5713 next[x+1][y] = Xspring_e;
5724 cave[x][y] = Yspring_eB;
5725 next[x][y] = Xblank;
5726 if (cave[x+2][y-1] == Xblank)
5727 cave[x+2][y-1] = Xsplash_e;
5728 if (cave[x][y-1] == Xblank)
5729 cave[x][y-1] = Xsplash_w;
5730 play_element_sound(x, y, SOUND_acid, Xacid_1);
5739 cave[x][y] = Yspring_alien_eB;
5740 next[x][y] = Xblank;
5741 cave[x+1][y] = Yspring_alien_e;
5742 next[x+1][y] = Xspring_e;
5743 play_element_sound(x, y, SOUND_slurp, Xalien);
5744 score += lev.slurp_score;
5749 cave[x+1][y] = Ybumper;
5750 next[x][y] = Xspring_w;
5751 play_element_sound(x, y, SOUND_spring, Xspring);
5755 cave[x][y] = Xspring;
5756 next[x][y] = Xspring;
5757 play_element_sound(x, y, SOUND_spring, Xspring);
5762 static void Lspring_w(int x, int y)
5764 switch (cave[x][y+1])
5777 cave[x][y] = Yspring_sB;
5778 next[x][y] = Xblank;
5779 cave[x][y+1] = Yspring_s;
5780 next[x][y+1] = Xspring_fall;
5791 cave[x][y] = Yspring_sB;
5792 next[x][y] = Xblank;
5793 if (cave[x+1][y] == Xblank)
5794 cave[x+1][y] = Xsplash_e;
5795 if (cave[x-1][y] == Xblank)
5796 cave[x-1][y] = Xsplash_w;
5797 play_element_sound(x, y, SOUND_acid, Xacid_1);
5801 cave[x][y+1] = Ybumper;
5804 switch (cave[x-1][y])
5821 cave[x][y] = Yspring_wB;
5822 next[x][y] = Xblank;
5823 cave[x-1][y] = Yspring_w;
5824 next[x-1][y] = Xspring_w;
5835 cave[x][y] = Yspring_wB;
5836 next[x][y] = Xblank;
5837 if (cave[x][y-1] == Xblank)
5838 cave[x][y-1] = Xsplash_e;
5839 if (cave[x-2][y-1] == Xblank)
5840 cave[x-2][y-1] = Xsplash_w;
5841 play_element_sound(x, y, SOUND_acid, Xacid_1);
5850 cave[x][y] = Yspring_alien_wB;
5851 next[x][y] = Xblank;
5852 cave[x-1][y] = Yspring_alien_w;
5853 next[x-1][y] = Xspring_w;
5854 play_element_sound(x, y, SOUND_slurp, Xalien);
5855 score += lev.slurp_score;
5860 cave[x-1][y] = Ybumper;
5861 next[x][y] = Xspring_e;
5862 play_element_sound(x, y, SOUND_spring, Xspring);
5866 cave[x][y] = Xspring;
5867 next[x][y] = Xspring;
5868 play_element_sound(x, y, SOUND_spring, Xspring);
5873 static void Lspring_fall(int x, int y)
5875 switch (cave[x][y+1])
5889 case Xfake_acid_1_player:
5890 case Xfake_acid_2_player:
5891 case Xfake_acid_3_player:
5892 case Xfake_acid_4_player:
5893 case Xfake_acid_5_player:
5894 case Xfake_acid_6_player:
5895 case Xfake_acid_7_player:
5896 case Xfake_acid_8_player:
5897 cave[x][y] = Yspring_sB;
5898 next[x][y] = Xblank;
5899 cave[x][y+1] = Yspring_s;
5900 next[x][y+1] = Xspring_fall;
5911 cave[x][y] = Yspring_sB;
5912 next[x][y] = Xblank;
5913 if (cave[x+1][y] == Xblank)
5914 cave[x+1][y] = Xsplash_e;
5915 if (cave[x-1][y] == Xblank)
5916 cave[x-1][y] = Xsplash_w;
5917 play_element_sound(x, y, SOUND_acid, Xacid_1);
5924 cave[x][y] = Yspring_sB;
5925 next[x][y] = Xblank;
5926 cave[x][y+1] = Yeater_spring;
5927 next[x][y+1] = Zeater;
5928 Lboom_eater_old(x, y+1);
5929 score += lev.eater_score;
5934 cave[x][y] = Yspring_sB;
5935 next[x][y] = Xblank;
5936 cave[x][y+1] = Yalien_spring;
5937 next[x][y+1] = Ztank;
5938 Lboom_tank_old(x, y+1);
5939 score += lev.alien_score;
5950 cave[x][y] = Yspring_sB;
5951 next[x][y] = Xblank;
5952 cave[x][y+1] = Ybug_spring;
5953 next[x][y+1] = Zbug;
5954 Lboom_bug_old(x, y+1);
5955 score += lev.bug_score;
5966 cave[x][y] = Yspring_sB;
5967 next[x][y] = Xblank;
5968 cave[x][y+1] = Ytank_spring;
5969 next[x][y+1] = Ztank;
5970 Lboom_tank_old(x, y+1);
5971 score += lev.tank_score;
5976 cave[x][y] = Xspring;
5977 next[x][y] = Xspring;
5978 cave[x][y+1] = Ybomb_blank;
5979 next[x][y+1] = Ztank;
5980 Lboom_tank_old(x, y+1);
5984 cave[x][y] = Xspring;
5985 next[x][y] = Xspring;
5986 play_element_sound(x, y, SOUND_spring, Xspring);
5991 static void Lpush_emerald_e(int x, int y)
5993 cave[x][y] = Yemerald_eB;
5994 next[x][y] = Xblank;
5996 switch (cave[x+1][y])
5999 if (!game_em.use_old_push_elements)
6012 Lpush_element_old(x, y, Xemerald);
6024 if (game_em.use_old_push_into_acid)
6026 if (cave[x+2][y-1] == Xblank)
6027 cave[x+2][y-1] = Xsplash_e;
6028 if (cave[x][y-1] == Xblank)
6029 cave[x][y-1] = Xsplash_w;
6030 play_element_sound(x, y, SOUND_acid, Xacid_1);
6035 cave[x+1][y] = Yemerald_e;
6036 next[x+1][y] = Xemerald_pause;
6039 static void Lpush_emerald_w(int x, int y)
6041 cave[x][y] = Yemerald_wB;
6042 next[x][y] = Xblank;
6044 switch (cave[x-1][y])
6047 if (!game_em.use_old_push_elements)
6060 Lpush_element_old(x, y, Xemerald);
6072 if (game_em.use_old_push_into_acid)
6074 if (cave[x][y-1] == Xblank)
6075 cave[x][y-1] = Xsplash_e;
6076 if (cave[x-2][y-1] == Xblank)
6077 cave[x-2][y-1] = Xsplash_w;
6078 play_element_sound(x, y, SOUND_acid, Xacid_1);
6083 cave[x-1][y] = Yemerald_w;
6084 next[x-1][y] = Xemerald_pause;
6087 static void Lpush_diamond_e(int x, int y)
6089 cave[x][y] = Ydiamond_eB;
6090 next[x][y] = Xblank;
6092 switch (cave[x+1][y])
6095 if (!game_em.use_old_push_elements)
6108 Lpush_element_old(x, y, Xdiamond);
6120 if (game_em.use_old_push_into_acid)
6122 if (cave[x+2][y-1] == Xblank)
6123 cave[x+2][y-1] = Xsplash_e;
6124 if (cave[x][y-1] == Xblank)
6125 cave[x][y-1] = Xsplash_w;
6126 play_element_sound(x, y, SOUND_acid, Xacid_1);
6131 cave[x+1][y] = Ydiamond_e;
6132 next[x+1][y] = Xdiamond_pause;
6135 static void Lpush_diamond_w(int x, int y)
6137 cave[x][y] = Ydiamond_wB;
6138 next[x][y] = Xblank;
6140 switch (cave[x-1][y])
6143 if (!game_em.use_old_push_elements)
6156 Lpush_element_old(x, y, Xdiamond);
6168 if (game_em.use_old_push_into_acid)
6170 if (cave[x][y-1] == Xblank)
6171 cave[x][y-1] = Xsplash_e;
6172 if (cave[x-2][y-1] == Xblank)
6173 cave[x-2][y-1] = Xsplash_w;
6174 play_element_sound(x, y, SOUND_acid, Xacid_1);
6179 cave[x-1][y] = Ydiamond_w;
6180 next[x-1][y] = Xdiamond_pause;
6183 static void Lpush_stone_e(int x, int y)
6185 cave[x][y] = Ystone_eB;
6186 next[x][y] = Xblank;
6188 switch (cave[x+1][y])
6191 if (!game_em.use_old_push_elements)
6204 Lpush_element_old(x, y, Xstone);
6216 if (game_em.use_old_push_into_acid)
6218 if (cave[x+2][y-1] == Xblank)
6219 cave[x+2][y-1] = Xsplash_e;
6220 if (cave[x][y-1] == Xblank)
6221 cave[x][y-1] = Xsplash_w;
6222 play_element_sound(x, y, SOUND_acid, Xacid_1);
6227 cave[x+1][y] = Ystone_e;
6228 next[x+1][y] = Xstone_pause;
6231 static void Lpush_stone_w(int x, int y)
6233 cave[x][y] = Ystone_wB;
6234 next[x][y] = Xblank;
6236 switch (cave[x-1][y])
6239 if (!game_em.use_old_push_elements)
6252 Lpush_element_old(x, y, Xstone);
6264 if (game_em.use_old_push_into_acid)
6266 if (cave[x][y-1] == Xblank)
6267 cave[x][y-1] = Xsplash_e;
6268 if (cave[x-2][y-1] == Xblank)
6269 cave[x-2][y-1] = Xsplash_w;
6270 play_element_sound(x, y, SOUND_acid, Xacid_1);
6275 cave[x-1][y] = Ystone_w;
6276 next[x-1][y] = Xstone_pause;
6279 static void Lpush_bomb_e(int x, int y)
6281 cave[x][y] = Ybomb_eB;
6282 next[x][y] = Xblank;
6284 switch (cave[x+1][y])
6287 if (!game_em.use_old_push_elements)
6300 Lpush_element_old(x, y, Xbomb);
6312 if (game_em.use_old_push_into_acid)
6314 if (cave[x+2][y-1] == Xblank)
6315 cave[x+2][y-1] = Xsplash_e;
6316 if (cave[x][y-1] == Xblank)
6317 cave[x][y-1] = Xsplash_w;
6318 play_element_sound(x, y, SOUND_acid, Xacid_1);
6323 cave[x+1][y] = Ybomb_e;
6324 next[x+1][y] = Xbomb_pause;
6327 static void Lpush_bomb_w(int x, int y)
6329 cave[x][y] = Ybomb_wB;
6330 next[x][y] = Xblank;
6332 switch (cave[x-1][y])
6335 if (!game_em.use_old_push_elements)
6348 Lpush_element_old(x, y, Xbomb);
6360 if (game_em.use_old_push_into_acid)
6362 if (cave[x][y-1] == Xblank)
6363 cave[x][y-1] = Xsplash_e;
6364 if (cave[x-2][y-1] == Xblank)
6365 cave[x-2][y-1] = Xsplash_w;
6366 play_element_sound(x, y, SOUND_acid, Xacid_1);
6371 cave[x-1][y] = Ybomb_w;
6372 next[x-1][y] = Xbomb_pause;
6375 static void Lpush_nut_e(int x, int y)
6377 cave[x][y] = Ynut_eB;
6378 next[x][y] = Xblank;
6380 switch (cave[x+1][y])
6383 if (!game_em.use_old_push_elements)
6396 Lpush_element_old(x, y, Xnut);
6408 if (game_em.use_old_push_into_acid)
6410 if (cave[x+2][y-1] == Xblank)
6411 cave[x+2][y-1] = Xsplash_e;
6412 if (cave[x][y-1] == Xblank)
6413 cave[x][y-1] = Xsplash_w;
6414 play_element_sound(x, y, SOUND_acid, Xacid_1);
6419 cave[x+1][y] = Ynut_e;
6420 next[x+1][y] = Xnut_pause;
6423 static void Lpush_nut_w(int x, int y)
6425 cave[x][y] = Ynut_wB;
6426 next[x][y] = Xblank;
6428 switch (cave[x-1][y])
6431 if (!game_em.use_old_push_elements)
6444 Lpush_element_old(x, y, Xnut);
6456 if (game_em.use_old_push_into_acid)
6458 if (cave[x][y-1] == Xblank)
6459 cave[x][y-1] = Xsplash_e;
6460 if (cave[x-2][y-1] == Xblank)
6461 cave[x-2][y-1] = Xsplash_w;
6462 play_element_sound(x, y, SOUND_acid, Xacid_1);
6467 cave[x-1][y] = Ynut_w;
6468 next[x-1][y] = Xnut_pause;
6471 static void Lpush_spring_e(int x, int y)
6473 cave[x][y] = Yspring_eB;
6474 next[x][y] = Xblank;
6476 switch (cave[x+1][y])
6479 if (!game_em.use_old_push_elements)
6492 Lpush_element_old(x, y, Xspring);
6504 if (game_em.use_old_push_into_acid)
6506 if (cave[x+2][y-1] == Xblank)
6507 cave[x+2][y-1] = Xsplash_e;
6508 if (cave[x][y-1] == Xblank)
6509 cave[x][y-1] = Xsplash_w;
6510 play_element_sound(x, y, SOUND_acid, Xacid_1);
6515 cave[x+1][y] = Yspring_e;
6516 next[x+1][y] = Xspring_e;
6519 static void Lpush_spring_w(int x, int y)
6521 cave[x][y] = Yspring_wB;
6522 next[x][y] = Xblank;
6524 switch (cave[x-1][y])
6527 if (!game_em.use_old_push_elements)
6540 Lpush_element_old(x, y, Xspring);
6552 if (game_em.use_old_push_into_acid)
6554 if (cave[x][y-1] == Xblank)
6555 cave[x][y-1] = Xsplash_e;
6556 if (cave[x-2][y-1] == Xblank)
6557 cave[x-2][y-1] = Xsplash_w;
6558 play_element_sound(x, y, SOUND_acid, Xacid_1);
6563 cave[x-1][y] = Yspring_w;
6564 next[x-1][y] = Xspring_w;
6567 static void Ldynamite_1(int x, int y)
6569 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
6570 next[x][y] = Xdynamite_2;
6573 static void Ldynamite_2(int x, int y)
6575 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
6576 next[x][y] = Xdynamite_3;
6579 static void Ldynamite_3(int x, int y)
6581 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
6582 next[x][y] = Xdynamite_4;
6585 static void Ldynamite_4(int x, int y)
6587 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
6588 next[x][y] = Zdynamite;
6590 Lboom_generic(x, y, Xblank, Xblank);
6593 static void Lfake_door_1(int x, int y)
6595 if (lev.magnify_cnt)
6596 cave[x][y] = Xdoor_1;
6599 static void Lfake_door_2(int x, int y)
6601 if (lev.magnify_cnt)
6602 cave[x][y] = Xdoor_2;
6605 static void Lfake_door_3(int x, int y)
6607 if (lev.magnify_cnt)
6608 cave[x][y] = Xdoor_3;
6611 static void Lfake_door_4(int x, int y)
6613 if (lev.magnify_cnt)
6614 cave[x][y] = Xdoor_4;
6617 static void Lfake_door_5(int x, int y)
6619 if (lev.magnify_cnt)
6620 cave[x][y] = Xdoor_5;
6623 static void Lfake_door_6(int x, int y)
6625 if (lev.magnify_cnt)
6626 cave[x][y] = Xdoor_6;
6629 static void Lfake_door_7(int x, int y)
6631 if (lev.magnify_cnt)
6632 cave[x][y] = Xdoor_7;
6635 static void Lfake_door_8(int x, int y)
6637 if (lev.magnify_cnt)
6638 cave[x][y] = Xdoor_8;
6641 static void Lballoon(int x, int y)
6643 if (lev.wind_cnt == 0)
6646 switch (lev.wind_direction)
6649 switch (cave[x][y-1])
6662 cave[x][y] = Yballoon_nB;
6663 next[x][y] = Xblank;
6664 cave[x][y-1] = Yballoon_n;
6665 next[x][y-1] = Xballoon;
6676 cave[x][y] = Yballoon_nB;
6677 next[x][y] = Xblank;
6678 if (cave[x+1][y-2] == Xblank)
6679 cave[x+1][y-2] = Xsplash_e;
6680 if (cave[x-1][y-2] == Xblank)
6681 cave[x-1][y-2] = Xsplash_w;
6682 play_element_sound(x, y, SOUND_acid, Xacid_1);
6688 switch (cave[x+1][y])
6701 cave[x][y] = Yballoon_eB;
6702 next[x][y] = Xblank;
6703 cave[x+1][y] = Yballoon_e;
6704 next[x+1][y] = Xballoon;
6715 cave[x][y] = Yballoon_eB;
6716 next[x][y] = Xblank;
6717 if (cave[x+2][y-1] == Xblank)
6718 cave[x+2][y-1] = Xsplash_e;
6719 if (cave[x][y-1] == Xblank)
6720 cave[x][y-1] = Xsplash_w;
6721 play_element_sound(x, y, SOUND_acid, Xacid_1);
6727 switch (cave[x][y+1])
6740 cave[x][y] = Yballoon_sB;
6741 next[x][y] = Xblank;
6742 cave[x][y+1] = Yballoon_s;
6743 next[x][y+1] = Xballoon;
6754 cave[x][y] = Yballoon_sB;
6755 next[x][y] = Xblank;
6756 if (cave[x+1][y] == Xblank)
6757 cave[x+1][y] = Xsplash_e;
6758 if (cave[x-1][y] == Xblank)
6759 cave[x-1][y] = Xsplash_w;
6760 play_element_sound(x, y, SOUND_acid, Xacid_1);
6766 switch (cave[x-1][y])
6779 cave[x][y] = Yballoon_wB;
6780 next[x][y] = Xblank;
6781 cave[x-1][y] = Yballoon_w;
6782 next[x-1][y] = Xballoon;
6793 cave[x][y] = Yballoon_wB;
6794 next[x][y] = Xblank;
6795 if (cave[x][y-1] == Xblank)
6796 cave[x][y-1] = Xsplash_e;
6797 if (cave[x-2][y-1] == Xblank)
6798 cave[x-2][y-1] = Xsplash_w;
6799 play_element_sound(x, y, SOUND_acid, Xacid_1);
6806 static void Lball_common(int x, int y)
6808 play_element_sound(x, y, SOUND_ball, Xball_1);
6810 if (lev.ball_random)
6815 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6816 is_blank[cave[x-1][y-1]])
6818 cave[x-1][y-1] = Yball_blank;
6819 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6824 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6825 is_blank[cave[x][y-1]])
6827 cave[x][y-1] = Yball_blank;
6828 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6833 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6834 is_blank[cave[x+1][y-1]])
6836 cave[x+1][y-1] = Yball_blank;
6837 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6842 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6843 is_blank[cave[x-1][y]])
6845 cave[x-1][y] = Yball_blank;
6846 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6851 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6852 is_blank[cave[x+1][y]])
6854 cave[x+1][y] = Yball_blank;
6855 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6860 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6861 is_blank[cave[x-1][y+1]])
6863 cave[x-1][y+1] = Yball_blank;
6864 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6869 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6870 is_blank[cave[x][y+1]])
6872 cave[x][y+1] = Yball_blank;
6873 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6878 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6879 is_blank[cave[x+1][y+1]])
6881 cave[x+1][y+1] = Yball_blank;
6882 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6889 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6890 is_blank[cave[x-1][y-1]])
6892 cave[x-1][y-1] = Yball_blank;
6893 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6896 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6897 is_blank[cave[x][y-1]])
6899 cave[x][y-1] = Yball_blank;
6900 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6903 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6904 is_blank[cave[x+1][y-1]])
6906 cave[x+1][y-1] = Yball_blank;
6907 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6910 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6911 is_blank[cave[x-1][y]])
6913 cave[x-1][y] = Yball_blank;
6914 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6917 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6918 is_blank[cave[x+1][y]])
6920 cave[x+1][y] = Yball_blank;
6921 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6924 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6925 is_blank[cave[x-1][y+1]])
6927 cave[x-1][y+1] = Yball_blank;
6928 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6931 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6932 is_blank[cave[x][y+1]])
6934 cave[x][y+1] = Yball_blank;
6935 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6938 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6939 is_blank[cave[x+1][y+1]])
6941 cave[x+1][y+1] = Yball_blank;
6942 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6946 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
6949 static void Lball_1(int x, int y)
6951 if (!lev.ball_active)
6954 cave[x][y] = Yball_1;
6955 next[x][y] = Xball_2;
6962 static void Lball_2(int x, int y)
6964 if (!lev.ball_active)
6967 cave[x][y] = Yball_2;
6968 next[x][y] = Xball_1;
6975 static void Ldrip(int x, int y)
6977 next[x][y] = Xdrip_fall;
6980 static void Ldrip_fall(int x, int y)
6984 switch (cave[x][y+1])
6998 case Xfake_acid_1_player:
6999 case Xfake_acid_2_player:
7000 case Xfake_acid_3_player:
7001 case Xfake_acid_4_player:
7002 case Xfake_acid_5_player:
7003 case Xfake_acid_6_player:
7004 case Xfake_acid_7_player:
7005 case Xfake_acid_8_player:
7008 cave[x][y] = Ydrip_1_sB;
7009 next[x][y] = Xdrip_stretchB;
7010 cave[x][y+1] = Ydrip_1_s;
7011 next[x][y+1] = Xdrip_stretch;
7022 cave[x][y] = Ydrip_1_sB;
7023 next[x][y] = Xdrip_stretchB;
7024 if (cave[x+1][y] == Xblank)
7025 cave[x+1][y] = Xsplash_e;
7026 if (cave[x-1][y] == Xblank)
7027 cave[x-1][y] = Xsplash_w;
7028 play_element_sound(x, y, SOUND_acid, Xacid_1);
7034 case 0: temp = Xamoeba_1; break;
7035 case 1: temp = Xamoeba_2; break;
7036 case 2: temp = Xamoeba_3; break;
7037 case 3: temp = Xamoeba_4; break;
7038 case 4: temp = Xamoeba_5; break;
7039 case 5: temp = Xamoeba_6; break;
7040 case 6: temp = Xamoeba_7; break;
7041 case 7: temp = Xamoeba_8; break;
7046 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
7051 static void Ldrip_stretch(int x, int y)
7053 cave[x][y] = Ydrip_2_s;
7054 next[x][y] = Xdrip_fall;
7057 static void Ldrip_stretchB(int x, int y)
7059 cave[x][y] = Ydrip_2_sB;
7060 next[x][y] = Xblank;
7063 static void Lwonderwall(int x, int y)
7065 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7067 cave[x][y] = Ywonderwall;
7068 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
7072 static void Lwheel(int x, int y)
7074 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
7075 cave[x][y] = Ywheel;
7078 static void Lswitch(int x, int y)
7080 if (lev.ball_active)
7081 cave[x][y] = Yswitch;
7084 static void Lfake_blank(int x, int y)
7087 cave[x][y] = Yfake_blank;
7090 static void Lfake_grass(int x, int y)
7092 if (lev.magnify_cnt)
7093 cave[x][y] = Yfake_grass;
7096 static void Lfake_amoeba(int x, int y)
7099 cave[x][y] = Yfake_amoeba;
7102 static void Lsand_stone(int x, int y)
7104 switch (cave[x][y+1])
7117 cave[x][y] = Xsand_stonesand_quickout_1;
7118 next[x][y] = Xsand_stonesand_quickout_2;
7119 cave[x][y+1] = Xsand_stoneout_1;
7120 next[x][y+1] = Xsand_stoneout_2;
7131 cave[x][y] = Xsand_stonesand_quickout_1;
7132 next[x][y] = Xsand_stonesand_quickout_2;
7133 if (cave[x+1][y] == Xblank)
7134 cave[x+1][y] = Xsplash_e;
7135 if (cave[x-1][y] == Xblank)
7136 cave[x-1][y] = Xsplash_w;
7137 play_element_sound(x, y, SOUND_acid, Xacid_1);
7141 cave[x][y] = Xsand_stonesand_1;
7142 next[x][y] = Xsand_stonesand_2;
7143 cave[x][y+1] = Xsand_sandstone_1;
7144 next[x][y+1] = Xsand_sandstone_2;
7149 static void Lsand_stonein_1(int x, int y)
7151 next[x][y] = Xsand_stonein_2;
7154 static void Lsand_stonein_2(int x, int y)
7156 next[x][y] = Xsand_stonein_3;
7159 static void Lsand_stonein_3(int x, int y)
7161 next[x][y] = Xsand_stonein_4;
7164 static void Lsand_stonein_4(int x, int y)
7166 next[x][y] = Xblank;
7169 static void Lsand_sandstone_1(int x, int y)
7171 next[x][y] = Xsand_sandstone_2;
7174 static void Lsand_sandstone_2(int x, int y)
7176 next[x][y] = Xsand_sandstone_3;
7179 static void Lsand_sandstone_3(int x, int y)
7181 next[x][y] = Xsand_sandstone_4;
7184 static void Lsand_sandstone_4(int x, int y)
7186 next[x][y] = Xsand_stone;
7189 static void Lsand_stonesand_1(int x, int y)
7191 next[x][y] = Xsand_stonesand_2;
7194 static void Lsand_stonesand_2(int x, int y)
7196 next[x][y] = Xsand_stonesand_3;
7199 static void Lsand_stonesand_3(int x, int y)
7201 next[x][y] = Xsand_stonesand_4;
7204 static void Lsand_stonesand_4(int x, int y)
7209 static void Lsand_stoneout_1(int x, int y)
7211 next[x][y] = Xsand_stoneout_2;
7214 static void Lsand_stoneout_2(int x, int y)
7216 next[x][y] = Xstone_fall;
7219 static void Lsand_stonesand_quickout_1(int x, int y)
7221 next[x][y] = Xsand_stonesand_quickout_2;
7224 static void Lsand_stonesand_quickout_2(int x, int y)
7229 static void Lslide_ns(int x, int y)
7231 if (is_blank[cave[x][y-1]])
7233 cave[x][y-1] = Yslide_ns_blank;
7234 next[x][y-1] = Xslide_ns;
7235 play_element_sound(x, y, SOUND_slide, Xslide_ns);
7238 if (is_blank[cave[x][y+1]])
7240 cave[x][y+1] = Yslide_ns_blank;
7241 next[x][y+1] = Xslide_ns;
7242 play_element_sound(x, y, SOUND_slide, Xslide_ns);
7246 static void Lslide_ew(int x, int y)
7248 if (is_blank[cave[x+1][y]])
7250 cave[x+1][y] = Yslide_ew_blank;
7251 next[x+1][y] = Xslide_ew;
7252 play_element_sound(x, y, SOUND_slide, Xslide_ew);
7255 if (is_blank[cave[x-1][y]])
7257 cave[x-1][y] = Yslide_ew_blank;
7258 next[x-1][y] = Xslide_ew;
7259 play_element_sound(x, y, SOUND_slide, Xslide_ew);
7263 static void Lexit(int x, int y)
7265 if (lev.gems_needed > 0)
7268 switch (RANDOM(64) / 21)
7271 cave[x][y] = Xexit_1;
7272 next[x][y] = Xexit_2;
7276 cave[x][y] = Xexit_2;
7277 next[x][y] = Xexit_3;
7281 cave[x][y] = Xexit_3;
7282 next[x][y] = Xexit_1;
7286 play_element_sound(x, y, SOUND_exit_open, Xexit);
7289 static void Lexit_1(int x, int y)
7291 next[x][y] = Xexit_2;
7294 static void Lexit_2(int x, int y)
7296 next[x][y] = Xexit_3;
7299 static void Lexit_3(int x, int y)
7301 next[x][y] = Xexit_1;
7304 static void Lpause(int x, int y)
7306 next[x][y] = Xblank;
7309 static void Lamoeba(int x, int y)
7329 if (is_amoeba[cave[x][y-1]] ||
7330 is_amoeba[cave[x+1][y]] ||
7331 is_amoeba[cave[x][y+1]] ||
7332 is_amoeba[cave[x-1][y]])
7337 static void Lboom_one(int x, int y, boolean by_dynamite)
7398 cave[x][y] = Xboom_android;
7409 cave[x][y] = Xboom_bug;
7410 Lboom_bug_new(x, y, TRUE);
7416 cave[x][y] = Xboom_tank;
7417 Lboom_tank_new(x, y, TRUE);
7421 cave[x][y] = Xboom_1;
7426 static void Lboom_nine(int x, int y, boolean by_dynamite)
7428 Lboom_one(x, y-1, by_dynamite);
7429 Lboom_one(x-1, y, by_dynamite);
7430 Lboom_one(x+1, y, by_dynamite);
7431 Lboom_one(x, y+1, by_dynamite);
7432 Lboom_one(x-1, y-1, by_dynamite);
7433 Lboom_one(x+1, y-1, by_dynamite);
7434 Lboom_one(x-1, y+1, by_dynamite);
7435 Lboom_one(x+1, y+1, by_dynamite);
7437 cave[x][y] = Xboom_1;
7440 static void Lexplode(int x, int y)
7445 Lboom_bug_new(x, y, FALSE);
7446 Lboom_nine(x, y, FALSE);
7450 Lboom_tank_new(x, y, FALSE);
7451 Lboom_nine(x, y, FALSE);
7455 Lboom_eater_new(x, y, FALSE);
7456 Lboom_nine(x, y, FALSE);
7460 Lboom_nine(x, y, TRUE);
7464 Lboom_nine(x, y, FALSE);
7469 static void Lboom_1(int x, int y)
7471 next[x][y] = Xboom_2;
7472 #if !PLAY_ELEMENT_SOUND
7473 if (x != lev.exit_x && y != lev.exit_y)
7474 play_sound(x, y, SOUND_boom);
7476 lev.exit_x = lev.exit_y = -1;
7480 static void Lboom_2(int x, int y)
7482 next[x][y] = boom[x][y];
7485 static void Lboom_android(int x, int y)
7487 #if PLAY_ELEMENT_SOUND
7488 play_element_sound(x, y, SOUND_boom, Xandroid);
7494 static void Lchain(int x, int y)
7499 static void handle_tile(int x, int y)
7503 case Xacid_1: Lacid_1(x, y); break;
7504 case Xacid_2: Lacid_2(x, y); break;
7505 case Xacid_3: Lacid_3(x, y); break;
7506 case Xacid_4: Lacid_4(x, y); break;
7507 case Xacid_5: Lacid_5(x, y); break;
7508 case Xacid_6: Lacid_6(x, y); break;
7509 case Xacid_7: Lacid_7(x, y); break;
7510 case Xacid_8: Lacid_8(x, y); break;
7512 case Xfake_acid_1: Lfake_acid_1(x, y); break;
7513 case Xfake_acid_2: Lfake_acid_2(x, y); break;
7514 case Xfake_acid_3: Lfake_acid_3(x, y); break;
7515 case Xfake_acid_4: Lfake_acid_4(x, y); break;
7516 case Xfake_acid_5: Lfake_acid_5(x, y); break;
7517 case Xfake_acid_6: Lfake_acid_6(x, y); break;
7518 case Xfake_acid_7: Lfake_acid_7(x, y); break;
7519 case Xfake_acid_8: Lfake_acid_8(x, y); break;
7521 case Xandroid: Landroid(x, y); break;
7522 case Xandroid_1_n: Landroid_1_n(x, y); break;
7523 case Xandroid_2_n: Landroid_2_n(x, y); break;
7524 case Xandroid_1_e: Landroid_1_e(x, y); break;
7525 case Xandroid_2_e: Landroid_2_e(x, y); break;
7526 case Xandroid_1_s: Landroid_1_s(x, y); break;
7527 case Xandroid_2_s: Landroid_2_s(x, y); break;
7528 case Xandroid_1_w: Landroid_1_w(x, y); break;
7529 case Xandroid_2_w: Landroid_2_w(x, y); break;
7531 case Xeater_n: Leater_n(x, y); break;
7532 case Xeater_e: Leater_e(x, y); break;
7533 case Xeater_s: Leater_s(x, y); break;
7534 case Xeater_w: Leater_w(x, y); break;
7536 case Xalien: Lalien(x, y); break;
7537 case Xalien_pause: Lalien_pause(x, y); break;
7539 case Xbug_1_n: Lbug_1_n(x, y); break;
7540 case Xbug_2_n: Lbug_2_n(x, y); break;
7541 case Xbug_1_e: Lbug_1_e(x, y); break;
7542 case Xbug_2_e: Lbug_2_e(x, y); break;
7543 case Xbug_1_s: Lbug_1_s(x, y); break;
7544 case Xbug_2_s: Lbug_2_s(x, y); break;
7545 case Xbug_1_w: Lbug_1_w(x, y); break;
7546 case Xbug_2_w: Lbug_2_w(x, y); break;
7548 case Xtank_1_n: Ltank_1_n(x, y); break;
7549 case Xtank_2_n: Ltank_2_n(x, y); break;
7550 case Xtank_1_e: Ltank_1_e(x, y); break;
7551 case Xtank_2_e: Ltank_2_e(x, y); break;
7552 case Xtank_1_s: Ltank_1_s(x, y); break;
7553 case Xtank_2_s: Ltank_2_s(x, y); break;
7554 case Xtank_1_w: Ltank_1_w(x, y); break;
7555 case Xtank_2_w: Ltank_2_w(x, y); break;
7557 case Xemerald: Lemerald(x, y); break;
7558 case Xemerald_pause: Lemerald_pause(x, y); break;
7559 case Xemerald_fall: Lemerald_fall(x, y); break;
7561 case Xdiamond: Ldiamond(x, y); break;
7562 case Xdiamond_pause: Ldiamond_pause(x, y); break;
7563 case Xdiamond_fall: Ldiamond_fall(x, y); break;
7565 case Xstone: Lstone(x, y); break;
7566 case Xstone_pause: Lstone_pause(x, y); break;
7567 case Xstone_fall: Lstone_fall(x, y); break;
7569 case Xbomb: Lbomb(x, y); break;
7570 case Xbomb_pause: Lbomb_pause(x, y); break;
7571 case Xbomb_fall: Lbomb_fall(x, y); break;
7573 case Xnut: Lnut(x, y); break;
7574 case Xnut_pause: Lnut_pause(x, y); break;
7575 case Xnut_fall: Lnut_fall(x, y); break;
7577 case Xspring: Lspring(x, y); break;
7578 case Xspring_pause: Lspring_pause(x, y); break;
7579 case Xspring_e: Lspring_e(x, y); break;
7580 case Xspring_w: Lspring_w(x, y); break;
7581 case Xspring_fall: Lspring_fall(x, y); break;
7583 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
7584 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
7585 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
7586 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
7587 case Xpush_stone_e: Lpush_stone_e(x, y); break;
7588 case Xpush_stone_w: Lpush_stone_w(x, y); break;
7589 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
7590 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
7591 case Xpush_nut_e: Lpush_nut_e(x, y); break;
7592 case Xpush_nut_w: Lpush_nut_w(x, y); break;
7593 case Xpush_spring_e: Lpush_spring_e(x, y); break;
7594 case Xpush_spring_w: Lpush_spring_w(x, y); break;
7596 case Xdynamite_1: Ldynamite_1(x, y); break;
7597 case Xdynamite_2: Ldynamite_2(x, y); break;
7598 case Xdynamite_3: Ldynamite_3(x, y); break;
7599 case Xdynamite_4: Ldynamite_4(x, y); break;
7601 case Xfake_door_1: Lfake_door_1(x, y); break;
7602 case Xfake_door_2: Lfake_door_2(x, y); break;
7603 case Xfake_door_3: Lfake_door_3(x, y); break;
7604 case Xfake_door_4: Lfake_door_4(x, y); break;
7605 case Xfake_door_5: Lfake_door_5(x, y); break;
7606 case Xfake_door_6: Lfake_door_6(x, y); break;
7607 case Xfake_door_7: Lfake_door_7(x, y); break;
7608 case Xfake_door_8: Lfake_door_8(x, y); break;
7610 case Xballoon: Lballoon(x, y); break;
7612 case Xball_1: Lball_1(x, y); break;
7613 case Xball_2: Lball_2(x, y); break;
7615 case Xdrip: Ldrip(x, y); break;
7616 case Xdrip_fall: Ldrip_fall(x, y); break;
7617 case Xdrip_stretch: Ldrip_stretch(x, y); break;
7618 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
7620 case Xwonderwall: Lwonderwall(x, y); break;
7622 case Xwheel: Lwheel(x, y); break;
7624 case Xswitch: Lswitch(x, y); break;
7626 case Xfake_blank: Lfake_blank(x, y); break;
7627 case Xfake_grass: Lfake_grass(x, y); break;
7628 case Xfake_amoeba: Lfake_amoeba(x, y); break;
7630 case Xsand_stone: Lsand_stone(x, y); break;
7631 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
7632 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
7633 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
7634 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
7635 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
7636 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
7637 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
7638 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
7639 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
7640 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
7641 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
7642 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
7643 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
7644 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
7645 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
7646 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
7648 case Xslide_ns: Lslide_ns(x, y); break;
7649 case Xslide_ew: Lslide_ew(x, y); break;
7651 case Xexit: Lexit(x, y); break;
7652 case Xexit_1: Lexit_1(x, y); break;
7653 case Xexit_2: Lexit_2(x, y); break;
7654 case Xexit_3: Lexit_3(x, y); break;
7656 case Xpause: Lpause(x, y); break;
7658 case Xchain: Lchain(x, y); break;
7659 case Xboom_bug: Lboom_bug(x, y); break;
7660 case Xboom_tank: Lboom_tank(x, y); break;
7661 case Xboom_android: Lboom_android(x, y); break;
7662 case Xboom_1: Lboom_1(x, y); break;
7663 case Xboom_2: Lboom_2(x, y); break;
7667 boolean logic_check_wrap(void)
7671 for (i = 0; i < MAX_PLAYERS; i++)
7676 /* check for wrap-around movement */
7677 if (ply[i].x < lev.left ||
7678 ply[i].x > lev.right - 1)
7685 void logic_move(void)
7689 for (i = 0; i < MAX_PLAYERS; i++)
7694 /* check for wrap-around movement */
7695 if (ply[i].x < lev.left ||
7696 ply[i].x > lev.right - 1)
7698 int direction = (ply[i].x < lev.left ? -1 : 1);
7700 ply[i].x += -direction * lev.width;
7702 if (!lev.infinite_true)
7703 ply[i].y += direction;
7705 game.centered_player_nr_next = i;
7706 game.set_centered_player = TRUE;
7707 game.set_centered_player_wrap = TRUE;
7710 ply[i].prev_x = ply[i].x;
7711 ply[i].prev_y = ply[i].y;
7712 ply[i].anim = PLY_still;
7716 static void logic_players(void)
7725 game_em.any_player_moving = FALSE;
7726 game_em.any_player_snapping = FALSE;
7728 /* must test for death and actually kill separately */
7729 for (i = 0; i < MAX_PLAYERS; i++)
7731 boolean ply_kill = player_killed(&ply[i]);
7733 if (ply[i].alive && ply_kill)
7734 kill_player(&ply[i]);
7739 start_check_nr = ((game_em.random & 128 ? 0 : 1) * 2 +
7740 (game_em.random & 256 ? 0 : 1));
7742 for (i = 0; i < MAX_PLAYERS; i++)
7744 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
7746 if (ply[check_nr].alive)
7747 check_player(&ply[check_nr]);
7750 for (i = 0; i < MAX_PLAYERS; i++)
7755 if (is_player[cave[ply[i].prev_x][ply[i].prev_y]])
7757 int element = cave[ply[i].prev_x][ply[i].prev_y];
7759 cave[ply[i].prev_x][ply[i].prev_y] = remove_player[element];
7760 next[ply[i].prev_x][ply[i].prev_y] = remove_player[element];
7763 if (is_blank[cave[ply[i].x][ply[i].y]])
7765 int element = cave[ply[i].x][ply[i].y];
7767 cave[ply[i].x][ply[i].y] = add_player[element];
7768 next[ply[i].x][ply[i].y] = add_player[element];
7772 /* check for wheel at wrap-around position */
7773 if (lev.wheel_x < lev.left ||
7774 lev.wheel_x > lev.right - 1)
7776 int direction = (lev.wheel_x < lev.left ? -1 : 1);
7778 lev.wheel_x += -direction * lev.width;
7780 if (!lev.infinite_true)
7781 lev.wheel_y += direction;
7785 static void logic_objects(void)
7793 seed = game_em.random;
7796 for (y = lev.top; y < lev.bottom; y++)
7797 for (x = lev.left; x < lev.right; x++)
7800 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
7801 lev.score += score; /* only add a score if someone is alive */
7803 game_em.game_over = TRUE;
7805 game_em.random = seed;
7807 /* triple buffering */
7808 void *temp = lev.cave;
7809 lev.cave = lev.next;
7810 lev.next = lev.draw;
7814 static void logic_globals(void)
7829 /* update variables */
7831 if (lev.score > 9999)
7834 if (lev.android_move_cnt-- == 0)
7835 lev.android_move_cnt = lev.android_move_time;
7836 if (lev.android_clone_cnt-- == 0)
7837 lev.android_clone_cnt = lev.android_clone_time;
7838 if (lev.ball_active)
7839 if (lev.ball_cnt-- == 0)
7840 lev.ball_cnt = lev.ball_time;
7843 if (lev.magnify_cnt)
7849 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7850 lev.wonderwall_time--;
7853 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
7857 random = game_em.random;
7859 for (count = lev.amoeba_time; count--;)
7861 x = lev.left - 1 + (random >> 10) % (CAVE_WIDTH + 2);
7862 y = lev.top - 1 + (random >> 20) % (CAVE_HEIGHT + 2);
7864 if (x >= lev.left && x < lev.right &&
7865 y >= lev.top && y < lev.bottom)
7868 random = random * 129 + 1;
7871 if (!game_em.use_random_bug)
7872 random = (uint32_t)random;
7876 game_em.random = random;
7878 /* handle explosions */
7880 for (y = lev.top; y < lev.bottom; y++)
7881 for (x = lev.left; x < lev.right; x++)
7884 /* triple buffering */
7886 for (y = lev.top; y < lev.bottom; y++)
7887 for (x = lev.left; x < lev.right; x++)
7888 next[x][y] = cave[x][y];
7891 void logic_init(void)
7893 int splash_is_blank = !game_em.use_old_android;
7895 is_android_blank[Xsplash_e] = splash_is_blank;
7896 is_android_blank[Xsplash_w] = splash_is_blank;