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_fake_acid[GAME_TILE_MAX] =
73 static const byte is_player[GAME_TILE_MAX] =
76 [Xfake_acid_1_player] = 1,
77 [Xfake_acid_2_player] = 1,
78 [Xfake_acid_3_player] = 1,
79 [Xfake_acid_4_player] = 1,
80 [Xfake_acid_5_player] = 1,
81 [Xfake_acid_6_player] = 1,
82 [Xfake_acid_7_player] = 1,
83 [Xfake_acid_8_player] = 1
86 static const byte add_player[GAME_TILE_MAX] =
89 [Xsplash_e] = Zplayer,
90 [Xsplash_w] = Zplayer,
91 [Xfake_acid_1] = Xfake_acid_1_player,
92 [Xfake_acid_2] = Xfake_acid_2_player,
93 [Xfake_acid_3] = Xfake_acid_3_player,
94 [Xfake_acid_4] = Xfake_acid_4_player,
95 [Xfake_acid_5] = Xfake_acid_5_player,
96 [Xfake_acid_6] = Xfake_acid_6_player,
97 [Xfake_acid_7] = Xfake_acid_7_player,
98 [Xfake_acid_8] = Xfake_acid_8_player
101 static const byte remove_player[GAME_TILE_MAX] =
104 [Xfake_acid_1_player] = Xfake_acid_1,
105 [Xfake_acid_2_player] = Xfake_acid_2,
106 [Xfake_acid_3_player] = Xfake_acid_3,
107 [Xfake_acid_4_player] = Xfake_acid_4,
108 [Xfake_acid_5_player] = Xfake_acid_5,
109 [Xfake_acid_6_player] = Xfake_acid_6,
110 [Xfake_acid_7_player] = Xfake_acid_7,
111 [Xfake_acid_8_player] = Xfake_acid_8
114 static const byte is_amoeba[GAME_TILE_MAX] =
128 static byte is_android_blank[GAME_TILE_MAX] =
143 static const byte is_android_walkable[GAME_TILE_MAX] =
159 static void Lboom_generic(int x, int y, int element, int element_middle)
161 boom[x-1][y-1] = element;
162 boom[x][y-1] = element;
163 boom[x+1][y-1] = element;
164 boom[x-1][y] = element;
165 boom[x][y] = element_middle;
166 boom[x+1][y] = element;
167 boom[x-1][y+1] = element;
168 boom[x][y+1] = element;
169 boom[x+1][y+1] = element;
172 static void Lboom_bug(int x, int y)
174 if (game_em.use_old_explosions)
177 Lboom_generic(x, y, Xemerald, Xdiamond);
179 #if PLAY_ELEMENT_SOUND
180 play_element_sound(x, y, SOUND_boom, Xbug_1_n);
184 static void Lboom_tank(int x, int y)
186 if (game_em.use_old_explosions)
189 Lboom_generic(x, y, Xblank, Xblank);
191 #if PLAY_ELEMENT_SOUND
192 play_element_sound(x, y, SOUND_boom, Xtank_1_n);
196 static void Lboom_eater(int x, int y)
198 if (game_em.use_old_explosions)
201 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
202 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
203 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
204 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
205 boom[x][y] = lev.eater_array[lev.eater_pos][4];
206 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
207 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
208 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
209 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
211 lev.eater_pos = (lev.eater_pos + 1) % lev.num_eater_arrays;
213 #if PLAY_ELEMENT_SOUND
214 play_element_sound(x, y, SOUND_boom, Xeater_n);
218 static void Lboom_bug_old(int x, int y)
220 if (!game_em.use_old_explosions)
226 static void Lboom_tank_old(int x, int y)
228 if (!game_em.use_old_explosions)
234 static void Lboom_eater_old(int x, int y)
236 if (!game_em.use_old_explosions)
242 static void Lboom_bug_new(int x, int y, boolean chain_explosion)
244 if (game_em.use_old_explosions)
253 static void Lboom_tank_new(int x, int y, boolean chain_explosion)
255 if (game_em.use_old_explosions)
264 static void Lboom_eater_new(int x, int y, boolean chain_explosion)
266 if (game_em.use_old_explosions)
275 static void Lboom_cave_new(int x, int y, int element)
277 if (game_em.use_old_explosions)
280 cave[x][y] = element;
283 static void Lboom_next_new(int x, int y, int element)
285 if (game_em.use_old_explosions)
288 next[x][y] = element;
291 static void Lpush_element_old(int x, int y, int element)
293 if (!game_em.use_old_push_elements)
296 cave[x][y] = element;
297 next[x][y] = element;
300 static boolean player_killed(struct PLAYER *ply)
308 if (lev.killed_out_of_time && setup.time_limit)
311 switch (cave[x][y-1])
332 switch (cave[x+1][y])
353 switch (cave[x][y+1])
374 switch (cave[x-1][y])
409 case Xfake_acid_1_player:
410 case Xfake_acid_2_player:
411 case Xfake_acid_3_player:
412 case Xfake_acid_4_player:
413 case Xfake_acid_5_player:
414 case Xfake_acid_6_player:
415 case Xfake_acid_7_player:
416 case Xfake_acid_8_player:
427 static void kill_player(struct PLAYER *ply)
434 switch (cave[x][y-1])
444 cave[x][y-1] = Xboom_bug;
445 Lboom_bug_new(x, y-1, TRUE);
456 cave[x][y-1] = Xboom_tank;
457 Lboom_tank_new(x, y-1, TRUE);
461 switch (cave[x+1][y])
471 cave[x+1][y] = Xboom_bug;
472 Lboom_bug_new(x+1, y, TRUE);
483 cave[x+1][y] = Xboom_tank;
484 Lboom_tank_new(x+1, y, TRUE);
488 switch (cave[x][y+1])
498 cave[x][y+1] = Xboom_bug;
499 Lboom_bug_new(x, y+1, TRUE);
510 cave[x][y+1] = Xboom_tank;
511 Lboom_tank_new(x, y+1, TRUE);
515 switch (cave[x-1][y])
525 cave[x-1][y] = Xboom_bug;
526 Lboom_bug_new(x-1, y, TRUE);
537 cave[x-1][y] = Xboom_tank;
538 Lboom_tank_new(x-1, y, TRUE);
549 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
553 play_element_sound(x, y, SOUND_die, Zplayer);
572 cave[x][y] = Xboom_1;
578 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
580 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
585 boolean result = TRUE;
587 if (!dx && !dy) /* no direction specified */
590 if (dx && dy && ply->joy_snap) /* more than one direction specified */
593 if (!ply->joy_snap) /* player wants to move */
595 int element = cave[x][y];
599 /* fire is released */
611 cave[x][y] = add_player[element];
612 next[x][y] = add_player[element];
614 play_element_sound(x, y, SOUND_blank, Xblank);
615 ply->anim = PLY_walk_n + anim;
629 if (cave[x+1][y-1] == Xblank)
630 cave[x+1][y-1] = Xsplash_e;
631 if (cave[x-1][y-1] == Xblank)
632 cave[x-1][y-1] = Xsplash_w;
633 play_element_sound(x, y, SOUND_acid, Xacid_1);
654 ply->anim = PLY_walk_n + anim;
660 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
661 (dx > 0 ? Ygrass_eB : Ygrass_wB));
662 next[x][y] = Zplayer;
663 play_element_sound(x, y, SOUND_dirt, Xgrass);
664 ply->anim = PLY_walk_n + anim;
670 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
671 (dx > 0 ? Ydirt_eB : Ydirt_wB));
672 next[x][y] = Zplayer;
673 play_element_sound(x, y, SOUND_dirt, Xdirt);
674 ply->anim = PLY_walk_n + anim;
681 cave[x][y] = Ydiamond_blank;
682 next[x][y] = Zplayer;
683 play_element_sound(x, y, SOUND_collect, element);
684 lev.score += lev.diamond_score;
685 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
686 game.snapshot.collected_item = TRUE;
687 ply->anim = PLY_walk_n + anim;
694 cave[x][y] = Yemerald_blank;
695 next[x][y] = Zplayer;
696 play_element_sound(x, y, SOUND_collect, element);
697 lev.score += lev.emerald_score;
698 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
699 game.snapshot.collected_item = TRUE;
700 ply->anim = PLY_walk_n + anim;
706 cave[x][y] = Ydynamite_blank;
707 next[x][y] = Zplayer;
708 play_element_sound(x, y, SOUND_collect, element);
709 lev.score += lev.dynamite_score;
710 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
711 ply->anim = PLY_walk_n + anim;
718 cave[x][y] = Ykey_1_blank;
723 cave[x][y] = Ykey_2_blank;
728 cave[x][y] = Ykey_3_blank;
733 cave[x][y] = Ykey_4_blank;
738 cave[x][y] = Ykey_5_blank;
743 cave[x][y] = Ykey_6_blank;
748 cave[x][y] = Ykey_7_blank;
753 cave[x][y] = Ykey_8_blank;
758 next[x][y] = Zplayer;
759 play_element_sound(x, y, SOUND_collect, element);
760 lev.score += lev.key_score;
761 ply->anim = PLY_walk_n + anim;
767 cave[x][y] = Ylenses_blank;
768 next[x][y] = Zplayer;
769 play_element_sound(x, y, SOUND_collect, element);
770 lev.score += lev.lenses_score;
771 lev.lenses_cnt = lev.lenses_time;
772 ply->anim = PLY_walk_n + anim;
778 cave[x][y] = Ymagnify_blank;
779 next[x][y] = Zplayer;
780 play_element_sound(x, y, SOUND_collect, element);
781 lev.score += lev.magnify_score;
782 lev.magnify_cnt = lev.magnify_time;
783 ply->anim = PLY_walk_n + anim;
792 switch (cave[x+dx][y])
805 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
806 next[x+dx][y] = Xstone_pause;
817 if (cave[x+dx+1][y-1] == Xblank)
818 cave[x+dx+1][y-1] = Xsplash_e;
819 if (cave[x+dx-1][y-1] == Xblank)
820 cave[x+dx-1][y-1] = Xsplash_w;
821 play_element_sound(x, y, SOUND_acid, Xacid_1);
825 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
826 next[x][y] = Zplayer;
827 play_element_sound(x, y, SOUND_roll, Xstone);
832 ply->anim = PLY_push_n + anim;
839 switch (cave[x+dx][y])
852 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
853 next[x+dx][y] = Xbomb_pause;
864 if (cave[x+dx+1][y-1] == Xblank)
865 cave[x+dx+1][y-1] = Xsplash_e;
866 if (cave[x+dx-1][y-1] == Xblank)
867 cave[x+dx-1][y-1] = Xsplash_w;
868 play_element_sound(x, y, SOUND_acid, Xacid_1);
872 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
873 next[x][y] = Zplayer;
874 play_element_sound(x, y, SOUND_roll, Xbomb);
879 ply->anim = PLY_push_n + anim;
886 switch (cave[x+dx][y])
899 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
900 next[x+dx][y] = Xnut_pause;
911 if (cave[x+dx+1][y-1] == Xblank)
912 cave[x+dx+1][y-1] = Xsplash_e;
913 if (cave[x+dx-1][y-1] == Xblank)
914 cave[x+dx-1][y-1] = Xsplash_w;
915 play_element_sound(x, y, SOUND_acid, Xacid_1);
919 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
920 next[x][y] = Zplayer;
921 play_element_sound(x, y, SOUND_roll, Xnut);
926 ply->anim = PLY_push_n + anim;
933 switch (cave[x+dx][y])
946 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
947 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
958 if (cave[x+dx+1][y-1] == Xblank)
959 cave[x+dx+1][y-1] = Xsplash_e;
960 if (cave[x+dx-1][y-1] == Xblank)
961 cave[x+dx-1][y-1] = Xsplash_w;
962 play_element_sound(x, y, SOUND_acid, Xacid_1);
966 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
967 next[x][y] = Zplayer;
968 play_element_sound(x, y, SOUND_roll, Xspring);
974 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
975 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
976 next[x][y] = Zplayer;
977 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
978 play_element_sound(x, y, SOUND_slurp, Xalien);
979 lev.score += lev.slurp_score;
984 ply->anim = PLY_push_n + anim;
991 case Xsand_stonein_1:
992 case Xsand_stonein_2:
993 case Xsand_stonein_3:
994 case Xsand_stonein_4:
998 ply->anim = PLY_push_n + anim;
1002 switch (cave[x+dx][y+dy])
1015 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
1016 (dx > 0 ? Yballoon_e : Yballoon_w));
1017 next[x+dx][y+dy] = Xballoon;
1028 if (cave[x+dx+1][y+dy-1] == Xblank)
1029 cave[x+dx+1][y+dy-1] = Xsplash_e;
1030 if (cave[x+dx-1][y+dy-1] == Xblank)
1031 cave[x+dx-1][y+dy-1] = Xsplash_w;
1032 play_element_sound(x, y, SOUND_acid, Xacid_1);
1036 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
1037 (dx > 0 ? Yballoon_eB : Yballoon_wB));
1038 next[x][y] = Zplayer;
1039 play_element_sound(x, y, SOUND_push, Xballoon);
1045 ply->anim = PLY_push_n + anim;
1057 switch (cave[x+dx][y+dy])
1070 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
1071 (dx > 0 ? Yandroid_e : Yandroid_w));
1072 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
1073 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1084 if (cave[x+dx+1][y+dy-1] == Xblank)
1085 cave[x+dx+1][y+dy-1] = Xsplash_e;
1086 if (cave[x+dx-1][y+dy-1] == Xblank)
1087 cave[x+dx-1][y+dy-1] = Xsplash_w;
1088 play_element_sound(x, y, SOUND_acid, Xacid_1);
1092 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1093 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1094 next[x][y] = Zplayer;
1095 play_element_sound(x, y, SOUND_push, Xandroid);
1101 ply->anim = PLY_push_n + anim;
1106 if (ply->keys & 0x01)
1113 if (ply->keys & 0x02)
1120 if (ply->keys & 0x04)
1127 if (ply->keys & 0x08)
1134 if (ply->keys & 0x10)
1141 if (ply->keys & 0x20)
1148 if (ply->keys & 0x40)
1155 if (ply->keys & 0x80)
1162 if (!is_blank[cave[x+dx][y+dy]])
1165 int element_next = cave[x+dx][y+dy];
1167 cave[x+dx][y+dy] = add_player[element_next];
1168 next[x+dx][y+dy] = add_player[element_next];
1170 play_element_sound(x, y, SOUND_door, element);
1171 ply->anim = PLY_walk_n + anim;
1177 play_element_sound(x, y, SOUND_press, element);
1178 lev.wheel_cnt = lev.wheel_time;
1184 lev.wind_direction = 0;
1188 lev.wind_direction = 1;
1192 lev.wind_direction = 2;
1196 lev.wind_direction = 3;
1200 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1205 play_element_sound(x, y, SOUND_press, element);
1206 lev.wind_cnt = lev.wind_time;
1210 play_element_sound(x, y, SOUND_press, element);
1215 play_element_sound(x, y, SOUND_press, element);
1216 lev.ball_cnt = lev.ball_time;
1217 lev.ball_active = !lev.ball_active;
1221 cave[x][y] = Yplant;
1222 next[x][y] = Xplant;
1223 play_element_sound(x, y, SOUND_blank, Xplant);
1224 ply->anim = PLY_walk_n + anim;
1235 game_em.level_solved = TRUE;
1237 ply->anim = PLY_walk_n + anim;
1244 if (ply->x == oldx && ply->y == oldy) /* no movement */
1247 else /* player wants to snap */
1249 int element = cave[x][y];
1253 /* fire is pressed */
1256 cave[x][y] = Ygrass_blank;
1257 next[x][y] = Xblank;
1258 play_element_sound(x, y, SOUND_dirt, element);
1259 ply->anim = PLY_shoot_n + anim;
1263 cave[x][y] = Ydirt_blank;
1264 next[x][y] = Xblank;
1265 play_element_sound(x, y, SOUND_dirt, element);
1266 ply->anim = PLY_shoot_n + anim;
1270 case Xdiamond_pause:
1271 cave[x][y] = Ydiamond_blank;
1272 next[x][y] = Xblank;
1273 play_element_sound(x, y, SOUND_collect, element);
1274 lev.score += lev.diamond_score;
1275 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
1276 game.snapshot.collected_item = TRUE;
1277 ply->anim = PLY_walk_n + anim;
1281 case Xemerald_pause:
1282 cave[x][y] = Yemerald_blank;
1283 next[x][y] = Xblank;
1284 play_element_sound(x, y, SOUND_collect, element);
1285 lev.score += lev.emerald_score;
1286 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
1287 game.snapshot.collected_item = TRUE;
1288 ply->anim = PLY_walk_n + anim;
1292 cave[x][y] = Ydynamite_blank;
1293 next[x][y] = Xblank;
1294 play_element_sound(x, y, SOUND_collect, element);
1295 lev.score += lev.dynamite_score;
1296 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1297 ply->anim = PLY_walk_n + anim;
1302 cave[x][y] = Ykey_1_blank;
1307 cave[x][y] = Ykey_2_blank;
1312 cave[x][y] = Ykey_3_blank;
1317 cave[x][y] = Ykey_4_blank;
1322 cave[x][y] = Ykey_5_blank;
1327 cave[x][y] = Ykey_6_blank;
1332 cave[x][y] = Ykey_7_blank;
1337 cave[x][y] = Ykey_8_blank;
1342 next[x][y] = Xblank;
1343 play_element_sound(x, y, SOUND_collect, element);
1344 lev.score += lev.key_score;
1345 ply->anim = PLY_walk_n + anim;
1349 cave[x][y] = Ylenses_blank;
1350 next[x][y] = Xblank;
1351 play_element_sound(x, y, SOUND_collect, element);
1352 lev.score += lev.lenses_score;
1353 lev.lenses_cnt = lev.lenses_time;
1354 ply->anim = PLY_walk_n + anim;
1358 cave[x][y] = Ymagnify_blank;
1359 next[x][y] = Xblank;
1360 play_element_sound(x, y, SOUND_collect, element);
1361 lev.score += lev.magnify_score;
1362 lev.magnify_cnt = lev.magnify_time;
1363 ply->anim = PLY_walk_n + anim;
1371 /* check for wrap-around movement */
1372 if (ply->x < lev.left ||
1373 ply->x > lev.right - 1)
1374 play_element_sound(oldx, oldy, SOUND_door, Xdoor_1);
1379 static void check_player(struct PLAYER *ply)
1387 game_em.last_player_direction[ply->num] = MV_NONE;
1389 if (ply->joy_w) /* west */
1394 else if (ply->joy_e) /* east */
1400 if (ply->joy_n) /* north */
1405 else if (ply->joy_s) /* south */
1417 boolean players_visible_before_move;
1418 boolean players_visible_after_move;
1421 players_visible_before_move = checkIfAllPlayersFitToScreen();
1426 players_visible_after_move = checkIfAllPlayersFitToScreen();
1429 player is allowed to move only in the following cases:
1430 - it is not needed to display all players (not focussed to all players)
1431 - all players are (still or again) visible after the move
1432 - some players were already outside visible screen area before the move
1434 can_move = (game.centered_player_nr != -1 ||
1435 players_visible_after_move ||
1436 !players_visible_before_move);
1452 if (dx == 0 && dy == 0)
1454 ply->joy_stick = FALSE;
1458 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1460 cave[x][y] = Xdynamite_1;
1461 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1467 ply->dynamite_cnt = 0;
1470 /* be a bit more random if the player doesn't move */
1471 game_em.random += 7;
1476 ply->joy_stick = TRUE;
1482 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1484 if (!ply->joy_snap) /* player wants to move */
1486 boolean moved = FALSE;
1488 if (ply->last_move_dir & MV_HORIZONTAL)
1490 if (!(moved = player_digfield(ply, 0, dy)))
1491 moved = player_digfield(ply, dx, 0);
1495 if (!(moved = player_digfield(ply, dx, 0)))
1496 moved = player_digfield(ply, 0, dy);
1502 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1503 else if (oldy != ply->y)
1504 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1506 game_em.any_player_moving = TRUE;
1507 game_em.last_moving_player = ply->num;
1508 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1511 else /* player wants to snap */
1513 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1517 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1519 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1522 /* default values if no players are alive anymore */
1526 for (i = 0; i < MAX_PLAYERS; i++)
1531 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1533 if (distance < distance_shortest)
1538 distance_shortest = distance;
1543 static void Lacid_1(int x, int y)
1545 next[x][y] = Xacid_2;
1548 static void Lacid_2(int x, int y)
1550 next[x][y] = Xacid_3;
1553 static void Lacid_3(int x, int y)
1555 next[x][y] = Xacid_4;
1558 static void Lacid_4(int x, int y)
1560 next[x][y] = Xacid_5;
1563 static void Lacid_5(int x, int y)
1565 next[x][y] = Xacid_6;
1568 static void Lacid_6(int x, int y)
1570 next[x][y] = Xacid_7;
1573 static void Lacid_7(int x, int y)
1575 next[x][y] = Xacid_8;
1578 static void Lacid_8(int x, int y)
1580 next[x][y] = Xacid_1;
1583 static void Lfake_acid_1(int x, int y)
1585 next[x][y] = Xfake_acid_2;
1588 static void Lfake_acid_2(int x, int y)
1590 next[x][y] = Xfake_acid_3;
1593 static void Lfake_acid_3(int x, int y)
1595 next[x][y] = Xfake_acid_4;
1598 static void Lfake_acid_4(int x, int y)
1600 next[x][y] = Xfake_acid_5;
1603 static void Lfake_acid_5(int x, int y)
1605 next[x][y] = Xfake_acid_6;
1608 static void Lfake_acid_6(int x, int y)
1610 next[x][y] = Xfake_acid_7;
1613 static void Lfake_acid_7(int x, int y)
1615 next[x][y] = Xfake_acid_8;
1618 static void Lfake_acid_8(int x, int y)
1620 next[x][y] = Xfake_acid_1;
1623 static void Landroid(int x, int y)
1627 if (lev.android_clone_cnt == 0)
1629 if (!is_android_blank[cave[x-1][y-1]] &&
1630 !is_android_blank[cave[x][y-1]] &&
1631 !is_android_blank[cave[x+1][y-1]] &&
1632 !is_android_blank[cave[x-1][y]] &&
1633 !is_android_blank[cave[x+1][y]] &&
1634 !is_android_blank[cave[x-1][y+1]] &&
1635 !is_android_blank[cave[x][y+1]] &&
1636 !is_android_blank[cave[x+1][y+1]])
1641 /* randomly find an object to clone */
1643 case 0: /* S,NE,W,NW,SE,E,SW,N */
1644 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1645 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1646 temp = lev.android_array[cave[x-1][y]]; 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+1]]; if (temp != Xblank) break;
1651 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1654 case 1: /* NW,SE,N,S,NE,SW,E,W */
1655 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1656 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1657 temp = lev.android_array[cave[x][y-1]]; 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]]; if (temp != Xblank) break;
1662 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1665 case 2: /* SW,E,S,W,N,NW,SE,NE */
1666 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1667 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1668 temp = lev.android_array[cave[x][y+1]]; 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;
1673 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1676 case 3: /* N,SE,NE,E,W,S,NW,SW */
1677 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1678 temp = lev.android_array[cave[x+1][y+1]]; 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]]; 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-1][y-1]]; if (temp != Xblank) break;
1684 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1687 case 4: /* SE,NW,E,NE,SW,W,N,S */
1688 temp = lev.android_array[cave[x+1][y+1]]; 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]]; if (temp != Xblank) break;
1691 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1692 temp = lev.android_array[cave[x-1][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][y-1]]; if (temp != Xblank) break;
1695 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1698 case 5: /* NE,W,SE,SW,S,N,E,NW */
1699 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1700 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1701 temp = lev.android_array[cave[x+1][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][y+1]]; if (temp != Xblank) break;
1704 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1705 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1706 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1709 case 6: /* E,N,SW,S,NW,NE,SE,W */
1710 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1711 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1712 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1713 temp = lev.android_array[cave[x][y+1]]; 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+1][y+1]]; if (temp != Xblank) break;
1717 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1720 case 7: /* W,SW,NW,N,E,SE,NE,S */
1721 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1722 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1723 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1724 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1725 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1726 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1727 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1728 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1732 next[x][y] = temp; /* the item we chose to clone */
1733 play_element_sound(x, y, SOUND_android_clone, temp);
1737 /* randomly find a direction to move */
1739 case 0: /* S,NE,W,NW,SE,E,SW,N */
1740 if (is_android_blank[cave[x][y+1]]) goto android_s;
1741 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1742 if (is_android_blank[cave[x-1][y]]) goto android_w;
1743 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1744 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1745 if (is_android_blank[cave[x+1][y]]) goto android_e;
1746 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1747 if (is_android_blank[cave[x][y-1]]) goto android_n;
1750 case 1: /* NW,SE,N,S,NE,SW,E,W */
1751 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1752 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1753 if (is_android_blank[cave[x][y-1]]) goto android_n;
1754 if (is_android_blank[cave[x][y+1]]) goto android_s;
1755 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1756 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1757 if (is_android_blank[cave[x+1][y]]) goto android_e;
1758 if (is_android_blank[cave[x-1][y]]) goto android_w;
1761 case 2: /* SW,E,S,W,N,NW,SE,NE */
1762 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1763 if (is_android_blank[cave[x+1][y]]) goto android_e;
1764 if (is_android_blank[cave[x][y+1]]) goto android_s;
1765 if (is_android_blank[cave[x-1][y]]) goto android_w;
1766 if (is_android_blank[cave[x][y-1]]) goto android_n;
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_se;
1769 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1772 case 3: /* N,SE,NE,E,W,S,NW,SW */
1773 if (is_android_blank[cave[x][y-1]]) goto android_n;
1774 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1775 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1776 if (is_android_blank[cave[x+1][y]]) goto android_e;
1777 if (is_android_blank[cave[x-1][y]]) goto android_w;
1778 if (is_android_blank[cave[x][y+1]]) goto android_s;
1779 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1780 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1783 case 4: /* SE,NW,E,NE,SW,W,N,S */
1784 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1785 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1786 if (is_android_blank[cave[x+1][y]]) goto android_e;
1787 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1788 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1789 if (is_android_blank[cave[x-1][y]]) goto android_w;
1790 if (is_android_blank[cave[x][y-1]]) goto android_n;
1791 if (is_android_blank[cave[x][y+1]]) goto android_s;
1794 case 5: /* NE,W,SE,SW,S,N,E,NW */
1795 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1796 if (is_android_blank[cave[x-1][y]]) goto android_w;
1797 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1798 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1799 if (is_android_blank[cave[x][y+1]]) goto android_s;
1800 if (is_android_blank[cave[x][y-1]]) goto android_n;
1801 if (is_android_blank[cave[x+1][y]]) goto android_e;
1802 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1805 case 6: /* E,N,SW,S,NW,NE,SE,W */
1806 if (is_android_blank[cave[x+1][y]]) goto android_e;
1807 if (is_android_blank[cave[x][y-1]]) goto android_n;
1808 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1809 if (is_android_blank[cave[x][y+1]]) goto android_s;
1810 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1811 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1812 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1813 if (is_android_blank[cave[x-1][y]]) goto android_w;
1816 case 7: /* W,SW,NW,N,E,SE,NE,S */
1817 if (is_android_blank[cave[x-1][y]]) goto android_w;
1818 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1819 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1820 if (is_android_blank[cave[x][y-1]]) goto android_n;
1821 if (is_android_blank[cave[x+1][y]]) goto android_e;
1822 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1823 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1824 if (is_android_blank[cave[x][y+1]]) goto android_s;
1830 if (lev.android_move_cnt == 0)
1832 if (is_player[cave[x-1][y-1]] ||
1833 is_player[cave[x][y-1]] ||
1834 is_player[cave[x+1][y-1]] ||
1835 is_player[cave[x-1][y]] ||
1836 is_player[cave[x+1][y]] ||
1837 is_player[cave[x-1][y+1]] ||
1838 is_player[cave[x][y+1]] ||
1839 is_player[cave[x+1][y+1]])
1842 set_nearest_player_xy(x, y, &dx, &dy);
1844 next[x][y] = Xblank; /* assume we will move */
1845 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1851 /* attempt clockwise move first if direct path is blocked */
1853 case 0: /* north west */
1854 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1855 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1856 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1860 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1861 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1862 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1865 case 2: /* north east */
1866 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1867 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1868 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1872 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1873 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1874 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1877 case 4: /* nowhere */
1881 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1882 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1883 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1886 case 6: /* south west */
1887 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1888 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1889 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1893 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1894 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1895 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1898 case 8: /* south east */
1899 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1900 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1901 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1909 /* attempt counterclockwise move first if direct path is blocked */
1911 case 0: /* north west */
1912 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1913 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1914 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1918 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1919 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1920 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1923 case 2: /* north east */
1924 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1925 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1926 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1930 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1931 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1932 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1935 case 4: /* nowhere */
1939 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1940 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1941 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1944 case 6: /* south west */
1945 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1946 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1947 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1951 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1952 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1953 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1956 case 8: /* south east */
1957 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1958 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1959 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1966 next[x][y] = Xandroid;
1970 cave[x][y] = Yandroid_nB;
1971 cave[x][y-1] = Yandroid_n;
1972 next[x][y-1] = Xandroid;
1973 play_element_sound(x, y, SOUND_android_move, Xandroid);
1977 cave[x][y] = Yandroid_neB;
1978 cave[x+1][y-1] = Yandroid_ne;
1979 next[x+1][y-1] = Xandroid;
1980 play_element_sound(x, y, SOUND_android_move, Xandroid);
1984 cave[x][y] = Yandroid_eB;
1985 cave[x+1][y] = Yandroid_e;
1986 next[x+1][y] = Xandroid;
1987 play_element_sound(x, y, SOUND_android_move, Xandroid);
1991 cave[x][y] = Yandroid_seB;
1992 cave[x+1][y+1] = Yandroid_se;
1993 next[x+1][y+1] = Xandroid;
1994 play_element_sound(x, y, SOUND_android_move, Xandroid);
1998 cave[x][y] = Yandroid_sB;
1999 cave[x][y+1] = Yandroid_s;
2000 next[x][y+1] = Xandroid;
2001 play_element_sound(x, y, SOUND_android_move, Xandroid);
2005 cave[x][y] = Yandroid_swB;
2006 cave[x-1][y+1] = Yandroid_sw;
2007 next[x-1][y+1] = Xandroid;
2008 play_element_sound(x, y, SOUND_android_move, Xandroid);
2012 cave[x][y] = Yandroid_wB;
2013 cave[x-1][y] = Yandroid_w;
2014 next[x-1][y] = Xandroid;
2015 play_element_sound(x, y, SOUND_android_move, Xandroid);
2019 cave[x][y] = Yandroid_nwB;
2020 cave[x-1][y-1] = Yandroid_nw;
2021 next[x-1][y-1] = Xandroid;
2022 play_element_sound(x, y, SOUND_android_move, Xandroid);
2026 static void Landroid_1_n(int x, int y)
2028 switch (cave[x][y-1])
2041 cave[x][y] = Yandroid_nB;
2042 next[x][y] = Xblank;
2043 cave[x][y-1] = Yandroid_n;
2044 next[x][y-1] = Xandroid;
2045 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
2056 cave[x][y] = Yandroid_nB;
2057 next[x][y] = Xblank;
2058 if (cave[x+1][y-2] == Xblank)
2059 cave[x+1][y-2] = Xsplash_e;
2060 if (cave[x-1][y-2] == Xblank)
2061 cave[x-1][y-2] = Xsplash_w;
2062 play_element_sound(x, y, SOUND_acid, Xacid_1);
2071 static void Landroid_2_n(int x, int y)
2073 switch (cave[x][y-1])
2086 cave[x][y] = Yandroid_nB;
2087 next[x][y] = Xblank;
2088 cave[x][y-1] = Yandroid_n;
2089 next[x][y-1] = Xandroid_1_n;
2090 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
2101 cave[x][y] = Yandroid_nB;
2102 next[x][y] = Xblank;
2103 if (cave[x+1][y-2] == Xblank)
2104 cave[x+1][y-2] = Xsplash_e;
2105 if (cave[x-1][y-2] == Xblank)
2106 cave[x-1][y-2] = Xsplash_w;
2107 play_element_sound(x, y, SOUND_acid, Xacid_1);
2116 static void Landroid_1_e(int x, int y)
2118 switch (cave[x+1][y])
2131 cave[x][y] = Yandroid_eB;
2132 next[x][y] = Xblank;
2133 cave[x+1][y] = Yandroid_e;
2134 next[x+1][y] = Xandroid;
2135 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
2146 cave[x][y] = Yandroid_eB;
2147 next[x][y] = Xblank;
2148 if (cave[x+2][y-1] == Xblank)
2149 cave[x+2][y-1] = Xsplash_e;
2150 if (cave[x][y-1] == Xblank)
2151 cave[x][y-1] = Xsplash_w;
2152 play_element_sound(x, y, SOUND_acid, Xacid_1);
2161 static void Landroid_2_e(int x, int y)
2163 switch (cave[x+1][y])
2176 cave[x][y] = Yandroid_eB;
2177 next[x][y] = Xblank;
2178 cave[x+1][y] = Yandroid_e;
2179 next[x+1][y] = Xandroid_1_e;
2180 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
2191 cave[x][y] = Yandroid_eB;
2192 next[x][y] = Xblank;
2193 if (cave[x+2][y-1] == Xblank)
2194 cave[x+2][y-1] = Xsplash_e;
2195 if (cave[x][y-1] == Xblank)
2196 cave[x][y-1] = Xsplash_w;
2197 play_element_sound(x, y, SOUND_acid, Xacid_1);
2206 static void Landroid_1_s(int x, int y)
2208 switch (cave[x][y+1])
2221 cave[x][y] = Yandroid_sB;
2222 next[x][y] = Xblank;
2223 cave[x][y+1] = Yandroid_s;
2224 next[x][y+1] = Xandroid;
2225 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
2236 cave[x][y] = Yandroid_sB;
2237 next[x][y] = Xblank;
2238 if (cave[x+1][y] == Xblank)
2239 cave[x+1][y] = Xsplash_e;
2240 if (cave[x-1][y] == Xblank)
2241 cave[x-1][y] = Xsplash_w;
2242 play_element_sound(x, y, SOUND_acid, Xacid_1);
2251 static void Landroid_2_s(int x, int y)
2253 switch (cave[x][y+1])
2266 cave[x][y] = Yandroid_sB;
2267 next[x][y] = Xblank;
2268 cave[x][y+1] = Yandroid_s;
2269 next[x][y+1] = Xandroid_1_s;
2270 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
2281 cave[x][y] = Yandroid_sB;
2282 next[x][y] = Xblank;
2283 if (cave[x+1][y] == Xblank)
2284 cave[x+1][y] = Xsplash_e;
2285 if (cave[x-1][y] == Xblank)
2286 cave[x-1][y] = Xsplash_w;
2287 play_element_sound(x, y, SOUND_acid, Xacid_1);
2296 static void Landroid_1_w(int x, int y)
2298 switch (cave[x-1][y])
2311 cave[x][y] = Yandroid_wB;
2312 next[x][y] = Xblank;
2313 cave[x-1][y] = Yandroid_w;
2314 next[x-1][y] = Xandroid;
2315 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2326 cave[x][y] = Yandroid_wB;
2327 next[x][y] = Xblank;
2328 if (cave[x][y-1] == Xblank)
2329 cave[x][y-1] = Xsplash_e;
2330 if (cave[x-2][y-1] == Xblank)
2331 cave[x-2][y-1] = Xsplash_w;
2332 play_element_sound(x, y, SOUND_acid, Xacid_1);
2341 static void Landroid_2_w(int x, int y)
2343 switch (cave[x-1][y])
2356 cave[x][y] = Yandroid_wB;
2357 next[x][y] = Xblank;
2358 cave[x-1][y] = Yandroid_w;
2359 next[x-1][y] = Xandroid_1_w;
2360 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2371 cave[x][y] = Yandroid_wB;
2372 next[x][y] = Xblank;
2373 if (cave[x][y-1] == Xblank)
2374 cave[x][y-1] = Xsplash_e;
2375 if (cave[x-2][y-1] == Xblank)
2376 cave[x-2][y-1] = Xsplash_w;
2377 play_element_sound(x, y, SOUND_acid, Xacid_1);
2386 static void Leater_n(int x, int y)
2388 if (cave[x+1][y] == Xdiamond)
2390 cave[x+1][y] = Ydiamond_blank;
2391 next[x+1][y] = Xblank;
2392 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2396 if (cave[x][y+1] == Xdiamond)
2398 cave[x][y+1] = Ydiamond_blank;
2399 next[x][y+1] = Xblank;
2400 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2404 if (cave[x-1][y] == Xdiamond)
2406 cave[x-1][y] = Ydiamond_blank;
2407 next[x-1][y] = Xblank;
2408 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2412 if (cave[x][y-1] == Xdiamond)
2414 cave[x][y-1] = Ydiamond_blank;
2415 next[x][y-1] = Xblank;
2416 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2420 switch (cave[x][y-1])
2434 case Xfake_acid_1_player:
2435 case Xfake_acid_2_player:
2436 case Xfake_acid_3_player:
2437 case Xfake_acid_4_player:
2438 case Xfake_acid_5_player:
2439 case Xfake_acid_6_player:
2440 case Xfake_acid_7_player:
2441 case Xfake_acid_8_player:
2444 cave[x][y] = Yeater_nB;
2445 next[x][y] = Xblank;
2446 cave[x][y-1] = Yeater_n;
2447 next[x][y-1] = Xeater_n;
2458 cave[x][y] = Yeater_nB;
2459 next[x][y] = Xblank;
2460 if (cave[x+1][y-2] == Xblank)
2461 cave[x+1][y-2] = Xsplash_e;
2462 if (cave[x-1][y-2] == Xblank)
2463 cave[x-1][y-2] = Xsplash_w;
2464 play_element_sound(x, y, SOUND_acid, Xacid_1);
2468 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2469 play_element_sound(x, y, SOUND_eater, Xeater_n);
2474 static void Leater_e(int x, int y)
2476 if (cave[x][y+1] == Xdiamond)
2478 cave[x][y+1] = Ydiamond_blank;
2479 next[x][y+1] = Xblank;
2480 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2484 if (cave[x-1][y] == Xdiamond)
2486 cave[x-1][y] = Ydiamond_blank;
2487 next[x-1][y] = Xblank;
2488 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2492 if (cave[x][y-1] == Xdiamond)
2494 cave[x][y-1] = Ydiamond_blank;
2495 next[x][y-1] = Xblank;
2496 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2500 if (cave[x+1][y] == Xdiamond)
2502 cave[x+1][y] = Ydiamond_blank;
2503 next[x+1][y] = Xblank;
2504 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2508 switch (cave[x+1][y])
2522 case Xfake_acid_1_player:
2523 case Xfake_acid_2_player:
2524 case Xfake_acid_3_player:
2525 case Xfake_acid_4_player:
2526 case Xfake_acid_5_player:
2527 case Xfake_acid_6_player:
2528 case Xfake_acid_7_player:
2529 case Xfake_acid_8_player:
2532 cave[x][y] = Yeater_eB;
2533 next[x][y] = Xblank;
2534 cave[x+1][y] = Yeater_e;
2535 next[x+1][y] = Xeater_e;
2546 cave[x][y] = Yeater_eB;
2547 next[x][y] = Xblank;
2548 if (cave[x+2][y-1] == Xblank)
2549 cave[x+2][y-1] = Xsplash_e;
2550 if (cave[x][y-1] == Xblank)
2551 cave[x][y-1] = Xsplash_w;
2552 play_element_sound(x, y, SOUND_acid, Xacid_1);
2556 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2557 play_element_sound(x, y, SOUND_eater, Xeater_e);
2562 static void Leater_s(int x, int y)
2564 if (cave[x-1][y] == Xdiamond)
2566 cave[x-1][y] = Ydiamond_blank;
2567 next[x-1][y] = Xblank;
2568 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2572 if (cave[x][y-1] == Xdiamond)
2574 cave[x][y-1] = Ydiamond_blank;
2575 next[x][y-1] = Xblank;
2576 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2580 if (cave[x+1][y] == Xdiamond)
2582 cave[x+1][y] = Ydiamond_blank;
2583 next[x+1][y] = Xblank;
2584 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2588 if (cave[x][y+1] == Xdiamond)
2590 cave[x][y+1] = Ydiamond_blank;
2591 next[x][y+1] = Xblank;
2592 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2596 switch (cave[x][y+1])
2610 case Xfake_acid_1_player:
2611 case Xfake_acid_2_player:
2612 case Xfake_acid_3_player:
2613 case Xfake_acid_4_player:
2614 case Xfake_acid_5_player:
2615 case Xfake_acid_6_player:
2616 case Xfake_acid_7_player:
2617 case Xfake_acid_8_player:
2620 cave[x][y] = Yeater_sB;
2621 next[x][y] = Xblank;
2622 cave[x][y+1] = Yeater_s;
2623 next[x][y+1] = Xeater_s;
2634 cave[x][y] = Yeater_sB;
2635 next[x][y] = Xblank;
2636 if (cave[x+1][y] == Xblank)
2637 cave[x+1][y] = Xsplash_e;
2638 if (cave[x-1][y] == Xblank)
2639 cave[x-1][y] = Xsplash_w;
2640 play_element_sound(x, y, SOUND_acid, Xacid_1);
2644 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2645 play_element_sound(x, y, SOUND_eater, Xeater_s);
2650 static void Leater_w(int x, int y)
2652 if (cave[x][y-1] == Xdiamond)
2654 cave[x][y-1] = Ydiamond_blank;
2655 next[x][y-1] = Xblank;
2656 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2660 if (cave[x+1][y] == Xdiamond)
2662 cave[x+1][y] = Ydiamond_blank;
2663 next[x+1][y] = Xblank;
2664 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2668 if (cave[x][y+1] == Xdiamond)
2670 cave[x][y+1] = Ydiamond_blank;
2671 next[x][y+1] = Xblank;
2672 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2676 if (cave[x-1][y] == Xdiamond)
2678 cave[x-1][y] = Ydiamond_blank;
2679 next[x-1][y] = Xblank;
2680 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2684 switch (cave[x-1][y])
2698 case Xfake_acid_1_player:
2699 case Xfake_acid_2_player:
2700 case Xfake_acid_3_player:
2701 case Xfake_acid_4_player:
2702 case Xfake_acid_5_player:
2703 case Xfake_acid_6_player:
2704 case Xfake_acid_7_player:
2705 case Xfake_acid_8_player:
2708 cave[x][y] = Yeater_wB;
2709 next[x][y] = Xblank;
2710 cave[x-1][y] = Yeater_w;
2711 next[x-1][y] = Xeater_w;
2722 cave[x][y] = Yeater_wB;
2723 next[x][y] = Xblank;
2724 if (cave[x][y-1] == Xblank)
2725 cave[x][y-1] = Xsplash_e;
2726 if (cave[x-2][y-1] == Xblank)
2727 cave[x-2][y-1] = Xsplash_w;
2728 play_element_sound(x, y, SOUND_acid, Xacid_1);
2732 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2733 play_element_sound(x, y, SOUND_eater, Xeater_w);
2738 static void Lalien(int x, int y)
2749 set_nearest_player_xy(x, y, &dx, &dy);
2756 switch (cave[x][y-1])
2770 case Xfake_acid_1_player:
2771 case Xfake_acid_2_player:
2772 case Xfake_acid_3_player:
2773 case Xfake_acid_4_player:
2774 case Xfake_acid_5_player:
2775 case Xfake_acid_6_player:
2776 case Xfake_acid_7_player:
2777 case Xfake_acid_8_player:
2780 cave[x][y] = Yalien_nB;
2781 next[x][y] = Xblank;
2782 cave[x][y-1] = Yalien_n;
2783 next[x][y-1] = Xalien_pause;
2784 play_element_sound(x, y, SOUND_alien, Xalien);
2795 cave[x][y] = Yalien_nB;
2796 next[x][y] = Xblank;
2797 if (cave[x+1][y-2] == Xblank)
2798 cave[x+1][y-2] = Xsplash_e;
2799 if (cave[x-1][y-2] == Xblank)
2800 cave[x-1][y-2] = Xsplash_w;
2801 play_element_sound(x, y, SOUND_acid, Xacid_1);
2807 switch (cave[x][y+1])
2821 case Xfake_acid_1_player:
2822 case Xfake_acid_2_player:
2823 case Xfake_acid_3_player:
2824 case Xfake_acid_4_player:
2825 case Xfake_acid_5_player:
2826 case Xfake_acid_6_player:
2827 case Xfake_acid_7_player:
2828 case Xfake_acid_8_player:
2831 cave[x][y] = Yalien_sB;
2832 next[x][y] = Xblank;
2833 cave[x][y+1] = Yalien_s;
2834 next[x][y+1] = Xalien_pause;
2835 play_element_sound(x, y, SOUND_alien, Xalien);
2846 cave[x][y] = Yalien_sB;
2847 next[x][y] = Xblank;
2848 if (cave[x+1][y] == Xblank)
2849 cave[x+1][y] = Xsplash_e;
2850 if (cave[x-1][y] == Xblank)
2851 cave[x-1][y] = Xsplash_w;
2852 play_element_sound(x, y, SOUND_acid, Xacid_1);
2861 switch (cave[x+1][y])
2875 case Xfake_acid_1_player:
2876 case Xfake_acid_2_player:
2877 case Xfake_acid_3_player:
2878 case Xfake_acid_4_player:
2879 case Xfake_acid_5_player:
2880 case Xfake_acid_6_player:
2881 case Xfake_acid_7_player:
2882 case Xfake_acid_8_player:
2885 cave[x][y] = Yalien_eB;
2886 next[x][y] = Xblank;
2887 cave[x+1][y] = Yalien_e;
2888 next[x+1][y] = Xalien_pause;
2889 play_element_sound(x, y, SOUND_alien, Xalien);
2900 cave[x][y] = Yalien_eB;
2901 next[x][y] = Xblank;
2902 if (cave[x+2][y-1] == Xblank)
2903 cave[x+2][y-1] = Xsplash_e;
2904 if (cave[x][y-1] == Xblank)
2905 cave[x][y-1] = Xsplash_w;
2906 play_element_sound(x, y, SOUND_acid, Xacid_1);
2912 switch (cave[x-1][y])
2926 case Xfake_acid_1_player:
2927 case Xfake_acid_2_player:
2928 case Xfake_acid_3_player:
2929 case Xfake_acid_4_player:
2930 case Xfake_acid_5_player:
2931 case Xfake_acid_6_player:
2932 case Xfake_acid_7_player:
2933 case Xfake_acid_8_player:
2936 cave[x][y] = Yalien_wB;
2937 next[x][y] = Xblank;
2938 cave[x-1][y] = Yalien_w;
2939 next[x-1][y] = Xalien_pause;
2940 play_element_sound(x, y, SOUND_alien, Xalien);
2951 cave[x][y] = Yalien_wB;
2952 next[x][y] = Xblank;
2953 if (cave[x][y-1] == Xblank)
2954 cave[x][y-1] = Xsplash_e;
2955 if (cave[x-2][y-1] == Xblank)
2956 cave[x-2][y-1] = Xsplash_w;
2957 play_element_sound(x, y, SOUND_acid, Xacid_1);
2964 static void Lalien_pause(int x, int y)
2966 next[x][y] = Xalien;
2969 static void Lbug_n(int x, int y)
2971 switch (cave[x][y-1])
2985 case Xfake_acid_1_player:
2986 case Xfake_acid_2_player:
2987 case Xfake_acid_3_player:
2988 case Xfake_acid_4_player:
2989 case Xfake_acid_5_player:
2990 case Xfake_acid_6_player:
2991 case Xfake_acid_7_player:
2992 case Xfake_acid_8_player:
2995 cave[x][y] = Ybug_nB;
2996 next[x][y] = Xblank;
2997 cave[x][y-1] = Ybug_n;
2998 next[x][y-1] = Xbug_1_n;
2999 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
3010 cave[x][y] = Ybug_nB;
3011 next[x][y] = Xblank;
3012 if (cave[x+1][y-2] == Xblank)
3013 cave[x+1][y-2] = Xsplash_e;
3014 if (cave[x-1][y-2] == Xblank)
3015 cave[x-1][y-2] = Xsplash_w;
3016 play_element_sound(x, y, SOUND_acid, Xacid_1);
3020 cave[x][y] = Ybug_n_w;
3021 next[x][y] = Xbug_2_w;
3022 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
3027 static void Lbug_1_n(int x, int y)
3029 if (is_amoeba[cave[x][y-1]] ||
3030 is_amoeba[cave[x+1][y]] ||
3031 is_amoeba[cave[x][y+1]] ||
3032 is_amoeba[cave[x-1][y]])
3040 switch (cave[x+1][y])
3054 case Xfake_acid_1_player:
3055 case Xfake_acid_2_player:
3056 case Xfake_acid_3_player:
3057 case Xfake_acid_4_player:
3058 case Xfake_acid_5_player:
3059 case Xfake_acid_6_player:
3060 case Xfake_acid_7_player:
3061 case Xfake_acid_8_player:
3072 cave[x][y] = Ybug_n_e;
3073 next[x][y] = Xbug_2_e;
3074 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
3083 static void Lbug_2_n(int x, int y)
3085 if (is_amoeba[cave[x][y-1]] ||
3086 is_amoeba[cave[x+1][y]] ||
3087 is_amoeba[cave[x][y+1]] ||
3088 is_amoeba[cave[x-1][y]])
3099 static void Lbug_e(int x, int y)
3101 switch (cave[x+1][y])
3115 case Xfake_acid_1_player:
3116 case Xfake_acid_2_player:
3117 case Xfake_acid_3_player:
3118 case Xfake_acid_4_player:
3119 case Xfake_acid_5_player:
3120 case Xfake_acid_6_player:
3121 case Xfake_acid_7_player:
3122 case Xfake_acid_8_player:
3125 cave[x][y] = Ybug_eB;
3126 next[x][y] = Xblank;
3127 cave[x+1][y] = Ybug_e;
3128 next[x+1][y] = Xbug_1_e;
3129 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3140 cave[x][y] = Ybug_eB;
3141 next[x][y] = Xblank;
3142 if (cave[x+2][y-1] == Xblank)
3143 cave[x+2][y-1] = Xsplash_e;
3144 if (cave[x][y-1] == Xblank)
3145 cave[x][y-1] = Xsplash_w;
3146 play_element_sound(x, y, SOUND_acid, Xacid_1);
3150 cave[x][y] = Ybug_e_n;
3151 next[x][y] = Xbug_2_n;
3152 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3157 static void Lbug_1_e(int x, int y)
3159 if (is_amoeba[cave[x][y-1]] ||
3160 is_amoeba[cave[x+1][y]] ||
3161 is_amoeba[cave[x][y+1]] ||
3162 is_amoeba[cave[x-1][y]])
3170 switch (cave[x][y+1])
3184 case Xfake_acid_1_player:
3185 case Xfake_acid_2_player:
3186 case Xfake_acid_3_player:
3187 case Xfake_acid_4_player:
3188 case Xfake_acid_5_player:
3189 case Xfake_acid_6_player:
3190 case Xfake_acid_7_player:
3191 case Xfake_acid_8_player:
3202 cave[x][y] = Ybug_e_s;
3203 next[x][y] = Xbug_2_s;
3204 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3213 static void Lbug_2_e(int x, int y)
3215 if (is_amoeba[cave[x][y-1]] ||
3216 is_amoeba[cave[x+1][y]] ||
3217 is_amoeba[cave[x][y+1]] ||
3218 is_amoeba[cave[x-1][y]])
3229 static void Lbug_s(int x, int y)
3231 switch (cave[x][y+1])
3245 case Xfake_acid_1_player:
3246 case Xfake_acid_2_player:
3247 case Xfake_acid_3_player:
3248 case Xfake_acid_4_player:
3249 case Xfake_acid_5_player:
3250 case Xfake_acid_6_player:
3251 case Xfake_acid_7_player:
3252 case Xfake_acid_8_player:
3255 cave[x][y] = Ybug_sB;
3256 next[x][y] = Xblank;
3257 cave[x][y+1] = Ybug_s;
3258 next[x][y+1] = Xbug_1_s;
3259 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3270 cave[x][y] = Ybug_sB;
3271 next[x][y] = Xblank;
3272 if (cave[x+1][y] == Xblank)
3273 cave[x+1][y] = Xsplash_e;
3274 if (cave[x-1][y] == Xblank)
3275 cave[x-1][y] = Xsplash_w;
3276 play_element_sound(x, y, SOUND_acid, Xacid_1);
3280 cave[x][y] = Ybug_s_e;
3281 next[x][y] = Xbug_2_e;
3282 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3287 static void Lbug_1_s(int x, int y)
3289 if (is_amoeba[cave[x][y-1]] ||
3290 is_amoeba[cave[x+1][y]] ||
3291 is_amoeba[cave[x][y+1]] ||
3292 is_amoeba[cave[x-1][y]])
3300 switch (cave[x-1][y])
3314 case Xfake_acid_1_player:
3315 case Xfake_acid_2_player:
3316 case Xfake_acid_3_player:
3317 case Xfake_acid_4_player:
3318 case Xfake_acid_5_player:
3319 case Xfake_acid_6_player:
3320 case Xfake_acid_7_player:
3321 case Xfake_acid_8_player:
3332 cave[x][y] = Ybug_s_w;
3333 next[x][y] = Xbug_2_w;
3334 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3343 static void Lbug_2_s(int x, int y)
3345 if (is_amoeba[cave[x][y-1]] ||
3346 is_amoeba[cave[x+1][y]] ||
3347 is_amoeba[cave[x][y+1]] ||
3348 is_amoeba[cave[x-1][y]])
3359 static void Lbug_w(int x, int y)
3361 switch (cave[x-1][y])
3375 case Xfake_acid_1_player:
3376 case Xfake_acid_2_player:
3377 case Xfake_acid_3_player:
3378 case Xfake_acid_4_player:
3379 case Xfake_acid_5_player:
3380 case Xfake_acid_6_player:
3381 case Xfake_acid_7_player:
3382 case Xfake_acid_8_player:
3385 cave[x][y] = Ybug_wB;
3386 next[x][y] = Xblank;
3387 cave[x-1][y] = Ybug_w;
3388 next[x-1][y] = Xbug_1_w;
3389 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3400 cave[x][y] = Ybug_wB;
3401 next[x][y] = Xblank;
3402 if (cave[x][y-1] == Xblank)
3403 cave[x][y-1] = Xsplash_e;
3404 if (cave[x-2][y-1] == Xblank)
3405 cave[x-2][y-1] = Xsplash_w;
3406 play_element_sound(x, y, SOUND_acid, Xacid_1);
3410 cave[x][y] = Ybug_w_s;
3411 next[x][y] = Xbug_2_s;
3412 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3417 static void Lbug_1_w(int x, int y)
3419 if (is_amoeba[cave[x][y-1]] ||
3420 is_amoeba[cave[x+1][y]] ||
3421 is_amoeba[cave[x][y+1]] ||
3422 is_amoeba[cave[x-1][y]])
3430 switch (cave[x][y-1])
3444 case Xfake_acid_1_player:
3445 case Xfake_acid_2_player:
3446 case Xfake_acid_3_player:
3447 case Xfake_acid_4_player:
3448 case Xfake_acid_5_player:
3449 case Xfake_acid_6_player:
3450 case Xfake_acid_7_player:
3451 case Xfake_acid_8_player:
3462 cave[x][y] = Ybug_w_n;
3463 next[x][y] = Xbug_2_n;
3464 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3473 static void Lbug_2_w(int x, int y)
3475 if (is_amoeba[cave[x][y-1]] ||
3476 is_amoeba[cave[x+1][y]] ||
3477 is_amoeba[cave[x][y+1]] ||
3478 is_amoeba[cave[x-1][y]])
3489 static void Ltank_n(int x, int y)
3491 switch (cave[x][y-1])
3505 case Xfake_acid_1_player:
3506 case Xfake_acid_2_player:
3507 case Xfake_acid_3_player:
3508 case Xfake_acid_4_player:
3509 case Xfake_acid_5_player:
3510 case Xfake_acid_6_player:
3511 case Xfake_acid_7_player:
3512 case Xfake_acid_8_player:
3515 cave[x][y] = Ytank_nB;
3516 next[x][y] = Xblank;
3517 cave[x][y-1] = Ytank_n;
3518 next[x][y-1] = Xtank_1_n;
3519 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3530 cave[x][y] = Ytank_nB;
3531 next[x][y] = Xblank;
3532 if (cave[x+1][y-2] == Xblank)
3533 cave[x+1][y-2] = Xsplash_e;
3534 if (cave[x-1][y-2] == Xblank)
3535 cave[x-1][y-2] = Xsplash_w;
3536 play_element_sound(x, y, SOUND_acid, Xacid_1);
3540 cave[x][y] = Ytank_n_e;
3541 next[x][y] = Xtank_2_e;
3542 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3547 static void Ltank_1_n(int x, int y)
3549 if (is_amoeba[cave[x][y-1]] ||
3550 is_amoeba[cave[x+1][y]] ||
3551 is_amoeba[cave[x][y+1]] ||
3552 is_amoeba[cave[x-1][y]])
3560 switch (cave[x-1][y])
3574 case Xfake_acid_1_player:
3575 case Xfake_acid_2_player:
3576 case Xfake_acid_3_player:
3577 case Xfake_acid_4_player:
3578 case Xfake_acid_5_player:
3579 case Xfake_acid_6_player:
3580 case Xfake_acid_7_player:
3581 case Xfake_acid_8_player:
3592 cave[x][y] = Ytank_n_w;
3593 next[x][y] = Xtank_2_w;
3594 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3603 static void Ltank_2_n(int x, int y)
3605 if (is_amoeba[cave[x][y-1]] ||
3606 is_amoeba[cave[x+1][y]] ||
3607 is_amoeba[cave[x][y+1]] ||
3608 is_amoeba[cave[x-1][y]])
3619 static void Ltank_e(int x, int y)
3621 switch (cave[x+1][y])
3635 case Xfake_acid_1_player:
3636 case Xfake_acid_2_player:
3637 case Xfake_acid_3_player:
3638 case Xfake_acid_4_player:
3639 case Xfake_acid_5_player:
3640 case Xfake_acid_6_player:
3641 case Xfake_acid_7_player:
3642 case Xfake_acid_8_player:
3645 cave[x][y] = Ytank_eB;
3646 next[x][y] = Xblank;
3647 cave[x+1][y] = Ytank_e;
3648 next[x+1][y] = Xtank_1_e;
3649 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3660 cave[x][y] = Ytank_eB;
3661 next[x][y] = Xblank;
3662 if (cave[x+2][y-1] == Xblank)
3663 cave[x+2][y-1] = Xsplash_e;
3664 if (cave[x][y-1] == Xblank)
3665 cave[x][y-1] = Xsplash_w;
3666 play_element_sound(x, y, SOUND_acid, Xacid_1);
3670 cave[x][y] = Ytank_e_s;
3671 next[x][y] = Xtank_2_s;
3672 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3677 static void Ltank_1_e(int x, int y)
3679 if (is_amoeba[cave[x][y-1]] ||
3680 is_amoeba[cave[x+1][y]] ||
3681 is_amoeba[cave[x][y+1]] ||
3682 is_amoeba[cave[x-1][y]])
3690 switch (cave[x][y-1])
3704 case Xfake_acid_1_player:
3705 case Xfake_acid_2_player:
3706 case Xfake_acid_3_player:
3707 case Xfake_acid_4_player:
3708 case Xfake_acid_5_player:
3709 case Xfake_acid_6_player:
3710 case Xfake_acid_7_player:
3711 case Xfake_acid_8_player:
3722 cave[x][y] = Ytank_e_n;
3723 next[x][y] = Xtank_2_n;
3724 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3733 static void Ltank_2_e(int x, int y)
3735 if (is_amoeba[cave[x][y-1]] ||
3736 is_amoeba[cave[x+1][y]] ||
3737 is_amoeba[cave[x][y+1]] ||
3738 is_amoeba[cave[x-1][y]])
3749 static void Ltank_s(int x, int y)
3751 switch (cave[x][y+1])
3765 case Xfake_acid_1_player:
3766 case Xfake_acid_2_player:
3767 case Xfake_acid_3_player:
3768 case Xfake_acid_4_player:
3769 case Xfake_acid_5_player:
3770 case Xfake_acid_6_player:
3771 case Xfake_acid_7_player:
3772 case Xfake_acid_8_player:
3775 cave[x][y] = Ytank_sB;
3776 next[x][y] = Xblank;
3777 cave[x][y+1] = Ytank_s;
3778 next[x][y+1] = Xtank_1_s;
3779 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3790 cave[x][y] = Ytank_sB;
3791 next[x][y] = Xblank;
3792 if (cave[x+1][y] == Xblank)
3793 cave[x+1][y] = Xsplash_e;
3794 if (cave[x-1][y] == Xblank)
3795 cave[x-1][y] = Xsplash_w;
3796 play_element_sound(x, y, SOUND_acid, Xacid_1);
3800 cave[x][y] = Ytank_s_w;
3801 next[x][y] = Xtank_2_w;
3802 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3807 static void Ltank_1_s(int x, int y)
3809 if (is_amoeba[cave[x][y-1]] ||
3810 is_amoeba[cave[x+1][y]] ||
3811 is_amoeba[cave[x][y+1]] ||
3812 is_amoeba[cave[x-1][y]])
3820 switch (cave[x+1][y])
3834 case Xfake_acid_1_player:
3835 case Xfake_acid_2_player:
3836 case Xfake_acid_3_player:
3837 case Xfake_acid_4_player:
3838 case Xfake_acid_5_player:
3839 case Xfake_acid_6_player:
3840 case Xfake_acid_7_player:
3841 case Xfake_acid_8_player:
3852 cave[x][y] = Ytank_s_e;
3853 next[x][y] = Xtank_2_e;
3854 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3863 static void Ltank_2_s(int x, int y)
3865 if (is_amoeba[cave[x][y-1]] ||
3866 is_amoeba[cave[x+1][y]] ||
3867 is_amoeba[cave[x][y+1]] ||
3868 is_amoeba[cave[x-1][y]])
3879 static void Ltank_w(int x, int y)
3881 switch (cave[x-1][y])
3895 case Xfake_acid_1_player:
3896 case Xfake_acid_2_player:
3897 case Xfake_acid_3_player:
3898 case Xfake_acid_4_player:
3899 case Xfake_acid_5_player:
3900 case Xfake_acid_6_player:
3901 case Xfake_acid_7_player:
3902 case Xfake_acid_8_player:
3905 cave[x][y] = Ytank_wB;
3906 next[x][y] = Xblank;
3907 cave[x-1][y] = Ytank_w;
3908 next[x-1][y] = Xtank_1_w;
3909 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3920 cave[x][y] = Ytank_wB;
3921 next[x][y] = Xblank;
3922 if (cave[x][y-1] == Xblank)
3923 cave[x][y-1] = Xsplash_e;
3924 if (cave[x-2][y-1] == Xblank)
3925 cave[x-2][y-1] = Xsplash_w;
3926 play_element_sound(x, y, SOUND_acid, Xacid_1);
3930 cave[x][y] = Ytank_w_n;
3931 next[x][y] = Xtank_2_n;
3932 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3937 static void Ltank_1_w(int x, int y)
3939 if (is_amoeba[cave[x][y-1]] ||
3940 is_amoeba[cave[x+1][y]] ||
3941 is_amoeba[cave[x][y+1]] ||
3942 is_amoeba[cave[x-1][y]])
3950 switch (cave[x][y+1])
3964 case Xfake_acid_1_player:
3965 case Xfake_acid_2_player:
3966 case Xfake_acid_3_player:
3967 case Xfake_acid_4_player:
3968 case Xfake_acid_5_player:
3969 case Xfake_acid_6_player:
3970 case Xfake_acid_7_player:
3971 case Xfake_acid_8_player:
3982 cave[x][y] = Ytank_w_s;
3983 next[x][y] = Xtank_2_s;
3984 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3993 static void Ltank_2_w(int x, int y)
3995 if (is_amoeba[cave[x][y-1]] ||
3996 is_amoeba[cave[x+1][y]] ||
3997 is_amoeba[cave[x][y+1]] ||
3998 is_amoeba[cave[x-1][y]])
4009 static void Lemerald(int x, int y)
4011 switch (cave[x][y+1])
4024 cave[x][y] = Yemerald_sB;
4025 next[x][y] = Xblank;
4026 cave[x][y+1] = Yemerald_s;
4027 next[x][y+1] = Xemerald_fall;
4038 cave[x][y] = Yemerald_sB;
4039 next[x][y] = Xblank;
4040 if (cave[x+1][y] == Xblank)
4041 cave[x+1][y] = Xsplash_e;
4042 if (cave[x-1][y] == Xblank)
4043 cave[x-1][y] = Xsplash_w;
4044 play_element_sound(x, y, SOUND_acid, Xacid_1);
4057 case Xemerald_pause:
4059 case Xdiamond_pause:
4103 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4105 cave[x][y] = Yemerald_eB;
4106 next[x][y] = Xblank;
4107 cave[x+1][y] = Yemerald_e;
4108 next[x+1][y] = Xemerald_pause;
4109 if (cave[x][y+1] == Xbumper)
4110 cave[x][y+1] = Ybumper;
4114 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4116 cave[x][y] = Yemerald_wB;
4117 next[x][y] = Xblank;
4118 cave[x-1][y] = Yemerald_w;
4119 next[x-1][y] = Xemerald_pause;
4120 if (cave[x][y+1] == Xbumper)
4121 cave[x][y+1] = Ybumper;
4127 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4129 cave[x][y] = Yemerald_wB;
4130 next[x][y] = Xblank;
4131 cave[x-1][y] = Yemerald_w;
4132 next[x-1][y] = Xemerald_pause;
4133 if (cave[x][y+1] == Xbumper)
4134 cave[x][y+1] = Ybumper;
4138 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4140 cave[x][y] = Yemerald_eB;
4141 next[x][y] = Xblank;
4142 cave[x+1][y] = Yemerald_e;
4143 next[x+1][y] = Xemerald_pause;
4144 if (cave[x][y+1] == Xbumper)
4145 cave[x][y+1] = Ybumper;
4151 if (++lev.shine_cnt > 50)
4153 lev.shine_cnt = RANDOM(8);
4154 cave[x][y] = Xemerald_shine;
4161 static void Lemerald_pause(int x, int y)
4163 switch (cave[x][y+1])
4176 cave[x][y] = Yemerald_sB;
4177 next[x][y] = Xblank;
4178 cave[x][y+1] = Yemerald_s;
4179 next[x][y+1] = Xemerald_fall;
4190 cave[x][y] = Yemerald_sB;
4191 next[x][y] = Xblank;
4192 if (cave[x+1][y] == Xblank)
4193 cave[x+1][y] = Xsplash_e;
4194 if (cave[x-1][y] == Xblank)
4195 cave[x-1][y] = Xsplash_w;
4196 play_element_sound(x, y, SOUND_acid, Xacid_1);
4200 cave[x][y] = Xemerald;
4201 next[x][y] = Xemerald;
4206 static void Lemerald_fall(int x, int y)
4208 switch (cave[x][y+1])
4222 case Xfake_acid_1_player:
4223 case Xfake_acid_2_player:
4224 case Xfake_acid_3_player:
4225 case Xfake_acid_4_player:
4226 case Xfake_acid_5_player:
4227 case Xfake_acid_6_player:
4228 case Xfake_acid_7_player:
4229 case Xfake_acid_8_player:
4230 cave[x][y] = Yemerald_sB;
4231 next[x][y] = Xblank;
4232 cave[x][y+1] = Yemerald_s;
4233 next[x][y+1] = Xemerald_fall;
4244 cave[x][y] = Yemerald_sB;
4245 next[x][y] = Xblank;
4246 if (cave[x+1][y] == Xblank)
4247 cave[x+1][y] = Xsplash_e;
4248 if (cave[x-1][y] == Xblank)
4249 cave[x-1][y] = Xsplash_w;
4250 play_element_sound(x, y, SOUND_acid, Xacid_1);
4254 if (lev.wonderwall_time > 0)
4256 lev.wonderwall_active = TRUE;
4257 cave[x][y] = Yemerald_sB;
4258 next[x][y] = Xblank;
4259 if (is_blank[cave[x][y+2]])
4261 cave[x][y+2] = Ydiamond_s;
4262 next[x][y+2] = Xdiamond_fall;
4264 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4269 cave[x][y] = Xemerald;
4270 next[x][y] = Xemerald;
4271 play_element_sound(x, y, SOUND_diamond, Xemerald);
4276 static void Ldiamond(int x, int y)
4278 switch (cave[x][y+1])
4291 cave[x][y] = Ydiamond_sB;
4292 next[x][y] = Xblank;
4293 cave[x][y+1] = Ydiamond_s;
4294 next[x][y+1] = Xdiamond_fall;
4305 cave[x][y] = Ydiamond_sB;
4306 next[x][y] = Xblank;
4307 if (cave[x+1][y] == Xblank)
4308 cave[x+1][y] = Xsplash_e;
4309 if (cave[x-1][y] == Xblank)
4310 cave[x-1][y] = Xsplash_w;
4311 play_element_sound(x, y, SOUND_acid, Xacid_1);
4324 case Xemerald_pause:
4326 case Xdiamond_pause:
4370 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4372 cave[x][y] = Ydiamond_eB;
4373 next[x][y] = Xblank;
4374 cave[x+1][y] = Ydiamond_e;
4375 next[x+1][y] = Xdiamond_pause;
4376 if (cave[x][y+1] == Xbumper)
4377 cave[x][y+1] = Ybumper;
4381 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4383 cave[x][y] = Ydiamond_wB;
4384 next[x][y] = Xblank;
4385 cave[x-1][y] = Ydiamond_w;
4386 next[x-1][y] = Xdiamond_pause;
4387 if (cave[x][y+1] == Xbumper)
4388 cave[x][y+1] = Ybumper;
4394 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4396 cave[x][y] = Ydiamond_wB;
4397 next[x][y] = Xblank;
4398 cave[x-1][y] = Ydiamond_w;
4399 next[x-1][y] = Xdiamond_pause;
4400 if (cave[x][y+1] == Xbumper)
4401 cave[x][y+1] = Ybumper;
4405 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4407 cave[x][y] = Ydiamond_eB;
4408 next[x][y] = Xblank;
4409 cave[x+1][y] = Ydiamond_e;
4410 next[x+1][y] = Xdiamond_pause;
4411 if (cave[x][y+1] == Xbumper)
4412 cave[x][y+1] = Ybumper;
4418 if (++lev.shine_cnt > 50)
4420 lev.shine_cnt = RANDOM(8);
4421 cave[x][y] = Xdiamond_shine;
4428 static void Ldiamond_pause(int x, int y)
4430 switch (cave[x][y+1])
4443 cave[x][y] = Ydiamond_sB;
4444 next[x][y] = Xblank;
4445 cave[x][y+1] = Ydiamond_s;
4446 next[x][y+1] = Xdiamond_fall;
4457 cave[x][y] = Ydiamond_sB;
4458 next[x][y] = Xblank;
4459 if (cave[x+1][y] == Xblank)
4460 cave[x+1][y] = Xsplash_e;
4461 if (cave[x-1][y] == Xblank)
4462 cave[x-1][y] = Xsplash_w;
4463 play_element_sound(x, y, SOUND_acid, Xacid_1);
4467 cave[x][y] = Xdiamond;
4468 next[x][y] = Xdiamond;
4473 static void Ldiamond_fall(int x, int y)
4475 switch (cave[x][y+1])
4489 case Xfake_acid_1_player:
4490 case Xfake_acid_2_player:
4491 case Xfake_acid_3_player:
4492 case Xfake_acid_4_player:
4493 case Xfake_acid_5_player:
4494 case Xfake_acid_6_player:
4495 case Xfake_acid_7_player:
4496 case Xfake_acid_8_player:
4497 cave[x][y] = Ydiamond_sB;
4498 next[x][y] = Xblank;
4499 cave[x][y+1] = Ydiamond_s;
4500 next[x][y+1] = Xdiamond_fall;
4511 cave[x][y] = Ydiamond_sB;
4512 next[x][y] = Xblank;
4513 if (cave[x+1][y] == Xblank)
4514 cave[x+1][y] = Xsplash_e;
4515 if (cave[x-1][y] == Xblank)
4516 cave[x-1][y] = Xsplash_w;
4517 play_element_sound(x, y, SOUND_acid, Xacid_1);
4521 if (lev.wonderwall_time > 0)
4523 lev.wonderwall_active = TRUE;
4524 cave[x][y] = Ydiamond_sB;
4525 next[x][y] = Xblank;
4526 if (is_blank[cave[x][y+2]])
4528 cave[x][y+2] = Ystone_s;
4529 next[x][y+2] = Xstone_fall;
4531 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4536 cave[x][y] = Xdiamond;
4537 next[x][y] = Xdiamond;
4538 play_element_sound(x, y, SOUND_diamond, Xdiamond);
4543 static void Lstone(int x, int y)
4545 switch (cave[x][y+1])
4560 cave[x][y] = Ystone_sB;
4561 next[x][y] = Xblank;
4562 cave[x][y+1] = Ystone_s;
4563 next[x][y+1] = Xstone_fall;
4574 cave[x][y] = Ystone_sB;
4575 next[x][y] = Xblank;
4576 if (cave[x+1][y] == Xblank)
4577 cave[x+1][y] = Xsplash_e;
4578 if (cave[x-1][y] == Xblank)
4579 cave[x-1][y] = Xsplash_w;
4580 play_element_sound(x, y, SOUND_acid, Xacid_1);
4584 cave[x][y] = Xsand_stonein_1;
4585 next[x][y] = Xsand_stonein_2;
4586 cave[x][y+1] = Xsand_sandstone_1;
4587 next[x][y+1] = Xsand_sandstone_2;
4600 case Xemerald_pause:
4602 case Xdiamond_pause:
4639 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4641 cave[x][y] = Ystone_eB;
4642 next[x][y] = Xblank;
4643 cave[x+1][y] = Ystone_e;
4644 next[x+1][y] = Xstone_pause;
4645 if (cave[x][y+1] == Xbumper)
4646 cave[x][y+1] = Ybumper;
4650 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4652 cave[x][y] = Ystone_wB;
4653 next[x][y] = Xblank;
4654 cave[x-1][y] = Ystone_w;
4655 next[x-1][y] = Xstone_pause;
4656 if (cave[x][y+1] == Xbumper)
4657 cave[x][y+1] = Ybumper;
4663 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4665 cave[x][y] = Ystone_wB;
4666 next[x][y] = Xblank;
4667 cave[x-1][y] = Ystone_w;
4668 next[x-1][y] = Xstone_pause;
4669 if (cave[x][y+1] == Xbumper)
4670 cave[x][y+1] = Ybumper;
4674 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4676 cave[x][y] = Ystone_eB;
4677 next[x][y] = Xblank;
4678 cave[x+1][y] = Ystone_e;
4679 next[x+1][y] = Xstone_pause;
4680 if (cave[x][y+1] == Xbumper)
4681 cave[x][y+1] = Ybumper;
4688 static void Lstone_pause(int x, int y)
4690 switch (cave[x][y+1])
4703 cave[x][y] = Ystone_sB;
4704 next[x][y] = Xblank;
4705 cave[x][y+1] = Ystone_s;
4706 next[x][y+1] = Xstone_fall;
4717 cave[x][y] = Ystone_sB;
4718 next[x][y] = Xblank;
4719 if (cave[x+1][y] == Xblank)
4720 cave[x+1][y] = Xsplash_e;
4721 if (cave[x-1][y] == Xblank)
4722 cave[x-1][y] = Xsplash_w;
4723 play_element_sound(x, y, SOUND_acid, Xacid_1);
4727 cave[x][y] = Xstone;
4728 next[x][y] = Xstone;
4733 static void Lstone_fall(int x, int y)
4735 switch (cave[x][y+1])
4749 case Xfake_acid_1_player:
4750 case Xfake_acid_2_player:
4751 case Xfake_acid_3_player:
4752 case Xfake_acid_4_player:
4753 case Xfake_acid_5_player:
4754 case Xfake_acid_6_player:
4755 case Xfake_acid_7_player:
4756 case Xfake_acid_8_player:
4757 cave[x][y] = Ystone_sB;
4758 next[x][y] = Xblank;
4759 cave[x][y+1] = Ystone_s;
4760 next[x][y+1] = Xstone_fall;
4771 cave[x][y] = Ystone_sB;
4772 next[x][y] = Xblank;
4773 if (cave[x+1][y] == Xblank)
4774 cave[x+1][y] = Xsplash_e;
4775 if (cave[x-1][y] == Xblank)
4776 cave[x-1][y] = Xsplash_w;
4777 play_element_sound(x, y, SOUND_acid, Xacid_1);
4784 cave[x][y] = Ystone_sB;
4785 Lboom_next_new(x, y, Xblank);
4786 cave[x][y+1] = Yeater_stone;
4787 next[x][y+1] = Zeater;
4788 Lboom_eater_old(x, y+1);
4789 score += lev.eater_score;
4794 cave[x][y] = Ystone_sB;
4795 Lboom_next_new(x, y, Xblank);
4796 cave[x][y+1] = Yalien_stone;
4797 next[x][y+1] = Ztank;
4798 Lboom_tank_old(x, y+1);
4799 score += lev.alien_score;
4810 cave[x][y] = Ystone_sB;
4811 Lboom_next_new(x, y, Xblank);
4812 cave[x][y+1] = Ybug_stone;
4813 next[x][y+1] = Zbug;
4814 Lboom_bug_old(x, y+1);
4815 score += lev.bug_score;
4826 cave[x][y] = Ystone_sB;
4827 Lboom_next_new(x, y, Xblank);
4828 cave[x][y+1] = Ytank_stone;
4829 next[x][y+1] = Ztank;
4830 Lboom_tank_old(x, y+1);
4831 score += lev.tank_score;
4835 case Xdiamond_pause:
4836 switch (cave[x][y+2])
4850 case Xfake_acid_1_player:
4851 case Xfake_acid_2_player:
4852 case Xfake_acid_3_player:
4853 case Xfake_acid_4_player:
4854 case Xfake_acid_5_player:
4855 case Xfake_acid_6_player:
4856 case Xfake_acid_7_player:
4857 case Xfake_acid_8_player:
4900 next[x][y] = Xstone;
4901 play_element_sound(x, y, SOUND_stone, Xstone);
4905 cave[x][y] = Ystone_sB;
4906 next[x][y] = Xblank;
4907 cave[x][y+1] = Ydiamond_stone;
4908 next[x][y+1] = Xstone_pause;
4909 play_element_sound(x, y, SOUND_squash, Xdiamond);
4914 Lboom_cave_new(x, y, Xstone);
4915 Lboom_next_new(x, y, Xstone);
4916 cave[x][y+1] = Ybomb_blank;
4917 next[x][y+1] = Ztank;
4918 Lboom_tank_old(x, y+1);
4923 next[x][y] = Xstone;
4924 cave[x][y+1] = Ynut_stone;
4925 next[x][y+1] = Xemerald;
4926 play_element_sound(x, y, SOUND_crack, Xnut);
4927 score += lev.nut_score;
4933 switch (cave[x+1][y+1])
4948 cave[x][y+1] = Xspring_e;
4952 cave[x][y+1] = Xspring_w;
4958 switch (cave[x-1][y+1])
4973 cave[x][y+1] = Xspring_w;
4976 cave[x][y+1] = Xspring_e;
4981 next[x][y] = Xstone;
4985 if (lev.wonderwall_time > 0)
4987 lev.wonderwall_active = TRUE;
4988 cave[x][y] = Ystone_sB;
4989 next[x][y] = Xblank;
4990 if (is_blank[cave[x][y+2]])
4992 cave[x][y+2] = Yemerald_s;
4993 next[x][y+2] = Xemerald_fall;
4995 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
5000 cave[x][y] = Xstone;
5001 next[x][y] = Xstone;
5002 play_element_sound(x, y, SOUND_stone, Xstone);
5007 static void Lbomb(int x, int y)
5009 switch (cave[x][y+1])
5022 cave[x][y] = Ybomb_sB;
5023 next[x][y] = Xblank;
5024 cave[x][y+1] = Ybomb_s;
5025 next[x][y+1] = Xbomb_fall;
5036 cave[x][y] = Ybomb_sB;
5037 next[x][y] = Xblank;
5038 if (cave[x+1][y] == Xblank)
5039 cave[x+1][y] = Xsplash_e;
5040 if (cave[x-1][y] == Xblank)
5041 cave[x-1][y] = Xsplash_w;
5042 play_element_sound(x, y, SOUND_acid, Xacid_1);
5055 case Xemerald_pause:
5057 case Xdiamond_pause:
5092 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5094 cave[x][y] = Ybomb_eB;
5095 next[x][y] = Xblank;
5096 cave[x+1][y] = Ybomb_e;
5097 next[x+1][y] = Xbomb_pause;
5098 if (cave[x][y+1] == Xbumper)
5099 cave[x][y+1] = Ybumper;
5103 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5105 cave[x][y] = Ybomb_wB;
5106 next[x][y] = Xblank;
5107 cave[x-1][y] = Ybomb_w;
5108 next[x-1][y] = Xbomb_pause;
5109 if (cave[x][y+1] == Xbumper)
5110 cave[x][y+1] = Ybumper;
5116 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5118 cave[x][y] = Ybomb_wB;
5119 next[x][y] = Xblank;
5120 cave[x-1][y] = Ybomb_w;
5121 next[x-1][y] = Xbomb_pause;
5122 if (cave[x][y+1] == Xbumper)
5123 cave[x][y+1] = Ybumper;
5127 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5129 cave[x][y] = Ybomb_eB;
5130 next[x][y] = Xblank;
5131 cave[x+1][y] = Ybomb_e;
5132 next[x+1][y] = Xbomb_pause;
5133 if (cave[x][y+1] == Xbumper)
5134 cave[x][y+1] = Ybumper;
5141 static void Lbomb_pause(int x, int y)
5143 switch (cave[x][y+1])
5156 cave[x][y] = Ybomb_sB;
5157 next[x][y] = Xblank;
5158 cave[x][y+1] = Ybomb_s;
5159 next[x][y+1] = Xbomb_fall;
5170 cave[x][y] = Ybomb_sB;
5171 next[x][y] = Xblank;
5172 if (cave[x+1][y] == Xblank)
5173 cave[x+1][y] = Xsplash_e;
5174 if (cave[x-1][y] == Xblank)
5175 cave[x-1][y] = Xsplash_w;
5176 play_element_sound(x, y, SOUND_acid, Xacid_1);
5186 static void Lbomb_fall(int x, int y)
5188 switch (cave[x][y+1])
5201 cave[x][y] = Ybomb_sB;
5202 next[x][y] = Xblank;
5203 cave[x][y+1] = Ybomb_s;
5204 next[x][y+1] = Xbomb_fall;
5215 cave[x][y] = Ybomb_sB;
5216 next[x][y] = Xblank;
5217 if (cave[x+1][y] == Xblank)
5218 cave[x+1][y] = Xsplash_e;
5219 if (cave[x-1][y] == Xblank)
5220 cave[x-1][y] = Xsplash_w;
5221 play_element_sound(x, y, SOUND_acid, Xacid_1);
5225 cave[x][y] = Ybomb_blank;
5227 Lboom_tank_old(x, y);
5232 static void Lnut(int x, int y)
5234 switch (cave[x][y+1])
5247 cave[x][y] = Ynut_sB;
5248 next[x][y] = Xblank;
5249 cave[x][y+1] = Ynut_s;
5250 next[x][y+1] = Xnut_fall;
5261 cave[x][y] = Ynut_sB;
5262 next[x][y] = Xblank;
5263 if (cave[x+1][y] == Xblank)
5264 cave[x+1][y] = Xsplash_e;
5265 if (cave[x-1][y] == Xblank)
5266 cave[x-1][y] = Xsplash_w;
5267 play_element_sound(x, y, SOUND_acid, Xacid_1);
5280 case Xemerald_pause:
5282 case Xdiamond_pause:
5317 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5319 cave[x][y] = Ynut_eB;
5320 next[x][y] = Xblank;
5321 cave[x+1][y] = Ynut_e;
5322 next[x+1][y] = Xnut_pause;
5323 if (cave[x][y+1] == Xbumper)
5324 cave[x][y+1] = Ybumper;
5328 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5330 cave[x][y] = Ynut_wB;
5331 next[x][y] = Xblank;
5332 cave[x-1][y] = Ynut_w;
5333 next[x-1][y] = Xnut_pause;
5334 if (cave[x][y+1] == Xbumper)
5335 cave[x][y+1] = Ybumper;
5341 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5343 cave[x][y] = Ynut_wB;
5344 next[x][y] = Xblank;
5345 cave[x-1][y] = Ynut_w;
5346 next[x-1][y] = Xnut_pause;
5347 if (cave[x][y+1] == Xbumper)
5348 cave[x][y+1] = Ybumper;
5352 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5354 cave[x][y] = Ynut_eB;
5355 next[x][y] = Xblank;
5356 cave[x+1][y] = Ynut_e;
5357 next[x+1][y] = Xnut_pause;
5358 if (cave[x][y+1] == Xbumper)
5359 cave[x][y+1] = Ybumper;
5366 static void Lnut_pause(int x, int y)
5368 switch (cave[x][y+1])
5381 cave[x][y] = Ynut_sB;
5382 next[x][y] = Xblank;
5383 cave[x][y+1] = Ynut_s;
5384 next[x][y+1] = Xnut_fall;
5395 cave[x][y] = Ynut_sB;
5396 next[x][y] = Xblank;
5397 if (cave[x+1][y] == Xblank)
5398 cave[x+1][y] = Xsplash_e;
5399 if (cave[x-1][y] == Xblank)
5400 cave[x-1][y] = Xsplash_w;
5401 play_element_sound(x, y, SOUND_acid, Xacid_1);
5411 static void Lnut_fall(int x, int y)
5413 switch (cave[x][y+1])
5427 case Xfake_acid_1_player:
5428 case Xfake_acid_2_player:
5429 case Xfake_acid_3_player:
5430 case Xfake_acid_4_player:
5431 case Xfake_acid_5_player:
5432 case Xfake_acid_6_player:
5433 case Xfake_acid_7_player:
5434 case Xfake_acid_8_player:
5435 cave[x][y] = Ynut_sB;
5436 next[x][y] = Xblank;
5437 cave[x][y+1] = Ynut_s;
5438 next[x][y+1] = Xnut_fall;
5449 cave[x][y] = Ynut_sB;
5450 next[x][y] = Xblank;
5451 if (cave[x+1][y] == Xblank)
5452 cave[x+1][y] = Xsplash_e;
5453 if (cave[x-1][y] == Xblank)
5454 cave[x-1][y] = Xsplash_w;
5455 play_element_sound(x, y, SOUND_acid, Xacid_1);
5461 play_element_sound(x, y, SOUND_nut, Xnut);
5466 static void Lspring(int x, int y)
5468 switch (cave[x][y+1])
5483 cave[x][y] = Yspring_sB;
5484 next[x][y] = Xblank;
5485 cave[x][y+1] = Yspring_s;
5486 next[x][y+1] = Xspring_fall;
5497 cave[x][y] = Yspring_sB;
5498 next[x][y] = Xblank;
5499 if (cave[x+1][y] == Xblank)
5500 cave[x+1][y] = Xsplash_e;
5501 if (cave[x-1][y] == Xblank)
5502 cave[x-1][y] = Xsplash_w;
5503 play_element_sound(x, y, SOUND_acid, Xacid_1);
5516 case Xemerald_pause:
5518 case Xdiamond_pause:
5553 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5555 cave[x][y] = Yspring_eB;
5556 next[x][y] = Xblank;
5557 cave[x+1][y] = Yspring_e;
5559 next[x+1][y] = Xspring_e;
5561 next[x+1][y] = Xspring_pause;
5563 if (cave[x][y+1] == Xbumper)
5564 cave[x][y+1] = Ybumper;
5568 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5570 cave[x][y] = Yspring_wB;
5571 next[x][y] = Xblank;
5572 cave[x-1][y] = Yspring_w;
5574 next[x-1][y] = Xspring_w;
5576 next[x-1][y] = Xspring_pause;
5578 if (cave[x][y+1] == Xbumper)
5579 cave[x][y+1] = Ybumper;
5585 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5587 cave[x][y] = Yspring_wB;
5588 next[x][y] = Xblank;
5589 cave[x-1][y] = Yspring_w;
5591 next[x-1][y] = Xspring_w;
5593 next[x-1][y] = Xspring_pause;
5595 if (cave[x][y+1] == Xbumper)
5596 cave[x][y+1] = Ybumper;
5600 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5602 cave[x][y] = Yspring_eB;
5603 next[x][y] = Xblank;
5604 cave[x+1][y] = Yspring_e;
5606 next[x+1][y] = Xspring_e;
5608 next[x+1][y] = Xspring_pause;
5610 if (cave[x][y+1] == Xbumper)
5611 cave[x][y+1] = Ybumper;
5618 static void Lspring_pause(int x, int y)
5620 switch (cave[x][y+1])
5633 cave[x][y] = Yspring_sB;
5634 next[x][y] = Xblank;
5635 cave[x][y+1] = Yspring_s;
5636 next[x][y+1] = Xspring_fall;
5647 cave[x][y] = Yspring_sB;
5648 next[x][y] = Xblank;
5649 if (cave[x+1][y] == Xblank)
5650 cave[x+1][y] = Xsplash_e;
5651 if (cave[x-1][y] == Xblank)
5652 cave[x-1][y] = Xsplash_w;
5653 play_element_sound(x, y, SOUND_acid, Xacid_1);
5657 cave[x][y] = Xspring;
5658 next[x][y] = Xspring;
5663 static void Lspring_e(int x, int y)
5665 switch (cave[x][y+1])
5678 cave[x][y] = Yspring_sB;
5679 next[x][y] = Xblank;
5680 cave[x][y+1] = Yspring_s;
5681 next[x][y+1] = Xspring_fall;
5692 cave[x][y] = Yspring_sB;
5693 next[x][y] = Xblank;
5694 if (cave[x+1][y] == Xblank)
5695 cave[x+1][y] = Xsplash_e;
5696 if (cave[x-1][y] == Xblank)
5697 cave[x-1][y] = Xsplash_w;
5698 play_element_sound(x, y, SOUND_acid, Xacid_1);
5702 cave[x][y+1] = Ybumper;
5705 switch (cave[x+1][y])
5722 cave[x][y] = Yspring_eB;
5723 next[x][y] = Xblank;
5724 cave[x+1][y] = Yspring_e;
5725 next[x+1][y] = Xspring_e;
5736 cave[x][y] = Yspring_eB;
5737 next[x][y] = Xblank;
5738 if (cave[x+2][y-1] == Xblank)
5739 cave[x+2][y-1] = Xsplash_e;
5740 if (cave[x][y-1] == Xblank)
5741 cave[x][y-1] = Xsplash_w;
5742 play_element_sound(x, y, SOUND_acid, Xacid_1);
5751 cave[x][y] = Yspring_alien_eB;
5752 next[x][y] = Xblank;
5753 cave[x+1][y] = Yspring_alien_e;
5754 next[x+1][y] = Xspring_e;
5755 play_element_sound(x, y, SOUND_slurp, Xalien);
5756 score += lev.slurp_score;
5761 cave[x+1][y] = Ybumper;
5762 next[x][y] = Xspring_w;
5763 play_element_sound(x, y, SOUND_spring, Xspring);
5767 cave[x][y] = Xspring;
5768 next[x][y] = Xspring;
5769 play_element_sound(x, y, SOUND_spring, Xspring);
5774 static void Lspring_w(int x, int y)
5776 switch (cave[x][y+1])
5789 cave[x][y] = Yspring_sB;
5790 next[x][y] = Xblank;
5791 cave[x][y+1] = Yspring_s;
5792 next[x][y+1] = Xspring_fall;
5803 cave[x][y] = Yspring_sB;
5804 next[x][y] = Xblank;
5805 if (cave[x+1][y] == Xblank)
5806 cave[x+1][y] = Xsplash_e;
5807 if (cave[x-1][y] == Xblank)
5808 cave[x-1][y] = Xsplash_w;
5809 play_element_sound(x, y, SOUND_acid, Xacid_1);
5813 cave[x][y+1] = Ybumper;
5816 switch (cave[x-1][y])
5833 cave[x][y] = Yspring_wB;
5834 next[x][y] = Xblank;
5835 cave[x-1][y] = Yspring_w;
5836 next[x-1][y] = Xspring_w;
5847 cave[x][y] = Yspring_wB;
5848 next[x][y] = Xblank;
5849 if (cave[x][y-1] == Xblank)
5850 cave[x][y-1] = Xsplash_e;
5851 if (cave[x-2][y-1] == Xblank)
5852 cave[x-2][y-1] = Xsplash_w;
5853 play_element_sound(x, y, SOUND_acid, Xacid_1);
5862 cave[x][y] = Yspring_alien_wB;
5863 next[x][y] = Xblank;
5864 cave[x-1][y] = Yspring_alien_w;
5865 next[x-1][y] = Xspring_w;
5866 play_element_sound(x, y, SOUND_slurp, Xalien);
5867 score += lev.slurp_score;
5872 cave[x-1][y] = Ybumper;
5873 next[x][y] = Xspring_e;
5874 play_element_sound(x, y, SOUND_spring, Xspring);
5878 cave[x][y] = Xspring;
5879 next[x][y] = Xspring;
5880 play_element_sound(x, y, SOUND_spring, Xspring);
5885 static void Lspring_fall(int x, int y)
5887 switch (cave[x][y+1])
5901 case Xfake_acid_1_player:
5902 case Xfake_acid_2_player:
5903 case Xfake_acid_3_player:
5904 case Xfake_acid_4_player:
5905 case Xfake_acid_5_player:
5906 case Xfake_acid_6_player:
5907 case Xfake_acid_7_player:
5908 case Xfake_acid_8_player:
5909 cave[x][y] = Yspring_sB;
5910 next[x][y] = Xblank;
5911 cave[x][y+1] = Yspring_s;
5912 next[x][y+1] = Xspring_fall;
5923 cave[x][y] = Yspring_sB;
5924 next[x][y] = Xblank;
5925 if (cave[x+1][y] == Xblank)
5926 cave[x+1][y] = Xsplash_e;
5927 if (cave[x-1][y] == Xblank)
5928 cave[x-1][y] = Xsplash_w;
5929 play_element_sound(x, y, SOUND_acid, Xacid_1);
5936 cave[x][y] = Yspring_sB;
5937 next[x][y] = Xblank;
5938 cave[x][y+1] = Yeater_spring;
5939 next[x][y+1] = Zeater;
5940 Lboom_eater_old(x, y+1);
5941 score += lev.eater_score;
5946 cave[x][y] = Yspring_sB;
5947 next[x][y] = Xblank;
5948 cave[x][y+1] = Yalien_spring;
5949 next[x][y+1] = Ztank;
5950 Lboom_tank_old(x, y+1);
5951 score += lev.alien_score;
5962 cave[x][y] = Yspring_sB;
5963 next[x][y] = Xblank;
5964 cave[x][y+1] = Ybug_spring;
5965 next[x][y+1] = Zbug;
5966 Lboom_bug_old(x, y+1);
5967 score += lev.bug_score;
5978 cave[x][y] = Yspring_sB;
5979 next[x][y] = Xblank;
5980 cave[x][y+1] = Ytank_spring;
5981 next[x][y+1] = Ztank;
5982 Lboom_tank_old(x, y+1);
5983 score += lev.tank_score;
5988 cave[x][y] = Xspring;
5989 next[x][y] = Xspring;
5990 cave[x][y+1] = Ybomb_blank;
5991 next[x][y+1] = Ztank;
5992 Lboom_tank_old(x, y+1);
5996 cave[x][y] = Xspring;
5997 next[x][y] = Xspring;
5998 play_element_sound(x, y, SOUND_spring, Xspring);
6003 static void Lpush_emerald_e(int x, int y)
6005 cave[x][y] = Yemerald_eB;
6006 next[x][y] = Xblank;
6008 switch (cave[x+1][y])
6011 if (!game_em.use_old_push_elements)
6024 Lpush_element_old(x, y, Xemerald);
6036 if (game_em.use_old_push_into_acid)
6038 if (cave[x+2][y-1] == Xblank)
6039 cave[x+2][y-1] = Xsplash_e;
6040 if (cave[x][y-1] == Xblank)
6041 cave[x][y-1] = Xsplash_w;
6042 play_element_sound(x, y, SOUND_acid, Xacid_1);
6047 cave[x+1][y] = Yemerald_e;
6048 next[x+1][y] = Xemerald_pause;
6051 static void Lpush_emerald_w(int x, int y)
6053 cave[x][y] = Yemerald_wB;
6054 next[x][y] = Xblank;
6056 switch (cave[x-1][y])
6059 if (!game_em.use_old_push_elements)
6072 Lpush_element_old(x, y, Xemerald);
6084 if (game_em.use_old_push_into_acid)
6086 if (cave[x][y-1] == Xblank)
6087 cave[x][y-1] = Xsplash_e;
6088 if (cave[x-2][y-1] == Xblank)
6089 cave[x-2][y-1] = Xsplash_w;
6090 play_element_sound(x, y, SOUND_acid, Xacid_1);
6095 cave[x-1][y] = Yemerald_w;
6096 next[x-1][y] = Xemerald_pause;
6099 static void Lpush_diamond_e(int x, int y)
6101 cave[x][y] = Ydiamond_eB;
6102 next[x][y] = Xblank;
6104 switch (cave[x+1][y])
6107 if (!game_em.use_old_push_elements)
6120 Lpush_element_old(x, y, Xdiamond);
6132 if (game_em.use_old_push_into_acid)
6134 if (cave[x+2][y-1] == Xblank)
6135 cave[x+2][y-1] = Xsplash_e;
6136 if (cave[x][y-1] == Xblank)
6137 cave[x][y-1] = Xsplash_w;
6138 play_element_sound(x, y, SOUND_acid, Xacid_1);
6143 cave[x+1][y] = Ydiamond_e;
6144 next[x+1][y] = Xdiamond_pause;
6147 static void Lpush_diamond_w(int x, int y)
6149 cave[x][y] = Ydiamond_wB;
6150 next[x][y] = Xblank;
6152 switch (cave[x-1][y])
6155 if (!game_em.use_old_push_elements)
6168 Lpush_element_old(x, y, Xdiamond);
6180 if (game_em.use_old_push_into_acid)
6182 if (cave[x][y-1] == Xblank)
6183 cave[x][y-1] = Xsplash_e;
6184 if (cave[x-2][y-1] == Xblank)
6185 cave[x-2][y-1] = Xsplash_w;
6186 play_element_sound(x, y, SOUND_acid, Xacid_1);
6191 cave[x-1][y] = Ydiamond_w;
6192 next[x-1][y] = Xdiamond_pause;
6195 static void Lpush_stone_e(int x, int y)
6197 cave[x][y] = Ystone_eB;
6198 next[x][y] = Xblank;
6200 switch (cave[x+1][y])
6203 if (!game_em.use_old_push_elements)
6216 Lpush_element_old(x, y, Xstone);
6228 if (game_em.use_old_push_into_acid)
6230 if (cave[x+2][y-1] == Xblank)
6231 cave[x+2][y-1] = Xsplash_e;
6232 if (cave[x][y-1] == Xblank)
6233 cave[x][y-1] = Xsplash_w;
6234 play_element_sound(x, y, SOUND_acid, Xacid_1);
6239 cave[x+1][y] = Ystone_e;
6240 next[x+1][y] = Xstone_pause;
6243 static void Lpush_stone_w(int x, int y)
6245 cave[x][y] = Ystone_wB;
6246 next[x][y] = Xblank;
6248 switch (cave[x-1][y])
6251 if (!game_em.use_old_push_elements)
6264 Lpush_element_old(x, y, Xstone);
6276 if (game_em.use_old_push_into_acid)
6278 if (cave[x][y-1] == Xblank)
6279 cave[x][y-1] = Xsplash_e;
6280 if (cave[x-2][y-1] == Xblank)
6281 cave[x-2][y-1] = Xsplash_w;
6282 play_element_sound(x, y, SOUND_acid, Xacid_1);
6287 cave[x-1][y] = Ystone_w;
6288 next[x-1][y] = Xstone_pause;
6291 static void Lpush_bomb_e(int x, int y)
6293 cave[x][y] = Ybomb_eB;
6294 next[x][y] = Xblank;
6296 switch (cave[x+1][y])
6299 if (!game_em.use_old_push_elements)
6312 Lpush_element_old(x, y, Xbomb);
6324 if (game_em.use_old_push_into_acid)
6326 if (cave[x+2][y-1] == Xblank)
6327 cave[x+2][y-1] = Xsplash_e;
6328 if (cave[x][y-1] == Xblank)
6329 cave[x][y-1] = Xsplash_w;
6330 play_element_sound(x, y, SOUND_acid, Xacid_1);
6335 cave[x+1][y] = Ybomb_e;
6336 next[x+1][y] = Xbomb_pause;
6339 static void Lpush_bomb_w(int x, int y)
6341 cave[x][y] = Ybomb_wB;
6342 next[x][y] = Xblank;
6344 switch (cave[x-1][y])
6347 if (!game_em.use_old_push_elements)
6360 Lpush_element_old(x, y, Xbomb);
6372 if (game_em.use_old_push_into_acid)
6374 if (cave[x][y-1] == Xblank)
6375 cave[x][y-1] = Xsplash_e;
6376 if (cave[x-2][y-1] == Xblank)
6377 cave[x-2][y-1] = Xsplash_w;
6378 play_element_sound(x, y, SOUND_acid, Xacid_1);
6383 cave[x-1][y] = Ybomb_w;
6384 next[x-1][y] = Xbomb_pause;
6387 static void Lpush_nut_e(int x, int y)
6389 cave[x][y] = Ynut_eB;
6390 next[x][y] = Xblank;
6392 switch (cave[x+1][y])
6395 if (!game_em.use_old_push_elements)
6408 Lpush_element_old(x, y, Xnut);
6420 if (game_em.use_old_push_into_acid)
6422 if (cave[x+2][y-1] == Xblank)
6423 cave[x+2][y-1] = Xsplash_e;
6424 if (cave[x][y-1] == Xblank)
6425 cave[x][y-1] = Xsplash_w;
6426 play_element_sound(x, y, SOUND_acid, Xacid_1);
6431 cave[x+1][y] = Ynut_e;
6432 next[x+1][y] = Xnut_pause;
6435 static void Lpush_nut_w(int x, int y)
6437 cave[x][y] = Ynut_wB;
6438 next[x][y] = Xblank;
6440 switch (cave[x-1][y])
6443 if (!game_em.use_old_push_elements)
6456 Lpush_element_old(x, y, Xnut);
6468 if (game_em.use_old_push_into_acid)
6470 if (cave[x][y-1] == Xblank)
6471 cave[x][y-1] = Xsplash_e;
6472 if (cave[x-2][y-1] == Xblank)
6473 cave[x-2][y-1] = Xsplash_w;
6474 play_element_sound(x, y, SOUND_acid, Xacid_1);
6479 cave[x-1][y] = Ynut_w;
6480 next[x-1][y] = Xnut_pause;
6483 static void Lpush_spring_e(int x, int y)
6485 cave[x][y] = Yspring_eB;
6486 next[x][y] = Xblank;
6488 switch (cave[x+1][y])
6491 if (!game_em.use_old_push_elements)
6504 Lpush_element_old(x, y, Xspring);
6516 if (game_em.use_old_push_into_acid)
6518 if (cave[x+2][y-1] == Xblank)
6519 cave[x+2][y-1] = Xsplash_e;
6520 if (cave[x][y-1] == Xblank)
6521 cave[x][y-1] = Xsplash_w;
6522 play_element_sound(x, y, SOUND_acid, Xacid_1);
6527 cave[x+1][y] = Yspring_e;
6528 next[x+1][y] = Xspring_e;
6531 static void Lpush_spring_w(int x, int y)
6533 cave[x][y] = Yspring_wB;
6534 next[x][y] = Xblank;
6536 switch (cave[x-1][y])
6539 if (!game_em.use_old_push_elements)
6552 Lpush_element_old(x, y, Xspring);
6564 if (game_em.use_old_push_into_acid)
6566 if (cave[x][y-1] == Xblank)
6567 cave[x][y-1] = Xsplash_e;
6568 if (cave[x-2][y-1] == Xblank)
6569 cave[x-2][y-1] = Xsplash_w;
6570 play_element_sound(x, y, SOUND_acid, Xacid_1);
6575 cave[x-1][y] = Yspring_w;
6576 next[x-1][y] = Xspring_w;
6579 static void Ldynamite_1(int x, int y)
6581 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
6582 next[x][y] = Xdynamite_2;
6585 static void Ldynamite_2(int x, int y)
6587 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
6588 next[x][y] = Xdynamite_3;
6591 static void Ldynamite_3(int x, int y)
6593 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
6594 next[x][y] = Xdynamite_4;
6597 static void Ldynamite_4(int x, int y)
6599 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
6600 next[x][y] = Zdynamite;
6602 Lboom_generic(x, y, Xblank, Xblank);
6605 static void Lfake_door_1(int x, int y)
6607 if (lev.magnify_cnt)
6608 cave[x][y] = Xdoor_1;
6611 static void Lfake_door_2(int x, int y)
6613 if (lev.magnify_cnt)
6614 cave[x][y] = Xdoor_2;
6617 static void Lfake_door_3(int x, int y)
6619 if (lev.magnify_cnt)
6620 cave[x][y] = Xdoor_3;
6623 static void Lfake_door_4(int x, int y)
6625 if (lev.magnify_cnt)
6626 cave[x][y] = Xdoor_4;
6629 static void Lfake_door_5(int x, int y)
6631 if (lev.magnify_cnt)
6632 cave[x][y] = Xdoor_5;
6635 static void Lfake_door_6(int x, int y)
6637 if (lev.magnify_cnt)
6638 cave[x][y] = Xdoor_6;
6641 static void Lfake_door_7(int x, int y)
6643 if (lev.magnify_cnt)
6644 cave[x][y] = Xdoor_7;
6647 static void Lfake_door_8(int x, int y)
6649 if (lev.magnify_cnt)
6650 cave[x][y] = Xdoor_8;
6653 static void Lballoon(int x, int y)
6655 if (lev.wind_cnt == 0)
6658 switch (lev.wind_direction)
6661 switch (cave[x][y-1])
6674 cave[x][y] = Yballoon_nB;
6675 next[x][y] = Xblank;
6676 cave[x][y-1] = Yballoon_n;
6677 next[x][y-1] = Xballoon;
6688 cave[x][y] = Yballoon_nB;
6689 next[x][y] = Xblank;
6690 if (cave[x+1][y-2] == Xblank)
6691 cave[x+1][y-2] = Xsplash_e;
6692 if (cave[x-1][y-2] == Xblank)
6693 cave[x-1][y-2] = Xsplash_w;
6694 play_element_sound(x, y, SOUND_acid, Xacid_1);
6700 switch (cave[x+1][y])
6713 cave[x][y] = Yballoon_eB;
6714 next[x][y] = Xblank;
6715 cave[x+1][y] = Yballoon_e;
6716 next[x+1][y] = Xballoon;
6727 cave[x][y] = Yballoon_eB;
6728 next[x][y] = Xblank;
6729 if (cave[x+2][y-1] == Xblank)
6730 cave[x+2][y-1] = Xsplash_e;
6731 if (cave[x][y-1] == Xblank)
6732 cave[x][y-1] = Xsplash_w;
6733 play_element_sound(x, y, SOUND_acid, Xacid_1);
6739 switch (cave[x][y+1])
6752 cave[x][y] = Yballoon_sB;
6753 next[x][y] = Xblank;
6754 cave[x][y+1] = Yballoon_s;
6755 next[x][y+1] = Xballoon;
6766 cave[x][y] = Yballoon_sB;
6767 next[x][y] = Xblank;
6768 if (cave[x+1][y] == Xblank)
6769 cave[x+1][y] = Xsplash_e;
6770 if (cave[x-1][y] == Xblank)
6771 cave[x-1][y] = Xsplash_w;
6772 play_element_sound(x, y, SOUND_acid, Xacid_1);
6778 switch (cave[x-1][y])
6791 cave[x][y] = Yballoon_wB;
6792 next[x][y] = Xblank;
6793 cave[x-1][y] = Yballoon_w;
6794 next[x-1][y] = Xballoon;
6805 cave[x][y] = Yballoon_wB;
6806 next[x][y] = Xblank;
6807 if (cave[x][y-1] == Xblank)
6808 cave[x][y-1] = Xsplash_e;
6809 if (cave[x-2][y-1] == Xblank)
6810 cave[x-2][y-1] = Xsplash_w;
6811 play_element_sound(x, y, SOUND_acid, Xacid_1);
6818 static void Lball_common(int x, int y)
6820 play_element_sound(x, y, SOUND_ball, Xball_1);
6822 if (lev.ball_random)
6827 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6828 is_blank[cave[x-1][y-1]])
6830 cave[x-1][y-1] = Yball_blank;
6831 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6836 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6837 is_blank[cave[x][y-1]])
6839 cave[x][y-1] = Yball_blank;
6840 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6845 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6846 is_blank[cave[x+1][y-1]])
6848 cave[x+1][y-1] = Yball_blank;
6849 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6854 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6855 is_blank[cave[x-1][y]])
6857 cave[x-1][y] = Yball_blank;
6858 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6863 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6864 is_blank[cave[x+1][y]])
6866 cave[x+1][y] = Yball_blank;
6867 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6872 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6873 is_blank[cave[x-1][y+1]])
6875 cave[x-1][y+1] = Yball_blank;
6876 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6881 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6882 is_blank[cave[x][y+1]])
6884 cave[x][y+1] = Yball_blank;
6885 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6890 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6891 is_blank[cave[x+1][y+1]])
6893 cave[x+1][y+1] = Yball_blank;
6894 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6901 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6902 is_blank[cave[x-1][y-1]])
6904 cave[x-1][y-1] = Yball_blank;
6905 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6908 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6909 is_blank[cave[x][y-1]])
6911 cave[x][y-1] = Yball_blank;
6912 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6915 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6916 is_blank[cave[x+1][y-1]])
6918 cave[x+1][y-1] = Yball_blank;
6919 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6922 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6923 is_blank[cave[x-1][y]])
6925 cave[x-1][y] = Yball_blank;
6926 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6929 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6930 is_blank[cave[x+1][y]])
6932 cave[x+1][y] = Yball_blank;
6933 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6936 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6937 is_blank[cave[x-1][y+1]])
6939 cave[x-1][y+1] = Yball_blank;
6940 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6943 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6944 is_blank[cave[x][y+1]])
6946 cave[x][y+1] = Yball_blank;
6947 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6950 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6951 is_blank[cave[x+1][y+1]])
6953 cave[x+1][y+1] = Yball_blank;
6954 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6958 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
6961 static void Lball_1(int x, int y)
6963 if (!lev.ball_active)
6966 cave[x][y] = Yball_1;
6967 next[x][y] = Xball_2;
6974 static void Lball_2(int x, int y)
6976 if (!lev.ball_active)
6979 cave[x][y] = Yball_2;
6980 next[x][y] = Xball_1;
6987 static void Ldrip(int x, int y)
6989 next[x][y] = Xdrip_fall;
6992 static void Ldrip_fall(int x, int y)
6996 switch (cave[x][y+1])
7010 case Xfake_acid_1_player:
7011 case Xfake_acid_2_player:
7012 case Xfake_acid_3_player:
7013 case Xfake_acid_4_player:
7014 case Xfake_acid_5_player:
7015 case Xfake_acid_6_player:
7016 case Xfake_acid_7_player:
7017 case Xfake_acid_8_player:
7020 cave[x][y] = Ydrip_1_sB;
7021 next[x][y] = Xdrip_stretchB;
7022 cave[x][y+1] = Ydrip_1_s;
7023 next[x][y+1] = Xdrip_stretch;
7034 cave[x][y] = Ydrip_1_sB;
7035 next[x][y] = Xdrip_stretchB;
7036 if (cave[x+1][y] == Xblank)
7037 cave[x+1][y] = Xsplash_e;
7038 if (cave[x-1][y] == Xblank)
7039 cave[x-1][y] = Xsplash_w;
7040 play_element_sound(x, y, SOUND_acid, Xacid_1);
7046 case 0: temp = Xamoeba_1; break;
7047 case 1: temp = Xamoeba_2; break;
7048 case 2: temp = Xamoeba_3; break;
7049 case 3: temp = Xamoeba_4; break;
7050 case 4: temp = Xamoeba_5; break;
7051 case 5: temp = Xamoeba_6; break;
7052 case 6: temp = Xamoeba_7; break;
7053 case 7: temp = Xamoeba_8; break;
7058 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
7063 static void Ldrip_stretch(int x, int y)
7065 cave[x][y] = Ydrip_2_s;
7066 next[x][y] = Xdrip_fall;
7069 static void Ldrip_stretchB(int x, int y)
7071 cave[x][y] = Ydrip_2_sB;
7072 next[x][y] = Xblank;
7075 static void Lwonderwall(int x, int y)
7077 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7079 cave[x][y] = Ywonderwall;
7080 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
7084 static void Lwheel(int x, int y)
7086 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
7087 cave[x][y] = Ywheel;
7090 static void Lswitch(int x, int y)
7092 if (lev.ball_active)
7093 cave[x][y] = Yswitch;
7096 static void Lfake_blank(int x, int y)
7099 cave[x][y] = Yfake_blank;
7102 static void Lfake_grass(int x, int y)
7104 if (lev.magnify_cnt)
7105 cave[x][y] = Yfake_grass;
7108 static void Lfake_amoeba(int x, int y)
7111 cave[x][y] = Yfake_amoeba;
7114 static void Lsand_stone(int x, int y)
7116 switch (cave[x][y+1])
7129 cave[x][y] = Xsand_stonesand_quickout_1;
7130 next[x][y] = Xsand_stonesand_quickout_2;
7131 cave[x][y+1] = Xsand_stoneout_1;
7132 next[x][y+1] = Xsand_stoneout_2;
7143 cave[x][y] = Xsand_stonesand_quickout_1;
7144 next[x][y] = Xsand_stonesand_quickout_2;
7145 if (cave[x+1][y] == Xblank)
7146 cave[x+1][y] = Xsplash_e;
7147 if (cave[x-1][y] == Xblank)
7148 cave[x-1][y] = Xsplash_w;
7149 play_element_sound(x, y, SOUND_acid, Xacid_1);
7153 cave[x][y] = Xsand_stonesand_1;
7154 next[x][y] = Xsand_stonesand_2;
7155 cave[x][y+1] = Xsand_sandstone_1;
7156 next[x][y+1] = Xsand_sandstone_2;
7161 static void Lsand_stonein_1(int x, int y)
7163 next[x][y] = Xsand_stonein_2;
7166 static void Lsand_stonein_2(int x, int y)
7168 next[x][y] = Xsand_stonein_3;
7171 static void Lsand_stonein_3(int x, int y)
7173 next[x][y] = Xsand_stonein_4;
7176 static void Lsand_stonein_4(int x, int y)
7178 next[x][y] = Xblank;
7181 static void Lsand_sandstone_1(int x, int y)
7183 next[x][y] = Xsand_sandstone_2;
7186 static void Lsand_sandstone_2(int x, int y)
7188 next[x][y] = Xsand_sandstone_3;
7191 static void Lsand_sandstone_3(int x, int y)
7193 next[x][y] = Xsand_sandstone_4;
7196 static void Lsand_sandstone_4(int x, int y)
7198 next[x][y] = Xsand_stone;
7201 static void Lsand_stonesand_1(int x, int y)
7203 next[x][y] = Xsand_stonesand_2;
7206 static void Lsand_stonesand_2(int x, int y)
7208 next[x][y] = Xsand_stonesand_3;
7211 static void Lsand_stonesand_3(int x, int y)
7213 next[x][y] = Xsand_stonesand_4;
7216 static void Lsand_stonesand_4(int x, int y)
7221 static void Lsand_stoneout_1(int x, int y)
7223 next[x][y] = Xsand_stoneout_2;
7226 static void Lsand_stoneout_2(int x, int y)
7228 next[x][y] = Xstone_fall;
7231 static void Lsand_stonesand_quickout_1(int x, int y)
7233 next[x][y] = Xsand_stonesand_quickout_2;
7236 static void Lsand_stonesand_quickout_2(int x, int y)
7241 static void Lslide_ns(int x, int y)
7243 if (is_blank[cave[x][y-1]])
7245 cave[x][y-1] = Yslide_ns_blank;
7246 next[x][y-1] = Xslide_ns;
7247 play_element_sound(x, y, SOUND_slide, Xslide_ns);
7250 if (is_blank[cave[x][y+1]])
7252 cave[x][y+1] = Yslide_ns_blank;
7253 next[x][y+1] = Xslide_ns;
7254 play_element_sound(x, y, SOUND_slide, Xslide_ns);
7258 static void Lslide_ew(int x, int y)
7260 if (is_blank[cave[x+1][y]])
7262 cave[x+1][y] = Yslide_ew_blank;
7263 next[x+1][y] = Xslide_ew;
7264 play_element_sound(x, y, SOUND_slide, Xslide_ew);
7267 if (is_blank[cave[x-1][y]])
7269 cave[x-1][y] = Yslide_ew_blank;
7270 next[x-1][y] = Xslide_ew;
7271 play_element_sound(x, y, SOUND_slide, Xslide_ew);
7275 static void Lexit(int x, int y)
7277 if (lev.gems_needed > 0)
7280 switch (RANDOM(64) / 21)
7283 cave[x][y] = Xexit_1;
7284 next[x][y] = Xexit_2;
7288 cave[x][y] = Xexit_2;
7289 next[x][y] = Xexit_3;
7293 cave[x][y] = Xexit_3;
7294 next[x][y] = Xexit_1;
7298 play_element_sound(x, y, SOUND_exit_open, Xexit);
7301 static void Lexit_1(int x, int y)
7303 next[x][y] = Xexit_2;
7306 static void Lexit_2(int x, int y)
7308 next[x][y] = Xexit_3;
7311 static void Lexit_3(int x, int y)
7313 next[x][y] = Xexit_1;
7316 static void Lpause(int x, int y)
7318 next[x][y] = Xblank;
7321 static void Lamoeba(int x, int y)
7341 if (is_amoeba[cave[x][y-1]] ||
7342 is_amoeba[cave[x+1][y]] ||
7343 is_amoeba[cave[x][y+1]] ||
7344 is_amoeba[cave[x-1][y]])
7349 static void Lboom_one(int x, int y, boolean by_dynamite)
7410 cave[x][y] = Xboom_android;
7421 cave[x][y] = Xboom_bug;
7422 Lboom_bug_new(x, y, TRUE);
7428 cave[x][y] = Xboom_tank;
7429 Lboom_tank_new(x, y, TRUE);
7433 cave[x][y] = Xboom_1;
7438 static void Lboom_nine(int x, int y, boolean by_dynamite)
7440 Lboom_one(x, y-1, by_dynamite);
7441 Lboom_one(x-1, y, by_dynamite);
7442 Lboom_one(x+1, y, by_dynamite);
7443 Lboom_one(x, y+1, by_dynamite);
7444 Lboom_one(x-1, y-1, by_dynamite);
7445 Lboom_one(x+1, y-1, by_dynamite);
7446 Lboom_one(x-1, y+1, by_dynamite);
7447 Lboom_one(x+1, y+1, by_dynamite);
7449 cave[x][y] = Xboom_1;
7452 static void Lexplode(int x, int y)
7457 Lboom_bug_new(x, y, FALSE);
7458 Lboom_nine(x, y, FALSE);
7462 Lboom_tank_new(x, y, FALSE);
7463 Lboom_nine(x, y, FALSE);
7467 Lboom_eater_new(x, y, FALSE);
7468 Lboom_nine(x, y, FALSE);
7472 Lboom_nine(x, y, TRUE);
7476 Lboom_nine(x, y, FALSE);
7481 static void Lboom_1(int x, int y)
7483 next[x][y] = Xboom_2;
7484 #if !PLAY_ELEMENT_SOUND
7485 if (x != lev.exit_x && y != lev.exit_y)
7486 play_sound(x, y, SOUND_boom);
7488 lev.exit_x = lev.exit_y = -1;
7492 static void Lboom_2(int x, int y)
7494 next[x][y] = boom[x][y];
7497 static void Lboom_android(int x, int y)
7499 #if PLAY_ELEMENT_SOUND
7500 play_element_sound(x, y, SOUND_boom, Xandroid);
7506 static void Lchain(int x, int y)
7511 static void handle_tile(int x, int y)
7515 case Xacid_1: Lacid_1(x, y); break;
7516 case Xacid_2: Lacid_2(x, y); break;
7517 case Xacid_3: Lacid_3(x, y); break;
7518 case Xacid_4: Lacid_4(x, y); break;
7519 case Xacid_5: Lacid_5(x, y); break;
7520 case Xacid_6: Lacid_6(x, y); break;
7521 case Xacid_7: Lacid_7(x, y); break;
7522 case Xacid_8: Lacid_8(x, y); break;
7524 case Xfake_acid_1: Lfake_acid_1(x, y); break;
7525 case Xfake_acid_2: Lfake_acid_2(x, y); break;
7526 case Xfake_acid_3: Lfake_acid_3(x, y); break;
7527 case Xfake_acid_4: Lfake_acid_4(x, y); break;
7528 case Xfake_acid_5: Lfake_acid_5(x, y); break;
7529 case Xfake_acid_6: Lfake_acid_6(x, y); break;
7530 case Xfake_acid_7: Lfake_acid_7(x, y); break;
7531 case Xfake_acid_8: Lfake_acid_8(x, y); break;
7533 case Xandroid: Landroid(x, y); break;
7534 case Xandroid_1_n: Landroid_1_n(x, y); break;
7535 case Xandroid_2_n: Landroid_2_n(x, y); break;
7536 case Xandroid_1_e: Landroid_1_e(x, y); break;
7537 case Xandroid_2_e: Landroid_2_e(x, y); break;
7538 case Xandroid_1_s: Landroid_1_s(x, y); break;
7539 case Xandroid_2_s: Landroid_2_s(x, y); break;
7540 case Xandroid_1_w: Landroid_1_w(x, y); break;
7541 case Xandroid_2_w: Landroid_2_w(x, y); break;
7543 case Xeater_n: Leater_n(x, y); break;
7544 case Xeater_e: Leater_e(x, y); break;
7545 case Xeater_s: Leater_s(x, y); break;
7546 case Xeater_w: Leater_w(x, y); break;
7548 case Xalien: Lalien(x, y); break;
7549 case Xalien_pause: Lalien_pause(x, y); break;
7551 case Xbug_1_n: Lbug_1_n(x, y); break;
7552 case Xbug_2_n: Lbug_2_n(x, y); break;
7553 case Xbug_1_e: Lbug_1_e(x, y); break;
7554 case Xbug_2_e: Lbug_2_e(x, y); break;
7555 case Xbug_1_s: Lbug_1_s(x, y); break;
7556 case Xbug_2_s: Lbug_2_s(x, y); break;
7557 case Xbug_1_w: Lbug_1_w(x, y); break;
7558 case Xbug_2_w: Lbug_2_w(x, y); break;
7560 case Xtank_1_n: Ltank_1_n(x, y); break;
7561 case Xtank_2_n: Ltank_2_n(x, y); break;
7562 case Xtank_1_e: Ltank_1_e(x, y); break;
7563 case Xtank_2_e: Ltank_2_e(x, y); break;
7564 case Xtank_1_s: Ltank_1_s(x, y); break;
7565 case Xtank_2_s: Ltank_2_s(x, y); break;
7566 case Xtank_1_w: Ltank_1_w(x, y); break;
7567 case Xtank_2_w: Ltank_2_w(x, y); break;
7569 case Xemerald: Lemerald(x, y); break;
7570 case Xemerald_pause: Lemerald_pause(x, y); break;
7571 case Xemerald_fall: Lemerald_fall(x, y); break;
7573 case Xdiamond: Ldiamond(x, y); break;
7574 case Xdiamond_pause: Ldiamond_pause(x, y); break;
7575 case Xdiamond_fall: Ldiamond_fall(x, y); break;
7577 case Xstone: Lstone(x, y); break;
7578 case Xstone_pause: Lstone_pause(x, y); break;
7579 case Xstone_fall: Lstone_fall(x, y); break;
7581 case Xbomb: Lbomb(x, y); break;
7582 case Xbomb_pause: Lbomb_pause(x, y); break;
7583 case Xbomb_fall: Lbomb_fall(x, y); break;
7585 case Xnut: Lnut(x, y); break;
7586 case Xnut_pause: Lnut_pause(x, y); break;
7587 case Xnut_fall: Lnut_fall(x, y); break;
7589 case Xspring: Lspring(x, y); break;
7590 case Xspring_pause: Lspring_pause(x, y); break;
7591 case Xspring_e: Lspring_e(x, y); break;
7592 case Xspring_w: Lspring_w(x, y); break;
7593 case Xspring_fall: Lspring_fall(x, y); break;
7595 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
7596 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
7597 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
7598 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
7599 case Xpush_stone_e: Lpush_stone_e(x, y); break;
7600 case Xpush_stone_w: Lpush_stone_w(x, y); break;
7601 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
7602 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
7603 case Xpush_nut_e: Lpush_nut_e(x, y); break;
7604 case Xpush_nut_w: Lpush_nut_w(x, y); break;
7605 case Xpush_spring_e: Lpush_spring_e(x, y); break;
7606 case Xpush_spring_w: Lpush_spring_w(x, y); break;
7608 case Xdynamite_1: Ldynamite_1(x, y); break;
7609 case Xdynamite_2: Ldynamite_2(x, y); break;
7610 case Xdynamite_3: Ldynamite_3(x, y); break;
7611 case Xdynamite_4: Ldynamite_4(x, y); break;
7613 case Xfake_door_1: Lfake_door_1(x, y); break;
7614 case Xfake_door_2: Lfake_door_2(x, y); break;
7615 case Xfake_door_3: Lfake_door_3(x, y); break;
7616 case Xfake_door_4: Lfake_door_4(x, y); break;
7617 case Xfake_door_5: Lfake_door_5(x, y); break;
7618 case Xfake_door_6: Lfake_door_6(x, y); break;
7619 case Xfake_door_7: Lfake_door_7(x, y); break;
7620 case Xfake_door_8: Lfake_door_8(x, y); break;
7622 case Xballoon: Lballoon(x, y); break;
7624 case Xball_1: Lball_1(x, y); break;
7625 case Xball_2: Lball_2(x, y); break;
7627 case Xdrip: Ldrip(x, y); break;
7628 case Xdrip_fall: Ldrip_fall(x, y); break;
7629 case Xdrip_stretch: Ldrip_stretch(x, y); break;
7630 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
7632 case Xwonderwall: Lwonderwall(x, y); break;
7634 case Xwheel: Lwheel(x, y); break;
7636 case Xswitch: Lswitch(x, y); break;
7638 case Xfake_blank: Lfake_blank(x, y); break;
7639 case Xfake_grass: Lfake_grass(x, y); break;
7640 case Xfake_amoeba: Lfake_amoeba(x, y); break;
7642 case Xsand_stone: Lsand_stone(x, y); break;
7643 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
7644 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
7645 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
7646 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
7647 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
7648 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
7649 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
7650 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
7651 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
7652 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
7653 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
7654 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
7655 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
7656 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
7657 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
7658 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
7660 case Xslide_ns: Lslide_ns(x, y); break;
7661 case Xslide_ew: Lslide_ew(x, y); break;
7663 case Xexit: Lexit(x, y); break;
7664 case Xexit_1: Lexit_1(x, y); break;
7665 case Xexit_2: Lexit_2(x, y); break;
7666 case Xexit_3: Lexit_3(x, y); break;
7668 case Xpause: Lpause(x, y); break;
7670 case Xchain: Lchain(x, y); break;
7671 case Xboom_bug: Lboom_bug(x, y); break;
7672 case Xboom_tank: Lboom_tank(x, y); break;
7673 case Xboom_android: Lboom_android(x, y); break;
7674 case Xboom_1: Lboom_1(x, y); break;
7675 case Xboom_2: Lboom_2(x, y); break;
7679 boolean logic_check_wrap(void)
7683 for (i = 0; i < MAX_PLAYERS; i++)
7688 /* check for wrap-around movement */
7689 if (ply[i].x < lev.left ||
7690 ply[i].x > lev.right - 1)
7697 void logic_move(void)
7701 for (i = 0; i < MAX_PLAYERS; i++)
7706 /* check for wrap-around movement */
7707 if (ply[i].x < lev.left ||
7708 ply[i].x > lev.right - 1)
7710 ply[i].x = (ply[i].x < lev.left ? lev.right - 1 : lev.left);
7712 if (!lev.infinite_true)
7713 ply[i].y += (ply[i].x == lev.left ? 1 : -1);
7715 game.centered_player_nr_next = i;
7716 game.set_centered_player = TRUE;
7717 game.set_centered_player_wrap = TRUE;
7720 ply[i].prev_x = ply[i].x;
7721 ply[i].prev_y = ply[i].y;
7722 ply[i].anim = PLY_still;
7726 static void logic_players(void)
7735 game_em.any_player_moving = FALSE;
7736 game_em.any_player_snapping = FALSE;
7738 /* must test for death and actually kill separately */
7739 for (i = 0; i < MAX_PLAYERS; i++)
7741 boolean ply_kill = player_killed(&ply[i]);
7743 if (ply[i].alive && ply_kill)
7744 kill_player(&ply[i]);
7749 start_check_nr = ((game_em.random & 128 ? 0 : 1) * 2 +
7750 (game_em.random & 256 ? 0 : 1));
7752 for (i = 0; i < MAX_PLAYERS; i++)
7754 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
7756 if (ply[check_nr].alive)
7757 check_player(&ply[check_nr]);
7760 for (i = 0; i < MAX_PLAYERS; i++)
7765 if (is_player[cave[ply[i].prev_x][ply[i].prev_y]])
7767 int element = cave[ply[i].prev_x][ply[i].prev_y];
7769 cave[ply[i].prev_x][ply[i].prev_y] = remove_player[element];
7770 next[ply[i].prev_x][ply[i].prev_y] = remove_player[element];
7773 if (is_blank[cave[ply[i].x][ply[i].y]])
7775 int element = cave[ply[i].x][ply[i].y];
7777 cave[ply[i].x][ply[i].y] = add_player[element];
7778 next[ply[i].x][ply[i].y] = add_player[element];
7783 static void logic_objects(void)
7791 seed = game_em.random;
7794 for (y = lev.top; y < lev.bottom; y++)
7795 for (x = lev.left; x < lev.right; x++)
7798 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
7799 lev.score += score; /* only add a score if someone is alive */
7801 game_em.game_over = TRUE;
7803 game_em.random = seed;
7805 /* triple buffering */
7806 void *temp = lev.cave;
7807 lev.cave = lev.next;
7808 lev.next = lev.draw;
7812 static void logic_globals(void)
7827 /* update variables */
7829 if (lev.score > 9999)
7832 if (lev.android_move_cnt-- == 0)
7833 lev.android_move_cnt = lev.android_move_time;
7834 if (lev.android_clone_cnt-- == 0)
7835 lev.android_clone_cnt = lev.android_clone_time;
7836 if (lev.ball_active)
7837 if (lev.ball_cnt-- == 0)
7838 lev.ball_cnt = lev.ball_time;
7841 if (lev.magnify_cnt)
7847 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7848 lev.wonderwall_time--;
7851 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
7855 random = game_em.random;
7857 for (count = lev.amoeba_time; count--;)
7859 x = lev.left - 1 + (random >> 10) % (CAVE_WIDTH + 2);
7860 y = lev.top - 1 + (random >> 20) % (CAVE_HEIGHT + 2);
7862 if (x >= lev.left && x < lev.right &&
7863 y >= lev.top && y < lev.bottom)
7866 random = random * 129 + 1;
7869 if (!game_em.use_random_bug)
7870 random = (uint32_t)random;
7874 game_em.random = random;
7876 /* handle explosions */
7878 for (y = lev.top; y < lev.bottom; y++)
7879 for (x = lev.left; x < lev.right; x++)
7882 /* triple buffering */
7884 for (y = lev.top; y < lev.bottom; y++)
7885 for (x = lev.left; x < lev.right; x++)
7886 next[x][y] = cave[x][y];
7889 void logic_init(void)
7891 int splash_is_blank = !game_em.use_old_android;
7893 is_android_blank[Xsplash_e] = splash_is_blank;
7894 is_android_blank[Xsplash_w] = splash_is_blank;