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(x) ((seed = seed << 31 | seed >> 1) % x)
17 static short **cave, **next, **boom;
18 static unsigned int seed;
21 static const byte is_blank[GAME_TILE_MAX] =
36 static const byte is_blank_or_acid[GAME_TILE_MAX] =
59 static const byte is_fake_acid[GAME_TILE_MAX] =
71 static const byte is_amoeba[GAME_TILE_MAX] =
85 static const byte is_android_walkable[GAME_TILE_MAX] =
101 static void Lboom_generic(int x, int y, int element, int element_middle)
103 boom[x-1][y-1] = element;
104 boom[x][y-1] = element;
105 boom[x+1][y-1] = element;
106 boom[x-1][y] = element;
107 boom[x][y] = element_middle;
108 boom[x+1][y] = element;
109 boom[x-1][y+1] = element;
110 boom[x][y+1] = element;
111 boom[x+1][y+1] = element;
114 static void Lboom_bug(int x, int y)
116 if (game_em.use_old_explosions)
119 Lboom_generic(x, y, Xemerald, Xdiamond);
121 #if PLAY_ELEMENT_SOUND
122 play_element_sound(x, y, SOUND_boom, Xbug_1_n);
126 static void Lboom_tank(int x, int y)
128 if (game_em.use_old_explosions)
131 Lboom_generic(x, y, Xblank, Xblank);
133 #if PLAY_ELEMENT_SOUND
134 play_element_sound(x, y, SOUND_boom, Xtank_1_n);
138 static void Lboom_eater(int x, int y)
140 if (game_em.use_old_explosions)
143 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
144 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
145 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
146 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
147 boom[x][y] = lev.eater_array[lev.eater_pos][4];
148 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
149 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
150 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
151 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
153 lev.eater_pos = (lev.eater_pos + 1) % 8;
155 #if PLAY_ELEMENT_SOUND
156 play_element_sound(x, y, SOUND_boom, Xeater_n);
160 static void Lboom_bug_old(int x, int y)
162 if (!game_em.use_old_explosions)
168 static void Lboom_tank_old(int x, int y)
170 if (!game_em.use_old_explosions)
176 static void Lboom_eater_old(int x, int y)
178 if (!game_em.use_old_explosions)
184 static void Lboom_bug_new(int x, int y, boolean chain_explosion)
186 if (game_em.use_old_explosions)
195 static void Lboom_tank_new(int x, int y, boolean chain_explosion)
197 if (game_em.use_old_explosions)
206 static void Lboom_eater_new(int x, int y, boolean chain_explosion)
208 if (game_em.use_old_explosions)
217 static void Lboom_cave_new(int x, int y, int element)
219 if (game_em.use_old_explosions)
222 cave[x][y] = element;
225 static void Lboom_next_new(int x, int y, int element)
227 if (game_em.use_old_explosions)
230 next[x][y] = element;
233 static boolean player_killed(struct PLAYER *ply)
241 if (lev.killed_out_of_time && setup.time_limit)
244 switch (cave[x][y-1])
265 switch (cave[x+1][y])
286 switch (cave[x][y+1])
307 switch (cave[x-1][y])
352 static void kill_player(struct PLAYER *ply)
359 switch (cave[x][y-1])
369 cave[x][y-1] = Xboom_bug;
370 Lboom_bug_new(x, y-1, TRUE);
381 cave[x][y-1] = Xboom_tank;
382 Lboom_tank_new(x, y-1, TRUE);
386 switch (cave[x+1][y])
396 cave[x+1][y] = Xboom_bug;
397 Lboom_bug_new(x+1, y, TRUE);
408 cave[x+1][y] = Xboom_tank;
409 Lboom_tank_new(x+1, y, TRUE);
413 switch (cave[x][y+1])
423 cave[x][y+1] = Xboom_bug;
424 Lboom_bug_new(x, y+1, TRUE);
435 cave[x][y+1] = Xboom_tank;
436 Lboom_tank_new(x, y+1, TRUE);
440 switch (cave[x-1][y])
450 cave[x-1][y] = Xboom_bug;
451 Lboom_bug_new(x-1, y, TRUE);
462 cave[x-1][y] = Xboom_tank;
463 Lboom_tank_new(x-1, y, TRUE);
474 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
478 play_element_sound(x, y, SOUND_die, Zplayer);
497 cave[x][y] = Xboom_1;
503 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
505 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
510 boolean result = TRUE;
512 if (!dx && !dy) /* no direction specified */
515 if (dx && dy && ply->joy_snap) /* more than one direction specified */
518 if (!ply->joy_snap) /* player wants to move */
520 int element = cave[x][y];
524 /* fire is released */
528 cave[x][y] = Zplayer;
529 next[x][y] = Zplayer;
540 play_element_sound(x, y, SOUND_blank, Xblank);
541 ply->anim = PLY_walk_n + anim;
555 if (cave[x+1][y-1] == Xblank)
556 cave[x+1][y-1] = Xsplash_e;
557 if (cave[x-1][y-1] == Xblank)
558 cave[x-1][y-1] = Xsplash_w;
559 play_element_sound(x, y, SOUND_acid, Xacid_1);
580 ply->anim = PLY_walk_n + anim;
586 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
587 (dx > 0 ? Ygrass_eB : Ygrass_wB));
588 next[x][y] = Zplayer;
589 play_element_sound(x, y, SOUND_dirt, Xgrass);
590 ply->anim = PLY_walk_n + anim;
596 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
597 (dx > 0 ? Ydirt_eB : Ydirt_wB));
598 next[x][y] = Zplayer;
599 play_element_sound(x, y, SOUND_dirt, Xdirt);
600 ply->anim = PLY_walk_n + anim;
607 cave[x][y] = Ydiamond_blank;
608 next[x][y] = Zplayer;
609 play_element_sound(x, y, SOUND_collect, element);
610 lev.score += lev.diamond_score;
611 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
612 game.snapshot.collected_item = TRUE;
613 ply->anim = PLY_walk_n + anim;
620 cave[x][y] = Yemerald_blank;
621 next[x][y] = Zplayer;
622 play_element_sound(x, y, SOUND_collect, element);
623 lev.score += lev.emerald_score;
624 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
625 game.snapshot.collected_item = TRUE;
626 ply->anim = PLY_walk_n + anim;
632 cave[x][y] = Ydynamite_blank;
633 next[x][y] = Zplayer;
634 play_element_sound(x, y, SOUND_collect, element);
635 lev.score += lev.dynamite_score;
636 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
637 ply->anim = PLY_walk_n + anim;
644 cave[x][y] = Ykey_1_blank;
649 cave[x][y] = Ykey_2_blank;
654 cave[x][y] = Ykey_3_blank;
659 cave[x][y] = Ykey_4_blank;
664 cave[x][y] = Ykey_5_blank;
669 cave[x][y] = Ykey_6_blank;
674 cave[x][y] = Ykey_7_blank;
679 cave[x][y] = Ykey_8_blank;
684 next[x][y] = Zplayer;
685 play_element_sound(x, y, SOUND_collect, element);
686 lev.score += lev.key_score;
687 ply->anim = PLY_walk_n + anim;
693 cave[x][y] = Ylenses_blank;
694 next[x][y] = Zplayer;
695 play_element_sound(x, y, SOUND_collect, element);
696 lev.score += lev.lenses_score;
697 lev.lenses_cnt = lev.lenses_time;
698 ply->anim = PLY_walk_n + anim;
704 cave[x][y] = Ymagnify_blank;
705 next[x][y] = Zplayer;
706 play_element_sound(x, y, SOUND_collect, element);
707 lev.score += lev.magnify_score;
708 lev.magnify_cnt = lev.magnify_time;
709 ply->anim = PLY_walk_n + anim;
718 switch (cave[x+dx][y])
731 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
732 next[x+dx][y] = Xstone_pause;
743 if (cave[x+dx+1][y-1] == Xblank)
744 cave[x+dx+1][y-1] = Xsplash_e;
745 if (cave[x+dx-1][y-1] == Xblank)
746 cave[x+dx-1][y-1] = Xsplash_w;
747 play_element_sound(x, y, SOUND_acid, Xacid_1);
751 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
752 next[x][y] = Zplayer;
753 play_element_sound(x, y, SOUND_roll, Xstone);
758 ply->anim = PLY_push_n + anim;
765 switch (cave[x+dx][y])
778 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
779 next[x+dx][y] = Xbomb_pause;
790 if (cave[x+dx+1][y-1] == Xblank)
791 cave[x+dx+1][y-1] = Xsplash_e;
792 if (cave[x+dx-1][y-1] == Xblank)
793 cave[x+dx-1][y-1] = Xsplash_w;
794 play_element_sound(x, y, SOUND_acid, Xacid_1);
798 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
799 next[x][y] = Zplayer;
800 play_element_sound(x, y, SOUND_roll, Xbomb);
805 ply->anim = PLY_push_n + anim;
812 switch (cave[x+dx][y])
825 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
826 next[x+dx][y] = Xnut_pause;
837 if (cave[x+dx+1][y-1] == Xblank)
838 cave[x+dx+1][y-1] = Xsplash_e;
839 if (cave[x+dx-1][y-1] == Xblank)
840 cave[x+dx-1][y-1] = Xsplash_w;
841 play_element_sound(x, y, SOUND_acid, Xacid_1);
845 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
846 next[x][y] = Zplayer;
847 play_element_sound(x, y, SOUND_roll, Xnut);
852 ply->anim = PLY_push_n + anim;
859 switch (cave[x+dx][y])
872 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
873 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
884 if (cave[x+dx+1][y-1] == Xblank)
885 cave[x+dx+1][y-1] = Xsplash_e;
886 if (cave[x+dx-1][y-1] == Xblank)
887 cave[x+dx-1][y-1] = Xsplash_w;
888 play_element_sound(x, y, SOUND_acid, Xacid_1);
892 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
893 next[x][y] = Zplayer;
894 play_element_sound(x, y, SOUND_roll, Xspring);
900 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
901 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
902 next[x][y] = Zplayer;
903 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
904 play_element_sound(x, y, SOUND_slurp, Xalien);
905 lev.score += lev.slurp_score;
910 ply->anim = PLY_push_n + anim;
917 case Xsand_stonein_1:
918 case Xsand_stonein_2:
919 case Xsand_stonein_3:
920 case Xsand_stonein_4:
924 ply->anim = PLY_push_n + anim;
928 switch (cave[x+dx][y+dy])
941 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
942 (dx > 0 ? Yballoon_e : Yballoon_w));
943 next[x+dx][y+dy] = Xballoon;
954 if (cave[x+dx+1][y+dy-1] == Xblank)
955 cave[x+dx+1][y+dy-1] = Xsplash_e;
956 if (cave[x+dx-1][y+dy-1] == Xblank)
957 cave[x+dx-1][y+dy-1] = Xsplash_w;
958 play_element_sound(x, y, SOUND_acid, Xacid_1);
962 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
963 (dx > 0 ? Yballoon_eB : Yballoon_wB));
964 next[x][y] = Zplayer;
965 play_element_sound(x, y, SOUND_push, Xballoon);
971 ply->anim = PLY_push_n + anim;
983 switch (cave[x+dx][y+dy])
996 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
997 (dx > 0 ? Yandroid_e : Yandroid_w));
998 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
999 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1010 if (cave[x+dx+1][y+dy-1] == Xblank)
1011 cave[x+dx+1][y+dy-1] = Xsplash_e;
1012 if (cave[x+dx-1][y+dy-1] == Xblank)
1013 cave[x+dx-1][y+dy-1] = Xsplash_w;
1014 play_element_sound(x, y, SOUND_acid, Xacid_1);
1018 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1019 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1020 next[x][y] = Zplayer;
1021 play_element_sound(x, y, SOUND_push, Xandroid);
1027 ply->anim = PLY_push_n + anim;
1032 if (ply->keys & 0x01)
1039 if (ply->keys & 0x02)
1046 if (ply->keys & 0x04)
1053 if (ply->keys & 0x08)
1060 if (ply->keys & 0x10)
1067 if (ply->keys & 0x20)
1074 if (ply->keys & 0x40)
1081 if (ply->keys & 0x80)
1088 if (!is_blank[cave[x+dx][y+dy]])
1091 if (!is_fake_acid[cave[x+dx][y+dy]])
1093 cave[x+dx][y+dy] = Zplayer;
1094 next[x+dx][y+dy] = Zplayer;
1097 play_element_sound(x, y, SOUND_door, element);
1098 ply->anim = PLY_walk_n + anim;
1104 play_element_sound(x, y, SOUND_press, element);
1105 lev.wheel_cnt = lev.wheel_time;
1111 lev.wind_direction = 0;
1115 lev.wind_direction = 1;
1119 lev.wind_direction = 2;
1123 lev.wind_direction = 3;
1127 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1132 play_element_sound(x, y, SOUND_press, element);
1133 lev.wind_cnt = lev.wind_time;
1137 play_element_sound(x, y, SOUND_press, element);
1142 play_element_sound(x, y, SOUND_press, element);
1143 lev.ball_cnt = lev.ball_time;
1144 lev.ball_active = !lev.ball_active;
1148 cave[x][y] = Yplant;
1149 next[x][y] = Xplant;
1150 play_element_sound(x, y, SOUND_blank, Xplant);
1151 ply->anim = PLY_walk_n + anim;
1162 game_em.level_solved = TRUE;
1164 ply->anim = PLY_walk_n + anim;
1171 if (ply->x == oldx && ply->y == oldy) /* no movement */
1174 else /* player wants to snap */
1176 int element = cave[x][y];
1180 /* fire is pressed */
1183 cave[x][y] = Ygrass_blank;
1184 next[x][y] = Xblank;
1185 play_element_sound(x, y, SOUND_dirt, element);
1186 ply->anim = PLY_shoot_n + anim;
1190 cave[x][y] = Ydirt_blank;
1191 next[x][y] = Xblank;
1192 play_element_sound(x, y, SOUND_dirt, element);
1193 ply->anim = PLY_shoot_n + anim;
1197 case Xdiamond_pause:
1198 cave[x][y] = Ydiamond_blank;
1199 next[x][y] = Xblank;
1200 play_element_sound(x, y, SOUND_collect, element);
1201 lev.score += lev.diamond_score;
1202 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
1203 game.snapshot.collected_item = TRUE;
1204 ply->anim = PLY_walk_n + anim;
1208 case Xemerald_pause:
1209 cave[x][y] = Yemerald_blank;
1210 next[x][y] = Xblank;
1211 play_element_sound(x, y, SOUND_collect, element);
1212 lev.score += lev.emerald_score;
1213 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
1214 game.snapshot.collected_item = TRUE;
1215 ply->anim = PLY_walk_n + anim;
1219 cave[x][y] = Ydynamite_blank;
1220 next[x][y] = Xblank;
1221 play_element_sound(x, y, SOUND_collect, element);
1222 lev.score += lev.dynamite_score;
1223 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1224 ply->anim = PLY_walk_n + anim;
1229 cave[x][y] = Ykey_1_blank;
1234 cave[x][y] = Ykey_2_blank;
1239 cave[x][y] = Ykey_3_blank;
1244 cave[x][y] = Ykey_4_blank;
1249 cave[x][y] = Ykey_5_blank;
1254 cave[x][y] = Ykey_6_blank;
1259 cave[x][y] = Ykey_7_blank;
1264 cave[x][y] = Ykey_8_blank;
1269 next[x][y] = Xblank;
1270 play_element_sound(x, y, SOUND_collect, element);
1271 lev.score += lev.key_score;
1272 ply->anim = PLY_walk_n + anim;
1276 cave[x][y] = Ylenses_blank;
1277 next[x][y] = Xblank;
1278 play_element_sound(x, y, SOUND_collect, element);
1279 lev.score += lev.lenses_score;
1280 lev.lenses_cnt = lev.lenses_time;
1281 ply->anim = PLY_walk_n + anim;
1285 cave[x][y] = Ymagnify_blank;
1286 next[x][y] = Xblank;
1287 play_element_sound(x, y, SOUND_collect, element);
1288 lev.score += lev.magnify_score;
1289 lev.magnify_cnt = lev.magnify_time;
1290 ply->anim = PLY_walk_n + anim;
1298 /* check for wrap-around movement */
1299 if (ply->x < lev.left ||
1300 ply->x > lev.right - 1)
1301 play_element_sound(oldx, oldy, SOUND_door, Xdoor_1);
1306 static void check_player(struct PLAYER *ply)
1314 game_em.last_player_direction[ply->num] = MV_NONE;
1316 if (ply->joy_w) /* west */
1321 else if (ply->joy_e) /* east */
1327 if (ply->joy_n) /* north */
1332 else if (ply->joy_s) /* south */
1344 boolean players_visible_before_move;
1345 boolean players_visible_after_move;
1348 players_visible_before_move = checkIfAllPlayersFitToScreen();
1353 players_visible_after_move = checkIfAllPlayersFitToScreen();
1356 player is allowed to move only in the following cases:
1357 - it is not needed to display all players (not focussed to all players)
1358 - all players are (still or again) visible after the move
1359 - some players were already outside visible screen area before the move
1361 can_move = (game.centered_player_nr != -1 ||
1362 players_visible_after_move ||
1363 !players_visible_before_move);
1379 if (dx == 0 && dy == 0)
1381 ply->joy_stick = FALSE;
1385 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1387 cave[x][y] = Xdynamite_1;
1388 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1394 ply->dynamite_cnt = 0;
1397 /* be a bit more random if the player doesn't move */
1398 game_em.random += 7;
1403 ply->joy_stick = TRUE;
1409 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1411 if (!ply->joy_snap) /* player wants to move */
1413 boolean moved = FALSE;
1415 if (ply->last_move_dir & MV_HORIZONTAL)
1417 if (!(moved = player_digfield(ply, 0, dy)))
1418 moved = player_digfield(ply, dx, 0);
1422 if (!(moved = player_digfield(ply, dx, 0)))
1423 moved = player_digfield(ply, 0, dy);
1429 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1430 else if (oldy != ply->y)
1431 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1433 game_em.any_player_moving = TRUE;
1434 game_em.last_moving_player = ply->num;
1435 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1438 else /* player wants to snap */
1440 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1444 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1446 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1449 /* default values if no players are alive anymore */
1453 for (i = 0; i < MAX_PLAYERS; i++)
1458 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1460 if (distance < distance_shortest)
1465 distance_shortest = distance;
1470 static void Lacid_1(int x, int y)
1472 next[x][y] = Xacid_2;
1475 static void Lacid_2(int x, int y)
1477 next[x][y] = Xacid_3;
1480 static void Lacid_3(int x, int y)
1482 next[x][y] = Xacid_4;
1485 static void Lacid_4(int x, int y)
1487 next[x][y] = Xacid_5;
1490 static void Lacid_5(int x, int y)
1492 next[x][y] = Xacid_6;
1495 static void Lacid_6(int x, int y)
1497 next[x][y] = Xacid_7;
1500 static void Lacid_7(int x, int y)
1502 next[x][y] = Xacid_8;
1505 static void Lacid_8(int x, int y)
1507 next[x][y] = Xacid_1;
1510 static void Lfake_acid_1(int x, int y)
1512 next[x][y] = Xfake_acid_2;
1515 static void Lfake_acid_2(int x, int y)
1517 next[x][y] = Xfake_acid_3;
1520 static void Lfake_acid_3(int x, int y)
1522 next[x][y] = Xfake_acid_4;
1525 static void Lfake_acid_4(int x, int y)
1527 next[x][y] = Xfake_acid_5;
1530 static void Lfake_acid_5(int x, int y)
1532 next[x][y] = Xfake_acid_6;
1535 static void Lfake_acid_6(int x, int y)
1537 next[x][y] = Xfake_acid_7;
1540 static void Lfake_acid_7(int x, int y)
1542 next[x][y] = Xfake_acid_8;
1545 static void Lfake_acid_8(int x, int y)
1547 next[x][y] = Xfake_acid_1;
1550 static void Landroid(int x, int y)
1554 if (lev.android_clone_cnt == 0)
1556 if (!is_blank[cave[x-1][y-1]] &&
1557 !is_blank[cave[x][y-1]] &&
1558 !is_blank[cave[x+1][y-1]] &&
1559 !is_blank[cave[x-1][y]] &&
1560 !is_blank[cave[x+1][y]] &&
1561 !is_blank[cave[x-1][y+1]] &&
1562 !is_blank[cave[x][y+1]] &&
1563 !is_blank[cave[x+1][y+1]])
1568 /* randomly find an object to clone */
1570 case 0: /* S,NE,W,NW,SE,E,SW,N */
1571 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1572 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1573 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1574 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1575 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1576 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1577 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1578 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1581 case 1: /* NW,SE,N,S,NE,SW,E,W */
1582 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1583 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1584 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1585 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1586 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1587 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1588 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1589 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1592 case 2: /* SW,E,S,W,N,NW,SE,NE */
1593 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1594 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1595 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1596 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1597 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1598 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1599 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1600 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1603 case 3: /* N,SE,NE,E,W,S,NW,SW */
1604 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1605 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1606 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1607 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1608 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1609 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1610 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1611 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1614 case 4: /* SE,NW,E,NE,SW,W,N,S */
1615 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1616 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1617 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1618 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1619 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1620 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1621 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1622 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1625 case 5: /* NE,W,SE,SW,S,N,E,NW */
1626 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1627 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1628 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1629 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1630 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1631 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1632 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1633 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1636 case 6: /* E,N,SW,S,NW,NE,SE,W */
1637 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1638 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1639 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1640 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1641 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1642 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1643 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1644 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1647 case 7: /* W,SW,NW,N,E,SE,NE,S */
1648 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1649 temp = lev.android_array[cave[x-1][y+1]]; 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;
1652 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1653 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1654 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1655 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1659 next[x][y] = temp; /* the item we chose to clone */
1660 play_element_sound(x, y, SOUND_android_clone, temp);
1664 /* randomly find a direction to move */
1666 case 0: /* S,NE,W,NW,SE,E,SW,N */
1667 if (is_blank[cave[x][y+1]]) goto android_s;
1668 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1669 if (is_blank[cave[x-1][y]]) goto android_w;
1670 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1671 if (is_blank[cave[x+1][y+1]]) goto android_se;
1672 if (is_blank[cave[x+1][y]]) goto android_e;
1673 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1674 if (is_blank[cave[x][y-1]]) goto android_n;
1677 case 1: /* NW,SE,N,S,NE,SW,E,W */
1678 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1679 if (is_blank[cave[x+1][y+1]]) goto android_se;
1680 if (is_blank[cave[x][y-1]]) goto android_n;
1681 if (is_blank[cave[x][y+1]]) goto android_s;
1682 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1683 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1684 if (is_blank[cave[x+1][y]]) goto android_e;
1685 if (is_blank[cave[x-1][y]]) goto android_w;
1688 case 2: /* SW,E,S,W,N,NW,SE,NE */
1689 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1690 if (is_blank[cave[x+1][y]]) goto android_e;
1691 if (is_blank[cave[x][y+1]]) goto android_s;
1692 if (is_blank[cave[x-1][y]]) goto android_w;
1693 if (is_blank[cave[x][y-1]]) goto android_n;
1694 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1695 if (is_blank[cave[x+1][y+1]]) goto android_se;
1696 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1699 case 3: /* N,SE,NE,E,W,S,NW,SW */
1700 if (is_blank[cave[x][y-1]]) goto android_n;
1701 if (is_blank[cave[x+1][y+1]]) goto android_se;
1702 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1703 if (is_blank[cave[x+1][y]]) goto android_e;
1704 if (is_blank[cave[x-1][y]]) goto android_w;
1705 if (is_blank[cave[x][y+1]]) goto android_s;
1706 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1707 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1710 case 4: /* SE,NW,E,NE,SW,W,N,S */
1711 if (is_blank[cave[x+1][y+1]]) goto android_se;
1712 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1713 if (is_blank[cave[x+1][y]]) goto android_e;
1714 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1715 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1716 if (is_blank[cave[x-1][y]]) goto android_w;
1717 if (is_blank[cave[x][y-1]]) goto android_n;
1718 if (is_blank[cave[x][y+1]]) goto android_s;
1721 case 5: /* NE,W,SE,SW,S,N,E,NW */
1722 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1723 if (is_blank[cave[x-1][y]]) goto android_w;
1724 if (is_blank[cave[x+1][y+1]]) goto android_se;
1725 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1726 if (is_blank[cave[x][y+1]]) goto android_s;
1727 if (is_blank[cave[x][y-1]]) goto android_n;
1728 if (is_blank[cave[x+1][y]]) goto android_e;
1729 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1732 case 6: /* E,N,SW,S,NW,NE,SE,W */
1733 if (is_blank[cave[x+1][y]]) goto android_e;
1734 if (is_blank[cave[x][y-1]]) goto android_n;
1735 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1736 if (is_blank[cave[x][y+1]]) goto android_s;
1737 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1738 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1739 if (is_blank[cave[x+1][y+1]]) goto android_se;
1740 if (is_blank[cave[x-1][y]]) goto android_w;
1743 case 7: /* W,SW,NW,N,E,SE,NE,S */
1744 if (is_blank[cave[x-1][y]]) goto android_w;
1745 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1746 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1747 if (is_blank[cave[x][y-1]]) goto android_n;
1748 if (is_blank[cave[x+1][y]]) goto android_e;
1749 if (is_blank[cave[x+1][y+1]]) goto android_se;
1750 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1751 if (is_blank[cave[x][y+1]]) goto android_s;
1757 if (lev.android_move_cnt == 0)
1759 if (cave[x-1][y-1] == Zplayer ||
1760 cave[x][y-1] == Zplayer ||
1761 cave[x+1][y-1] == Zplayer ||
1762 cave[x-1][y] == Zplayer ||
1763 cave[x+1][y] == Zplayer ||
1764 cave[x-1][y+1] == Zplayer ||
1765 cave[x][y+1] == Zplayer ||
1766 cave[x+1][y+1] == Zplayer)
1769 set_nearest_player_xy(x, y, &dx, &dy);
1771 next[x][y] = Xblank; /* assume we will move */
1772 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1778 /* attempt clockwise move first if direct path is blocked */
1780 case 0: /* north west */
1781 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1782 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1783 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1787 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1788 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1789 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1792 case 2: /* north east */
1793 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1794 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1795 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1799 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1800 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1801 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1804 case 4: /* nowhere */
1808 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1809 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1810 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1813 case 6: /* south west */
1814 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1815 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1816 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1820 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1821 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1822 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1825 case 8: /* south east */
1826 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1827 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1828 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1836 /* attempt counterclockwise move first if direct path is blocked */
1838 case 0: /* north west */
1839 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1840 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1841 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1845 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1846 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1847 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1850 case 2: /* north east */
1851 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1852 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1853 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1857 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1858 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1859 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1862 case 4: /* nowhere */
1866 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1867 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1868 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1871 case 6: /* south west */
1872 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1873 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1874 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1878 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1879 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1880 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1883 case 8: /* south east */
1884 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1885 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1886 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1893 next[x][y] = Xandroid;
1897 cave[x][y] = Yandroid_nB;
1898 cave[x][y-1] = Yandroid_n;
1899 next[x][y-1] = Xandroid;
1900 play_element_sound(x, y, SOUND_android_move, Xandroid);
1904 cave[x][y] = Yandroid_neB;
1905 cave[x+1][y-1] = Yandroid_ne;
1906 next[x+1][y-1] = Xandroid;
1907 play_element_sound(x, y, SOUND_android_move, Xandroid);
1911 cave[x][y] = Yandroid_eB;
1912 cave[x+1][y] = Yandroid_e;
1913 next[x+1][y] = Xandroid;
1914 play_element_sound(x, y, SOUND_android_move, Xandroid);
1918 cave[x][y] = Yandroid_seB;
1919 cave[x+1][y+1] = Yandroid_se;
1920 next[x+1][y+1] = Xandroid;
1921 play_element_sound(x, y, SOUND_android_move, Xandroid);
1925 cave[x][y] = Yandroid_sB;
1926 cave[x][y+1] = Yandroid_s;
1927 next[x][y+1] = Xandroid;
1928 play_element_sound(x, y, SOUND_android_move, Xandroid);
1932 cave[x][y] = Yandroid_swB;
1933 cave[x-1][y+1] = Yandroid_sw;
1934 next[x-1][y+1] = Xandroid;
1935 play_element_sound(x, y, SOUND_android_move, Xandroid);
1939 cave[x][y] = Yandroid_wB;
1940 cave[x-1][y] = Yandroid_w;
1941 next[x-1][y] = Xandroid;
1942 play_element_sound(x, y, SOUND_android_move, Xandroid);
1946 cave[x][y] = Yandroid_nwB;
1947 cave[x-1][y-1] = Yandroid_nw;
1948 next[x-1][y-1] = Xandroid;
1949 play_element_sound(x, y, SOUND_android_move, Xandroid);
1953 static void Landroid_1_n(int x, int y)
1955 switch (cave[x][y-1])
1968 cave[x][y] = Yandroid_nB;
1969 next[x][y] = Xblank;
1970 cave[x][y-1] = Yandroid_n;
1971 next[x][y-1] = Xandroid;
1972 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
1983 cave[x][y] = Yandroid_nB;
1984 next[x][y] = Xblank;
1985 if (cave[x+1][y-2] == Xblank)
1986 cave[x+1][y-2] = Xsplash_e;
1987 if (cave[x-1][y-2] == Xblank)
1988 cave[x-1][y-2] = Xsplash_w;
1989 play_element_sound(x, y, SOUND_acid, Xacid_1);
1998 static void Landroid_2_n(int x, int y)
2000 switch (cave[x][y-1])
2013 cave[x][y] = Yandroid_nB;
2014 next[x][y] = Xblank;
2015 cave[x][y-1] = Yandroid_n;
2016 next[x][y-1] = Xandroid_1_n;
2017 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
2028 cave[x][y] = Yandroid_nB;
2029 next[x][y] = Xblank;
2030 if (cave[x+1][y-2] == Xblank)
2031 cave[x+1][y-2] = Xsplash_e;
2032 if (cave[x-1][y-2] == Xblank)
2033 cave[x-1][y-2] = Xsplash_w;
2034 play_element_sound(x, y, SOUND_acid, Xacid_1);
2043 static void Landroid_1_e(int x, int y)
2045 switch (cave[x+1][y])
2058 cave[x][y] = Yandroid_eB;
2059 next[x][y] = Xblank;
2060 cave[x+1][y] = Yandroid_e;
2061 next[x+1][y] = Xandroid;
2062 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
2073 cave[x][y] = Yandroid_eB;
2074 next[x][y] = Xblank;
2075 if (cave[x+2][y-1] == Xblank)
2076 cave[x+2][y-1] = Xsplash_e;
2077 if (cave[x][y-1] == Xblank)
2078 cave[x][y-1] = Xsplash_w;
2079 play_element_sound(x, y, SOUND_acid, Xacid_1);
2088 static void Landroid_2_e(int x, int y)
2090 switch (cave[x+1][y])
2103 cave[x][y] = Yandroid_eB;
2104 next[x][y] = Xblank;
2105 cave[x+1][y] = Yandroid_e;
2106 next[x+1][y] = Xandroid_1_e;
2107 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
2118 cave[x][y] = Yandroid_eB;
2119 next[x][y] = Xblank;
2120 if (cave[x+2][y-1] == Xblank)
2121 cave[x+2][y-1] = Xsplash_e;
2122 if (cave[x][y-1] == Xblank)
2123 cave[x][y-1] = Xsplash_w;
2124 play_element_sound(x, y, SOUND_acid, Xacid_1);
2133 static void Landroid_1_s(int x, int y)
2135 switch (cave[x][y+1])
2148 cave[x][y] = Yandroid_sB;
2149 next[x][y] = Xblank;
2150 cave[x][y+1] = Yandroid_s;
2151 next[x][y+1] = Xandroid;
2152 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
2163 cave[x][y] = Yandroid_sB;
2164 next[x][y] = Xblank;
2165 if (cave[x+1][y] == Xblank)
2166 cave[x+1][y] = Xsplash_e;
2167 if (cave[x-1][y] == Xblank)
2168 cave[x-1][y] = Xsplash_w;
2169 play_element_sound(x, y, SOUND_acid, Xacid_1);
2178 static void Landroid_2_s(int x, int y)
2180 switch (cave[x][y+1])
2193 cave[x][y] = Yandroid_sB;
2194 next[x][y] = Xblank;
2195 cave[x][y+1] = Yandroid_s;
2196 next[x][y+1] = Xandroid_1_s;
2197 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
2208 cave[x][y] = Yandroid_sB;
2209 next[x][y] = Xblank;
2210 if (cave[x+1][y] == Xblank)
2211 cave[x+1][y] = Xsplash_e;
2212 if (cave[x-1][y] == Xblank)
2213 cave[x-1][y] = Xsplash_w;
2214 play_element_sound(x, y, SOUND_acid, Xacid_1);
2223 static void Landroid_1_w(int x, int y)
2225 switch (cave[x-1][y])
2238 cave[x][y] = Yandroid_wB;
2239 next[x][y] = Xblank;
2240 cave[x-1][y] = Yandroid_w;
2241 next[x-1][y] = Xandroid;
2242 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2253 cave[x][y] = Yandroid_wB;
2254 next[x][y] = Xblank;
2255 if (cave[x][y-1] == Xblank)
2256 cave[x][y-1] = Xsplash_e;
2257 if (cave[x-2][y-1] == Xblank)
2258 cave[x-2][y-1] = Xsplash_w;
2259 play_element_sound(x, y, SOUND_acid, Xacid_1);
2268 static void Landroid_2_w(int x, int y)
2270 switch (cave[x-1][y])
2283 cave[x][y] = Yandroid_wB;
2284 next[x][y] = Xblank;
2285 cave[x-1][y] = Yandroid_w;
2286 next[x-1][y] = Xandroid_1_w;
2287 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2298 cave[x][y] = Yandroid_wB;
2299 next[x][y] = Xblank;
2300 if (cave[x][y-1] == Xblank)
2301 cave[x][y-1] = Xsplash_e;
2302 if (cave[x-2][y-1] == Xblank)
2303 cave[x-2][y-1] = Xsplash_w;
2304 play_element_sound(x, y, SOUND_acid, Xacid_1);
2313 static void Leater_n(int x, int y)
2315 if (cave[x+1][y] == Xdiamond)
2317 cave[x+1][y] = Ydiamond_blank;
2318 next[x+1][y] = Xblank;
2319 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2323 if (cave[x][y+1] == Xdiamond)
2325 cave[x][y+1] = Ydiamond_blank;
2326 next[x][y+1] = Xblank;
2327 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2331 if (cave[x-1][y] == Xdiamond)
2333 cave[x-1][y] = Ydiamond_blank;
2334 next[x-1][y] = Xblank;
2335 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2339 if (cave[x][y-1] == Xdiamond)
2341 cave[x][y-1] = Ydiamond_blank;
2342 next[x][y-1] = Xblank;
2343 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2347 switch (cave[x][y-1])
2363 cave[x][y] = Yeater_nB;
2364 next[x][y] = Xblank;
2365 cave[x][y-1] = Yeater_n;
2366 next[x][y-1] = Xeater_n;
2377 cave[x][y] = Yeater_nB;
2378 next[x][y] = Xblank;
2379 if (cave[x+1][y-2] == Xblank)
2380 cave[x+1][y-2] = Xsplash_e;
2381 if (cave[x-1][y-2] == Xblank)
2382 cave[x-1][y-2] = Xsplash_w;
2383 play_element_sound(x, y, SOUND_acid, Xacid_1);
2387 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2388 play_element_sound(x, y, SOUND_eater, Xeater_n);
2393 static void Leater_e(int x, int y)
2395 if (cave[x][y+1] == Xdiamond)
2397 cave[x][y+1] = Ydiamond_blank;
2398 next[x][y+1] = Xblank;
2399 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2403 if (cave[x-1][y] == Xdiamond)
2405 cave[x-1][y] = Ydiamond_blank;
2406 next[x-1][y] = Xblank;
2407 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2411 if (cave[x][y-1] == Xdiamond)
2413 cave[x][y-1] = Ydiamond_blank;
2414 next[x][y-1] = Xblank;
2415 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2419 if (cave[x+1][y] == Xdiamond)
2421 cave[x+1][y] = Ydiamond_blank;
2422 next[x+1][y] = Xblank;
2423 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2427 switch (cave[x+1][y])
2443 cave[x][y] = Yeater_eB;
2444 next[x][y] = Xblank;
2445 cave[x+1][y] = Yeater_e;
2446 next[x+1][y] = Xeater_e;
2457 cave[x][y] = Yeater_eB;
2458 next[x][y] = Xblank;
2459 if (cave[x+2][y-1] == Xblank)
2460 cave[x+2][y-1] = Xsplash_e;
2461 if (cave[x][y-1] == Xblank)
2462 cave[x][y-1] = Xsplash_w;
2463 play_element_sound(x, y, SOUND_acid, Xacid_1);
2467 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2468 play_element_sound(x, y, SOUND_eater, Xeater_e);
2473 static void Leater_s(int x, int y)
2475 if (cave[x-1][y] == Xdiamond)
2477 cave[x-1][y] = Ydiamond_blank;
2478 next[x-1][y] = Xblank;
2479 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2483 if (cave[x][y-1] == Xdiamond)
2485 cave[x][y-1] = Ydiamond_blank;
2486 next[x][y-1] = Xblank;
2487 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2491 if (cave[x+1][y] == Xdiamond)
2493 cave[x+1][y] = Ydiamond_blank;
2494 next[x+1][y] = Xblank;
2495 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2499 if (cave[x][y+1] == Xdiamond)
2501 cave[x][y+1] = Ydiamond_blank;
2502 next[x][y+1] = Xblank;
2503 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2507 switch (cave[x][y+1])
2523 cave[x][y] = Yeater_sB;
2524 next[x][y] = Xblank;
2525 cave[x][y+1] = Yeater_s;
2526 next[x][y+1] = Xeater_s;
2537 cave[x][y] = Yeater_sB;
2538 next[x][y] = Xblank;
2539 if (cave[x+1][y] == Xblank)
2540 cave[x+1][y] = Xsplash_e;
2541 if (cave[x-1][y] == Xblank)
2542 cave[x-1][y] = Xsplash_w;
2543 play_element_sound(x, y, SOUND_acid, Xacid_1);
2547 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2548 play_element_sound(x, y, SOUND_eater, Xeater_s);
2553 static void Leater_w(int x, int y)
2555 if (cave[x][y-1] == Xdiamond)
2557 cave[x][y-1] = Ydiamond_blank;
2558 next[x][y-1] = Xblank;
2559 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2563 if (cave[x+1][y] == Xdiamond)
2565 cave[x+1][y] = Ydiamond_blank;
2566 next[x+1][y] = Xblank;
2567 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2571 if (cave[x][y+1] == Xdiamond)
2573 cave[x][y+1] = Ydiamond_blank;
2574 next[x][y+1] = Xblank;
2575 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2579 if (cave[x-1][y] == Xdiamond)
2581 cave[x-1][y] = Ydiamond_blank;
2582 next[x-1][y] = Xblank;
2583 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2587 switch (cave[x-1][y])
2603 cave[x][y] = Yeater_wB;
2604 next[x][y] = Xblank;
2605 cave[x-1][y] = Yeater_w;
2606 next[x-1][y] = Xeater_w;
2617 cave[x][y] = Yeater_wB;
2618 next[x][y] = Xblank;
2619 if (cave[x][y-1] == Xblank)
2620 cave[x][y-1] = Xsplash_e;
2621 if (cave[x-2][y-1] == Xblank)
2622 cave[x-2][y-1] = Xsplash_w;
2623 play_element_sound(x, y, SOUND_acid, Xacid_1);
2627 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2628 play_element_sound(x, y, SOUND_eater, Xeater_w);
2633 static void Lalien(int x, int y)
2644 set_nearest_player_xy(x, y, &dx, &dy);
2651 switch (cave[x][y-1])
2667 cave[x][y] = Yalien_nB;
2668 next[x][y] = Xblank;
2669 cave[x][y-1] = Yalien_n;
2670 next[x][y-1] = Xalien_pause;
2671 play_element_sound(x, y, SOUND_alien, Xalien);
2682 cave[x][y] = Yalien_nB;
2683 next[x][y] = Xblank;
2684 if (cave[x+1][y-2] == Xblank)
2685 cave[x+1][y-2] = Xsplash_e;
2686 if (cave[x-1][y-2] == Xblank)
2687 cave[x-1][y-2] = Xsplash_w;
2688 play_element_sound(x, y, SOUND_acid, Xacid_1);
2694 switch (cave[x][y+1])
2710 cave[x][y] = Yalien_sB;
2711 next[x][y] = Xblank;
2712 cave[x][y+1] = Yalien_s;
2713 next[x][y+1] = Xalien_pause;
2714 play_element_sound(x, y, SOUND_alien, Xalien);
2725 cave[x][y] = Yalien_sB;
2726 next[x][y] = Xblank;
2727 if (cave[x+1][y] == Xblank)
2728 cave[x+1][y] = Xsplash_e;
2729 if (cave[x-1][y] == Xblank)
2730 cave[x-1][y] = Xsplash_w;
2731 play_element_sound(x, y, SOUND_acid, Xacid_1);
2740 switch (cave[x+1][y])
2756 cave[x][y] = Yalien_eB;
2757 next[x][y] = Xblank;
2758 cave[x+1][y] = Yalien_e;
2759 next[x+1][y] = Xalien_pause;
2760 play_element_sound(x, y, SOUND_alien, Xalien);
2771 cave[x][y] = Yalien_eB;
2772 next[x][y] = Xblank;
2773 if (cave[x+2][y-1] == Xblank)
2774 cave[x+2][y-1] = Xsplash_e;
2775 if (cave[x][y-1] == Xblank)
2776 cave[x][y-1] = Xsplash_w;
2777 play_element_sound(x, y, SOUND_acid, Xacid_1);
2783 switch (cave[x-1][y])
2799 cave[x][y] = Yalien_wB;
2800 next[x][y] = Xblank;
2801 cave[x-1][y] = Yalien_w;
2802 next[x-1][y] = Xalien_pause;
2803 play_element_sound(x, y, SOUND_alien, Xalien);
2814 cave[x][y] = Yalien_wB;
2815 next[x][y] = Xblank;
2816 if (cave[x][y-1] == Xblank)
2817 cave[x][y-1] = Xsplash_e;
2818 if (cave[x-2][y-1] == Xblank)
2819 cave[x-2][y-1] = Xsplash_w;
2820 play_element_sound(x, y, SOUND_acid, Xacid_1);
2827 static void Lalien_pause(int x, int y)
2829 next[x][y] = Xalien;
2832 static void Lbug_n(int x, int y)
2834 switch (cave[x][y-1])
2850 cave[x][y] = Ybug_nB;
2851 next[x][y] = Xblank;
2852 cave[x][y-1] = Ybug_n;
2853 next[x][y-1] = Xbug_1_n;
2854 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2865 cave[x][y] = Ybug_nB;
2866 next[x][y] = Xblank;
2867 if (cave[x+1][y-2] == Xblank)
2868 cave[x+1][y-2] = Xsplash_e;
2869 if (cave[x-1][y-2] == Xblank)
2870 cave[x-1][y-2] = Xsplash_w;
2871 play_element_sound(x, y, SOUND_acid, Xacid_1);
2875 cave[x][y] = Ybug_n_w;
2876 next[x][y] = Xbug_2_w;
2877 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2882 static void Lbug_1_n(int x, int y)
2884 if (is_amoeba[cave[x][y-1]] ||
2885 is_amoeba[cave[x+1][y]] ||
2886 is_amoeba[cave[x][y+1]] ||
2887 is_amoeba[cave[x-1][y]])
2895 switch (cave[x+1][y])
2919 cave[x][y] = Ybug_n_e;
2920 next[x][y] = Xbug_2_e;
2921 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2930 static void Lbug_2_n(int x, int y)
2932 if (is_amoeba[cave[x][y-1]] ||
2933 is_amoeba[cave[x+1][y]] ||
2934 is_amoeba[cave[x][y+1]] ||
2935 is_amoeba[cave[x-1][y]])
2946 static void Lbug_e(int x, int y)
2948 switch (cave[x+1][y])
2964 cave[x][y] = Ybug_eB;
2965 next[x][y] = Xblank;
2966 cave[x+1][y] = Ybug_e;
2967 next[x+1][y] = Xbug_1_e;
2968 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2979 cave[x][y] = Ybug_eB;
2980 next[x][y] = Xblank;
2981 if (cave[x+2][y-1] == Xblank)
2982 cave[x+2][y-1] = Xsplash_e;
2983 if (cave[x][y-1] == Xblank)
2984 cave[x][y-1] = Xsplash_w;
2985 play_element_sound(x, y, SOUND_acid, Xacid_1);
2989 cave[x][y] = Ybug_e_n;
2990 next[x][y] = Xbug_2_n;
2991 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2996 static void Lbug_1_e(int x, int y)
2998 if (is_amoeba[cave[x][y-1]] ||
2999 is_amoeba[cave[x+1][y]] ||
3000 is_amoeba[cave[x][y+1]] ||
3001 is_amoeba[cave[x-1][y]])
3009 switch (cave[x][y+1])
3033 cave[x][y] = Ybug_e_s;
3034 next[x][y] = Xbug_2_s;
3035 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3044 static void Lbug_2_e(int x, int y)
3046 if (is_amoeba[cave[x][y-1]] ||
3047 is_amoeba[cave[x+1][y]] ||
3048 is_amoeba[cave[x][y+1]] ||
3049 is_amoeba[cave[x-1][y]])
3060 static void Lbug_s(int x, int y)
3062 switch (cave[x][y+1])
3078 cave[x][y] = Ybug_sB;
3079 next[x][y] = Xblank;
3080 cave[x][y+1] = Ybug_s;
3081 next[x][y+1] = Xbug_1_s;
3082 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3093 cave[x][y] = Ybug_sB;
3094 next[x][y] = Xblank;
3095 if (cave[x+1][y] == Xblank)
3096 cave[x+1][y] = Xsplash_e;
3097 if (cave[x-1][y] == Xblank)
3098 cave[x-1][y] = Xsplash_w;
3099 play_element_sound(x, y, SOUND_acid, Xacid_1);
3103 cave[x][y] = Ybug_s_e;
3104 next[x][y] = Xbug_2_e;
3105 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3110 static void Lbug_1_s(int x, int y)
3112 if (is_amoeba[cave[x][y-1]] ||
3113 is_amoeba[cave[x+1][y]] ||
3114 is_amoeba[cave[x][y+1]] ||
3115 is_amoeba[cave[x-1][y]])
3123 switch (cave[x-1][y])
3147 cave[x][y] = Ybug_s_w;
3148 next[x][y] = Xbug_2_w;
3149 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3158 static void Lbug_2_s(int x, int y)
3160 if (is_amoeba[cave[x][y-1]] ||
3161 is_amoeba[cave[x+1][y]] ||
3162 is_amoeba[cave[x][y+1]] ||
3163 is_amoeba[cave[x-1][y]])
3174 static void Lbug_w(int x, int y)
3176 switch (cave[x-1][y])
3192 cave[x][y] = Ybug_wB;
3193 next[x][y] = Xblank;
3194 cave[x-1][y] = Ybug_w;
3195 next[x-1][y] = Xbug_1_w;
3196 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3207 cave[x][y] = Ybug_wB;
3208 next[x][y] = Xblank;
3209 if (cave[x][y-1] == Xblank)
3210 cave[x][y-1] = Xsplash_e;
3211 if (cave[x-2][y-1] == Xblank)
3212 cave[x-2][y-1] = Xsplash_w;
3213 play_element_sound(x, y, SOUND_acid, Xacid_1);
3217 cave[x][y] = Ybug_w_s;
3218 next[x][y] = Xbug_2_s;
3219 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3224 static void Lbug_1_w(int x, int y)
3226 if (is_amoeba[cave[x][y-1]] ||
3227 is_amoeba[cave[x+1][y]] ||
3228 is_amoeba[cave[x][y+1]] ||
3229 is_amoeba[cave[x-1][y]])
3237 switch (cave[x][y-1])
3261 cave[x][y] = Ybug_w_n;
3262 next[x][y] = Xbug_2_n;
3263 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3272 static void Lbug_2_w(int x, int y)
3274 if (is_amoeba[cave[x][y-1]] ||
3275 is_amoeba[cave[x+1][y]] ||
3276 is_amoeba[cave[x][y+1]] ||
3277 is_amoeba[cave[x-1][y]])
3288 static void Ltank_n(int x, int y)
3290 switch (cave[x][y-1])
3306 cave[x][y] = Ytank_nB;
3307 next[x][y] = Xblank;
3308 cave[x][y-1] = Ytank_n;
3309 next[x][y-1] = Xtank_1_n;
3310 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3321 cave[x][y] = Ytank_nB;
3322 next[x][y] = Xblank;
3323 if (cave[x+1][y-2] == Xblank)
3324 cave[x+1][y-2] = Xsplash_e;
3325 if (cave[x-1][y-2] == Xblank)
3326 cave[x-1][y-2] = Xsplash_w;
3327 play_element_sound(x, y, SOUND_acid, Xacid_1);
3331 cave[x][y] = Ytank_n_e;
3332 next[x][y] = Xtank_2_e;
3333 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3338 static void Ltank_1_n(int x, int y)
3340 if (is_amoeba[cave[x][y-1]] ||
3341 is_amoeba[cave[x+1][y]] ||
3342 is_amoeba[cave[x][y+1]] ||
3343 is_amoeba[cave[x-1][y]])
3351 switch (cave[x-1][y])
3375 cave[x][y] = Ytank_n_w;
3376 next[x][y] = Xtank_2_w;
3377 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3386 static void Ltank_2_n(int x, int y)
3388 if (is_amoeba[cave[x][y-1]] ||
3389 is_amoeba[cave[x+1][y]] ||
3390 is_amoeba[cave[x][y+1]] ||
3391 is_amoeba[cave[x-1][y]])
3402 static void Ltank_e(int x, int y)
3404 switch (cave[x+1][y])
3420 cave[x][y] = Ytank_eB;
3421 next[x][y] = Xblank;
3422 cave[x+1][y] = Ytank_e;
3423 next[x+1][y] = Xtank_1_e;
3424 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3435 cave[x][y] = Ytank_eB;
3436 next[x][y] = Xblank;
3437 if (cave[x+2][y-1] == Xblank)
3438 cave[x+2][y-1] = Xsplash_e;
3439 if (cave[x][y-1] == Xblank)
3440 cave[x][y-1] = Xsplash_w;
3441 play_element_sound(x, y, SOUND_acid, Xacid_1);
3445 cave[x][y] = Ytank_e_s;
3446 next[x][y] = Xtank_2_s;
3447 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3452 static void Ltank_1_e(int x, int y)
3454 if (is_amoeba[cave[x][y-1]] ||
3455 is_amoeba[cave[x+1][y]] ||
3456 is_amoeba[cave[x][y+1]] ||
3457 is_amoeba[cave[x-1][y]])
3465 switch (cave[x][y-1])
3489 cave[x][y] = Ytank_e_n;
3490 next[x][y] = Xtank_2_n;
3491 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3500 static void Ltank_2_e(int x, int y)
3502 if (is_amoeba[cave[x][y-1]] ||
3503 is_amoeba[cave[x+1][y]] ||
3504 is_amoeba[cave[x][y+1]] ||
3505 is_amoeba[cave[x-1][y]])
3516 static void Ltank_s(int x, int y)
3518 switch (cave[x][y+1])
3534 cave[x][y] = Ytank_sB;
3535 next[x][y] = Xblank;
3536 cave[x][y+1] = Ytank_s;
3537 next[x][y+1] = Xtank_1_s;
3538 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3549 cave[x][y] = Ytank_sB;
3550 next[x][y] = Xblank;
3551 if (cave[x+1][y] == Xblank)
3552 cave[x+1][y] = Xsplash_e;
3553 if (cave[x-1][y] == Xblank)
3554 cave[x-1][y] = Xsplash_w;
3555 play_element_sound(x, y, SOUND_acid, Xacid_1);
3559 cave[x][y] = Ytank_s_w;
3560 next[x][y] = Xtank_2_w;
3561 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3566 static void Ltank_1_s(int x, int y)
3568 if (is_amoeba[cave[x][y-1]] ||
3569 is_amoeba[cave[x+1][y]] ||
3570 is_amoeba[cave[x][y+1]] ||
3571 is_amoeba[cave[x-1][y]])
3579 switch (cave[x+1][y])
3603 cave[x][y] = Ytank_s_e;
3604 next[x][y] = Xtank_2_e;
3605 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3614 static void Ltank_2_s(int x, int y)
3616 if (is_amoeba[cave[x][y-1]] ||
3617 is_amoeba[cave[x+1][y]] ||
3618 is_amoeba[cave[x][y+1]] ||
3619 is_amoeba[cave[x-1][y]])
3630 static void Ltank_w(int x, int y)
3632 switch (cave[x-1][y])
3648 cave[x][y] = Ytank_wB;
3649 next[x][y] = Xblank;
3650 cave[x-1][y] = Ytank_w;
3651 next[x-1][y] = Xtank_1_w;
3652 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3663 cave[x][y] = Ytank_wB;
3664 next[x][y] = Xblank;
3665 if (cave[x][y-1] == Xblank)
3666 cave[x][y-1] = Xsplash_e;
3667 if (cave[x-2][y-1] == Xblank)
3668 cave[x-2][y-1] = Xsplash_w;
3669 play_element_sound(x, y, SOUND_acid, Xacid_1);
3673 cave[x][y] = Ytank_w_n;
3674 next[x][y] = Xtank_2_n;
3675 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3680 static void Ltank_1_w(int x, int y)
3682 if (is_amoeba[cave[x][y-1]] ||
3683 is_amoeba[cave[x+1][y]] ||
3684 is_amoeba[cave[x][y+1]] ||
3685 is_amoeba[cave[x-1][y]])
3693 switch (cave[x][y+1])
3717 cave[x][y] = Ytank_w_s;
3718 next[x][y] = Xtank_2_s;
3719 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3728 static void Ltank_2_w(int x, int y)
3730 if (is_amoeba[cave[x][y-1]] ||
3731 is_amoeba[cave[x+1][y]] ||
3732 is_amoeba[cave[x][y+1]] ||
3733 is_amoeba[cave[x-1][y]])
3744 static void Lemerald(int x, int y)
3746 switch (cave[x][y+1])
3759 cave[x][y] = Yemerald_sB;
3760 next[x][y] = Xblank;
3761 cave[x][y+1] = Yemerald_s;
3762 next[x][y+1] = Xemerald_fall;
3773 cave[x][y] = Yemerald_sB;
3774 next[x][y] = Xblank;
3775 if (cave[x+1][y] == Xblank)
3776 cave[x+1][y] = Xsplash_e;
3777 if (cave[x-1][y] == Xblank)
3778 cave[x-1][y] = Xsplash_w;
3779 play_element_sound(x, y, SOUND_acid, Xacid_1);
3792 case Xemerald_pause:
3794 case Xdiamond_pause:
3838 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
3840 cave[x][y] = Yemerald_eB;
3841 next[x][y] = Xblank;
3842 cave[x+1][y] = Yemerald_e;
3843 next[x+1][y] = Xemerald_pause;
3844 if (cave[x][y+1] == Xbumper)
3845 cave[x][y+1] = Ybumper;
3849 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
3851 cave[x][y] = Yemerald_wB;
3852 next[x][y] = Xblank;
3853 cave[x-1][y] = Yemerald_w;
3854 next[x-1][y] = Xemerald_pause;
3855 if (cave[x][y+1] == Xbumper)
3856 cave[x][y+1] = Ybumper;
3862 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
3864 cave[x][y] = Yemerald_wB;
3865 next[x][y] = Xblank;
3866 cave[x-1][y] = Yemerald_w;
3867 next[x-1][y] = Xemerald_pause;
3868 if (cave[x][y+1] == Xbumper)
3869 cave[x][y+1] = Ybumper;
3873 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
3875 cave[x][y] = Yemerald_eB;
3876 next[x][y] = Xblank;
3877 cave[x+1][y] = Yemerald_e;
3878 next[x+1][y] = Xemerald_pause;
3879 if (cave[x][y+1] == Xbumper)
3880 cave[x][y+1] = Ybumper;
3886 if (++lev.shine_cnt > 50)
3888 lev.shine_cnt = RANDOM(8);
3889 cave[x][y] = Xemerald_shine;
3896 static void Lemerald_pause(int x, int y)
3898 switch (cave[x][y+1])
3911 cave[x][y] = Yemerald_sB;
3912 next[x][y] = Xblank;
3913 cave[x][y+1] = Yemerald_s;
3914 next[x][y+1] = Xemerald_fall;
3925 cave[x][y] = Yemerald_sB;
3926 next[x][y] = Xblank;
3927 if (cave[x+1][y] == Xblank)
3928 cave[x+1][y] = Xsplash_e;
3929 if (cave[x-1][y] == Xblank)
3930 cave[x-1][y] = Xsplash_w;
3931 play_element_sound(x, y, SOUND_acid, Xacid_1);
3935 cave[x][y] = Xemerald;
3936 next[x][y] = Xemerald;
3941 static void Lemerald_fall(int x, int y)
3943 switch (cave[x][y+1])
3957 cave[x][y] = Yemerald_sB;
3958 next[x][y] = Xblank;
3959 cave[x][y+1] = Yemerald_s;
3960 next[x][y+1] = Xemerald_fall;
3971 cave[x][y] = Yemerald_sB;
3972 next[x][y] = Xblank;
3973 if (cave[x+1][y] == Xblank)
3974 cave[x+1][y] = Xsplash_e;
3975 if (cave[x-1][y] == Xblank)
3976 cave[x-1][y] = Xsplash_w;
3977 play_element_sound(x, y, SOUND_acid, Xacid_1);
3981 if (lev.wonderwall_time > 0)
3983 lev.wonderwall_active = TRUE;
3984 cave[x][y] = Yemerald_sB;
3985 next[x][y] = Xblank;
3986 if (is_blank[cave[x][y+2]])
3988 cave[x][y+2] = Ydiamond_s;
3989 next[x][y+2] = Xdiamond_fall;
3991 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3996 cave[x][y] = Xemerald;
3997 next[x][y] = Xemerald;
3998 play_element_sound(x, y, SOUND_diamond, Xemerald);
4003 static void Ldiamond(int x, int y)
4005 switch (cave[x][y+1])
4018 cave[x][y] = Ydiamond_sB;
4019 next[x][y] = Xblank;
4020 cave[x][y+1] = Ydiamond_s;
4021 next[x][y+1] = Xdiamond_fall;
4032 cave[x][y] = Ydiamond_sB;
4033 next[x][y] = Xblank;
4034 if (cave[x+1][y] == Xblank)
4035 cave[x+1][y] = Xsplash_e;
4036 if (cave[x-1][y] == Xblank)
4037 cave[x-1][y] = Xsplash_w;
4038 play_element_sound(x, y, SOUND_acid, Xacid_1);
4051 case Xemerald_pause:
4053 case Xdiamond_pause:
4097 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4099 cave[x][y] = Ydiamond_eB;
4100 next[x][y] = Xblank;
4101 cave[x+1][y] = Ydiamond_e;
4102 next[x+1][y] = Xdiamond_pause;
4103 if (cave[x][y+1] == Xbumper)
4104 cave[x][y+1] = Ybumper;
4108 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4110 cave[x][y] = Ydiamond_wB;
4111 next[x][y] = Xblank;
4112 cave[x-1][y] = Ydiamond_w;
4113 next[x-1][y] = Xdiamond_pause;
4114 if (cave[x][y+1] == Xbumper)
4115 cave[x][y+1] = Ybumper;
4121 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4123 cave[x][y] = Ydiamond_wB;
4124 next[x][y] = Xblank;
4125 cave[x-1][y] = Ydiamond_w;
4126 next[x-1][y] = Xdiamond_pause;
4127 if (cave[x][y+1] == Xbumper)
4128 cave[x][y+1] = Ybumper;
4132 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4134 cave[x][y] = Ydiamond_eB;
4135 next[x][y] = Xblank;
4136 cave[x+1][y] = Ydiamond_e;
4137 next[x+1][y] = Xdiamond_pause;
4138 if (cave[x][y+1] == Xbumper)
4139 cave[x][y+1] = Ybumper;
4145 if (++lev.shine_cnt > 50)
4147 lev.shine_cnt = RANDOM(8);
4148 cave[x][y] = Xdiamond_shine;
4155 static void Ldiamond_pause(int x, int y)
4157 switch (cave[x][y+1])
4170 cave[x][y] = Ydiamond_sB;
4171 next[x][y] = Xblank;
4172 cave[x][y+1] = Ydiamond_s;
4173 next[x][y+1] = Xdiamond_fall;
4184 cave[x][y] = Ydiamond_sB;
4185 next[x][y] = Xblank;
4186 if (cave[x+1][y] == Xblank)
4187 cave[x+1][y] = Xsplash_e;
4188 if (cave[x-1][y] == Xblank)
4189 cave[x-1][y] = Xsplash_w;
4190 play_element_sound(x, y, SOUND_acid, Xacid_1);
4194 cave[x][y] = Xdiamond;
4195 next[x][y] = Xdiamond;
4200 static void Ldiamond_fall(int x, int y)
4202 switch (cave[x][y+1])
4216 cave[x][y] = Ydiamond_sB;
4217 next[x][y] = Xblank;
4218 cave[x][y+1] = Ydiamond_s;
4219 next[x][y+1] = Xdiamond_fall;
4230 cave[x][y] = Ydiamond_sB;
4231 next[x][y] = Xblank;
4232 if (cave[x+1][y] == Xblank)
4233 cave[x+1][y] = Xsplash_e;
4234 if (cave[x-1][y] == Xblank)
4235 cave[x-1][y] = Xsplash_w;
4236 play_element_sound(x, y, SOUND_acid, Xacid_1);
4240 if (lev.wonderwall_time > 0)
4242 lev.wonderwall_active = TRUE;
4243 cave[x][y] = Ydiamond_sB;
4244 next[x][y] = Xblank;
4245 if (is_blank[cave[x][y+2]])
4247 cave[x][y+2] = Ystone_s;
4248 next[x][y+2] = Xstone_fall;
4250 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4255 cave[x][y] = Xdiamond;
4256 next[x][y] = Xdiamond;
4257 play_element_sound(x, y, SOUND_diamond, Xdiamond);
4262 static void Lstone(int x, int y)
4264 switch (cave[x][y+1])
4279 cave[x][y] = Ystone_sB;
4280 next[x][y] = Xblank;
4281 cave[x][y+1] = Ystone_s;
4282 next[x][y+1] = Xstone_fall;
4293 cave[x][y] = Ystone_sB;
4294 next[x][y] = Xblank;
4295 if (cave[x+1][y] == Xblank)
4296 cave[x+1][y] = Xsplash_e;
4297 if (cave[x-1][y] == Xblank)
4298 cave[x-1][y] = Xsplash_w;
4299 play_element_sound(x, y, SOUND_acid, Xacid_1);
4303 cave[x][y] = Xsand_stonein_1;
4304 next[x][y] = Xsand_stonein_2;
4305 cave[x][y+1] = Xsand_sandstone_1;
4306 next[x][y+1] = Xsand_sandstone_2;
4319 case Xemerald_pause:
4321 case Xdiamond_pause:
4358 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4360 cave[x][y] = Ystone_eB;
4361 next[x][y] = Xblank;
4362 cave[x+1][y] = Ystone_e;
4363 next[x+1][y] = Xstone_pause;
4364 if (cave[x][y+1] == Xbumper)
4365 cave[x][y+1] = Ybumper;
4369 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4371 cave[x][y] = Ystone_wB;
4372 next[x][y] = Xblank;
4373 cave[x-1][y] = Ystone_w;
4374 next[x-1][y] = Xstone_pause;
4375 if (cave[x][y+1] == Xbumper)
4376 cave[x][y+1] = Ybumper;
4382 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4384 cave[x][y] = Ystone_wB;
4385 next[x][y] = Xblank;
4386 cave[x-1][y] = Ystone_w;
4387 next[x-1][y] = Xstone_pause;
4388 if (cave[x][y+1] == Xbumper)
4389 cave[x][y+1] = Ybumper;
4393 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4395 cave[x][y] = Ystone_eB;
4396 next[x][y] = Xblank;
4397 cave[x+1][y] = Ystone_e;
4398 next[x+1][y] = Xstone_pause;
4399 if (cave[x][y+1] == Xbumper)
4400 cave[x][y+1] = Ybumper;
4407 static void Lstone_pause(int x, int y)
4409 switch (cave[x][y+1])
4422 cave[x][y] = Ystone_sB;
4423 next[x][y] = Xblank;
4424 cave[x][y+1] = Ystone_s;
4425 next[x][y+1] = Xstone_fall;
4436 cave[x][y] = Ystone_sB;
4437 next[x][y] = Xblank;
4438 if (cave[x+1][y] == Xblank)
4439 cave[x+1][y] = Xsplash_e;
4440 if (cave[x-1][y] == Xblank)
4441 cave[x-1][y] = Xsplash_w;
4442 play_element_sound(x, y, SOUND_acid, Xacid_1);
4446 cave[x][y] = Xstone;
4447 next[x][y] = Xstone;
4452 static void Lstone_fall(int x, int y)
4454 switch (cave[x][y+1])
4468 cave[x][y] = Ystone_sB;
4469 next[x][y] = Xblank;
4470 cave[x][y+1] = Ystone_s;
4471 next[x][y+1] = Xstone_fall;
4482 cave[x][y] = Ystone_sB;
4483 next[x][y] = Xblank;
4484 if (cave[x+1][y] == Xblank)
4485 cave[x+1][y] = Xsplash_e;
4486 if (cave[x-1][y] == Xblank)
4487 cave[x-1][y] = Xsplash_w;
4488 play_element_sound(x, y, SOUND_acid, Xacid_1);
4495 cave[x][y] = Ystone_sB;
4496 Lboom_next_new(x, y, Xblank);
4497 cave[x][y+1] = Yeater_stone;
4498 next[x][y+1] = Zeater;
4499 Lboom_eater_old(x, y+1);
4500 score += lev.eater_score;
4505 cave[x][y] = Ystone_sB;
4506 Lboom_next_new(x, y, Xblank);
4507 cave[x][y+1] = Yalien_stone;
4508 next[x][y+1] = Ztank;
4509 Lboom_tank_old(x, y+1);
4510 score += lev.alien_score;
4521 cave[x][y] = Ystone_sB;
4522 Lboom_next_new(x, y, Xblank);
4523 cave[x][y+1] = Ybug_stone;
4524 next[x][y+1] = Zbug;
4525 Lboom_bug_old(x, y+1);
4526 score += lev.bug_score;
4537 cave[x][y] = Ystone_sB;
4538 Lboom_next_new(x, y, Xblank);
4539 cave[x][y+1] = Ytank_stone;
4540 next[x][y+1] = Ztank;
4541 Lboom_tank_old(x, y+1);
4542 score += lev.tank_score;
4546 case Xdiamond_pause:
4547 switch (cave[x][y+2])
4603 next[x][y] = Xstone;
4604 play_element_sound(x, y, SOUND_stone, Xstone);
4608 cave[x][y] = Ystone_sB;
4609 next[x][y] = Xblank;
4610 cave[x][y+1] = Ydiamond_stone;
4611 next[x][y+1] = Xstone_pause;
4612 play_element_sound(x, y, SOUND_squash, Xdiamond);
4617 Lboom_cave_new(x, y, Xstone);
4618 Lboom_next_new(x, y, Xstone);
4619 cave[x][y+1] = Ybomb_blank;
4620 next[x][y+1] = Ztank;
4621 Lboom_tank_old(x, y+1);
4626 next[x][y] = Xstone;
4627 cave[x][y+1] = Ynut_stone;
4628 next[x][y+1] = Xemerald;
4629 play_element_sound(x, y, SOUND_crack, Xnut);
4630 score += lev.nut_score;
4636 switch (cave[x+1][y+1])
4651 cave[x][y+1] = Xspring_e;
4655 cave[x][y+1] = Xspring_w;
4661 switch (cave[x-1][y+1])
4676 cave[x][y+1] = Xspring_w;
4679 cave[x][y+1] = Xspring_e;
4684 next[x][y] = Xstone;
4688 if (lev.wonderwall_time > 0)
4690 lev.wonderwall_active = TRUE;
4691 cave[x][y] = Ystone_sB;
4692 next[x][y] = Xblank;
4693 if (is_blank[cave[x][y+2]])
4695 cave[x][y+2] = Yemerald_s;
4696 next[x][y+2] = Xemerald_fall;
4698 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4703 cave[x][y] = Xstone;
4704 next[x][y] = Xstone;
4705 play_element_sound(x, y, SOUND_stone, Xstone);
4710 static void Lbomb(int x, int y)
4712 switch (cave[x][y+1])
4725 cave[x][y] = Ybomb_sB;
4726 next[x][y] = Xblank;
4727 cave[x][y+1] = Ybomb_s;
4728 next[x][y+1] = Xbomb_fall;
4739 cave[x][y] = Ybomb_sB;
4740 next[x][y] = Xblank;
4741 if (cave[x+1][y] == Xblank)
4742 cave[x+1][y] = Xsplash_e;
4743 if (cave[x-1][y] == Xblank)
4744 cave[x-1][y] = Xsplash_w;
4745 play_element_sound(x, y, SOUND_acid, Xacid_1);
4758 case Xemerald_pause:
4760 case Xdiamond_pause:
4795 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4797 cave[x][y] = Ybomb_eB;
4798 next[x][y] = Xblank;
4799 cave[x+1][y] = Ybomb_e;
4800 next[x+1][y] = Xbomb_pause;
4801 if (cave[x][y+1] == Xbumper)
4802 cave[x][y+1] = Ybumper;
4806 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4808 cave[x][y] = Ybomb_wB;
4809 next[x][y] = Xblank;
4810 cave[x-1][y] = Ybomb_w;
4811 next[x-1][y] = Xbomb_pause;
4812 if (cave[x][y+1] == Xbumper)
4813 cave[x][y+1] = Ybumper;
4819 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4821 cave[x][y] = Ybomb_wB;
4822 next[x][y] = Xblank;
4823 cave[x-1][y] = Ybomb_w;
4824 next[x-1][y] = Xbomb_pause;
4825 if (cave[x][y+1] == Xbumper)
4826 cave[x][y+1] = Ybumper;
4830 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4832 cave[x][y] = Ybomb_eB;
4833 next[x][y] = Xblank;
4834 cave[x+1][y] = Ybomb_e;
4835 next[x+1][y] = Xbomb_pause;
4836 if (cave[x][y+1] == Xbumper)
4837 cave[x][y+1] = Ybumper;
4844 static void Lbomb_pause(int x, int y)
4846 switch (cave[x][y+1])
4859 cave[x][y] = Ybomb_sB;
4860 next[x][y] = Xblank;
4861 cave[x][y+1] = Ybomb_s;
4862 next[x][y+1] = Xbomb_fall;
4873 cave[x][y] = Ybomb_sB;
4874 next[x][y] = Xblank;
4875 if (cave[x+1][y] == Xblank)
4876 cave[x+1][y] = Xsplash_e;
4877 if (cave[x-1][y] == Xblank)
4878 cave[x-1][y] = Xsplash_w;
4879 play_element_sound(x, y, SOUND_acid, Xacid_1);
4889 static void Lbomb_fall(int x, int y)
4891 switch (cave[x][y+1])
4904 cave[x][y] = Ybomb_sB;
4905 next[x][y] = Xblank;
4906 cave[x][y+1] = Ybomb_s;
4907 next[x][y+1] = Xbomb_fall;
4918 cave[x][y] = Ybomb_sB;
4919 next[x][y] = Xblank;
4920 if (cave[x+1][y] == Xblank)
4921 cave[x+1][y] = Xsplash_e;
4922 if (cave[x-1][y] == Xblank)
4923 cave[x-1][y] = Xsplash_w;
4924 play_element_sound(x, y, SOUND_acid, Xacid_1);
4928 cave[x][y] = Ybomb_blank;
4930 Lboom_tank_old(x, y);
4935 static void Lnut(int x, int y)
4937 switch (cave[x][y+1])
4950 cave[x][y] = Ynut_sB;
4951 next[x][y] = Xblank;
4952 cave[x][y+1] = Ynut_s;
4953 next[x][y+1] = Xnut_fall;
4964 cave[x][y] = Ynut_sB;
4965 next[x][y] = Xblank;
4966 if (cave[x+1][y] == Xblank)
4967 cave[x+1][y] = Xsplash_e;
4968 if (cave[x-1][y] == Xblank)
4969 cave[x-1][y] = Xsplash_w;
4970 play_element_sound(x, y, SOUND_acid, Xacid_1);
4983 case Xemerald_pause:
4985 case Xdiamond_pause:
5020 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5022 cave[x][y] = Ynut_eB;
5023 next[x][y] = Xblank;
5024 cave[x+1][y] = Ynut_e;
5025 next[x+1][y] = Xnut_pause;
5026 if (cave[x][y+1] == Xbumper)
5027 cave[x][y+1] = Ybumper;
5031 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5033 cave[x][y] = Ynut_wB;
5034 next[x][y] = Xblank;
5035 cave[x-1][y] = Ynut_w;
5036 next[x-1][y] = Xnut_pause;
5037 if (cave[x][y+1] == Xbumper)
5038 cave[x][y+1] = Ybumper;
5044 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5046 cave[x][y] = Ynut_wB;
5047 next[x][y] = Xblank;
5048 cave[x-1][y] = Ynut_w;
5049 next[x-1][y] = Xnut_pause;
5050 if (cave[x][y+1] == Xbumper)
5051 cave[x][y+1] = Ybumper;
5055 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5057 cave[x][y] = Ynut_eB;
5058 next[x][y] = Xblank;
5059 cave[x+1][y] = Ynut_e;
5060 next[x+1][y] = Xnut_pause;
5061 if (cave[x][y+1] == Xbumper)
5062 cave[x][y+1] = Ybumper;
5069 static void Lnut_pause(int x, int y)
5071 switch (cave[x][y+1])
5084 cave[x][y] = Ynut_sB;
5085 next[x][y] = Xblank;
5086 cave[x][y+1] = Ynut_s;
5087 next[x][y+1] = Xnut_fall;
5098 cave[x][y] = Ynut_sB;
5099 next[x][y] = Xblank;
5100 if (cave[x+1][y] == Xblank)
5101 cave[x+1][y] = Xsplash_e;
5102 if (cave[x-1][y] == Xblank)
5103 cave[x-1][y] = Xsplash_w;
5104 play_element_sound(x, y, SOUND_acid, Xacid_1);
5114 static void Lnut_fall(int x, int y)
5116 switch (cave[x][y+1])
5130 cave[x][y] = Ynut_sB;
5131 next[x][y] = Xblank;
5132 cave[x][y+1] = Ynut_s;
5133 next[x][y+1] = Xnut_fall;
5144 cave[x][y] = Ynut_sB;
5145 next[x][y] = Xblank;
5146 if (cave[x+1][y] == Xblank)
5147 cave[x+1][y] = Xsplash_e;
5148 if (cave[x-1][y] == Xblank)
5149 cave[x-1][y] = Xsplash_w;
5150 play_element_sound(x, y, SOUND_acid, Xacid_1);
5156 play_element_sound(x, y, SOUND_nut, Xnut);
5161 static void Lspring(int x, int y)
5163 switch (cave[x][y+1])
5178 cave[x][y] = Yspring_sB;
5179 next[x][y] = Xblank;
5180 cave[x][y+1] = Yspring_s;
5181 next[x][y+1] = Xspring_fall;
5192 cave[x][y] = Yspring_sB;
5193 next[x][y] = Xblank;
5194 if (cave[x+1][y] == Xblank)
5195 cave[x+1][y] = Xsplash_e;
5196 if (cave[x-1][y] == Xblank)
5197 cave[x-1][y] = Xsplash_w;
5198 play_element_sound(x, y, SOUND_acid, Xacid_1);
5211 case Xemerald_pause:
5213 case Xdiamond_pause:
5248 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5250 cave[x][y] = Yspring_eB;
5251 next[x][y] = Xblank;
5252 cave[x+1][y] = Yspring_e;
5254 next[x+1][y] = Xspring_e;
5256 next[x+1][y] = Xspring_pause;
5258 if (cave[x][y+1] == Xbumper)
5259 cave[x][y+1] = Ybumper;
5263 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5265 cave[x][y] = Yspring_wB;
5266 next[x][y] = Xblank;
5267 cave[x-1][y] = Yspring_w;
5269 next[x-1][y] = Xspring_w;
5271 next[x-1][y] = Xspring_pause;
5273 if (cave[x][y+1] == Xbumper)
5274 cave[x][y+1] = Ybumper;
5280 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5282 cave[x][y] = Yspring_wB;
5283 next[x][y] = Xblank;
5284 cave[x-1][y] = Yspring_w;
5286 next[x-1][y] = Xspring_w;
5288 next[x-1][y] = Xspring_pause;
5290 if (cave[x][y+1] == Xbumper)
5291 cave[x][y+1] = Ybumper;
5295 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5297 cave[x][y] = Yspring_eB;
5298 next[x][y] = Xblank;
5299 cave[x+1][y] = Yspring_e;
5301 next[x+1][y] = Xspring_e;
5303 next[x+1][y] = Xspring_pause;
5305 if (cave[x][y+1] == Xbumper)
5306 cave[x][y+1] = Ybumper;
5313 static void Lspring_pause(int x, int y)
5315 switch (cave[x][y+1])
5328 cave[x][y] = Yspring_sB;
5329 next[x][y] = Xblank;
5330 cave[x][y+1] = Yspring_s;
5331 next[x][y+1] = Xspring_fall;
5342 cave[x][y] = Yspring_sB;
5343 next[x][y] = Xblank;
5344 if (cave[x+1][y] == Xblank)
5345 cave[x+1][y] = Xsplash_e;
5346 if (cave[x-1][y] == Xblank)
5347 cave[x-1][y] = Xsplash_w;
5348 play_element_sound(x, y, SOUND_acid, Xacid_1);
5352 cave[x][y] = Xspring;
5353 next[x][y] = Xspring;
5358 static void Lspring_e(int x, int y)
5360 switch (cave[x][y+1])
5373 cave[x][y] = Yspring_sB;
5374 next[x][y] = Xblank;
5375 cave[x][y+1] = Yspring_s;
5376 next[x][y+1] = Xspring_fall;
5387 cave[x][y] = Yspring_sB;
5388 next[x][y] = Xblank;
5389 if (cave[x+1][y] == Xblank)
5390 cave[x+1][y] = Xsplash_e;
5391 if (cave[x-1][y] == Xblank)
5392 cave[x-1][y] = Xsplash_w;
5393 play_element_sound(x, y, SOUND_acid, Xacid_1);
5397 cave[x][y+1] = Ybumper;
5400 switch (cave[x+1][y])
5417 cave[x][y] = Yspring_eB;
5418 next[x][y] = Xblank;
5419 cave[x+1][y] = Yspring_e;
5420 next[x+1][y] = Xspring_e;
5431 cave[x][y] = Yspring_eB;
5432 next[x][y] = Xblank;
5433 if (cave[x+2][y-1] == Xblank)
5434 cave[x+2][y-1] = Xsplash_e;
5435 if (cave[x][y-1] == Xblank)
5436 cave[x][y-1] = Xsplash_w;
5437 play_element_sound(x, y, SOUND_acid, Xacid_1);
5446 cave[x][y] = Yspring_alien_eB;
5447 next[x][y] = Xblank;
5448 cave[x+1][y] = Yspring_alien_e;
5449 next[x+1][y] = Xspring_e;
5450 play_element_sound(x, y, SOUND_slurp, Xalien);
5451 score += lev.slurp_score;
5456 cave[x+1][y] = Ybumper;
5457 next[x][y] = Xspring_w;
5458 play_element_sound(x, y, SOUND_spring, Xspring);
5462 cave[x][y] = Xspring;
5463 next[x][y] = Xspring;
5464 play_element_sound(x, y, SOUND_spring, Xspring);
5469 static void Lspring_w(int x, int y)
5471 switch (cave[x][y+1])
5484 cave[x][y] = Yspring_sB;
5485 next[x][y] = Xblank;
5486 cave[x][y+1] = Yspring_s;
5487 next[x][y+1] = Xspring_fall;
5498 cave[x][y] = Yspring_sB;
5499 next[x][y] = Xblank;
5500 if (cave[x+1][y] == Xblank)
5501 cave[x+1][y] = Xsplash_e;
5502 if (cave[x-1][y] == Xblank)
5503 cave[x-1][y] = Xsplash_w;
5504 play_element_sound(x, y, SOUND_acid, Xacid_1);
5508 cave[x][y+1] = Ybumper;
5511 switch (cave[x-1][y])
5528 cave[x][y] = Yspring_wB;
5529 next[x][y] = Xblank;
5530 cave[x-1][y] = Yspring_w;
5531 next[x-1][y] = Xspring_w;
5542 cave[x][y] = Yspring_wB;
5543 next[x][y] = Xblank;
5544 if (cave[x][y-1] == Xblank)
5545 cave[x][y-1] = Xsplash_e;
5546 if (cave[x-2][y-1] == Xblank)
5547 cave[x-2][y-1] = Xsplash_w;
5548 play_element_sound(x, y, SOUND_acid, Xacid_1);
5557 cave[x][y] = Yspring_alien_wB;
5558 next[x][y] = Xblank;
5559 cave[x-1][y] = Yspring_alien_w;
5560 next[x-1][y] = Xspring_w;
5561 play_element_sound(x, y, SOUND_slurp, Xalien);
5562 score += lev.slurp_score;
5567 cave[x-1][y] = Ybumper;
5568 next[x][y] = Xspring_e;
5569 play_element_sound(x, y, SOUND_spring, Xspring);
5573 cave[x][y] = Xspring;
5574 next[x][y] = Xspring;
5575 play_element_sound(x, y, SOUND_spring, Xspring);
5580 static void Lspring_fall(int x, int y)
5582 switch (cave[x][y+1])
5596 cave[x][y] = Yspring_sB;
5597 next[x][y] = Xblank;
5598 cave[x][y+1] = Yspring_s;
5599 next[x][y+1] = Xspring_fall;
5610 cave[x][y] = Yspring_sB;
5611 next[x][y] = Xblank;
5612 if (cave[x+1][y] == Xblank)
5613 cave[x+1][y] = Xsplash_e;
5614 if (cave[x-1][y] == Xblank)
5615 cave[x-1][y] = Xsplash_w;
5616 play_element_sound(x, y, SOUND_acid, Xacid_1);
5623 cave[x][y] = Yspring_sB;
5624 next[x][y] = Xblank;
5625 cave[x][y+1] = Yeater_spring;
5626 next[x][y+1] = Zeater;
5627 Lboom_eater_old(x, y+1);
5628 score += lev.eater_score;
5633 cave[x][y] = Yspring_sB;
5634 next[x][y] = Xblank;
5635 cave[x][y+1] = Yalien_spring;
5636 next[x][y+1] = Ztank;
5637 Lboom_tank_old(x, y+1);
5638 score += lev.alien_score;
5649 cave[x][y] = Yspring_sB;
5650 next[x][y] = Xblank;
5651 cave[x][y+1] = Ybug_spring;
5652 next[x][y+1] = Zbug;
5653 Lboom_bug_old(x, y+1);
5654 score += lev.bug_score;
5665 cave[x][y] = Yspring_sB;
5666 next[x][y] = Xblank;
5667 cave[x][y+1] = Ytank_spring;
5668 next[x][y+1] = Ztank;
5669 Lboom_tank_old(x, y+1);
5670 score += lev.tank_score;
5675 cave[x][y] = Xspring;
5676 next[x][y] = Xspring;
5677 cave[x][y+1] = Ybomb_blank;
5678 next[x][y+1] = Ztank;
5679 Lboom_tank_old(x, y+1);
5683 cave[x][y] = Xspring;
5684 next[x][y] = Xspring;
5685 play_element_sound(x, y, SOUND_spring, Xspring);
5690 static void Lpush_emerald_e(int x, int y)
5692 cave[x][y] = Yemerald_eB;
5693 next[x][y] = Xblank;
5695 switch (cave[x+1][y])
5719 if (cave[x+2][y-1] == Xblank)
5720 cave[x+2][y-1] = Xsplash_e;
5721 if (cave[x][y-1] == Xblank)
5722 cave[x][y-1] = Xsplash_w;
5723 play_element_sound(x, y, SOUND_acid, Xacid_1);
5728 cave[x+1][y] = Yemerald_e;
5729 next[x+1][y] = Xemerald_pause;
5732 static void Lpush_emerald_w(int x, int y)
5734 cave[x][y] = Yemerald_wB;
5735 next[x][y] = Xblank;
5737 switch (cave[x-1][y])
5761 if (cave[x][y-1] == Xblank)
5762 cave[x][y-1] = Xsplash_e;
5763 if (cave[x-2][y-1] == Xblank)
5764 cave[x-2][y-1] = Xsplash_w;
5765 play_element_sound(x, y, SOUND_acid, Xacid_1);
5770 cave[x-1][y] = Yemerald_w;
5771 next[x-1][y] = Xemerald_pause;
5774 static void Lpush_diamond_e(int x, int y)
5776 cave[x][y] = Ydiamond_eB;
5777 next[x][y] = Xblank;
5779 switch (cave[x+1][y])
5803 if (cave[x+2][y-1] == Xblank)
5804 cave[x+2][y-1] = Xsplash_e;
5805 if (cave[x][y-1] == Xblank)
5806 cave[x][y-1] = Xsplash_w;
5807 play_element_sound(x, y, SOUND_acid, Xacid_1);
5812 cave[x+1][y] = Ydiamond_e;
5813 next[x+1][y] = Xdiamond_pause;
5816 static void Lpush_diamond_w(int x, int y)
5818 cave[x][y] = Ydiamond_wB;
5819 next[x][y] = Xblank;
5821 switch (cave[x-1][y])
5845 if (cave[x][y-1] == Xblank)
5846 cave[x][y-1] = Xsplash_e;
5847 if (cave[x-2][y-1] == Xblank)
5848 cave[x-2][y-1] = Xsplash_w;
5849 play_element_sound(x, y, SOUND_acid, Xacid_1);
5854 cave[x-1][y] = Ydiamond_w;
5855 next[x-1][y] = Xdiamond_pause;
5858 static void Lpush_stone_e(int x, int y)
5860 cave[x][y] = Ystone_eB;
5861 next[x][y] = Xblank;
5863 switch (cave[x+1][y])
5887 if (cave[x+2][y-1] == Xblank)
5888 cave[x+2][y-1] = Xsplash_e;
5889 if (cave[x][y-1] == Xblank)
5890 cave[x][y-1] = Xsplash_w;
5891 play_element_sound(x, y, SOUND_acid, Xacid_1);
5896 cave[x+1][y] = Ystone_e;
5897 next[x+1][y] = Xstone_pause;
5900 static void Lpush_stone_w(int x, int y)
5902 cave[x][y] = Ystone_wB;
5903 next[x][y] = Xblank;
5905 switch (cave[x-1][y])
5929 if (cave[x][y-1] == Xblank)
5930 cave[x][y-1] = Xsplash_e;
5931 if (cave[x-2][y-1] == Xblank)
5932 cave[x-2][y-1] = Xsplash_w;
5933 play_element_sound(x, y, SOUND_acid, Xacid_1);
5938 cave[x-1][y] = Ystone_w;
5939 next[x-1][y] = Xstone_pause;
5942 static void Lpush_bomb_e(int x, int y)
5944 cave[x][y] = Ybomb_eB;
5945 next[x][y] = Xblank;
5947 switch (cave[x+1][y])
5971 if (cave[x+2][y-1] == Xblank)
5972 cave[x+2][y-1] = Xsplash_e;
5973 if (cave[x][y-1] == Xblank)
5974 cave[x][y-1] = Xsplash_w;
5975 play_element_sound(x, y, SOUND_acid, Xacid_1);
5980 cave[x+1][y] = Ybomb_e;
5981 next[x+1][y] = Xbomb_pause;
5984 static void Lpush_bomb_w(int x, int y)
5986 cave[x][y] = Ybomb_wB;
5987 next[x][y] = Xblank;
5989 switch (cave[x-1][y])
6013 if (cave[x][y-1] == Xblank)
6014 cave[x][y-1] = Xsplash_e;
6015 if (cave[x-2][y-1] == Xblank)
6016 cave[x-2][y-1] = Xsplash_w;
6017 play_element_sound(x, y, SOUND_acid, Xacid_1);
6022 cave[x-1][y] = Ybomb_w;
6023 next[x-1][y] = Xbomb_pause;
6026 static void Lpush_nut_e(int x, int y)
6028 cave[x][y] = Ynut_eB;
6029 next[x][y] = Xblank;
6031 switch (cave[x+1][y])
6055 if (cave[x+2][y-1] == Xblank)
6056 cave[x+2][y-1] = Xsplash_e;
6057 if (cave[x][y-1] == Xblank)
6058 cave[x][y-1] = Xsplash_w;
6059 play_element_sound(x, y, SOUND_acid, Xacid_1);
6064 cave[x+1][y] = Ynut_e;
6065 next[x+1][y] = Xnut_pause;
6068 static void Lpush_nut_w(int x, int y)
6070 cave[x][y] = Ynut_wB;
6071 next[x][y] = Xblank;
6073 switch (cave[x-1][y])
6097 if (cave[x][y-1] == Xblank)
6098 cave[x][y-1] = Xsplash_e;
6099 if (cave[x-2][y-1] == Xblank)
6100 cave[x-2][y-1] = Xsplash_w;
6101 play_element_sound(x, y, SOUND_acid, Xacid_1);
6106 cave[x-1][y] = Ynut_w;
6107 next[x-1][y] = Xnut_pause;
6110 static void Lpush_spring_e(int x, int y)
6112 cave[x][y] = Yspring_eB;
6113 next[x][y] = Xblank;
6115 switch (cave[x+1][y])
6139 if (cave[x+2][y-1] == Xblank)
6140 cave[x+2][y-1] = Xsplash_e;
6141 if (cave[x][y-1] == Xblank)
6142 cave[x][y-1] = Xsplash_w;
6143 play_element_sound(x, y, SOUND_acid, Xacid_1);
6148 cave[x+1][y] = Yspring_e;
6149 next[x+1][y] = Xspring_e;
6152 static void Lpush_spring_w(int x, int y)
6154 cave[x][y] = Yspring_wB;
6155 next[x][y] = Xblank;
6157 switch (cave[x-1][y])
6181 if (cave[x][y-1] == Xblank)
6182 cave[x][y-1] = Xsplash_e;
6183 if (cave[x-2][y-1] == Xblank)
6184 cave[x-2][y-1] = Xsplash_w;
6185 play_element_sound(x, y, SOUND_acid, Xacid_1);
6190 cave[x-1][y] = Yspring_w;
6191 next[x-1][y] = Xspring_w;
6194 static void Ldynamite_1(int x, int y)
6196 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
6197 next[x][y] = Xdynamite_2;
6200 static void Ldynamite_2(int x, int y)
6202 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
6203 next[x][y] = Xdynamite_3;
6206 static void Ldynamite_3(int x, int y)
6208 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
6209 next[x][y] = Xdynamite_4;
6212 static void Ldynamite_4(int x, int y)
6214 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
6215 next[x][y] = Zdynamite;
6217 Lboom_generic(x, y, Xblank, Xblank);
6220 static void Lfake_door_1(int x, int y)
6222 if (lev.magnify_cnt)
6223 cave[x][y] = Xdoor_1;
6226 static void Lfake_door_2(int x, int y)
6228 if (lev.magnify_cnt)
6229 cave[x][y] = Xdoor_2;
6232 static void Lfake_door_3(int x, int y)
6234 if (lev.magnify_cnt)
6235 cave[x][y] = Xdoor_3;
6238 static void Lfake_door_4(int x, int y)
6240 if (lev.magnify_cnt)
6241 cave[x][y] = Xdoor_4;
6244 static void Lfake_door_5(int x, int y)
6246 if (lev.magnify_cnt)
6247 cave[x][y] = Xdoor_5;
6250 static void Lfake_door_6(int x, int y)
6252 if (lev.magnify_cnt)
6253 cave[x][y] = Xdoor_6;
6256 static void Lfake_door_7(int x, int y)
6258 if (lev.magnify_cnt)
6259 cave[x][y] = Xdoor_7;
6262 static void Lfake_door_8(int x, int y)
6264 if (lev.magnify_cnt)
6265 cave[x][y] = Xdoor_8;
6268 static void Lballoon(int x, int y)
6270 if (lev.wind_cnt == 0)
6273 switch (lev.wind_direction)
6276 switch (cave[x][y-1])
6289 cave[x][y] = Yballoon_nB;
6290 next[x][y] = Xblank;
6291 cave[x][y-1] = Yballoon_n;
6292 next[x][y-1] = Xballoon;
6303 cave[x][y] = Yballoon_nB;
6304 next[x][y] = Xblank;
6305 if (cave[x+1][y-2] == Xblank)
6306 cave[x+1][y-2] = Xsplash_e;
6307 if (cave[x-1][y-2] == Xblank)
6308 cave[x-1][y-2] = Xsplash_w;
6309 play_element_sound(x, y, SOUND_acid, Xacid_1);
6315 switch (cave[x+1][y])
6328 cave[x][y] = Yballoon_eB;
6329 next[x][y] = Xblank;
6330 cave[x+1][y] = Yballoon_e;
6331 next[x+1][y] = Xballoon;
6342 cave[x][y] = Yballoon_eB;
6343 next[x][y] = Xblank;
6344 if (cave[x+2][y-1] == Xblank)
6345 cave[x+2][y-1] = Xsplash_e;
6346 if (cave[x][y-1] == Xblank)
6347 cave[x][y-1] = Xsplash_w;
6348 play_element_sound(x, y, SOUND_acid, Xacid_1);
6354 switch (cave[x][y+1])
6367 cave[x][y] = Yballoon_sB;
6368 next[x][y] = Xblank;
6369 cave[x][y+1] = Yballoon_s;
6370 next[x][y+1] = Xballoon;
6381 cave[x][y] = Yballoon_sB;
6382 next[x][y] = Xblank;
6383 if (cave[x+1][y] == Xblank)
6384 cave[x+1][y] = Xsplash_e;
6385 if (cave[x-1][y] == Xblank)
6386 cave[x-1][y] = Xsplash_w;
6387 play_element_sound(x, y, SOUND_acid, Xacid_1);
6393 switch (cave[x-1][y])
6406 cave[x][y] = Yballoon_wB;
6407 next[x][y] = Xblank;
6408 cave[x-1][y] = Yballoon_w;
6409 next[x-1][y] = Xballoon;
6420 cave[x][y] = Yballoon_wB;
6421 next[x][y] = Xblank;
6422 if (cave[x][y-1] == Xblank)
6423 cave[x][y-1] = Xsplash_e;
6424 if (cave[x-2][y-1] == Xblank)
6425 cave[x-2][y-1] = Xsplash_w;
6426 play_element_sound(x, y, SOUND_acid, Xacid_1);
6433 static void Lball_common(int x, int y)
6435 play_element_sound(x, y, SOUND_ball, Xball_1);
6437 if (lev.ball_random)
6442 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6443 is_blank[cave[x-1][y-1]])
6445 cave[x-1][y-1] = Yball_blank;
6446 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6451 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6452 is_blank[cave[x][y-1]])
6454 cave[x][y-1] = Yball_blank;
6455 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6460 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6461 is_blank[cave[x+1][y-1]])
6463 cave[x+1][y-1] = Yball_blank;
6464 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6469 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6470 is_blank[cave[x-1][y]])
6472 cave[x-1][y] = Yball_blank;
6473 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6478 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6479 is_blank[cave[x+1][y]])
6481 cave[x+1][y] = Yball_blank;
6482 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6487 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6488 is_blank[cave[x-1][y+1]])
6490 cave[x-1][y+1] = Yball_blank;
6491 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6496 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6497 is_blank[cave[x][y+1]])
6499 cave[x][y+1] = Yball_blank;
6500 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6505 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6506 is_blank[cave[x+1][y+1]])
6508 cave[x+1][y+1] = Yball_blank;
6509 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6516 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6517 is_blank[cave[x-1][y-1]])
6519 cave[x-1][y-1] = Yball_blank;
6520 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6523 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6524 is_blank[cave[x][y-1]])
6526 cave[x][y-1] = Yball_blank;
6527 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6530 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6531 is_blank[cave[x+1][y-1]])
6533 cave[x+1][y-1] = Yball_blank;
6534 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6537 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6538 is_blank[cave[x-1][y]])
6540 cave[x-1][y] = Yball_blank;
6541 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6544 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6545 is_blank[cave[x+1][y]])
6547 cave[x+1][y] = Yball_blank;
6548 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6551 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6552 is_blank[cave[x-1][y+1]])
6554 cave[x-1][y+1] = Yball_blank;
6555 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6558 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6559 is_blank[cave[x][y+1]])
6561 cave[x][y+1] = Yball_blank;
6562 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6565 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6566 is_blank[cave[x+1][y+1]])
6568 cave[x+1][y+1] = Yball_blank;
6569 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6573 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
6576 static void Lball_1(int x, int y)
6578 if (!lev.ball_active)
6581 cave[x][y] = Yball_1;
6582 next[x][y] = Xball_2;
6589 static void Lball_2(int x, int y)
6591 if (!lev.ball_active)
6594 cave[x][y] = Yball_2;
6595 next[x][y] = Xball_1;
6602 static void Ldrip(int x, int y)
6604 next[x][y] = Xdrip_fall;
6607 static void Ldrip_fall(int x, int y)
6611 switch (cave[x][y+1])
6627 cave[x][y] = Ydrip_1_sB;
6628 next[x][y] = Xdrip_stretchB;
6629 cave[x][y+1] = Ydrip_1_s;
6630 next[x][y+1] = Xdrip_stretch;
6641 cave[x][y] = Ydrip_1_sB;
6642 next[x][y] = Xdrip_stretchB;
6643 if (cave[x+1][y] == Xblank)
6644 cave[x+1][y] = Xsplash_e;
6645 if (cave[x-1][y] == Xblank)
6646 cave[x-1][y] = Xsplash_w;
6647 play_element_sound(x, y, SOUND_acid, Xacid_1);
6653 case 0: temp = Xamoeba_1; break;
6654 case 1: temp = Xamoeba_2; break;
6655 case 2: temp = Xamoeba_3; break;
6656 case 3: temp = Xamoeba_4; break;
6657 case 4: temp = Xamoeba_5; break;
6658 case 5: temp = Xamoeba_6; break;
6659 case 6: temp = Xamoeba_7; break;
6660 case 7: temp = Xamoeba_8; break;
6665 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
6670 static void Ldrip_stretch(int x, int y)
6672 cave[x][y] = Ydrip_2_s;
6673 next[x][y] = Xdrip_fall;
6676 static void Ldrip_stretchB(int x, int y)
6678 cave[x][y] = Ydrip_2_sB;
6679 next[x][y] = Xblank;
6682 static void Lwonderwall(int x, int y)
6684 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
6686 cave[x][y] = Ywonderwall;
6687 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
6691 static void Lwheel(int x, int y)
6693 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
6694 cave[x][y] = Ywheel;
6697 static void Lswitch(int x, int y)
6699 if (lev.ball_active)
6700 cave[x][y] = Yswitch;
6703 static void Lfake_blank(int x, int y)
6706 cave[x][y] = Yfake_blank;
6709 static void Lfake_grass(int x, int y)
6711 if (lev.magnify_cnt)
6712 cave[x][y] = Yfake_grass;
6715 static void Lfake_amoeba(int x, int y)
6718 cave[x][y] = Yfake_amoeba;
6721 static void Lsand_stone(int x, int y)
6723 switch (cave[x][y+1])
6736 cave[x][y] = Xsand_stonesand_quickout_1;
6737 next[x][y] = Xsand_stonesand_quickout_2;
6738 cave[x][y+1] = Xsand_stoneout_1;
6739 next[x][y+1] = Xsand_stoneout_2;
6750 cave[x][y] = Xsand_stonesand_quickout_1;
6751 next[x][y] = Xsand_stonesand_quickout_2;
6752 if (cave[x+1][y] == Xblank)
6753 cave[x+1][y] = Xsplash_e;
6754 if (cave[x-1][y] == Xblank)
6755 cave[x-1][y] = Xsplash_w;
6756 play_element_sound(x, y, SOUND_acid, Xacid_1);
6760 cave[x][y] = Xsand_stonesand_1;
6761 next[x][y] = Xsand_stonesand_2;
6762 cave[x][y+1] = Xsand_sandstone_1;
6763 next[x][y+1] = Xsand_sandstone_2;
6768 static void Lsand_stonein_1(int x, int y)
6770 next[x][y] = Xsand_stonein_2;
6773 static void Lsand_stonein_2(int x, int y)
6775 next[x][y] = Xsand_stonein_3;
6778 static void Lsand_stonein_3(int x, int y)
6780 next[x][y] = Xsand_stonein_4;
6783 static void Lsand_stonein_4(int x, int y)
6785 next[x][y] = Xblank;
6788 static void Lsand_sandstone_1(int x, int y)
6790 next[x][y] = Xsand_sandstone_2;
6793 static void Lsand_sandstone_2(int x, int y)
6795 next[x][y] = Xsand_sandstone_3;
6798 static void Lsand_sandstone_3(int x, int y)
6800 next[x][y] = Xsand_sandstone_4;
6803 static void Lsand_sandstone_4(int x, int y)
6805 next[x][y] = Xsand_stone;
6808 static void Lsand_stonesand_1(int x, int y)
6810 next[x][y] = Xsand_stonesand_2;
6813 static void Lsand_stonesand_2(int x, int y)
6815 next[x][y] = Xsand_stonesand_3;
6818 static void Lsand_stonesand_3(int x, int y)
6820 next[x][y] = Xsand_stonesand_4;
6823 static void Lsand_stonesand_4(int x, int y)
6828 static void Lsand_stoneout_1(int x, int y)
6830 next[x][y] = Xsand_stoneout_2;
6833 static void Lsand_stoneout_2(int x, int y)
6835 next[x][y] = Xstone_fall;
6838 static void Lsand_stonesand_quickout_1(int x, int y)
6840 next[x][y] = Xsand_stonesand_quickout_2;
6843 static void Lsand_stonesand_quickout_2(int x, int y)
6848 static void Lslide_ns(int x, int y)
6850 if (is_blank[cave[x][y-1]])
6852 cave[x][y-1] = Yslide_ns_blank;
6853 next[x][y-1] = Xslide_ns;
6854 play_element_sound(x, y, SOUND_slide, Xslide_ns);
6857 if (is_blank[cave[x][y+1]])
6859 cave[x][y+1] = Yslide_ns_blank;
6860 next[x][y+1] = Xslide_ns;
6861 play_element_sound(x, y, SOUND_slide, Xslide_ns);
6865 static void Lslide_ew(int x, int y)
6867 if (is_blank[cave[x+1][y]])
6869 cave[x+1][y] = Yslide_ew_blank;
6870 next[x+1][y] = Xslide_ew;
6871 play_element_sound(x, y, SOUND_slide, Xslide_ew);
6874 if (is_blank[cave[x-1][y]])
6876 cave[x-1][y] = Yslide_ew_blank;
6877 next[x-1][y] = Xslide_ew;
6878 play_element_sound(x, y, SOUND_slide, Xslide_ew);
6882 static void Lexit(int x, int y)
6884 if (lev.gems_needed > 0)
6887 switch (RANDOM(64) / 21)
6890 cave[x][y] = Xexit_1;
6891 next[x][y] = Xexit_2;
6895 cave[x][y] = Xexit_2;
6896 next[x][y] = Xexit_3;
6900 cave[x][y] = Xexit_3;
6901 next[x][y] = Xexit_1;
6905 play_element_sound(x, y, SOUND_exit_open, Xexit);
6908 static void Lexit_1(int x, int y)
6910 next[x][y] = Xexit_2;
6913 static void Lexit_2(int x, int y)
6915 next[x][y] = Xexit_3;
6918 static void Lexit_3(int x, int y)
6920 next[x][y] = Xexit_1;
6923 static void Lpause(int x, int y)
6925 next[x][y] = Xblank;
6928 static void Lamoeba(int x, int y)
6948 if (is_amoeba[cave[x][y-1]] ||
6949 is_amoeba[cave[x+1][y]] ||
6950 is_amoeba[cave[x][y+1]] ||
6951 is_amoeba[cave[x-1][y]])
6956 static void Lboom_one(int x, int y, boolean by_dynamite)
7017 cave[x][y] = Xboom_android;
7028 cave[x][y] = Xboom_bug;
7029 Lboom_bug_new(x, y, TRUE);
7035 cave[x][y] = Xboom_tank;
7036 Lboom_tank_new(x, y, TRUE);
7040 cave[x][y] = Xboom_1;
7045 static void Lboom_nine(int x, int y, boolean by_dynamite)
7047 Lboom_one(x, y-1, by_dynamite);
7048 Lboom_one(x-1, y, by_dynamite);
7049 Lboom_one(x+1, y, by_dynamite);
7050 Lboom_one(x, y+1, by_dynamite);
7051 Lboom_one(x-1, y-1, by_dynamite);
7052 Lboom_one(x+1, y-1, by_dynamite);
7053 Lboom_one(x-1, y+1, by_dynamite);
7054 Lboom_one(x+1, y+1, by_dynamite);
7056 cave[x][y] = Xboom_1;
7059 static void Lexplode(int x, int y)
7064 Lboom_bug_new(x, y, FALSE);
7065 Lboom_nine(x, y, FALSE);
7069 Lboom_tank_new(x, y, FALSE);
7070 Lboom_nine(x, y, FALSE);
7074 Lboom_eater_new(x, y, FALSE);
7075 Lboom_nine(x, y, FALSE);
7079 Lboom_nine(x, y, TRUE);
7083 Lboom_nine(x, y, FALSE);
7088 static void Lboom_1(int x, int y)
7090 next[x][y] = Xboom_2;
7091 #if !PLAY_ELEMENT_SOUND
7092 if (x != lev.exit_x && y != lev.exit_y)
7093 play_sound(x, y, SOUND_boom);
7095 lev.exit_x = lev.exit_y = -1;
7099 static void Lboom_2(int x, int y)
7101 next[x][y] = boom[x][y];
7104 static void Lboom_android(int x, int y)
7106 #if PLAY_ELEMENT_SOUND
7107 play_element_sound(x, y, SOUND_boom, Xandroid);
7113 static void Lchain(int x, int y)
7118 static void handle_tile(int x, int y)
7122 case Xacid_1: Lacid_1(x, y); break;
7123 case Xacid_2: Lacid_2(x, y); break;
7124 case Xacid_3: Lacid_3(x, y); break;
7125 case Xacid_4: Lacid_4(x, y); break;
7126 case Xacid_5: Lacid_5(x, y); break;
7127 case Xacid_6: Lacid_6(x, y); break;
7128 case Xacid_7: Lacid_7(x, y); break;
7129 case Xacid_8: Lacid_8(x, y); break;
7131 case Xfake_acid_1: Lfake_acid_1(x, y); break;
7132 case Xfake_acid_2: Lfake_acid_2(x, y); break;
7133 case Xfake_acid_3: Lfake_acid_3(x, y); break;
7134 case Xfake_acid_4: Lfake_acid_4(x, y); break;
7135 case Xfake_acid_5: Lfake_acid_5(x, y); break;
7136 case Xfake_acid_6: Lfake_acid_6(x, y); break;
7137 case Xfake_acid_7: Lfake_acid_7(x, y); break;
7138 case Xfake_acid_8: Lfake_acid_8(x, y); break;
7140 case Xandroid: Landroid(x, y); break;
7141 case Xandroid_1_n: Landroid_1_n(x, y); break;
7142 case Xandroid_2_n: Landroid_2_n(x, y); break;
7143 case Xandroid_1_e: Landroid_1_e(x, y); break;
7144 case Xandroid_2_e: Landroid_2_e(x, y); break;
7145 case Xandroid_1_s: Landroid_1_s(x, y); break;
7146 case Xandroid_2_s: Landroid_2_s(x, y); break;
7147 case Xandroid_1_w: Landroid_1_w(x, y); break;
7148 case Xandroid_2_w: Landroid_2_w(x, y); break;
7150 case Xeater_n: Leater_n(x, y); break;
7151 case Xeater_e: Leater_e(x, y); break;
7152 case Xeater_s: Leater_s(x, y); break;
7153 case Xeater_w: Leater_w(x, y); break;
7155 case Xalien: Lalien(x, y); break;
7156 case Xalien_pause: Lalien_pause(x, y); break;
7158 case Xbug_1_n: Lbug_1_n(x, y); break;
7159 case Xbug_2_n: Lbug_2_n(x, y); break;
7160 case Xbug_1_e: Lbug_1_e(x, y); break;
7161 case Xbug_2_e: Lbug_2_e(x, y); break;
7162 case Xbug_1_s: Lbug_1_s(x, y); break;
7163 case Xbug_2_s: Lbug_2_s(x, y); break;
7164 case Xbug_1_w: Lbug_1_w(x, y); break;
7165 case Xbug_2_w: Lbug_2_w(x, y); break;
7167 case Xtank_1_n: Ltank_1_n(x, y); break;
7168 case Xtank_2_n: Ltank_2_n(x, y); break;
7169 case Xtank_1_e: Ltank_1_e(x, y); break;
7170 case Xtank_2_e: Ltank_2_e(x, y); break;
7171 case Xtank_1_s: Ltank_1_s(x, y); break;
7172 case Xtank_2_s: Ltank_2_s(x, y); break;
7173 case Xtank_1_w: Ltank_1_w(x, y); break;
7174 case Xtank_2_w: Ltank_2_w(x, y); break;
7176 case Xemerald: Lemerald(x, y); break;
7177 case Xemerald_pause: Lemerald_pause(x, y); break;
7178 case Xemerald_fall: Lemerald_fall(x, y); break;
7180 case Xdiamond: Ldiamond(x, y); break;
7181 case Xdiamond_pause: Ldiamond_pause(x, y); break;
7182 case Xdiamond_fall: Ldiamond_fall(x, y); break;
7184 case Xstone: Lstone(x, y); break;
7185 case Xstone_pause: Lstone_pause(x, y); break;
7186 case Xstone_fall: Lstone_fall(x, y); break;
7188 case Xbomb: Lbomb(x, y); break;
7189 case Xbomb_pause: Lbomb_pause(x, y); break;
7190 case Xbomb_fall: Lbomb_fall(x, y); break;
7192 case Xnut: Lnut(x, y); break;
7193 case Xnut_pause: Lnut_pause(x, y); break;
7194 case Xnut_fall: Lnut_fall(x, y); break;
7196 case Xspring: Lspring(x, y); break;
7197 case Xspring_pause: Lspring_pause(x, y); break;
7198 case Xspring_e: Lspring_e(x, y); break;
7199 case Xspring_w: Lspring_w(x, y); break;
7200 case Xspring_fall: Lspring_fall(x, y); break;
7202 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
7203 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
7204 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
7205 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
7206 case Xpush_stone_e: Lpush_stone_e(x, y); break;
7207 case Xpush_stone_w: Lpush_stone_w(x, y); break;
7208 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
7209 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
7210 case Xpush_nut_e: Lpush_nut_e(x, y); break;
7211 case Xpush_nut_w: Lpush_nut_w(x, y); break;
7212 case Xpush_spring_e: Lpush_spring_e(x, y); break;
7213 case Xpush_spring_w: Lpush_spring_w(x, y); break;
7215 case Xdynamite_1: Ldynamite_1(x, y); break;
7216 case Xdynamite_2: Ldynamite_2(x, y); break;
7217 case Xdynamite_3: Ldynamite_3(x, y); break;
7218 case Xdynamite_4: Ldynamite_4(x, y); break;
7220 case Xfake_door_1: Lfake_door_1(x, y); break;
7221 case Xfake_door_2: Lfake_door_2(x, y); break;
7222 case Xfake_door_3: Lfake_door_3(x, y); break;
7223 case Xfake_door_4: Lfake_door_4(x, y); break;
7224 case Xfake_door_5: Lfake_door_5(x, y); break;
7225 case Xfake_door_6: Lfake_door_6(x, y); break;
7226 case Xfake_door_7: Lfake_door_7(x, y); break;
7227 case Xfake_door_8: Lfake_door_8(x, y); break;
7229 case Xballoon: Lballoon(x, y); break;
7231 case Xball_1: Lball_1(x, y); break;
7232 case Xball_2: Lball_2(x, y); break;
7234 case Xdrip: Ldrip(x, y); break;
7235 case Xdrip_fall: Ldrip_fall(x, y); break;
7236 case Xdrip_stretch: Ldrip_stretch(x, y); break;
7237 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
7239 case Xwonderwall: Lwonderwall(x, y); break;
7241 case Xwheel: Lwheel(x, y); break;
7243 case Xswitch: Lswitch(x, y); break;
7245 case Xfake_blank: Lfake_blank(x, y); break;
7246 case Xfake_grass: Lfake_grass(x, y); break;
7247 case Xfake_amoeba: Lfake_amoeba(x, y); break;
7249 case Xsand_stone: Lsand_stone(x, y); break;
7250 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
7251 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
7252 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
7253 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
7254 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
7255 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
7256 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
7257 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
7258 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
7259 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
7260 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
7261 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
7262 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
7263 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
7264 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
7265 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
7267 case Xslide_ns: Lslide_ns(x, y); break;
7268 case Xslide_ew: Lslide_ew(x, y); break;
7270 case Xexit: Lexit(x, y); break;
7271 case Xexit_1: Lexit_1(x, y); break;
7272 case Xexit_2: Lexit_2(x, y); break;
7273 case Xexit_3: Lexit_3(x, y); break;
7275 case Xpause: Lpause(x, y); break;
7277 case Xchain: Lchain(x, y); break;
7278 case Xboom_bug: Lboom_bug(x, y); break;
7279 case Xboom_tank: Lboom_tank(x, y); break;
7280 case Xboom_android: Lboom_android(x, y); break;
7281 case Xboom_1: Lboom_1(x, y); break;
7282 case Xboom_2: Lboom_2(x, y); break;
7286 static void logic_players(void)
7295 game_em.any_player_moving = FALSE;
7296 game_em.any_player_snapping = FALSE;
7298 /* must test for death and actually kill separately */
7299 for (i = 0; i < MAX_PLAYERS; i++)
7301 boolean ply_kill = player_killed(&ply[i]);
7303 if (ply[i].alive && ply_kill)
7304 kill_player(&ply[i]);
7307 for (i = 0; i < MAX_PLAYERS; i++)
7312 /* check for wrap-around movement */
7313 if (ply[i].x < lev.left ||
7314 ply[i].x > lev.right - 1)
7316 ply[i].x = (ply[i].x < lev.left ? lev.right - 1 : lev.left);
7318 game.centered_player_nr_next = i;
7319 game.set_centered_player = TRUE;
7320 game.set_centered_player_wrap = TRUE;
7323 ply[i].prev_x = ply[i].x;
7324 ply[i].prev_y = ply[i].y;
7325 ply[i].anim = PLY_still;
7328 start_check_nr = ((game_em.random & 128 ? 0 : 1) * 2 +
7329 (game_em.random & 256 ? 0 : 1));
7331 for (i = 0; i < MAX_PLAYERS; i++)
7333 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
7335 if (ply[check_nr].alive)
7336 check_player(&ply[check_nr]);
7339 for (i = 0; i < MAX_PLAYERS; i++)
7344 if (cave[ply[i].prev_x][ply[i].prev_y] == Zplayer)
7346 cave[ply[i].prev_x][ply[i].prev_y] = Xblank;
7347 next[ply[i].prev_x][ply[i].prev_y] = Xblank;
7350 if (cave[ply[i].x][ply[i].y] == Xblank)
7352 cave[ply[i].x][ply[i].y] = Zplayer;
7353 next[ply[i].x][ply[i].y] = Zplayer;
7358 static void logic_objects(void)
7366 seed = game_em.random;
7369 for (y = lev.top; y < lev.bottom; y++)
7370 for (x = lev.left; x < lev.right; x++)
7373 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
7374 lev.score += score; /* only add a score if someone is alive */
7376 game_em.game_over = TRUE;
7378 game_em.random = seed;
7380 /* triple buffering */
7381 void *temp = lev.cave;
7382 lev.cave = lev.next;
7383 lev.next = lev.draw;
7387 static void logic_globals(void)
7392 unsigned int random;
7398 /* update variables */
7400 if (lev.score > 9999)
7403 if (lev.android_move_cnt-- == 0)
7404 lev.android_move_cnt = lev.android_move_time;
7405 if (lev.android_clone_cnt-- == 0)
7406 lev.android_clone_cnt = lev.android_clone_time;
7407 if (lev.ball_active)
7408 if (lev.ball_cnt-- == 0)
7409 lev.ball_cnt = lev.ball_time;
7412 if (lev.magnify_cnt)
7418 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7419 lev.wonderwall_time--;
7422 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
7426 random = game_em.random;
7428 for (count = lev.amoeba_time; count--;)
7430 x = lev.left - 1 + (random >> 10) % (CAVE_WIDTH + 2);
7431 y = lev.top - 1 + (random >> 20) % (CAVE_HEIGHT + 2);
7433 if (x >= lev.left && x < lev.right &&
7434 y >= lev.top && y < lev.bottom)
7437 random = random * 129 + 1;
7440 game_em.random = random;
7442 /* handle explosions */
7444 for (y = lev.top; y < lev.bottom; y++)
7445 for (x = lev.left; x < lev.right; x++)
7448 /* triple buffering */
7450 for (y = lev.top; y < lev.bottom; y++)
7451 for (x = lev.left; x < lev.right; x++)
7452 next[x][y] = cave[x][y];