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 */
14 #define USE_CHANGED_ACID_STUFF
16 #define RANDOM_RAW (seed = seed << 31 | seed >> 1)
17 #define RANDOM(x) (RANDOM_RAW & (x - 1))
19 static short **cave, **next, **boom;
20 static unsigned int seed;
23 static const byte is_blank[GAME_TILE_MAX] =
38 static const byte is_blank_or_acid[GAME_TILE_MAX] =
61 static const byte is_fake_acid[GAME_TILE_MAX] =
73 static const byte is_amoeba[GAME_TILE_MAX] =
87 static const byte is_android_walkable[GAME_TILE_MAX] =
103 static void Lboom_generic(int x, int y, int element, int element_middle)
105 boom[x-1][y-1] = element;
106 boom[x][y-1] = element;
107 boom[x+1][y-1] = element;
108 boom[x-1][y] = element;
109 boom[x][y] = element_middle;
110 boom[x+1][y] = element;
111 boom[x-1][y+1] = element;
112 boom[x][y+1] = element;
113 boom[x+1][y+1] = element;
116 static void Lboom_bug(int x, int y)
118 if (game_em.use_old_explosions)
121 Lboom_generic(x, y, Xemerald, Xdiamond);
123 #if PLAY_ELEMENT_SOUND
124 play_element_sound(x, y, SOUND_boom, Xbug_1_n);
128 static void Lboom_tank(int x, int y)
130 if (game_em.use_old_explosions)
133 Lboom_generic(x, y, Xblank, Xblank);
135 #if PLAY_ELEMENT_SOUND
136 play_element_sound(x, y, SOUND_boom, Xtank_1_n);
140 static void Lboom_eater(int x, int y)
142 if (game_em.use_old_explosions)
145 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
146 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
147 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
148 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
149 boom[x][y] = lev.eater_array[lev.eater_pos][4];
150 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
151 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
152 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
153 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
155 lev.eater_pos = (lev.eater_pos + 1) & 7;
157 #if PLAY_ELEMENT_SOUND
158 play_element_sound(x, y, SOUND_boom, Xeater_n);
162 static void Lboom_bug_old(int x, int y)
164 if (!game_em.use_old_explosions)
170 static void Lboom_tank_old(int x, int y)
172 if (!game_em.use_old_explosions)
178 static void Lboom_eater_old(int x, int y)
180 if (!game_em.use_old_explosions)
186 static void Lboom_bug_new(int x, int y, boolean chain_explosion)
188 if (game_em.use_old_explosions)
197 static void Lboom_tank_new(int x, int y, boolean chain_explosion)
199 if (game_em.use_old_explosions)
208 static void Lboom_eater_new(int x, int y, boolean chain_explosion)
210 if (game_em.use_old_explosions)
219 static boolean player_killed(struct PLAYER *ply)
227 if (lev.killed_out_of_time && setup.time_limit)
230 switch (cave[x][y-1])
251 switch (cave[x+1][y])
272 switch (cave[x][y+1])
293 switch (cave[x-1][y])
338 static void kill_player(struct PLAYER *ply)
345 switch (cave[x][y-1])
355 cave[x][y-1] = Xboom_bug;
356 Lboom_bug_new(x, y-1, TRUE);
367 cave[x][y-1] = Xboom_tank;
368 Lboom_tank_new(x, y-1, TRUE);
372 switch (cave[x+1][y])
382 cave[x+1][y] = Xboom_bug;
383 Lboom_bug_new(x+1, y, TRUE);
394 cave[x+1][y] = Xboom_tank;
395 Lboom_tank_new(x+1, y, TRUE);
399 switch (cave[x][y+1])
409 cave[x][y+1] = Xboom_bug;
410 Lboom_bug_new(x, y+1, TRUE);
421 cave[x][y+1] = Xboom_tank;
422 Lboom_tank_new(x, y+1, TRUE);
426 switch (cave[x-1][y])
436 cave[x-1][y] = Xboom_bug;
437 Lboom_bug_new(x-1, y, TRUE);
448 cave[x-1][y] = Xboom_tank;
449 Lboom_tank_new(x-1, y, TRUE);
460 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
464 play_element_sound(x, y, SOUND_die, Zplayer);
470 #ifdef USE_CHANGED_ACID_STUFF
483 cave[x][y] = Xboom_1;
489 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
491 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
496 boolean result = TRUE;
498 if (!dx && !dy) /* no direction specified */
501 if (dx && dy && ply->joy_snap) /* more than one direction specified */
504 if (!ply->joy_snap) /* player wants to move */
506 int element = cave[x][y];
510 /* fire is released */
514 cave[x][y] = Zplayer;
515 next[x][y] = Zplayer;
524 play_element_sound(x, y, SOUND_blank, Xblank);
525 ply->anim = PLY_walk_n + anim;
530 #ifdef USE_CHANGED_ACID_STUFF
539 if (cave[x+1][y-1] == Xblank)
540 cave[x+1][y-1] = Xsplash_e;
541 if (cave[x-1][y-1] == Xblank)
542 cave[x-1][y-1] = Xsplash_w;
543 play_element_sound(x, y, SOUND_acid, Xacid_1);
565 #ifndef USE_CHANGED_ACID_STUFF
575 ply->anim = PLY_walk_n + anim;
581 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
582 (dx > 0 ? Ygrass_eB : Ygrass_wB));
583 next[x][y] = Zplayer;
584 play_element_sound(x, y, SOUND_dirt, Xgrass);
585 ply->anim = PLY_walk_n + anim;
591 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
592 (dx > 0 ? Ydirt_eB : Ydirt_wB));
593 next[x][y] = Zplayer;
594 play_element_sound(x, y, SOUND_dirt, Xdirt);
595 ply->anim = PLY_walk_n + anim;
602 cave[x][y] = Ydiamond_blank;
603 next[x][y] = Zplayer;
604 play_element_sound(x, y, SOUND_collect, element);
605 lev.score += lev.diamond_score;
606 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
607 game.snapshot.collected_item = TRUE;
608 ply->anim = PLY_walk_n + anim;
615 cave[x][y] = Yemerald_blank;
616 next[x][y] = Zplayer;
617 play_element_sound(x, y, SOUND_collect, element);
618 lev.score += lev.emerald_score;
619 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
620 game.snapshot.collected_item = TRUE;
621 ply->anim = PLY_walk_n + anim;
627 cave[x][y] = Ydynamite_blank;
628 next[x][y] = Zplayer;
629 play_element_sound(x, y, SOUND_collect, element);
630 lev.score += lev.dynamite_score;
631 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
632 ply->anim = PLY_walk_n + anim;
639 cave[x][y] = Ykey_1_blank;
644 cave[x][y] = Ykey_2_blank;
649 cave[x][y] = Ykey_3_blank;
654 cave[x][y] = Ykey_4_blank;
659 cave[x][y] = Ykey_5_blank;
664 cave[x][y] = Ykey_6_blank;
669 cave[x][y] = Ykey_7_blank;
674 cave[x][y] = Ykey_8_blank;
679 next[x][y] = Zplayer;
680 play_element_sound(x, y, SOUND_collect, element);
681 lev.score += lev.key_score;
682 ply->anim = PLY_walk_n + anim;
688 cave[x][y] = Ylenses_blank;
689 next[x][y] = Zplayer;
690 play_element_sound(x, y, SOUND_collect, element);
691 lev.score += lev.lenses_score;
692 lev.lenses_cnt = lev.lenses_time;
693 ply->anim = PLY_walk_n + anim;
699 cave[x][y] = Ymagnify_blank;
700 next[x][y] = Zplayer;
701 play_element_sound(x, y, SOUND_collect, element);
702 lev.score += lev.magnify_score;
703 lev.magnify_cnt = lev.magnify_time;
704 ply->anim = PLY_walk_n + anim;
713 switch (cave[x+dx][y])
726 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
727 next[x+dx][y] = Xstone_pause;
738 if (cave[x+dx+1][y-1] == Xblank)
739 cave[x+dx+1][y-1] = Xsplash_e;
740 if (cave[x+dx-1][y-1] == Xblank)
741 cave[x+dx-1][y-1] = Xsplash_w;
742 play_element_sound(x, y, SOUND_acid, Xacid_1);
746 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
747 next[x][y] = Zplayer;
748 play_element_sound(x, y, SOUND_roll, Xstone);
753 ply->anim = PLY_push_n + anim;
760 switch (cave[x+dx][y])
773 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
774 next[x+dx][y] = Xbomb_pause;
785 if (cave[x+dx+1][y-1] == Xblank)
786 cave[x+dx+1][y-1] = Xsplash_e;
787 if (cave[x+dx-1][y-1] == Xblank)
788 cave[x+dx-1][y-1] = Xsplash_w;
789 play_element_sound(x, y, SOUND_acid, Xacid_1);
793 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
794 next[x][y] = Zplayer;
795 play_element_sound(x, y, SOUND_roll, Xbomb);
800 ply->anim = PLY_push_n + anim;
807 switch (cave[x+dx][y])
820 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
821 next[x+dx][y] = Xnut_pause;
832 if (cave[x+dx+1][y-1] == Xblank)
833 cave[x+dx+1][y-1] = Xsplash_e;
834 if (cave[x+dx-1][y-1] == Xblank)
835 cave[x+dx-1][y-1] = Xsplash_w;
836 play_element_sound(x, y, SOUND_acid, Xacid_1);
840 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
841 next[x][y] = Zplayer;
842 play_element_sound(x, y, SOUND_roll, Xnut);
847 ply->anim = PLY_push_n + anim;
854 switch (cave[x+dx][y])
867 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
868 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
879 if (cave[x+dx+1][y-1] == Xblank)
880 cave[x+dx+1][y-1] = Xsplash_e;
881 if (cave[x+dx-1][y-1] == Xblank)
882 cave[x+dx-1][y-1] = Xsplash_w;
883 play_element_sound(x, y, SOUND_acid, Xacid_1);
887 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
888 next[x][y] = Zplayer;
889 play_element_sound(x, y, SOUND_roll, Xspring);
895 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
896 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
897 next[x][y] = Zplayer;
898 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
899 play_element_sound(x, y, SOUND_slurp, Xalien);
900 lev.score += lev.slurp_score;
905 ply->anim = PLY_push_n + anim;
912 case Xsand_stonein_1:
913 case Xsand_stonein_2:
914 case Xsand_stonein_3:
915 case Xsand_stonein_4:
919 ply->anim = PLY_push_n + anim;
923 switch (cave[x+dx][y+dy])
936 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
937 (dx > 0 ? Yballoon_e : Yballoon_w));
938 next[x+dx][y+dy] = Xballoon;
949 if (cave[x+dx+1][y+dy-1] == Xblank)
950 cave[x+dx+1][y+dy-1] = Xsplash_e;
951 if (cave[x+dx-1][y+dy-1] == Xblank)
952 cave[x+dx-1][y+dy-1] = Xsplash_w;
953 play_element_sound(x, y, SOUND_acid, Xacid_1);
957 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
958 (dx > 0 ? Yballoon_eB : Yballoon_wB));
959 next[x][y] = Zplayer;
960 play_element_sound(x, y, SOUND_push, Xballoon);
966 ply->anim = PLY_push_n + anim;
978 switch (cave[x+dx][y+dy])
991 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
992 (dx > 0 ? Yandroid_e : Yandroid_w));
993 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
994 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1005 if (cave[x+dx+1][y+dy-1] == Xblank)
1006 cave[x+dx+1][y+dy-1] = Xsplash_e;
1007 if (cave[x+dx-1][y+dy-1] == Xblank)
1008 cave[x+dx-1][y+dy-1] = Xsplash_w;
1009 play_element_sound(x, y, SOUND_acid, Xacid_1);
1013 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1014 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1015 next[x][y] = Zplayer;
1016 play_element_sound(x, y, SOUND_push, Xandroid);
1022 ply->anim = PLY_push_n + anim;
1027 if (ply->keys & 0x01)
1034 if (ply->keys & 0x02)
1041 if (ply->keys & 0x04)
1048 if (ply->keys & 0x08)
1055 if (ply->keys & 0x10)
1062 if (ply->keys & 0x20)
1069 if (ply->keys & 0x40)
1076 if (ply->keys & 0x80)
1083 if (!is_blank[cave[x+dx][y+dy]])
1086 if (!is_fake_acid[cave[x+dx][y+dy]])
1088 cave[x+dx][y+dy] = Zplayer;
1089 next[x+dx][y+dy] = Zplayer;
1092 play_element_sound(x, y, SOUND_door, element);
1093 ply->anim = PLY_walk_n + anim;
1099 play_element_sound(x, y, SOUND_press, element);
1100 lev.wheel_cnt = lev.wheel_time;
1106 lev.wind_direction = 0;
1110 lev.wind_direction = 1;
1114 lev.wind_direction = 2;
1118 lev.wind_direction = 3;
1122 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1127 play_element_sound(x, y, SOUND_press, element);
1128 lev.wind_cnt = lev.wind_time;
1132 play_element_sound(x, y, SOUND_press, element);
1137 play_element_sound(x, y, SOUND_press, element);
1138 lev.ball_cnt = lev.ball_time;
1139 lev.ball_active = !lev.ball_active;
1143 cave[x][y] = Yplant;
1144 next[x][y] = Xplant;
1145 play_element_sound(x, y, SOUND_blank, Xplant);
1146 ply->anim = PLY_walk_n + anim;
1157 game_em.level_solved = TRUE;
1159 ply->anim = PLY_walk_n + anim;
1166 if (ply->x == oldx && ply->y == oldy) /* no movement */
1169 else /* player wants to snap */
1171 int element = cave[x][y];
1175 /* fire is pressed */
1178 cave[x][y] = Ygrass_blank;
1179 next[x][y] = Xblank;
1180 play_element_sound(x, y, SOUND_dirt, element);
1181 ply->anim = PLY_shoot_n + anim;
1185 cave[x][y] = Ydirt_blank;
1186 next[x][y] = Xblank;
1187 play_element_sound(x, y, SOUND_dirt, element);
1188 ply->anim = PLY_shoot_n + anim;
1192 case Xdiamond_pause:
1193 cave[x][y] = Ydiamond_blank;
1194 next[x][y] = Xblank;
1195 play_element_sound(x, y, SOUND_collect, element);
1196 lev.score += lev.diamond_score;
1197 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
1198 game.snapshot.collected_item = TRUE;
1199 ply->anim = PLY_walk_n + anim;
1203 case Xemerald_pause:
1204 cave[x][y] = Yemerald_blank;
1205 next[x][y] = Xblank;
1206 play_element_sound(x, y, SOUND_collect, element);
1207 lev.score += lev.emerald_score;
1208 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
1209 game.snapshot.collected_item = TRUE;
1210 ply->anim = PLY_walk_n + anim;
1214 cave[x][y] = Ydynamite_blank;
1215 next[x][y] = Xblank;
1216 play_element_sound(x, y, SOUND_collect, element);
1217 lev.score += lev.dynamite_score;
1218 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1219 ply->anim = PLY_walk_n + anim;
1224 cave[x][y] = Ykey_1_blank;
1229 cave[x][y] = Ykey_2_blank;
1234 cave[x][y] = Ykey_3_blank;
1239 cave[x][y] = Ykey_4_blank;
1244 cave[x][y] = Ykey_5_blank;
1249 cave[x][y] = Ykey_6_blank;
1254 cave[x][y] = Ykey_7_blank;
1259 cave[x][y] = Ykey_8_blank;
1264 next[x][y] = Xblank;
1265 play_element_sound(x, y, SOUND_collect, element);
1266 lev.score += lev.key_score;
1267 ply->anim = PLY_walk_n + anim;
1271 cave[x][y] = Ylenses_blank;
1272 next[x][y] = Xblank;
1273 play_element_sound(x, y, SOUND_collect, element);
1274 lev.score += lev.lenses_score;
1275 lev.lenses_cnt = lev.lenses_time;
1276 ply->anim = PLY_walk_n + anim;
1280 cave[x][y] = Ymagnify_blank;
1281 next[x][y] = Xblank;
1282 play_element_sound(x, y, SOUND_collect, element);
1283 lev.score += lev.magnify_score;
1284 lev.magnify_cnt = lev.magnify_time;
1285 ply->anim = PLY_walk_n + anim;
1296 static void check_player(struct PLAYER *ply)
1304 game_em.last_player_direction[ply->num] = MV_NONE;
1306 if (ply->joy_w) /* west */
1311 else if (ply->joy_e) /* east */
1317 if (ply->joy_n) /* north */
1322 else if (ply->joy_s) /* south */
1334 boolean players_visible_before_move;
1335 boolean players_visible_after_move;
1338 players_visible_before_move = checkIfAllPlayersFitToScreen();
1343 players_visible_after_move = checkIfAllPlayersFitToScreen();
1346 player is allowed to move only in the following cases:
1347 - it is not needed to display all players (not focussed to all players)
1348 - all players are (still or again) visible after the move
1349 - some players were already outside visible screen area before the move
1351 can_move = (game.centered_player_nr != -1 ||
1352 players_visible_after_move ||
1353 !players_visible_before_move);
1369 if (dx == 0 && dy == 0)
1371 ply->joy_stick = FALSE;
1375 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1377 cave[x][y] = Xdynamite_1;
1378 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1384 ply->dynamite_cnt = 0;
1387 /* be a bit more random if the player doesn't move */
1388 game_em.random += 7;
1393 ply->joy_stick = TRUE;
1399 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1401 if (!ply->joy_snap) /* player wants to move */
1403 boolean moved = FALSE;
1405 if (ply->last_move_dir & MV_HORIZONTAL)
1407 if (!(moved = player_digfield(ply, 0, dy)))
1408 moved = player_digfield(ply, dx, 0);
1412 if (!(moved = player_digfield(ply, dx, 0)))
1413 moved = player_digfield(ply, 0, dy);
1419 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1420 else if (oldy != ply->y)
1421 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1423 game_em.any_player_moving = TRUE;
1424 game_em.last_moving_player = ply->num;
1425 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1428 else /* player wants to snap */
1430 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1434 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1436 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1439 /* default values if no players are alive anymore */
1443 for (i = 0; i < MAX_PLAYERS; i++)
1448 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1450 if (distance < distance_shortest)
1455 distance_shortest = distance;
1460 static void Lacid_1(int x, int y)
1462 next[x][y] = Xacid_2;
1465 static void Lacid_2(int x, int y)
1467 next[x][y] = Xacid_3;
1470 static void Lacid_3(int x, int y)
1472 next[x][y] = Xacid_4;
1475 static void Lacid_4(int x, int y)
1477 next[x][y] = Xacid_5;
1480 static void Lacid_5(int x, int y)
1482 next[x][y] = Xacid_6;
1485 static void Lacid_6(int x, int y)
1487 next[x][y] = Xacid_7;
1490 static void Lacid_7(int x, int y)
1492 next[x][y] = Xacid_8;
1495 static void Lacid_8(int x, int y)
1497 next[x][y] = Xacid_1;
1500 static void Lfake_acid_1(int x, int y)
1502 next[x][y] = Xfake_acid_2;
1505 static void Lfake_acid_2(int x, int y)
1507 next[x][y] = Xfake_acid_3;
1510 static void Lfake_acid_3(int x, int y)
1512 next[x][y] = Xfake_acid_4;
1515 static void Lfake_acid_4(int x, int y)
1517 next[x][y] = Xfake_acid_5;
1520 static void Lfake_acid_5(int x, int y)
1522 next[x][y] = Xfake_acid_6;
1525 static void Lfake_acid_6(int x, int y)
1527 next[x][y] = Xfake_acid_7;
1530 static void Lfake_acid_7(int x, int y)
1532 next[x][y] = Xfake_acid_8;
1535 static void Lfake_acid_8(int x, int y)
1537 next[x][y] = Xfake_acid_1;
1540 static void Landroid(int x, int y)
1544 if (lev.android_clone_cnt == 0)
1546 if (!is_blank[cave[x-1][y-1]] &&
1547 !is_blank[cave[x][y-1]] &&
1548 !is_blank[cave[x+1][y-1]] &&
1549 !is_blank[cave[x-1][y]] &&
1550 !is_blank[cave[x+1][y]] &&
1551 !is_blank[cave[x-1][y+1]] &&
1552 !is_blank[cave[x][y+1]] &&
1553 !is_blank[cave[x+1][y+1]])
1558 /* randomly find an object to clone */
1560 case 0: /* S,NE,W,NW,SE,E,SW,N */
1561 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1562 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1563 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1564 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1565 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1566 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1567 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1568 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1571 case 1: /* NW,SE,N,S,NE,SW,E,W */
1572 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1573 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1574 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1575 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1576 temp = lev.android_array[cave[x+1][y-1]]; 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+1][y]]; if (temp != Xblank) break;
1579 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1582 case 2: /* SW,E,S,W,N,NW,SE,NE */
1583 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1584 temp = lev.android_array[cave[x+1][y]]; 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]]; if (temp != Xblank) break;
1587 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1588 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1589 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1590 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1593 case 3: /* N,SE,NE,E,W,S,NW,SW */
1594 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1595 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1596 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1597 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1598 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1599 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1600 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1601 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1604 case 4: /* SE,NW,E,NE,SW,W,N,S */
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-1]]; if (temp != Xblank) break;
1609 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1610 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1611 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1612 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1615 case 5: /* NE,W,SE,SW,S,N,E,NW */
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][y+1]]; if (temp != Xblank) break;
1621 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1622 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1623 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1626 case 6: /* E,N,SW,S,NW,NE,SE,W */
1627 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1628 temp = lev.android_array[cave[x][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-1][y-1]]; if (temp != Xblank) break;
1632 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1633 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1634 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1637 case 7: /* W,SW,NW,N,E,SE,NE,S */
1638 temp = lev.android_array[cave[x-1][y]]; 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-1][y-1]]; if (temp != Xblank) break;
1641 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1642 temp = lev.android_array[cave[x+1][y]]; 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-1]]; if (temp != Xblank) break;
1645 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1649 next[x][y] = temp; /* the item we chose to clone */
1650 play_element_sound(x, y, SOUND_android_clone, temp);
1654 /* randomly find a direction to move */
1656 case 0: /* S,NE,W,NW,SE,E,SW,N */
1657 if (is_blank[cave[x][y+1]]) goto android_s;
1658 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1659 if (is_blank[cave[x-1][y]]) goto android_w;
1660 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1661 if (is_blank[cave[x+1][y+1]]) goto android_se;
1662 if (is_blank[cave[x+1][y]]) goto android_e;
1663 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1664 if (is_blank[cave[x][y-1]]) goto android_n;
1667 case 1: /* NW,SE,N,S,NE,SW,E,W */
1668 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1669 if (is_blank[cave[x+1][y+1]]) goto android_se;
1670 if (is_blank[cave[x][y-1]]) goto android_n;
1671 if (is_blank[cave[x][y+1]]) goto android_s;
1672 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1673 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1674 if (is_blank[cave[x+1][y]]) goto android_e;
1675 if (is_blank[cave[x-1][y]]) goto android_w;
1678 case 2: /* SW,E,S,W,N,NW,SE,NE */
1679 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1680 if (is_blank[cave[x+1][y]]) goto android_e;
1681 if (is_blank[cave[x][y+1]]) goto android_s;
1682 if (is_blank[cave[x-1][y]]) goto android_w;
1683 if (is_blank[cave[x][y-1]]) goto android_n;
1684 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1685 if (is_blank[cave[x+1][y+1]]) goto android_se;
1686 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1689 case 3: /* N,SE,NE,E,W,S,NW,SW */
1690 if (is_blank[cave[x][y-1]]) goto android_n;
1691 if (is_blank[cave[x+1][y+1]]) goto android_se;
1692 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1693 if (is_blank[cave[x+1][y]]) goto android_e;
1694 if (is_blank[cave[x-1][y]]) goto android_w;
1695 if (is_blank[cave[x][y+1]]) goto android_s;
1696 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1697 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1700 case 4: /* SE,NW,E,NE,SW,W,N,S */
1701 if (is_blank[cave[x+1][y+1]]) goto android_se;
1702 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1703 if (is_blank[cave[x+1][y]]) goto android_e;
1704 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1705 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1706 if (is_blank[cave[x-1][y]]) goto android_w;
1707 if (is_blank[cave[x][y-1]]) goto android_n;
1708 if (is_blank[cave[x][y+1]]) goto android_s;
1711 case 5: /* NE,W,SE,SW,S,N,E,NW */
1712 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1713 if (is_blank[cave[x-1][y]]) goto android_w;
1714 if (is_blank[cave[x+1][y+1]]) goto android_se;
1715 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1716 if (is_blank[cave[x][y+1]]) goto android_s;
1717 if (is_blank[cave[x][y-1]]) goto android_n;
1718 if (is_blank[cave[x+1][y]]) goto android_e;
1719 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1722 case 6: /* E,N,SW,S,NW,NE,SE,W */
1723 if (is_blank[cave[x+1][y]]) goto android_e;
1724 if (is_blank[cave[x][y-1]]) goto android_n;
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-1][y-1]]) goto android_nw;
1728 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1729 if (is_blank[cave[x+1][y+1]]) goto android_se;
1730 if (is_blank[cave[x-1][y]]) goto android_w;
1733 case 7: /* W,SW,NW,N,E,SE,NE,S */
1734 if (is_blank[cave[x-1][y]]) goto android_w;
1735 if (is_blank[cave[x-1][y+1]]) goto android_sw;
1736 if (is_blank[cave[x-1][y-1]]) goto android_nw;
1737 if (is_blank[cave[x][y-1]]) goto android_n;
1738 if (is_blank[cave[x+1][y]]) goto android_e;
1739 if (is_blank[cave[x+1][y+1]]) goto android_se;
1740 if (is_blank[cave[x+1][y-1]]) goto android_ne;
1741 if (is_blank[cave[x][y+1]]) goto android_s;
1747 if (lev.android_move_cnt == 0)
1749 if (cave[x-1][y-1] == Zplayer ||
1750 cave[x][y-1] == Zplayer ||
1751 cave[x+1][y-1] == Zplayer ||
1752 cave[x-1][y] == Zplayer ||
1753 cave[x+1][y] == Zplayer ||
1754 cave[x-1][y+1] == Zplayer ||
1755 cave[x][y+1] == Zplayer ||
1756 cave[x+1][y+1] == Zplayer)
1759 set_nearest_player_xy(x, y, &dx, &dy);
1761 next[x][y] = Xblank; /* assume we will move */
1762 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1768 /* attempt clockwise move first if direct path is blocked */
1770 case 0: /* north west */
1771 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1772 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1773 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1777 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1778 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1779 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1782 case 2: /* north east */
1783 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1784 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1785 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1789 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1790 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1791 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1794 case 4: /* nowhere */
1798 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1799 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1800 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1803 case 6: /* south west */
1804 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1805 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1806 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1810 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1811 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1812 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1815 case 8: /* south east */
1816 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1817 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1818 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1826 /* attempt counterclockwise move first if direct path is blocked */
1828 case 0: /* north west */
1829 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1830 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1831 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1835 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1836 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1837 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1840 case 2: /* north east */
1841 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1842 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1843 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1847 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1848 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1849 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1852 case 4: /* nowhere */
1856 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1857 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1858 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1861 case 6: /* south west */
1862 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1863 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1864 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1868 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1869 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1870 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1873 case 8: /* south east */
1874 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1875 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1876 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1883 next[x][y] = Xandroid;
1887 cave[x][y] = Yandroid_nB;
1888 cave[x][y-1] = Yandroid_n;
1889 next[x][y-1] = Xandroid;
1890 play_element_sound(x, y, SOUND_android_move, Xandroid);
1894 cave[x][y] = Yandroid_neB;
1895 cave[x+1][y-1] = Yandroid_ne;
1896 next[x+1][y-1] = Xandroid;
1897 play_element_sound(x, y, SOUND_android_move, Xandroid);
1901 cave[x][y] = Yandroid_eB;
1902 cave[x+1][y] = Yandroid_e;
1903 next[x+1][y] = Xandroid;
1904 play_element_sound(x, y, SOUND_android_move, Xandroid);
1908 cave[x][y] = Yandroid_seB;
1909 cave[x+1][y+1] = Yandroid_se;
1910 next[x+1][y+1] = Xandroid;
1911 play_element_sound(x, y, SOUND_android_move, Xandroid);
1915 cave[x][y] = Yandroid_sB;
1916 cave[x][y+1] = Yandroid_s;
1917 next[x][y+1] = Xandroid;
1918 play_element_sound(x, y, SOUND_android_move, Xandroid);
1922 cave[x][y] = Yandroid_swB;
1923 cave[x-1][y+1] = Yandroid_sw;
1924 next[x-1][y+1] = Xandroid;
1925 play_element_sound(x, y, SOUND_android_move, Xandroid);
1929 cave[x][y] = Yandroid_wB;
1930 cave[x-1][y] = Yandroid_w;
1931 next[x-1][y] = Xandroid;
1932 play_element_sound(x, y, SOUND_android_move, Xandroid);
1936 cave[x][y] = Yandroid_nwB;
1937 cave[x-1][y-1] = Yandroid_nw;
1938 next[x-1][y-1] = Xandroid;
1939 play_element_sound(x, y, SOUND_android_move, Xandroid);
1943 static void Landroid_1_n(int x, int y)
1945 switch (cave[x][y-1])
1958 cave[x][y] = Yandroid_nB;
1959 next[x][y] = Xblank;
1960 cave[x][y-1] = Yandroid_n;
1961 next[x][y-1] = Xandroid;
1962 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
1973 cave[x][y] = Yandroid_nB;
1974 next[x][y] = Xblank;
1975 if (cave[x+1][y-2] == Xblank)
1976 cave[x+1][y-2] = Xsplash_e;
1977 if (cave[x-1][y-2] == Xblank)
1978 cave[x-1][y-2] = Xsplash_w;
1979 play_element_sound(x, y, SOUND_acid, Xacid_1);
1988 static void Landroid_2_n(int x, int y)
1990 switch (cave[x][y-1])
2003 cave[x][y] = Yandroid_nB;
2004 next[x][y] = Xblank;
2005 cave[x][y-1] = Yandroid_n;
2006 next[x][y-1] = Xandroid_1_n;
2007 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
2018 cave[x][y] = Yandroid_nB;
2019 next[x][y] = Xblank;
2020 if (cave[x+1][y-2] == Xblank)
2021 cave[x+1][y-2] = Xsplash_e;
2022 if (cave[x-1][y-2] == Xblank)
2023 cave[x-1][y-2] = Xsplash_w;
2024 play_element_sound(x, y, SOUND_acid, Xacid_1);
2033 static void Landroid_1_e(int x, int y)
2035 switch (cave[x+1][y])
2048 cave[x][y] = Yandroid_eB;
2049 next[x][y] = Xblank;
2050 cave[x+1][y] = Yandroid_e;
2051 next[x+1][y] = Xandroid;
2052 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
2063 cave[x][y] = Yandroid_eB;
2064 next[x][y] = Xblank;
2065 if (cave[x+2][y-1] == Xblank)
2066 cave[x+2][y-1] = Xsplash_e;
2067 if (cave[x][y-1] == Xblank)
2068 cave[x][y-1] = Xsplash_w;
2069 play_element_sound(x, y, SOUND_acid, Xacid_1);
2078 static void Landroid_2_e(int x, int y)
2080 switch (cave[x+1][y])
2093 cave[x][y] = Yandroid_eB;
2094 next[x][y] = Xblank;
2095 cave[x+1][y] = Yandroid_e;
2096 next[x+1][y] = Xandroid_1_e;
2097 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
2108 cave[x][y] = Yandroid_eB;
2109 next[x][y] = Xblank;
2110 if (cave[x+2][y-1] == Xblank)
2111 cave[x+2][y-1] = Xsplash_e;
2112 if (cave[x][y-1] == Xblank)
2113 cave[x][y-1] = Xsplash_w;
2114 play_element_sound(x, y, SOUND_acid, Xacid_1);
2123 static void Landroid_1_s(int x, int y)
2125 switch (cave[x][y+1])
2138 cave[x][y] = Yandroid_sB;
2139 next[x][y] = Xblank;
2140 cave[x][y+1] = Yandroid_s;
2141 next[x][y+1] = Xandroid;
2142 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
2153 cave[x][y] = Yandroid_sB;
2154 next[x][y] = Xblank;
2155 if (cave[x+1][y] == Xblank)
2156 cave[x+1][y] = Xsplash_e;
2157 if (cave[x-1][y] == Xblank)
2158 cave[x-1][y] = Xsplash_w;
2159 play_element_sound(x, y, SOUND_acid, Xacid_1);
2168 static void Landroid_2_s(int x, int y)
2170 switch (cave[x][y+1])
2183 cave[x][y] = Yandroid_sB;
2184 next[x][y] = Xblank;
2185 cave[x][y+1] = Yandroid_s;
2186 next[x][y+1] = Xandroid_1_s;
2187 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
2198 cave[x][y] = Yandroid_sB;
2199 next[x][y] = Xblank;
2200 if (cave[x+1][y] == Xblank)
2201 cave[x+1][y] = Xsplash_e;
2202 if (cave[x-1][y] == Xblank)
2203 cave[x-1][y] = Xsplash_w;
2204 play_element_sound(x, y, SOUND_acid, Xacid_1);
2213 static void Landroid_1_w(int x, int y)
2215 switch (cave[x-1][y])
2228 cave[x][y] = Yandroid_wB;
2229 next[x][y] = Xblank;
2230 cave[x-1][y] = Yandroid_w;
2231 next[x-1][y] = Xandroid;
2232 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2243 cave[x][y] = Yandroid_wB;
2244 next[x][y] = Xblank;
2245 if (cave[x][y-1] == Xblank)
2246 cave[x][y-1] = Xsplash_e;
2247 if (cave[x-2][y-1] == Xblank)
2248 cave[x-2][y-1] = Xsplash_w;
2249 play_element_sound(x, y, SOUND_acid, Xacid_1);
2258 static void Landroid_2_w(int x, int y)
2260 switch (cave[x-1][y])
2273 cave[x][y] = Yandroid_wB;
2274 next[x][y] = Xblank;
2275 cave[x-1][y] = Yandroid_w;
2276 next[x-1][y] = Xandroid_1_w;
2277 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2288 cave[x][y] = Yandroid_wB;
2289 next[x][y] = Xblank;
2290 if (cave[x][y-1] == Xblank)
2291 cave[x][y-1] = Xsplash_e;
2292 if (cave[x-2][y-1] == Xblank)
2293 cave[x-2][y-1] = Xsplash_w;
2294 play_element_sound(x, y, SOUND_acid, Xacid_1);
2303 static void Leater_n(int x, int y)
2305 if (cave[x+1][y] == Xdiamond)
2307 cave[x+1][y] = Ydiamond_blank;
2308 next[x+1][y] = Xblank;
2309 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2313 if (cave[x][y+1] == Xdiamond)
2315 cave[x][y+1] = Ydiamond_blank;
2316 next[x][y+1] = Xblank;
2317 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2321 if (cave[x-1][y] == Xdiamond)
2323 cave[x-1][y] = Ydiamond_blank;
2324 next[x-1][y] = Xblank;
2325 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2329 if (cave[x][y-1] == Xdiamond)
2331 cave[x][y-1] = Ydiamond_blank;
2332 next[x][y-1] = Xblank;
2333 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2337 switch (cave[x][y-1])
2353 cave[x][y] = Yeater_nB;
2354 next[x][y] = Xblank;
2355 cave[x][y-1] = Yeater_n;
2356 next[x][y-1] = Xeater_n;
2367 cave[x][y] = Yeater_nB;
2368 next[x][y] = Xblank;
2369 if (cave[x+1][y-2] == Xblank)
2370 cave[x+1][y-2] = Xsplash_e;
2371 if (cave[x-1][y-2] == Xblank)
2372 cave[x-1][y-2] = Xsplash_w;
2373 play_element_sound(x, y, SOUND_acid, Xacid_1);
2377 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2378 play_element_sound(x, y, SOUND_eater, Xeater_n);
2383 static void Leater_e(int x, int y)
2385 if (cave[x][y+1] == Xdiamond)
2387 cave[x][y+1] = Ydiamond_blank;
2388 next[x][y+1] = Xblank;
2389 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2393 if (cave[x-1][y] == Xdiamond)
2395 cave[x-1][y] = Ydiamond_blank;
2396 next[x-1][y] = Xblank;
2397 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2401 if (cave[x][y-1] == Xdiamond)
2403 cave[x][y-1] = Ydiamond_blank;
2404 next[x][y-1] = Xblank;
2405 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2409 if (cave[x+1][y] == Xdiamond)
2411 cave[x+1][y] = Ydiamond_blank;
2412 next[x+1][y] = Xblank;
2413 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2417 switch (cave[x+1][y])
2433 cave[x][y] = Yeater_eB;
2434 next[x][y] = Xblank;
2435 cave[x+1][y] = Yeater_e;
2436 next[x+1][y] = Xeater_e;
2447 cave[x][y] = Yeater_eB;
2448 next[x][y] = Xblank;
2449 if (cave[x+2][y-1] == Xblank)
2450 cave[x+2][y-1] = Xsplash_e;
2451 if (cave[x][y-1] == Xblank)
2452 cave[x][y-1] = Xsplash_w;
2453 play_element_sound(x, y, SOUND_acid, Xacid_1);
2457 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2458 play_element_sound(x, y, SOUND_eater, Xeater_e);
2463 static void Leater_s(int x, int y)
2465 if (cave[x-1][y] == Xdiamond)
2467 cave[x-1][y] = Ydiamond_blank;
2468 next[x-1][y] = Xblank;
2469 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2473 if (cave[x][y-1] == Xdiamond)
2475 cave[x][y-1] = Ydiamond_blank;
2476 next[x][y-1] = Xblank;
2477 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2481 if (cave[x+1][y] == Xdiamond)
2483 cave[x+1][y] = Ydiamond_blank;
2484 next[x+1][y] = Xblank;
2485 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2489 if (cave[x][y+1] == Xdiamond)
2491 cave[x][y+1] = Ydiamond_blank;
2492 next[x][y+1] = Xblank;
2493 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2497 switch (cave[x][y+1])
2513 cave[x][y] = Yeater_sB;
2514 next[x][y] = Xblank;
2515 cave[x][y+1] = Yeater_s;
2516 next[x][y+1] = Xeater_s;
2527 cave[x][y] = Yeater_sB;
2528 next[x][y] = Xblank;
2529 if (cave[x+1][y] == Xblank)
2530 cave[x+1][y] = Xsplash_e;
2531 if (cave[x-1][y] == Xblank)
2532 cave[x-1][y] = Xsplash_w;
2533 play_element_sound(x, y, SOUND_acid, Xacid_1);
2537 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2538 play_element_sound(x, y, SOUND_eater, Xeater_s);
2543 static void Leater_w(int x, int y)
2545 if (cave[x][y-1] == Xdiamond)
2547 cave[x][y-1] = Ydiamond_blank;
2548 next[x][y-1] = Xblank;
2549 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2553 if (cave[x+1][y] == Xdiamond)
2555 cave[x+1][y] = Ydiamond_blank;
2556 next[x+1][y] = Xblank;
2557 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2561 if (cave[x][y+1] == Xdiamond)
2563 cave[x][y+1] = Ydiamond_blank;
2564 next[x][y+1] = Xblank;
2565 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2569 if (cave[x-1][y] == Xdiamond)
2571 cave[x-1][y] = Ydiamond_blank;
2572 next[x-1][y] = Xblank;
2573 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2577 switch (cave[x-1][y])
2593 cave[x][y] = Yeater_wB;
2594 next[x][y] = Xblank;
2595 cave[x-1][y] = Yeater_w;
2596 next[x-1][y] = Xeater_w;
2607 cave[x][y] = Yeater_wB;
2608 next[x][y] = Xblank;
2609 if (cave[x][y-1] == Xblank)
2610 cave[x][y-1] = Xsplash_e;
2611 if (cave[x-2][y-1] == Xblank)
2612 cave[x-2][y-1] = Xsplash_w;
2613 play_element_sound(x, y, SOUND_acid, Xacid_1);
2617 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2618 play_element_sound(x, y, SOUND_eater, Xeater_w);
2623 static void Lalien(int x, int y)
2634 set_nearest_player_xy(x, y, &dx, &dy);
2641 switch (cave[x][y-1])
2657 cave[x][y] = Yalien_nB;
2658 next[x][y] = Xblank;
2659 cave[x][y-1] = Yalien_n;
2660 next[x][y-1] = Xalien_pause;
2661 play_element_sound(x, y, SOUND_alien, Xalien);
2672 cave[x][y] = Yalien_nB;
2673 next[x][y] = Xblank;
2674 if (cave[x+1][y-2] == Xblank)
2675 cave[x+1][y-2] = Xsplash_e;
2676 if (cave[x-1][y-2] == Xblank)
2677 cave[x-1][y-2] = Xsplash_w;
2678 play_element_sound(x, y, SOUND_acid, Xacid_1);
2684 switch (cave[x][y+1])
2700 cave[x][y] = Yalien_sB;
2701 next[x][y] = Xblank;
2702 cave[x][y+1] = Yalien_s;
2703 next[x][y+1] = Xalien_pause;
2704 play_element_sound(x, y, SOUND_alien, Xalien);
2715 cave[x][y] = Yalien_sB;
2716 next[x][y] = Xblank;
2717 if (cave[x+1][y] == Xblank)
2718 cave[x+1][y] = Xsplash_e;
2719 if (cave[x-1][y] == Xblank)
2720 cave[x-1][y] = Xsplash_w;
2721 play_element_sound(x, y, SOUND_acid, Xacid_1);
2730 switch (cave[x+1][y])
2746 cave[x][y] = Yalien_eB;
2747 next[x][y] = Xblank;
2748 cave[x+1][y] = Yalien_e;
2749 next[x+1][y] = Xalien_pause;
2750 play_element_sound(x, y, SOUND_alien, Xalien);
2761 cave[x][y] = Yalien_eB;
2762 next[x][y] = Xblank;
2763 if (cave[x+2][y-1] == Xblank)
2764 cave[x+2][y-1] = Xsplash_e;
2765 if (cave[x][y-1] == Xblank)
2766 cave[x][y-1] = Xsplash_w;
2767 play_element_sound(x, y, SOUND_acid, Xacid_1);
2773 switch (cave[x-1][y])
2789 cave[x][y] = Yalien_wB;
2790 next[x][y] = Xblank;
2791 cave[x-1][y] = Yalien_w;
2792 next[x-1][y] = Xalien_pause;
2793 play_element_sound(x, y, SOUND_alien, Xalien);
2804 cave[x][y] = Yalien_wB;
2805 next[x][y] = Xblank;
2806 if (cave[x][y-1] == Xblank)
2807 cave[x][y-1] = Xsplash_e;
2808 if (cave[x-2][y-1] == Xblank)
2809 cave[x-2][y-1] = Xsplash_w;
2810 play_element_sound(x, y, SOUND_acid, Xacid_1);
2817 static void Lalien_pause(int x, int y)
2819 next[x][y] = Xalien;
2822 static void Lbug_n(int x, int y)
2824 switch (cave[x][y-1])
2840 cave[x][y] = Ybug_nB;
2841 next[x][y] = Xblank;
2842 cave[x][y-1] = Ybug_n;
2843 next[x][y-1] = Xbug_1_n;
2844 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2855 cave[x][y] = Ybug_nB;
2856 next[x][y] = Xblank;
2857 if (cave[x+1][y-2] == Xblank)
2858 cave[x+1][y-2] = Xsplash_e;
2859 if (cave[x-1][y-2] == Xblank)
2860 cave[x-1][y-2] = Xsplash_w;
2861 play_element_sound(x, y, SOUND_acid, Xacid_1);
2865 cave[x][y] = Ybug_n_w;
2866 next[x][y] = Xbug_2_w;
2867 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2872 static void Lbug_1_n(int x, int y)
2874 if (is_amoeba[cave[x][y-1]] ||
2875 is_amoeba[cave[x+1][y]] ||
2876 is_amoeba[cave[x][y+1]] ||
2877 is_amoeba[cave[x-1][y]])
2885 switch (cave[x+1][y])
2909 cave[x][y] = Ybug_n_e;
2910 next[x][y] = Xbug_2_e;
2911 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2920 static void Lbug_2_n(int x, int y)
2922 if (is_amoeba[cave[x][y-1]] ||
2923 is_amoeba[cave[x+1][y]] ||
2924 is_amoeba[cave[x][y+1]] ||
2925 is_amoeba[cave[x-1][y]])
2936 static void Lbug_e(int x, int y)
2938 switch (cave[x+1][y])
2954 cave[x][y] = Ybug_eB;
2955 next[x][y] = Xblank;
2956 cave[x+1][y] = Ybug_e;
2957 next[x+1][y] = Xbug_1_e;
2958 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2969 cave[x][y] = Ybug_eB;
2970 next[x][y] = Xblank;
2971 if (cave[x+2][y-1] == Xblank)
2972 cave[x+2][y-1] = Xsplash_e;
2973 if (cave[x][y-1] == Xblank)
2974 cave[x][y-1] = Xsplash_w;
2975 play_element_sound(x, y, SOUND_acid, Xacid_1);
2979 cave[x][y] = Ybug_e_n;
2980 next[x][y] = Xbug_2_n;
2981 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2986 static void Lbug_1_e(int x, int y)
2988 if (is_amoeba[cave[x][y-1]] ||
2989 is_amoeba[cave[x+1][y]] ||
2990 is_amoeba[cave[x][y+1]] ||
2991 is_amoeba[cave[x-1][y]])
2999 switch (cave[x][y+1])
3023 cave[x][y] = Ybug_e_s;
3024 next[x][y] = Xbug_2_s;
3025 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3034 static void Lbug_2_e(int x, int y)
3036 if (is_amoeba[cave[x][y-1]] ||
3037 is_amoeba[cave[x+1][y]] ||
3038 is_amoeba[cave[x][y+1]] ||
3039 is_amoeba[cave[x-1][y]])
3050 static void Lbug_s(int x, int y)
3052 switch (cave[x][y+1])
3068 cave[x][y] = Ybug_sB;
3069 next[x][y] = Xblank;
3070 cave[x][y+1] = Ybug_s;
3071 next[x][y+1] = Xbug_1_s;
3072 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3083 cave[x][y] = Ybug_sB;
3084 next[x][y] = Xblank;
3085 if (cave[x+1][y] == Xblank)
3086 cave[x+1][y] = Xsplash_e;
3087 if (cave[x-1][y] == Xblank)
3088 cave[x-1][y] = Xsplash_w;
3089 play_element_sound(x, y, SOUND_acid, Xacid_1);
3093 cave[x][y] = Ybug_s_e;
3094 next[x][y] = Xbug_2_e;
3095 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3100 static void Lbug_1_s(int x, int y)
3102 if (is_amoeba[cave[x][y-1]] ||
3103 is_amoeba[cave[x+1][y]] ||
3104 is_amoeba[cave[x][y+1]] ||
3105 is_amoeba[cave[x-1][y]])
3113 switch (cave[x-1][y])
3137 cave[x][y] = Ybug_s_w;
3138 next[x][y] = Xbug_2_w;
3139 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3148 static void Lbug_2_s(int x, int y)
3150 if (is_amoeba[cave[x][y-1]] ||
3151 is_amoeba[cave[x+1][y]] ||
3152 is_amoeba[cave[x][y+1]] ||
3153 is_amoeba[cave[x-1][y]])
3164 static void Lbug_w(int x, int y)
3166 switch (cave[x-1][y])
3182 cave[x][y] = Ybug_wB;
3183 next[x][y] = Xblank;
3184 cave[x-1][y] = Ybug_w;
3185 next[x-1][y] = Xbug_1_w;
3186 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3197 cave[x][y] = Ybug_wB;
3198 next[x][y] = Xblank;
3199 if (cave[x][y-1] == Xblank)
3200 cave[x][y-1] = Xsplash_e;
3201 if (cave[x-2][y-1] == Xblank)
3202 cave[x-2][y-1] = Xsplash_w;
3203 play_element_sound(x, y, SOUND_acid, Xacid_1);
3207 cave[x][y] = Ybug_w_s;
3208 next[x][y] = Xbug_2_s;
3209 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3214 static void Lbug_1_w(int x, int y)
3216 if (is_amoeba[cave[x][y-1]] ||
3217 is_amoeba[cave[x+1][y]] ||
3218 is_amoeba[cave[x][y+1]] ||
3219 is_amoeba[cave[x-1][y]])
3227 switch (cave[x][y-1])
3251 cave[x][y] = Ybug_w_n;
3252 next[x][y] = Xbug_2_n;
3253 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3262 static void Lbug_2_w(int x, int y)
3264 if (is_amoeba[cave[x][y-1]] ||
3265 is_amoeba[cave[x+1][y]] ||
3266 is_amoeba[cave[x][y+1]] ||
3267 is_amoeba[cave[x-1][y]])
3278 static void Ltank_n(int x, int y)
3280 switch (cave[x][y-1])
3296 cave[x][y] = Ytank_nB;
3297 next[x][y] = Xblank;
3298 cave[x][y-1] = Ytank_n;
3299 next[x][y-1] = Xtank_1_n;
3300 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3311 cave[x][y] = Ytank_nB;
3312 next[x][y] = Xblank;
3313 if (cave[x+1][y-2] == Xblank)
3314 cave[x+1][y-2] = Xsplash_e;
3315 if (cave[x-1][y-2] == Xblank)
3316 cave[x-1][y-2] = Xsplash_w;
3317 play_element_sound(x, y, SOUND_acid, Xacid_1);
3321 cave[x][y] = Ytank_n_e;
3322 next[x][y] = Xtank_2_e;
3323 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3328 static void Ltank_1_n(int x, int y)
3330 if (is_amoeba[cave[x][y-1]] ||
3331 is_amoeba[cave[x+1][y]] ||
3332 is_amoeba[cave[x][y+1]] ||
3333 is_amoeba[cave[x-1][y]])
3341 switch (cave[x-1][y])
3365 cave[x][y] = Ytank_n_w;
3366 next[x][y] = Xtank_2_w;
3367 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3376 static void Ltank_2_n(int x, int y)
3378 if (is_amoeba[cave[x][y-1]] ||
3379 is_amoeba[cave[x+1][y]] ||
3380 is_amoeba[cave[x][y+1]] ||
3381 is_amoeba[cave[x-1][y]])
3392 static void Ltank_e(int x, int y)
3394 switch (cave[x+1][y])
3410 cave[x][y] = Ytank_eB;
3411 next[x][y] = Xblank;
3412 cave[x+1][y] = Ytank_e;
3413 next[x+1][y] = Xtank_1_e;
3414 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3425 cave[x][y] = Ytank_eB;
3426 next[x][y] = Xblank;
3427 if (cave[x+2][y-1] == Xblank)
3428 cave[x+2][y-1] = Xsplash_e;
3429 if (cave[x][y-1] == Xblank)
3430 cave[x][y-1] = Xsplash_w;
3431 play_element_sound(x, y, SOUND_acid, Xacid_1);
3435 cave[x][y] = Ytank_e_s;
3436 next[x][y] = Xtank_2_s;
3437 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3442 static void Ltank_1_e(int x, int y)
3444 if (is_amoeba[cave[x][y-1]] ||
3445 is_amoeba[cave[x+1][y]] ||
3446 is_amoeba[cave[x][y+1]] ||
3447 is_amoeba[cave[x-1][y]])
3455 switch (cave[x][y-1])
3479 cave[x][y] = Ytank_e_n;
3480 next[x][y] = Xtank_2_n;
3481 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3490 static void Ltank_2_e(int x, int y)
3492 if (is_amoeba[cave[x][y-1]] ||
3493 is_amoeba[cave[x+1][y]] ||
3494 is_amoeba[cave[x][y+1]] ||
3495 is_amoeba[cave[x-1][y]])
3506 static void Ltank_s(int x, int y)
3508 switch (cave[x][y+1])
3524 cave[x][y] = Ytank_sB;
3525 next[x][y] = Xblank;
3526 cave[x][y+1] = Ytank_s;
3527 next[x][y+1] = Xtank_1_s;
3528 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3539 cave[x][y] = Ytank_sB;
3540 next[x][y] = Xblank;
3541 if (cave[x+1][y] == Xblank)
3542 cave[x+1][y] = Xsplash_e;
3543 if (cave[x-1][y] == Xblank)
3544 cave[x-1][y] = Xsplash_w;
3545 play_element_sound(x, y, SOUND_acid, Xacid_1);
3549 cave[x][y] = Ytank_s_w;
3550 next[x][y] = Xtank_2_w;
3551 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3556 static void Ltank_1_s(int x, int y)
3558 if (is_amoeba[cave[x][y-1]] ||
3559 is_amoeba[cave[x+1][y]] ||
3560 is_amoeba[cave[x][y+1]] ||
3561 is_amoeba[cave[x-1][y]])
3569 switch (cave[x+1][y])
3593 cave[x][y] = Ytank_s_e;
3594 next[x][y] = Xtank_2_e;
3595 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3604 static void Ltank_2_s(int x, int y)
3606 if (is_amoeba[cave[x][y-1]] ||
3607 is_amoeba[cave[x+1][y]] ||
3608 is_amoeba[cave[x][y+1]] ||
3609 is_amoeba[cave[x-1][y]])
3620 static void Ltank_w(int x, int y)
3622 switch (cave[x-1][y])
3638 cave[x][y] = Ytank_wB;
3639 next[x][y] = Xblank;
3640 cave[x-1][y] = Ytank_w;
3641 next[x-1][y] = Xtank_1_w;
3642 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3653 cave[x][y] = Ytank_wB;
3654 next[x][y] = Xblank;
3655 if (cave[x][y-1] == Xblank)
3656 cave[x][y-1] = Xsplash_e;
3657 if (cave[x-2][y-1] == Xblank)
3658 cave[x-2][y-1] = Xsplash_w;
3659 play_element_sound(x, y, SOUND_acid, Xacid_1);
3663 cave[x][y] = Ytank_w_n;
3664 next[x][y] = Xtank_2_n;
3665 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3670 static void Ltank_1_w(int x, int y)
3672 if (is_amoeba[cave[x][y-1]] ||
3673 is_amoeba[cave[x+1][y]] ||
3674 is_amoeba[cave[x][y+1]] ||
3675 is_amoeba[cave[x-1][y]])
3683 switch (cave[x][y+1])
3707 cave[x][y] = Ytank_w_s;
3708 next[x][y] = Xtank_2_s;
3709 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3718 static void Ltank_2_w(int x, int y)
3720 if (is_amoeba[cave[x][y-1]] ||
3721 is_amoeba[cave[x+1][y]] ||
3722 is_amoeba[cave[x][y+1]] ||
3723 is_amoeba[cave[x-1][y]])
3734 static void Lemerald(int x, int y)
3736 switch (cave[x][y+1])
3749 cave[x][y] = Yemerald_sB;
3750 next[x][y] = Xblank;
3751 cave[x][y+1] = Yemerald_s;
3752 next[x][y+1] = Xemerald_fall;
3763 cave[x][y] = Yemerald_sB;
3764 next[x][y] = Xblank;
3765 if (cave[x+1][y] == Xblank)
3766 cave[x+1][y] = Xsplash_e;
3767 if (cave[x-1][y] == Xblank)
3768 cave[x-1][y] = Xsplash_w;
3769 play_element_sound(x, y, SOUND_acid, Xacid_1);
3782 case Xemerald_pause:
3784 case Xdiamond_pause:
3828 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
3830 cave[x][y] = Yemerald_eB;
3831 next[x][y] = Xblank;
3832 cave[x+1][y] = Yemerald_e;
3833 next[x+1][y] = Xemerald_pause;
3834 if (cave[x][y+1] == Xbumper)
3835 cave[x][y+1] = Ybumper;
3839 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
3841 cave[x][y] = Yemerald_wB;
3842 next[x][y] = Xblank;
3843 cave[x-1][y] = Yemerald_w;
3844 next[x-1][y] = Xemerald_pause;
3845 if (cave[x][y+1] == Xbumper)
3846 cave[x][y+1] = Ybumper;
3852 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
3854 cave[x][y] = Yemerald_wB;
3855 next[x][y] = Xblank;
3856 cave[x-1][y] = Yemerald_w;
3857 next[x-1][y] = Xemerald_pause;
3858 if (cave[x][y+1] == Xbumper)
3859 cave[x][y+1] = Ybumper;
3863 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
3865 cave[x][y] = Yemerald_eB;
3866 next[x][y] = Xblank;
3867 cave[x+1][y] = Yemerald_e;
3868 next[x+1][y] = Xemerald_pause;
3869 if (cave[x][y+1] == Xbumper)
3870 cave[x][y+1] = Ybumper;
3876 if (++lev.shine_cnt > 50)
3878 lev.shine_cnt = RANDOM(8);
3879 cave[x][y] = Xemerald_shine;
3886 static void Lemerald_pause(int x, int y)
3888 switch (cave[x][y+1])
3901 cave[x][y] = Yemerald_sB;
3902 next[x][y] = Xblank;
3903 cave[x][y+1] = Yemerald_s;
3904 next[x][y+1] = Xemerald_fall;
3915 cave[x][y] = Yemerald_sB;
3916 next[x][y] = Xblank;
3917 if (cave[x+1][y] == Xblank)
3918 cave[x+1][y] = Xsplash_e;
3919 if (cave[x-1][y] == Xblank)
3920 cave[x-1][y] = Xsplash_w;
3921 play_element_sound(x, y, SOUND_acid, Xacid_1);
3925 cave[x][y] = Xemerald;
3926 next[x][y] = Xemerald;
3931 static void Lemerald_fall(int x, int y)
3933 switch (cave[x][y+1])
3947 cave[x][y] = Yemerald_sB;
3948 next[x][y] = Xblank;
3949 cave[x][y+1] = Yemerald_s;
3950 next[x][y+1] = Xemerald_fall;
3961 cave[x][y] = Yemerald_sB;
3962 next[x][y] = Xblank;
3963 if (cave[x+1][y] == Xblank)
3964 cave[x+1][y] = Xsplash_e;
3965 if (cave[x-1][y] == Xblank)
3966 cave[x-1][y] = Xsplash_w;
3967 play_element_sound(x, y, SOUND_acid, Xacid_1);
3971 if (lev.wonderwall_time > 0)
3973 lev.wonderwall_active = TRUE;
3974 cave[x][y] = Yemerald_sB;
3975 next[x][y] = Xblank;
3976 if (is_blank[cave[x][y+2]])
3978 cave[x][y+2] = Ydiamond_s;
3979 next[x][y+2] = Xdiamond_fall;
3981 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3986 cave[x][y] = Xemerald;
3987 next[x][y] = Xemerald;
3988 play_element_sound(x, y, SOUND_diamond, Xemerald);
3993 static void Ldiamond(int x, int y)
3995 switch (cave[x][y+1])
4008 cave[x][y] = Ydiamond_sB;
4009 next[x][y] = Xblank;
4010 cave[x][y+1] = Ydiamond_s;
4011 next[x][y+1] = Xdiamond_fall;
4022 cave[x][y] = Ydiamond_sB;
4023 next[x][y] = Xblank;
4024 if (cave[x+1][y] == Xblank)
4025 cave[x+1][y] = Xsplash_e;
4026 if (cave[x-1][y] == Xblank)
4027 cave[x-1][y] = Xsplash_w;
4028 play_element_sound(x, y, SOUND_acid, Xacid_1);
4041 case Xemerald_pause:
4043 case Xdiamond_pause:
4087 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4089 cave[x][y] = Ydiamond_eB;
4090 next[x][y] = Xblank;
4091 cave[x+1][y] = Ydiamond_e;
4092 next[x+1][y] = Xdiamond_pause;
4093 if (cave[x][y+1] == Xbumper)
4094 cave[x][y+1] = Ybumper;
4098 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4100 cave[x][y] = Ydiamond_wB;
4101 next[x][y] = Xblank;
4102 cave[x-1][y] = Ydiamond_w;
4103 next[x-1][y] = Xdiamond_pause;
4104 if (cave[x][y+1] == Xbumper)
4105 cave[x][y+1] = Ybumper;
4111 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4113 cave[x][y] = Ydiamond_wB;
4114 next[x][y] = Xblank;
4115 cave[x-1][y] = Ydiamond_w;
4116 next[x-1][y] = Xdiamond_pause;
4117 if (cave[x][y+1] == Xbumper)
4118 cave[x][y+1] = Ybumper;
4122 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4124 cave[x][y] = Ydiamond_eB;
4125 next[x][y] = Xblank;
4126 cave[x+1][y] = Ydiamond_e;
4127 next[x+1][y] = Xdiamond_pause;
4128 if (cave[x][y+1] == Xbumper)
4129 cave[x][y+1] = Ybumper;
4135 if (++lev.shine_cnt > 50)
4137 lev.shine_cnt = RANDOM(8);
4138 cave[x][y] = Xdiamond_shine;
4145 static void Ldiamond_pause(int x, int y)
4147 switch (cave[x][y+1])
4160 cave[x][y] = Ydiamond_sB;
4161 next[x][y] = Xblank;
4162 cave[x][y+1] = Ydiamond_s;
4163 next[x][y+1] = Xdiamond_fall;
4174 cave[x][y] = Ydiamond_sB;
4175 next[x][y] = Xblank;
4176 if (cave[x+1][y] == Xblank)
4177 cave[x+1][y] = Xsplash_e;
4178 if (cave[x-1][y] == Xblank)
4179 cave[x-1][y] = Xsplash_w;
4180 play_element_sound(x, y, SOUND_acid, Xacid_1);
4184 cave[x][y] = Xdiamond;
4185 next[x][y] = Xdiamond;
4190 static void Ldiamond_fall(int x, int y)
4192 switch (cave[x][y+1])
4206 cave[x][y] = Ydiamond_sB;
4207 next[x][y] = Xblank;
4208 cave[x][y+1] = Ydiamond_s;
4209 next[x][y+1] = Xdiamond_fall;
4220 cave[x][y] = Ydiamond_sB;
4221 next[x][y] = Xblank;
4222 if (cave[x+1][y] == Xblank)
4223 cave[x+1][y] = Xsplash_e;
4224 if (cave[x-1][y] == Xblank)
4225 cave[x-1][y] = Xsplash_w;
4226 play_element_sound(x, y, SOUND_acid, Xacid_1);
4230 if (lev.wonderwall_time > 0)
4232 lev.wonderwall_active = TRUE;
4233 cave[x][y] = Ydiamond_sB;
4234 next[x][y] = Xblank;
4235 if (is_blank[cave[x][y+2]])
4237 cave[x][y+2] = Ystone_s;
4238 next[x][y+2] = Xstone_fall;
4240 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4245 cave[x][y] = Xdiamond;
4246 next[x][y] = Xdiamond;
4247 play_element_sound(x, y, SOUND_diamond, Xdiamond);
4252 static void Lstone(int x, int y)
4254 switch (cave[x][y+1])
4269 cave[x][y] = Ystone_sB;
4270 next[x][y] = Xblank;
4271 cave[x][y+1] = Ystone_s;
4272 next[x][y+1] = Xstone_fall;
4283 cave[x][y] = Ystone_sB;
4284 next[x][y] = Xblank;
4285 if (cave[x+1][y] == Xblank)
4286 cave[x+1][y] = Xsplash_e;
4287 if (cave[x-1][y] == Xblank)
4288 cave[x-1][y] = Xsplash_w;
4289 play_element_sound(x, y, SOUND_acid, Xacid_1);
4293 cave[x][y] = Xsand_stonein_1;
4294 next[x][y] = Xsand_stonein_2;
4295 cave[x][y+1] = Xsand_sandstone_1;
4296 next[x][y+1] = Xsand_sandstone_2;
4309 case Xemerald_pause:
4311 case Xdiamond_pause:
4348 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4350 cave[x][y] = Ystone_eB;
4351 next[x][y] = Xblank;
4352 cave[x+1][y] = Ystone_e;
4353 next[x+1][y] = Xstone_pause;
4354 if (cave[x][y+1] == Xbumper)
4355 cave[x][y+1] = Ybumper;
4359 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4361 cave[x][y] = Ystone_wB;
4362 next[x][y] = Xblank;
4363 cave[x-1][y] = Ystone_w;
4364 next[x-1][y] = Xstone_pause;
4365 if (cave[x][y+1] == Xbumper)
4366 cave[x][y+1] = Ybumper;
4372 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4374 cave[x][y] = Ystone_wB;
4375 next[x][y] = Xblank;
4376 cave[x-1][y] = Ystone_w;
4377 next[x-1][y] = Xstone_pause;
4378 if (cave[x][y+1] == Xbumper)
4379 cave[x][y+1] = Ybumper;
4383 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4385 cave[x][y] = Ystone_eB;
4386 next[x][y] = Xblank;
4387 cave[x+1][y] = Ystone_e;
4388 next[x+1][y] = Xstone_pause;
4389 if (cave[x][y+1] == Xbumper)
4390 cave[x][y+1] = Ybumper;
4397 static void Lstone_pause(int x, int y)
4399 switch (cave[x][y+1])
4412 cave[x][y] = Ystone_sB;
4413 next[x][y] = Xblank;
4414 cave[x][y+1] = Ystone_s;
4415 next[x][y+1] = Xstone_fall;
4426 cave[x][y] = Ystone_sB;
4427 next[x][y] = Xblank;
4428 if (cave[x+1][y] == Xblank)
4429 cave[x+1][y] = Xsplash_e;
4430 if (cave[x-1][y] == Xblank)
4431 cave[x-1][y] = Xsplash_w;
4432 play_element_sound(x, y, SOUND_acid, Xacid_1);
4436 cave[x][y] = Xstone;
4437 next[x][y] = Xstone;
4442 static void Lstone_fall(int x, int y)
4444 switch (cave[x][y+1])
4458 cave[x][y] = Ystone_sB;
4459 next[x][y] = Xblank;
4460 cave[x][y+1] = Ystone_s;
4461 next[x][y+1] = Xstone_fall;
4472 cave[x][y] = Ystone_sB;
4473 next[x][y] = Xblank;
4474 if (cave[x+1][y] == Xblank)
4475 cave[x+1][y] = Xsplash_e;
4476 if (cave[x-1][y] == Xblank)
4477 cave[x-1][y] = Xsplash_w;
4478 play_element_sound(x, y, SOUND_acid, Xacid_1);
4485 cave[x][y] = Ystone_sB;
4486 next[x][y] = Xblank;
4487 cave[x][y+1] = Yeater_stone;
4488 next[x][y+1] = Zeater;
4489 Lboom_eater_old(x, y+1);
4490 score += lev.eater_score;
4495 cave[x][y] = Ystone_sB;
4496 next[x][y] = Xblank;
4497 cave[x][y+1] = Yalien_stone;
4498 next[x][y+1] = Ztank;
4499 Lboom_tank_old(x, y+1);
4500 score += lev.alien_score;
4511 cave[x][y] = Ystone_sB;
4512 next[x][y] = Xblank;
4513 cave[x][y+1] = Ybug_stone;
4514 next[x][y+1] = Zbug;
4515 Lboom_bug_old(x, y+1);
4516 score += lev.bug_score;
4527 cave[x][y] = Ystone_sB;
4528 next[x][y] = Xblank;
4529 cave[x][y+1] = Ytank_stone;
4530 next[x][y+1] = Ztank;
4531 Lboom_tank_old(x, y+1);
4532 score += lev.tank_score;
4536 case Xdiamond_pause:
4537 switch (cave[x][y+2])
4593 next[x][y] = Xstone;
4594 play_element_sound(x, y, SOUND_stone, Xstone);
4598 cave[x][y] = Ystone_sB;
4599 next[x][y] = Xblank;
4600 cave[x][y+1] = Ydiamond_stone;
4601 next[x][y+1] = Xstone_pause;
4602 play_element_sound(x, y, SOUND_squash, Xdiamond);
4607 cave[x][y] = Xstone;
4608 next[x][y] = Xstone;
4609 cave[x][y+1] = Ybomb_blank;
4610 next[x][y+1] = Ztank;
4611 Lboom_tank_old(x, y+1);
4616 next[x][y] = Xstone;
4617 cave[x][y+1] = Ynut_stone;
4618 next[x][y+1] = Xemerald;
4619 play_element_sound(x, y, SOUND_crack, Xnut);
4620 score += lev.nut_score;
4626 switch (cave[x+1][y+1])
4641 cave[x][y+1] = Xspring_e;
4645 cave[x][y+1] = Xspring_w;
4651 switch (cave[x-1][y+1])
4666 cave[x][y+1] = Xspring_w;
4669 cave[x][y+1] = Xspring_e;
4674 next[x][y] = Xstone;
4678 if (lev.wonderwall_time > 0)
4680 lev.wonderwall_active = TRUE;
4681 cave[x][y] = Ystone_sB;
4682 next[x][y] = Xblank;
4683 if (is_blank[cave[x][y+2]])
4685 cave[x][y+2] = Yemerald_s;
4686 next[x][y+2] = Xemerald_fall;
4688 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4693 cave[x][y] = Xstone;
4694 next[x][y] = Xstone;
4695 play_element_sound(x, y, SOUND_stone, Xstone);
4700 static void Lbomb(int x, int y)
4702 switch (cave[x][y+1])
4715 cave[x][y] = Ybomb_sB;
4716 next[x][y] = Xblank;
4717 cave[x][y+1] = Ybomb_s;
4718 next[x][y+1] = Xbomb_fall;
4729 cave[x][y] = Ybomb_sB;
4730 next[x][y] = Xblank;
4731 if (cave[x+1][y] == Xblank)
4732 cave[x+1][y] = Xsplash_e;
4733 if (cave[x-1][y] == Xblank)
4734 cave[x-1][y] = Xsplash_w;
4735 play_element_sound(x, y, SOUND_acid, Xacid_1);
4748 case Xemerald_pause:
4750 case Xdiamond_pause:
4785 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4787 cave[x][y] = Ybomb_eB;
4788 next[x][y] = Xblank;
4789 cave[x+1][y] = Ybomb_e;
4790 next[x+1][y] = Xbomb_pause;
4791 if (cave[x][y+1] == Xbumper)
4792 cave[x][y+1] = Ybumper;
4796 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4798 cave[x][y] = Ybomb_wB;
4799 next[x][y] = Xblank;
4800 cave[x-1][y] = Ybomb_w;
4801 next[x-1][y] = Xbomb_pause;
4802 if (cave[x][y+1] == Xbumper)
4803 cave[x][y+1] = Ybumper;
4809 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4811 cave[x][y] = Ybomb_wB;
4812 next[x][y] = Xblank;
4813 cave[x-1][y] = Ybomb_w;
4814 next[x-1][y] = Xbomb_pause;
4815 if (cave[x][y+1] == Xbumper)
4816 cave[x][y+1] = Ybumper;
4820 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4822 cave[x][y] = Ybomb_eB;
4823 next[x][y] = Xblank;
4824 cave[x+1][y] = Ybomb_e;
4825 next[x+1][y] = Xbomb_pause;
4826 if (cave[x][y+1] == Xbumper)
4827 cave[x][y+1] = Ybumper;
4834 static void Lbomb_pause(int x, int y)
4836 switch (cave[x][y+1])
4849 cave[x][y] = Ybomb_sB;
4850 next[x][y] = Xblank;
4851 cave[x][y+1] = Ybomb_s;
4852 next[x][y+1] = Xbomb_fall;
4863 cave[x][y] = Ybomb_sB;
4864 next[x][y] = Xblank;
4865 if (cave[x+1][y] == Xblank)
4866 cave[x+1][y] = Xsplash_e;
4867 if (cave[x-1][y] == Xblank)
4868 cave[x-1][y] = Xsplash_w;
4869 play_element_sound(x, y, SOUND_acid, Xacid_1);
4879 static void Lbomb_fall(int x, int y)
4881 switch (cave[x][y+1])
4894 cave[x][y] = Ybomb_sB;
4895 next[x][y] = Xblank;
4896 cave[x][y+1] = Ybomb_s;
4897 next[x][y+1] = Xbomb_fall;
4908 cave[x][y] = Ybomb_sB;
4909 next[x][y] = Xblank;
4910 if (cave[x+1][y] == Xblank)
4911 cave[x+1][y] = Xsplash_e;
4912 if (cave[x-1][y] == Xblank)
4913 cave[x-1][y] = Xsplash_w;
4914 play_element_sound(x, y, SOUND_acid, Xacid_1);
4918 cave[x][y] = Ybomb_blank;
4920 Lboom_tank_old(x, y);
4925 static void Lnut(int x, int y)
4927 switch (cave[x][y+1])
4940 cave[x][y] = Ynut_sB;
4941 next[x][y] = Xblank;
4942 cave[x][y+1] = Ynut_s;
4943 next[x][y+1] = Xnut_fall;
4954 cave[x][y] = Ynut_sB;
4955 next[x][y] = Xblank;
4956 if (cave[x+1][y] == Xblank)
4957 cave[x+1][y] = Xsplash_e;
4958 if (cave[x-1][y] == Xblank)
4959 cave[x-1][y] = Xsplash_w;
4960 play_element_sound(x, y, SOUND_acid, Xacid_1);
4973 case Xemerald_pause:
4975 case Xdiamond_pause:
5010 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5012 cave[x][y] = Ynut_eB;
5013 next[x][y] = Xblank;
5014 cave[x+1][y] = Ynut_e;
5015 next[x+1][y] = Xnut_pause;
5016 if (cave[x][y+1] == Xbumper)
5017 cave[x][y+1] = Ybumper;
5021 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5023 cave[x][y] = Ynut_wB;
5024 next[x][y] = Xblank;
5025 cave[x-1][y] = Ynut_w;
5026 next[x-1][y] = Xnut_pause;
5027 if (cave[x][y+1] == Xbumper)
5028 cave[x][y+1] = Ybumper;
5034 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5036 cave[x][y] = Ynut_wB;
5037 next[x][y] = Xblank;
5038 cave[x-1][y] = Ynut_w;
5039 next[x-1][y] = Xnut_pause;
5040 if (cave[x][y+1] == Xbumper)
5041 cave[x][y+1] = Ybumper;
5045 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5047 cave[x][y] = Ynut_eB;
5048 next[x][y] = Xblank;
5049 cave[x+1][y] = Ynut_e;
5050 next[x+1][y] = Xnut_pause;
5051 if (cave[x][y+1] == Xbumper)
5052 cave[x][y+1] = Ybumper;
5059 static void Lnut_pause(int x, int y)
5061 switch (cave[x][y+1])
5074 cave[x][y] = Ynut_sB;
5075 next[x][y] = Xblank;
5076 cave[x][y+1] = Ynut_s;
5077 next[x][y+1] = Xnut_fall;
5088 cave[x][y] = Ynut_sB;
5089 next[x][y] = Xblank;
5090 if (cave[x+1][y] == Xblank)
5091 cave[x+1][y] = Xsplash_e;
5092 if (cave[x-1][y] == Xblank)
5093 cave[x-1][y] = Xsplash_w;
5094 play_element_sound(x, y, SOUND_acid, Xacid_1);
5104 static void Lnut_fall(int x, int y)
5106 switch (cave[x][y+1])
5120 cave[x][y] = Ynut_sB;
5121 next[x][y] = Xblank;
5122 cave[x][y+1] = Ynut_s;
5123 next[x][y+1] = Xnut_fall;
5134 cave[x][y] = Ynut_sB;
5135 next[x][y] = Xblank;
5136 if (cave[x+1][y] == Xblank)
5137 cave[x+1][y] = Xsplash_e;
5138 if (cave[x-1][y] == Xblank)
5139 cave[x-1][y] = Xsplash_w;
5140 play_element_sound(x, y, SOUND_acid, Xacid_1);
5146 play_element_sound(x, y, SOUND_nut, Xnut);
5151 static void Lspring(int x, int y)
5153 switch (cave[x][y+1])
5168 cave[x][y] = Yspring_sB;
5169 next[x][y] = Xblank;
5170 cave[x][y+1] = Yspring_s;
5171 next[x][y+1] = Xspring_fall;
5182 cave[x][y] = Yspring_sB;
5183 next[x][y] = Xblank;
5184 if (cave[x+1][y] == Xblank)
5185 cave[x+1][y] = Xsplash_e;
5186 if (cave[x-1][y] == Xblank)
5187 cave[x-1][y] = Xsplash_w;
5188 play_element_sound(x, y, SOUND_acid, Xacid_1);
5201 case Xemerald_pause:
5203 case Xdiamond_pause:
5238 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5240 cave[x][y] = Yspring_eB;
5241 next[x][y] = Xblank;
5242 cave[x+1][y] = Yspring_e;
5244 next[x+1][y] = Xspring_e;
5246 next[x+1][y] = Xspring_pause;
5248 if (cave[x][y+1] == Xbumper)
5249 cave[x][y+1] = Ybumper;
5253 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5255 cave[x][y] = Yspring_wB;
5256 next[x][y] = Xblank;
5257 cave[x-1][y] = Yspring_w;
5259 next[x-1][y] = Xspring_w;
5261 next[x-1][y] = Xspring_pause;
5263 if (cave[x][y+1] == Xbumper)
5264 cave[x][y+1] = Ybumper;
5270 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5272 cave[x][y] = Yspring_wB;
5273 next[x][y] = Xblank;
5274 cave[x-1][y] = Yspring_w;
5276 next[x-1][y] = Xspring_w;
5278 next[x-1][y] = Xspring_pause;
5280 if (cave[x][y+1] == Xbumper)
5281 cave[x][y+1] = Ybumper;
5285 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5287 cave[x][y] = Yspring_eB;
5288 next[x][y] = Xblank;
5289 cave[x+1][y] = Yspring_e;
5291 next[x+1][y] = Xspring_e;
5293 next[x+1][y] = Xspring_pause;
5295 if (cave[x][y+1] == Xbumper)
5296 cave[x][y+1] = Ybumper;
5303 static void Lspring_pause(int x, int y)
5305 switch (cave[x][y+1])
5318 cave[x][y] = Yspring_sB;
5319 next[x][y] = Xblank;
5320 cave[x][y+1] = Yspring_s;
5321 next[x][y+1] = Xspring_fall;
5332 cave[x][y] = Yspring_sB;
5333 next[x][y] = Xblank;
5334 if (cave[x+1][y] == Xblank)
5335 cave[x+1][y] = Xsplash_e;
5336 if (cave[x-1][y] == Xblank)
5337 cave[x-1][y] = Xsplash_w;
5338 play_element_sound(x, y, SOUND_acid, Xacid_1);
5342 cave[x][y] = Xspring;
5343 next[x][y] = Xspring;
5348 static void Lspring_e(int x, int y)
5350 switch (cave[x][y+1])
5363 cave[x][y] = Yspring_sB;
5364 next[x][y] = Xblank;
5365 cave[x][y+1] = Yspring_s;
5366 next[x][y+1] = Xspring_fall;
5377 cave[x][y] = Yspring_sB;
5378 next[x][y] = Xblank;
5379 if (cave[x+1][y] == Xblank)
5380 cave[x+1][y] = Xsplash_e;
5381 if (cave[x-1][y] == Xblank)
5382 cave[x-1][y] = Xsplash_w;
5383 play_element_sound(x, y, SOUND_acid, Xacid_1);
5387 cave[x][y+1] = Ybumper;
5390 switch (cave[x+1][y])
5407 cave[x][y] = Yspring_eB;
5408 next[x][y] = Xblank;
5409 cave[x+1][y] = Yspring_e;
5410 next[x+1][y] = Xspring_e;
5421 cave[x][y] = Yspring_eB;
5422 next[x][y] = Xblank;
5423 if (cave[x+2][y-1] == Xblank)
5424 cave[x+2][y-1] = Xsplash_e;
5425 if (cave[x][y-1] == Xblank)
5426 cave[x][y-1] = Xsplash_w;
5427 play_element_sound(x, y, SOUND_acid, Xacid_1);
5436 cave[x][y] = Yspring_alien_eB;
5437 next[x][y] = Xblank;
5438 cave[x+1][y] = Yspring_alien_e;
5439 next[x+1][y] = Xspring_e;
5440 play_element_sound(x, y, SOUND_slurp, Xalien);
5441 score += lev.slurp_score;
5446 cave[x+1][y] = Ybumper;
5447 next[x][y] = Xspring_w;
5448 play_element_sound(x, y, SOUND_spring, Xspring);
5452 cave[x][y] = Xspring;
5453 next[x][y] = Xspring;
5454 play_element_sound(x, y, SOUND_spring, Xspring);
5459 static void Lspring_w(int x, int y)
5461 switch (cave[x][y+1])
5474 cave[x][y] = Yspring_sB;
5475 next[x][y] = Xblank;
5476 cave[x][y+1] = Yspring_s;
5477 next[x][y+1] = Xspring_fall;
5488 cave[x][y] = Yspring_sB;
5489 next[x][y] = Xblank;
5490 if (cave[x+1][y] == Xblank)
5491 cave[x+1][y] = Xsplash_e;
5492 if (cave[x-1][y] == Xblank)
5493 cave[x-1][y] = Xsplash_w;
5494 play_element_sound(x, y, SOUND_acid, Xacid_1);
5498 cave[x][y+1] = Ybumper;
5501 switch (cave[x-1][y])
5518 cave[x][y] = Yspring_wB;
5519 next[x][y] = Xblank;
5520 cave[x-1][y] = Yspring_w;
5521 next[x-1][y] = Xspring_w;
5532 cave[x][y] = Yspring_wB;
5533 next[x][y] = Xblank;
5534 if (cave[x][y-1] == Xblank)
5535 cave[x][y-1] = Xsplash_e;
5536 if (cave[x-2][y-1] == Xblank)
5537 cave[x-2][y-1] = Xsplash_w;
5538 play_element_sound(x, y, SOUND_acid, Xacid_1);
5547 cave[x][y] = Yspring_alien_wB;
5548 next[x][y] = Xblank;
5549 cave[x-1][y] = Yspring_alien_w;
5550 next[x-1][y] = Xspring_w;
5551 play_element_sound(x, y, SOUND_slurp, Xalien);
5552 score += lev.slurp_score;
5557 cave[x-1][y] = Ybumper;
5558 next[x][y] = Xspring_e;
5559 play_element_sound(x, y, SOUND_spring, Xspring);
5563 cave[x][y] = Xspring;
5564 next[x][y] = Xspring;
5565 play_element_sound(x, y, SOUND_spring, Xspring);
5570 static void Lspring_fall(int x, int y)
5572 switch (cave[x][y+1])
5586 cave[x][y] = Yspring_sB;
5587 next[x][y] = Xblank;
5588 cave[x][y+1] = Yspring_s;
5589 next[x][y+1] = Xspring_fall;
5600 cave[x][y] = Yspring_sB;
5601 next[x][y] = Xblank;
5602 if (cave[x+1][y] == Xblank)
5603 cave[x+1][y] = Xsplash_e;
5604 if (cave[x-1][y] == Xblank)
5605 cave[x-1][y] = Xsplash_w;
5606 play_element_sound(x, y, SOUND_acid, Xacid_1);
5613 cave[x][y] = Yspring_sB;
5614 next[x][y] = Xblank;
5615 cave[x][y+1] = Yeater_spring;
5616 next[x][y+1] = Zeater;
5617 Lboom_eater_old(x, y+1);
5618 score += lev.eater_score;
5623 cave[x][y] = Yspring_sB;
5624 next[x][y] = Xblank;
5625 cave[x][y+1] = Yalien_spring;
5626 next[x][y+1] = Ztank;
5627 Lboom_tank_old(x, y+1);
5628 score += lev.alien_score;
5639 cave[x][y] = Yspring_sB;
5640 next[x][y] = Xblank;
5641 cave[x][y+1] = Ybug_spring;
5642 next[x][y+1] = Zbug;
5643 Lboom_bug_old(x, y+1);
5644 score += lev.bug_score;
5655 cave[x][y] = Yspring_sB;
5656 next[x][y] = Xblank;
5657 cave[x][y+1] = Ytank_spring;
5658 next[x][y+1] = Ztank;
5659 Lboom_tank_old(x, y+1);
5660 score += lev.tank_score;
5665 cave[x][y] = Xspring;
5666 next[x][y] = Xspring;
5667 cave[x][y+1] = Ybomb_blank;
5668 next[x][y+1] = Ztank;
5669 Lboom_tank_old(x, y+1);
5673 cave[x][y] = Xspring;
5674 next[x][y] = Xspring;
5675 play_element_sound(x, y, SOUND_spring, Xspring);
5680 static void Lpush_emerald_e(int x, int y)
5682 cave[x][y] = Yemerald_eB;
5683 next[x][y] = Xblank;
5685 switch (cave[x+1][y])
5709 if (cave[x+2][y-1] == Xblank)
5710 cave[x+2][y-1] = Xsplash_e;
5711 if (cave[x][y-1] == Xblank)
5712 cave[x][y-1] = Xsplash_w;
5713 play_element_sound(x, y, SOUND_acid, Xacid_1);
5718 cave[x+1][y] = Yemerald_e;
5719 next[x+1][y] = Xemerald_pause;
5722 static void Lpush_emerald_w(int x, int y)
5724 cave[x][y] = Yemerald_wB;
5725 next[x][y] = Xblank;
5727 switch (cave[x-1][y])
5751 if (cave[x][y-1] == Xblank)
5752 cave[x][y-1] = Xsplash_e;
5753 if (cave[x-2][y-1] == Xblank)
5754 cave[x-2][y-1] = Xsplash_w;
5755 play_element_sound(x, y, SOUND_acid, Xacid_1);
5760 cave[x-1][y] = Yemerald_w;
5761 next[x-1][y] = Xemerald_pause;
5764 static void Lpush_diamond_e(int x, int y)
5766 cave[x][y] = Ydiamond_eB;
5767 next[x][y] = Xblank;
5769 switch (cave[x+1][y])
5793 if (cave[x+2][y-1] == Xblank)
5794 cave[x+2][y-1] = Xsplash_e;
5795 if (cave[x][y-1] == Xblank)
5796 cave[x][y-1] = Xsplash_w;
5797 play_element_sound(x, y, SOUND_acid, Xacid_1);
5802 cave[x+1][y] = Ydiamond_e;
5803 next[x+1][y] = Xdiamond_pause;
5806 static void Lpush_diamond_w(int x, int y)
5808 cave[x][y] = Ydiamond_wB;
5809 next[x][y] = Xblank;
5811 switch (cave[x-1][y])
5835 if (cave[x][y-1] == Xblank)
5836 cave[x][y-1] = Xsplash_e;
5837 if (cave[x-2][y-1] == Xblank)
5838 cave[x-2][y-1] = Xsplash_w;
5839 play_element_sound(x, y, SOUND_acid, Xacid_1);
5844 cave[x-1][y] = Ydiamond_w;
5845 next[x-1][y] = Xdiamond_pause;
5848 static void Lpush_stone_e(int x, int y)
5850 cave[x][y] = Ystone_eB;
5851 next[x][y] = Xblank;
5853 switch (cave[x+1][y])
5877 if (cave[x+2][y-1] == Xblank)
5878 cave[x+2][y-1] = Xsplash_e;
5879 if (cave[x][y-1] == Xblank)
5880 cave[x][y-1] = Xsplash_w;
5881 play_element_sound(x, y, SOUND_acid, Xacid_1);
5886 cave[x+1][y] = Ystone_e;
5887 next[x+1][y] = Xstone_pause;
5890 static void Lpush_stone_w(int x, int y)
5892 cave[x][y] = Ystone_wB;
5893 next[x][y] = Xblank;
5895 switch (cave[x-1][y])
5919 if (cave[x][y-1] == Xblank)
5920 cave[x][y-1] = Xsplash_e;
5921 if (cave[x-2][y-1] == Xblank)
5922 cave[x-2][y-1] = Xsplash_w;
5923 play_element_sound(x, y, SOUND_acid, Xacid_1);
5928 cave[x-1][y] = Ystone_w;
5929 next[x-1][y] = Xstone_pause;
5932 static void Lpush_bomb_e(int x, int y)
5934 cave[x][y] = Ybomb_eB;
5935 next[x][y] = Xblank;
5937 switch (cave[x+1][y])
5961 if (cave[x+2][y-1] == Xblank)
5962 cave[x+2][y-1] = Xsplash_e;
5963 if (cave[x][y-1] == Xblank)
5964 cave[x][y-1] = Xsplash_w;
5965 play_element_sound(x, y, SOUND_acid, Xacid_1);
5970 cave[x+1][y] = Ybomb_e;
5971 next[x+1][y] = Xbomb_pause;
5974 static void Lpush_bomb_w(int x, int y)
5976 cave[x][y] = Ybomb_wB;
5977 next[x][y] = Xblank;
5979 switch (cave[x-1][y])
6003 if (cave[x][y-1] == Xblank)
6004 cave[x][y-1] = Xsplash_e;
6005 if (cave[x-2][y-1] == Xblank)
6006 cave[x-2][y-1] = Xsplash_w;
6007 play_element_sound(x, y, SOUND_acid, Xacid_1);
6012 cave[x-1][y] = Ybomb_w;
6013 next[x-1][y] = Xbomb_pause;
6016 static void Lpush_nut_e(int x, int y)
6018 cave[x][y] = Ynut_eB;
6019 next[x][y] = Xblank;
6021 switch (cave[x+1][y])
6045 if (cave[x+2][y-1] == Xblank)
6046 cave[x+2][y-1] = Xsplash_e;
6047 if (cave[x][y-1] == Xblank)
6048 cave[x][y-1] = Xsplash_w;
6049 play_element_sound(x, y, SOUND_acid, Xacid_1);
6054 cave[x+1][y] = Ynut_e;
6055 next[x+1][y] = Xnut_pause;
6058 static void Lpush_nut_w(int x, int y)
6060 cave[x][y] = Ynut_wB;
6061 next[x][y] = Xblank;
6063 switch (cave[x-1][y])
6087 if (cave[x][y-1] == Xblank)
6088 cave[x][y-1] = Xsplash_e;
6089 if (cave[x-2][y-1] == Xblank)
6090 cave[x-2][y-1] = Xsplash_w;
6091 play_element_sound(x, y, SOUND_acid, Xacid_1);
6096 cave[x-1][y] = Ynut_w;
6097 next[x-1][y] = Xnut_pause;
6100 static void Lpush_spring_e(int x, int y)
6102 cave[x][y] = Yspring_eB;
6103 next[x][y] = Xblank;
6105 switch (cave[x+1][y])
6129 if (cave[x+2][y-1] == Xblank)
6130 cave[x+2][y-1] = Xsplash_e;
6131 if (cave[x][y-1] == Xblank)
6132 cave[x][y-1] = Xsplash_w;
6133 play_element_sound(x, y, SOUND_acid, Xacid_1);
6138 cave[x+1][y] = Yspring_e;
6139 next[x+1][y] = Xspring_e;
6142 static void Lpush_spring_w(int x, int y)
6144 cave[x][y] = Yspring_wB;
6145 next[x][y] = Xblank;
6147 switch (cave[x-1][y])
6171 if (cave[x][y-1] == Xblank)
6172 cave[x][y-1] = Xsplash_e;
6173 if (cave[x-2][y-1] == Xblank)
6174 cave[x-2][y-1] = Xsplash_w;
6175 play_element_sound(x, y, SOUND_acid, Xacid_1);
6180 cave[x-1][y] = Yspring_w;
6181 next[x-1][y] = Xspring_w;
6184 static void Ldynamite_1(int x, int y)
6186 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
6187 next[x][y] = Xdynamite_2;
6190 static void Ldynamite_2(int x, int y)
6192 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
6193 next[x][y] = Xdynamite_3;
6196 static void Ldynamite_3(int x, int y)
6198 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
6199 next[x][y] = Xdynamite_4;
6202 static void Ldynamite_4(int x, int y)
6204 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
6205 next[x][y] = Zdynamite;
6207 Lboom_generic(x, y, Xblank, Xblank);
6210 static void Lfake_door_1(int x, int y)
6212 if (lev.magnify_cnt)
6213 cave[x][y] = Xdoor_1;
6216 static void Lfake_door_2(int x, int y)
6218 if (lev.magnify_cnt)
6219 cave[x][y] = Xdoor_2;
6222 static void Lfake_door_3(int x, int y)
6224 if (lev.magnify_cnt)
6225 cave[x][y] = Xdoor_3;
6228 static void Lfake_door_4(int x, int y)
6230 if (lev.magnify_cnt)
6231 cave[x][y] = Xdoor_4;
6234 static void Lfake_door_5(int x, int y)
6236 if (lev.magnify_cnt)
6237 cave[x][y] = Xdoor_5;
6240 static void Lfake_door_6(int x, int y)
6242 if (lev.magnify_cnt)
6243 cave[x][y] = Xdoor_6;
6246 static void Lfake_door_7(int x, int y)
6248 if (lev.magnify_cnt)
6249 cave[x][y] = Xdoor_7;
6252 static void Lfake_door_8(int x, int y)
6254 if (lev.magnify_cnt)
6255 cave[x][y] = Xdoor_8;
6258 static void Lballoon(int x, int y)
6260 if (lev.wind_cnt == 0)
6263 switch (lev.wind_direction)
6266 switch (cave[x][y-1])
6279 cave[x][y] = Yballoon_nB;
6280 next[x][y] = Xblank;
6281 cave[x][y-1] = Yballoon_n;
6282 next[x][y-1] = Xballoon;
6293 cave[x][y] = Yballoon_nB;
6294 next[x][y] = Xblank;
6295 if (cave[x+1][y-2] == Xblank)
6296 cave[x+1][y-2] = Xsplash_e;
6297 if (cave[x-1][y-2] == Xblank)
6298 cave[x-1][y-2] = Xsplash_w;
6299 play_element_sound(x, y, SOUND_acid, Xacid_1);
6305 switch (cave[x+1][y])
6318 cave[x][y] = Yballoon_eB;
6319 next[x][y] = Xblank;
6320 cave[x+1][y] = Yballoon_e;
6321 next[x+1][y] = Xballoon;
6332 cave[x][y] = Yballoon_eB;
6333 next[x][y] = Xblank;
6334 if (cave[x+2][y-1] == Xblank)
6335 cave[x+2][y-1] = Xsplash_e;
6336 if (cave[x][y-1] == Xblank)
6337 cave[x][y-1] = Xsplash_w;
6338 play_element_sound(x, y, SOUND_acid, Xacid_1);
6344 switch (cave[x][y+1])
6357 cave[x][y] = Yballoon_sB;
6358 next[x][y] = Xblank;
6359 cave[x][y+1] = Yballoon_s;
6360 next[x][y+1] = Xballoon;
6371 cave[x][y] = Yballoon_sB;
6372 next[x][y] = Xblank;
6373 if (cave[x+1][y] == Xblank)
6374 cave[x+1][y] = Xsplash_e;
6375 if (cave[x-1][y] == Xblank)
6376 cave[x-1][y] = Xsplash_w;
6377 play_element_sound(x, y, SOUND_acid, Xacid_1);
6383 switch (cave[x-1][y])
6396 cave[x][y] = Yballoon_wB;
6397 next[x][y] = Xblank;
6398 cave[x-1][y] = Yballoon_w;
6399 next[x-1][y] = Xballoon;
6410 cave[x][y] = Yballoon_wB;
6411 next[x][y] = Xblank;
6412 if (cave[x][y-1] == Xblank)
6413 cave[x][y-1] = Xsplash_e;
6414 if (cave[x-2][y-1] == Xblank)
6415 cave[x-2][y-1] = Xsplash_w;
6416 play_element_sound(x, y, SOUND_acid, Xacid_1);
6423 static void Lball_common(int x, int y)
6425 play_element_sound(x, y, SOUND_ball, Xball_1);
6427 if (lev.ball_random)
6432 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6433 is_blank[cave[x-1][y-1]])
6435 cave[x-1][y-1] = Yball_blank;
6436 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6441 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6442 is_blank[cave[x][y-1]])
6444 cave[x][y-1] = Yball_blank;
6445 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6450 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6451 is_blank[cave[x+1][y-1]])
6453 cave[x+1][y-1] = Yball_blank;
6454 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6459 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6460 is_blank[cave[x-1][y]])
6462 cave[x-1][y] = Yball_blank;
6463 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6468 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6469 is_blank[cave[x+1][y]])
6471 cave[x+1][y] = Yball_blank;
6472 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6477 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6478 is_blank[cave[x-1][y+1]])
6480 cave[x-1][y+1] = Yball_blank;
6481 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6486 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6487 is_blank[cave[x][y+1]])
6489 cave[x][y+1] = Yball_blank;
6490 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6495 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6496 is_blank[cave[x+1][y+1]])
6498 cave[x+1][y+1] = Yball_blank;
6499 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6506 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6507 is_blank[cave[x-1][y-1]])
6509 cave[x-1][y-1] = Yball_blank;
6510 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6513 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6514 is_blank[cave[x][y-1]])
6516 cave[x][y-1] = Yball_blank;
6517 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6520 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6521 is_blank[cave[x+1][y-1]])
6523 cave[x+1][y-1] = Yball_blank;
6524 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6527 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6528 is_blank[cave[x-1][y]])
6530 cave[x-1][y] = Yball_blank;
6531 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6534 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6535 is_blank[cave[x+1][y]])
6537 cave[x+1][y] = Yball_blank;
6538 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6541 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6542 is_blank[cave[x-1][y+1]])
6544 cave[x-1][y+1] = Yball_blank;
6545 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6548 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6549 is_blank[cave[x][y+1]])
6551 cave[x][y+1] = Yball_blank;
6552 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6555 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6556 is_blank[cave[x+1][y+1]])
6558 cave[x+1][y+1] = Yball_blank;
6559 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6563 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
6566 static void Lball_1(int x, int y)
6568 if (!lev.ball_active)
6571 cave[x][y] = Yball_1;
6572 next[x][y] = Xball_2;
6579 static void Lball_2(int x, int y)
6581 if (!lev.ball_active)
6584 cave[x][y] = Yball_2;
6585 next[x][y] = Xball_1;
6592 static void Ldrip(int x, int y)
6594 next[x][y] = Xdrip_fall;
6597 static void Ldrip_fall(int x, int y)
6601 switch (cave[x][y+1])
6617 cave[x][y] = Ydrip_1_sB;
6618 next[x][y] = Xdrip_stretchB;
6619 cave[x][y+1] = Ydrip_1_s;
6620 next[x][y+1] = Xdrip_stretch;
6631 cave[x][y] = Ydrip_1_sB;
6632 next[x][y] = Xdrip_stretchB;
6633 if (cave[x+1][y] == Xblank)
6634 cave[x+1][y] = Xsplash_e;
6635 if (cave[x-1][y] == Xblank)
6636 cave[x-1][y] = Xsplash_w;
6637 play_element_sound(x, y, SOUND_acid, Xacid_1);
6643 case 0: temp = Xamoeba_1; break;
6644 case 1: temp = Xamoeba_2; break;
6645 case 2: temp = Xamoeba_3; break;
6646 case 3: temp = Xamoeba_4; break;
6647 case 4: temp = Xamoeba_5; break;
6648 case 5: temp = Xamoeba_6; break;
6649 case 6: temp = Xamoeba_7; break;
6650 case 7: temp = Xamoeba_8; break;
6655 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
6660 static void Ldrip_stretch(int x, int y)
6662 cave[x][y] = Ydrip_2_s;
6663 next[x][y] = Xdrip_fall;
6666 static void Ldrip_stretchB(int x, int y)
6668 cave[x][y] = Ydrip_2_sB;
6669 next[x][y] = Xblank;
6672 static void Lwonderwall(int x, int y)
6674 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
6676 cave[x][y] = Ywonderwall;
6677 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
6681 static void Lwheel(int x, int y)
6683 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
6684 cave[x][y] = Ywheel;
6687 static void Lswitch(int x, int y)
6689 if (lev.ball_active)
6690 cave[x][y] = Yswitch;
6693 static void Lfake_blank(int x, int y)
6696 cave[x][y] = Yfake_blank;
6699 static void Lfake_grass(int x, int y)
6701 if (lev.magnify_cnt)
6702 cave[x][y] = Yfake_grass;
6705 static void Lfake_amoeba(int x, int y)
6708 cave[x][y] = Yfake_amoeba;
6711 static void Lsand_stone(int x, int y)
6713 switch (cave[x][y+1])
6726 cave[x][y] = Xsand_stonesand_quickout_1;
6727 next[x][y] = Xsand_stonesand_quickout_2;
6728 cave[x][y+1] = Xsand_stoneout_1;
6729 next[x][y+1] = Xsand_stoneout_2;
6740 cave[x][y] = Xsand_stonesand_quickout_1;
6741 next[x][y] = Xsand_stonesand_quickout_2;
6742 if (cave[x+1][y] == Xblank)
6743 cave[x+1][y] = Xsplash_e;
6744 if (cave[x-1][y] == Xblank)
6745 cave[x-1][y] = Xsplash_w;
6746 play_element_sound(x, y, SOUND_acid, Xacid_1);
6750 cave[x][y] = Xsand_stonesand_1;
6751 next[x][y] = Xsand_stonesand_2;
6752 cave[x][y+1] = Xsand_sandstone_1;
6753 next[x][y+1] = Xsand_sandstone_2;
6758 static void Lsand_stonein_1(int x, int y)
6760 next[x][y] = Xsand_stonein_2;
6763 static void Lsand_stonein_2(int x, int y)
6765 next[x][y] = Xsand_stonein_3;
6768 static void Lsand_stonein_3(int x, int y)
6770 next[x][y] = Xsand_stonein_4;
6773 static void Lsand_stonein_4(int x, int y)
6775 next[x][y] = Xblank;
6778 static void Lsand_sandstone_1(int x, int y)
6780 next[x][y] = Xsand_sandstone_2;
6783 static void Lsand_sandstone_2(int x, int y)
6785 next[x][y] = Xsand_sandstone_3;
6788 static void Lsand_sandstone_3(int x, int y)
6790 next[x][y] = Xsand_sandstone_4;
6793 static void Lsand_sandstone_4(int x, int y)
6795 next[x][y] = Xsand_stone;
6798 static void Lsand_stonesand_1(int x, int y)
6800 next[x][y] = Xsand_stonesand_2;
6803 static void Lsand_stonesand_2(int x, int y)
6805 next[x][y] = Xsand_stonesand_3;
6808 static void Lsand_stonesand_3(int x, int y)
6810 next[x][y] = Xsand_stonesand_4;
6813 static void Lsand_stonesand_4(int x, int y)
6818 static void Lsand_stoneout_1(int x, int y)
6820 next[x][y] = Xsand_stoneout_2;
6823 static void Lsand_stoneout_2(int x, int y)
6825 next[x][y] = Xstone_fall;
6828 static void Lsand_stonesand_quickout_1(int x, int y)
6830 next[x][y] = Xsand_stonesand_quickout_2;
6833 static void Lsand_stonesand_quickout_2(int x, int y)
6838 static void Lslide_ns(int x, int y)
6840 if (is_blank[cave[x][y-1]])
6842 cave[x][y-1] = Yslide_ns_blank;
6843 next[x][y-1] = Xslide_ns;
6844 play_element_sound(x, y, SOUND_slide, Xslide_ns);
6847 if (is_blank[cave[x][y+1]])
6849 cave[x][y+1] = Yslide_ns_blank;
6850 next[x][y+1] = Xslide_ns;
6851 play_element_sound(x, y, SOUND_slide, Xslide_ns);
6855 static void Lslide_ew(int x, int y)
6857 if (is_blank[cave[x+1][y]])
6859 cave[x+1][y] = Yslide_ew_blank;
6860 next[x+1][y] = Xslide_ew;
6861 play_element_sound(x, y, SOUND_slide, Xslide_ew);
6864 if (is_blank[cave[x-1][y]])
6866 cave[x-1][y] = Yslide_ew_blank;
6867 next[x-1][y] = Xslide_ew;
6868 play_element_sound(x, y, SOUND_slide, Xslide_ew);
6872 static void Lexit(int x, int y)
6874 if (lev.gems_needed > 0)
6877 switch (RANDOM(64) / 21)
6880 cave[x][y] = Xexit_1;
6881 next[x][y] = Xexit_2;
6885 cave[x][y] = Xexit_2;
6886 next[x][y] = Xexit_3;
6890 cave[x][y] = Xexit_3;
6891 next[x][y] = Xexit_1;
6895 play_element_sound(x, y, SOUND_exit_open, Xexit);
6898 static void Lexit_1(int x, int y)
6900 next[x][y] = Xexit_2;
6903 static void Lexit_2(int x, int y)
6905 next[x][y] = Xexit_3;
6908 static void Lexit_3(int x, int y)
6910 next[x][y] = Xexit_1;
6913 static void Lpause(int x, int y)
6915 next[x][y] = Xblank;
6918 static void Lamoeba(int x, int y)
6938 if (is_amoeba[cave[x][y-1]] ||
6939 is_amoeba[cave[x+1][y]] ||
6940 is_amoeba[cave[x][y+1]] ||
6941 is_amoeba[cave[x-1][y]])
6946 static void Lboom_one(int x, int y, boolean by_dynamite)
7007 cave[x][y] = Xboom_android;
7018 cave[x][y] = Xboom_bug;
7019 Lboom_bug_new(x, y, TRUE);
7025 cave[x][y] = Xboom_tank;
7026 Lboom_tank_new(x, y, TRUE);
7030 cave[x][y] = Xboom_1;
7035 static void Lboom_nine(int x, int y, boolean by_dynamite)
7037 Lboom_one(x, y-1, by_dynamite);
7038 Lboom_one(x-1, y, by_dynamite);
7039 Lboom_one(x+1, y, by_dynamite);
7040 Lboom_one(x, y+1, by_dynamite);
7041 Lboom_one(x-1, y-1, by_dynamite);
7042 Lboom_one(x+1, y-1, by_dynamite);
7043 Lboom_one(x-1, y+1, by_dynamite);
7044 Lboom_one(x+1, y+1, by_dynamite);
7046 cave[x][y] = Xboom_1;
7049 static void Lexplode(int x, int y)
7054 Lboom_bug_new(x, y, FALSE);
7055 Lboom_nine(x, y, FALSE);
7059 Lboom_tank_new(x, y, FALSE);
7060 Lboom_nine(x, y, FALSE);
7064 Lboom_eater_new(x, y, FALSE);
7065 Lboom_nine(x, y, FALSE);
7069 Lboom_nine(x, y, TRUE);
7073 Lboom_nine(x, y, FALSE);
7078 static void Lboom_1(int x, int y)
7080 next[x][y] = Xboom_2;
7081 #if !PLAY_ELEMENT_SOUND
7082 if (x != lev.exit_x && y != lev.exit_y)
7083 play_sound(x, y, SOUND_boom);
7085 lev.exit_x = lev.exit_y = -1;
7089 static void Lboom_2(int x, int y)
7091 next[x][y] = boom[x][y];
7094 static void Lboom_android(int x, int y)
7096 #if PLAY_ELEMENT_SOUND
7097 play_element_sound(x, y, SOUND_boom, Xandroid);
7103 static void Lchain(int x, int y)
7108 static void handle_tile(int x, int y)
7112 case Xacid_1: Lacid_1(x, y); break;
7113 case Xacid_2: Lacid_2(x, y); break;
7114 case Xacid_3: Lacid_3(x, y); break;
7115 case Xacid_4: Lacid_4(x, y); break;
7116 case Xacid_5: Lacid_5(x, y); break;
7117 case Xacid_6: Lacid_6(x, y); break;
7118 case Xacid_7: Lacid_7(x, y); break;
7119 case Xacid_8: Lacid_8(x, y); break;
7121 case Xfake_acid_1: Lfake_acid_1(x, y); break;
7122 case Xfake_acid_2: Lfake_acid_2(x, y); break;
7123 case Xfake_acid_3: Lfake_acid_3(x, y); break;
7124 case Xfake_acid_4: Lfake_acid_4(x, y); break;
7125 case Xfake_acid_5: Lfake_acid_5(x, y); break;
7126 case Xfake_acid_6: Lfake_acid_6(x, y); break;
7127 case Xfake_acid_7: Lfake_acid_7(x, y); break;
7128 case Xfake_acid_8: Lfake_acid_8(x, y); break;
7130 case Xandroid: Landroid(x, y); break;
7131 case Xandroid_1_n: Landroid_1_n(x, y); break;
7132 case Xandroid_2_n: Landroid_2_n(x, y); break;
7133 case Xandroid_1_e: Landroid_1_e(x, y); break;
7134 case Xandroid_2_e: Landroid_2_e(x, y); break;
7135 case Xandroid_1_s: Landroid_1_s(x, y); break;
7136 case Xandroid_2_s: Landroid_2_s(x, y); break;
7137 case Xandroid_1_w: Landroid_1_w(x, y); break;
7138 case Xandroid_2_w: Landroid_2_w(x, y); break;
7140 case Xeater_n: Leater_n(x, y); break;
7141 case Xeater_e: Leater_e(x, y); break;
7142 case Xeater_s: Leater_s(x, y); break;
7143 case Xeater_w: Leater_w(x, y); break;
7145 case Xalien: Lalien(x, y); break;
7146 case Xalien_pause: Lalien_pause(x, y); break;
7148 case Xbug_1_n: Lbug_1_n(x, y); break;
7149 case Xbug_2_n: Lbug_2_n(x, y); break;
7150 case Xbug_1_e: Lbug_1_e(x, y); break;
7151 case Xbug_2_e: Lbug_2_e(x, y); break;
7152 case Xbug_1_s: Lbug_1_s(x, y); break;
7153 case Xbug_2_s: Lbug_2_s(x, y); break;
7154 case Xbug_1_w: Lbug_1_w(x, y); break;
7155 case Xbug_2_w: Lbug_2_w(x, y); break;
7157 case Xtank_1_n: Ltank_1_n(x, y); break;
7158 case Xtank_2_n: Ltank_2_n(x, y); break;
7159 case Xtank_1_e: Ltank_1_e(x, y); break;
7160 case Xtank_2_e: Ltank_2_e(x, y); break;
7161 case Xtank_1_s: Ltank_1_s(x, y); break;
7162 case Xtank_2_s: Ltank_2_s(x, y); break;
7163 case Xtank_1_w: Ltank_1_w(x, y); break;
7164 case Xtank_2_w: Ltank_2_w(x, y); break;
7166 case Xemerald: Lemerald(x, y); break;
7167 case Xemerald_pause: Lemerald_pause(x, y); break;
7168 case Xemerald_fall: Lemerald_fall(x, y); break;
7170 case Xdiamond: Ldiamond(x, y); break;
7171 case Xdiamond_pause: Ldiamond_pause(x, y); break;
7172 case Xdiamond_fall: Ldiamond_fall(x, y); break;
7174 case Xstone: Lstone(x, y); break;
7175 case Xstone_pause: Lstone_pause(x, y); break;
7176 case Xstone_fall: Lstone_fall(x, y); break;
7178 case Xbomb: Lbomb(x, y); break;
7179 case Xbomb_pause: Lbomb_pause(x, y); break;
7180 case Xbomb_fall: Lbomb_fall(x, y); break;
7182 case Xnut: Lnut(x, y); break;
7183 case Xnut_pause: Lnut_pause(x, y); break;
7184 case Xnut_fall: Lnut_fall(x, y); break;
7186 case Xspring: Lspring(x, y); break;
7187 case Xspring_pause: Lspring_pause(x, y); break;
7188 case Xspring_e: Lspring_e(x, y); break;
7189 case Xspring_w: Lspring_w(x, y); break;
7190 case Xspring_fall: Lspring_fall(x, y); break;
7192 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
7193 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
7194 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
7195 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
7196 case Xpush_stone_e: Lpush_stone_e(x, y); break;
7197 case Xpush_stone_w: Lpush_stone_w(x, y); break;
7198 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
7199 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
7200 case Xpush_nut_e: Lpush_nut_e(x, y); break;
7201 case Xpush_nut_w: Lpush_nut_w(x, y); break;
7202 case Xpush_spring_e: Lpush_spring_e(x, y); break;
7203 case Xpush_spring_w: Lpush_spring_w(x, y); break;
7205 case Xdynamite_1: Ldynamite_1(x, y); break;
7206 case Xdynamite_2: Ldynamite_2(x, y); break;
7207 case Xdynamite_3: Ldynamite_3(x, y); break;
7208 case Xdynamite_4: Ldynamite_4(x, y); break;
7210 case Xfake_door_1: Lfake_door_1(x, y); break;
7211 case Xfake_door_2: Lfake_door_2(x, y); break;
7212 case Xfake_door_3: Lfake_door_3(x, y); break;
7213 case Xfake_door_4: Lfake_door_4(x, y); break;
7214 case Xfake_door_5: Lfake_door_5(x, y); break;
7215 case Xfake_door_6: Lfake_door_6(x, y); break;
7216 case Xfake_door_7: Lfake_door_7(x, y); break;
7217 case Xfake_door_8: Lfake_door_8(x, y); break;
7219 case Xballoon: Lballoon(x, y); break;
7221 case Xball_1: Lball_1(x, y); break;
7222 case Xball_2: Lball_2(x, y); break;
7224 case Xdrip: Ldrip(x, y); break;
7225 case Xdrip_fall: Ldrip_fall(x, y); break;
7226 case Xdrip_stretch: Ldrip_stretch(x, y); break;
7227 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
7229 case Xwonderwall: Lwonderwall(x, y); break;
7231 case Xwheel: Lwheel(x, y); break;
7233 case Xswitch: Lswitch(x, y); break;
7235 case Xfake_blank: Lfake_blank(x, y); break;
7236 case Xfake_grass: Lfake_grass(x, y); break;
7237 case Xfake_amoeba: Lfake_amoeba(x, y); break;
7239 case Xsand_stone: Lsand_stone(x, y); break;
7240 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
7241 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
7242 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
7243 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
7244 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
7245 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
7246 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
7247 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
7248 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
7249 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
7250 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
7251 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
7252 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
7253 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
7254 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
7255 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
7257 case Xslide_ns: Lslide_ns(x, y); break;
7258 case Xslide_ew: Lslide_ew(x, y); break;
7260 case Xexit: Lexit(x, y); break;
7261 case Xexit_1: Lexit_1(x, y); break;
7262 case Xexit_2: Lexit_2(x, y); break;
7263 case Xexit_3: Lexit_3(x, y); break;
7265 case Xpause: Lpause(x, y); break;
7267 case Xchain: Lchain(x, y); break;
7268 case Xboom_bug: Lboom_bug(x, y); break;
7269 case Xboom_tank: Lboom_tank(x, y); break;
7270 case Xboom_android: Lboom_android(x, y); break;
7271 case Xboom_1: Lboom_1(x, y); break;
7272 case Xboom_2: Lboom_2(x, y); break;
7276 static void logic_players(void)
7285 game_em.any_player_moving = FALSE;
7286 game_em.any_player_snapping = FALSE;
7288 /* must test for death and actually kill separately */
7289 for (i = 0; i < MAX_PLAYERS; i++)
7291 boolean ply_kill = player_killed(&ply[i]);
7293 if (ply[i].alive && ply_kill)
7294 kill_player(&ply[i]);
7297 for (i = 0; i < MAX_PLAYERS; i++)
7302 /* check for wrap-around movement */
7303 if (ply[i].x < lev.left ||
7304 ply[i].x > lev.right - 1)
7306 ply[i].x = (ply[i].x < lev.left ? lev.right - 1 : lev.left);
7308 game.centered_player_nr_next = i;
7309 game.set_centered_player = TRUE;
7310 game.set_centered_player_wrap = TRUE;
7313 ply[i].prev_x = ply[i].x;
7314 ply[i].prev_y = ply[i].y;
7315 ply[i].anim = PLY_still;
7318 start_check_nr = ((game_em.random & 128 ? 0 : 1) * 2 +
7319 (game_em.random & 256 ? 0 : 1));
7321 for (i = 0; i < MAX_PLAYERS; i++)
7323 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
7325 if (ply[check_nr].alive)
7326 check_player(&ply[check_nr]);
7329 for (i = 0; i < MAX_PLAYERS; i++)
7334 if (cave[ply[i].prev_x][ply[i].prev_y] == Zplayer)
7336 cave[ply[i].prev_x][ply[i].prev_y] = Xblank;
7337 next[ply[i].prev_x][ply[i].prev_y] = Xblank;
7340 if (cave[ply[i].x][ply[i].y] == Xblank)
7342 cave[ply[i].x][ply[i].y] = Zplayer;
7343 next[ply[i].x][ply[i].y] = Zplayer;
7348 static void logic_objects(void)
7356 seed = game_em.random;
7359 for (y = lev.top; y < lev.bottom; y++)
7360 for (x = lev.left; x < lev.right; x++)
7363 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
7364 lev.score += score; /* only add a score if someone is alive */
7366 game_em.game_over = TRUE;
7368 game_em.random = seed;
7370 /* triple buffering */
7371 void *temp = lev.cave;
7372 lev.cave = lev.next;
7373 lev.next = lev.draw;
7377 static void logic_globals(void)
7382 unsigned int random;
7388 /* update variables */
7390 if (lev.score > 9999)
7393 if (lev.android_move_cnt-- == 0)
7394 lev.android_move_cnt = lev.android_move_time;
7395 if (lev.android_clone_cnt-- == 0)
7396 lev.android_clone_cnt = lev.android_clone_time;
7397 if (lev.ball_active)
7398 if (lev.ball_cnt-- == 0)
7399 lev.ball_cnt = lev.ball_time;
7402 if (lev.magnify_cnt)
7408 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7409 lev.wonderwall_time--;
7412 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
7416 random = game_em.random;
7418 for (count = lev.amoeba_time; count--;)
7420 x = lev.left - 1 + (random >> 10) % (CAVE_WIDTH + 2);
7421 y = lev.top - 1 + (random >> 20) % (CAVE_HEIGHT + 2);
7423 if (x >= lev.left && x < lev.right &&
7424 y >= lev.top && y < lev.bottom)
7427 random = random * 129 + 1;
7430 game_em.random = random;
7432 /* handle explosions */
7434 for (y = lev.top; y < lev.bottom; y++)
7435 for (x = lev.left; x < lev.right; x++)
7438 /* triple buffering */
7440 for (y = lev.top; y < lev.bottom; y++)
7441 for (x = lev.left; x < lev.right; x++)
7442 next[x][y] = cave[x][y];