5 * my own version of the emerald mine engine
11 #define SPRING_ROLL /* spring rolling off round things continues to roll */
12 #define ACID_ROLL /* rolling objects go into acid rather than remove it */
13 #define ACID_PLAYER /* player gets killed by acid, but without explosion */
15 #define RANDOM(x) ((seed = seed << 31 | seed >> 1) % x)
17 static short **cave, **next, **boom;
18 static unsigned int seed;
21 static const byte is_blank[GAME_TILE_MAX] =
36 static const byte is_blank_or_acid[GAME_TILE_MAX] =
59 static const byte is_fake_acid[GAME_TILE_MAX] =
71 static const byte is_amoeba[GAME_TILE_MAX] =
85 static byte is_android_blank[GAME_TILE_MAX] =
100 static const byte is_android_walkable[GAME_TILE_MAX] =
116 static void Lboom_generic(int x, int y, int element, int element_middle)
118 boom[x-1][y-1] = element;
119 boom[x][y-1] = element;
120 boom[x+1][y-1] = element;
121 boom[x-1][y] = element;
122 boom[x][y] = element_middle;
123 boom[x+1][y] = element;
124 boom[x-1][y+1] = element;
125 boom[x][y+1] = element;
126 boom[x+1][y+1] = element;
129 static void Lboom_bug(int x, int y)
131 if (game_em.use_old_explosions)
134 Lboom_generic(x, y, Xemerald, Xdiamond);
136 #if PLAY_ELEMENT_SOUND
137 play_element_sound(x, y, SOUND_boom, Xbug_1_n);
141 static void Lboom_tank(int x, int y)
143 if (game_em.use_old_explosions)
146 Lboom_generic(x, y, Xblank, Xblank);
148 #if PLAY_ELEMENT_SOUND
149 play_element_sound(x, y, SOUND_boom, Xtank_1_n);
153 static void Lboom_eater(int x, int y)
155 if (game_em.use_old_explosions)
158 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
159 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
160 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
161 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
162 boom[x][y] = lev.eater_array[lev.eater_pos][4];
163 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
164 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
165 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
166 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
168 lev.eater_pos = (lev.eater_pos + 1) % 8;
170 #if PLAY_ELEMENT_SOUND
171 play_element_sound(x, y, SOUND_boom, Xeater_n);
175 static void Lboom_bug_old(int x, int y)
177 if (!game_em.use_old_explosions)
183 static void Lboom_tank_old(int x, int y)
185 if (!game_em.use_old_explosions)
191 static void Lboom_eater_old(int x, int y)
193 if (!game_em.use_old_explosions)
199 static void Lboom_bug_new(int x, int y, boolean chain_explosion)
201 if (game_em.use_old_explosions)
210 static void Lboom_tank_new(int x, int y, boolean chain_explosion)
212 if (game_em.use_old_explosions)
221 static void Lboom_eater_new(int x, int y, boolean chain_explosion)
223 if (game_em.use_old_explosions)
232 static void Lboom_cave_new(int x, int y, int element)
234 if (game_em.use_old_explosions)
237 cave[x][y] = element;
240 static void Lboom_next_new(int x, int y, int element)
242 if (game_em.use_old_explosions)
245 next[x][y] = element;
248 static boolean player_killed(struct PLAYER *ply)
256 if (lev.killed_out_of_time && setup.time_limit)
259 switch (cave[x][y-1])
280 switch (cave[x+1][y])
301 switch (cave[x][y+1])
322 switch (cave[x-1][y])
367 static void kill_player(struct PLAYER *ply)
374 switch (cave[x][y-1])
384 cave[x][y-1] = Xboom_bug;
385 Lboom_bug_new(x, y-1, TRUE);
396 cave[x][y-1] = Xboom_tank;
397 Lboom_tank_new(x, y-1, TRUE);
401 switch (cave[x+1][y])
411 cave[x+1][y] = Xboom_bug;
412 Lboom_bug_new(x+1, y, TRUE);
423 cave[x+1][y] = Xboom_tank;
424 Lboom_tank_new(x+1, y, TRUE);
428 switch (cave[x][y+1])
438 cave[x][y+1] = Xboom_bug;
439 Lboom_bug_new(x, y+1, TRUE);
450 cave[x][y+1] = Xboom_tank;
451 Lboom_tank_new(x, y+1, TRUE);
455 switch (cave[x-1][y])
465 cave[x-1][y] = Xboom_bug;
466 Lboom_bug_new(x-1, y, TRUE);
477 cave[x-1][y] = Xboom_tank;
478 Lboom_tank_new(x-1, y, TRUE);
489 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
493 play_element_sound(x, y, SOUND_die, Zplayer);
512 cave[x][y] = Xboom_1;
518 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
520 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
525 boolean result = TRUE;
527 if (!dx && !dy) /* no direction specified */
530 if (dx && dy && ply->joy_snap) /* more than one direction specified */
533 if (!ply->joy_snap) /* player wants to move */
535 int element = cave[x][y];
539 /* fire is released */
543 cave[x][y] = Zplayer;
544 next[x][y] = Zplayer;
555 play_element_sound(x, y, SOUND_blank, Xblank);
556 ply->anim = PLY_walk_n + anim;
570 if (cave[x+1][y-1] == Xblank)
571 cave[x+1][y-1] = Xsplash_e;
572 if (cave[x-1][y-1] == Xblank)
573 cave[x-1][y-1] = Xsplash_w;
574 play_element_sound(x, y, SOUND_acid, Xacid_1);
595 ply->anim = PLY_walk_n + anim;
601 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
602 (dx > 0 ? Ygrass_eB : Ygrass_wB));
603 next[x][y] = Zplayer;
604 play_element_sound(x, y, SOUND_dirt, Xgrass);
605 ply->anim = PLY_walk_n + anim;
611 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
612 (dx > 0 ? Ydirt_eB : Ydirt_wB));
613 next[x][y] = Zplayer;
614 play_element_sound(x, y, SOUND_dirt, Xdirt);
615 ply->anim = PLY_walk_n + anim;
622 cave[x][y] = Ydiamond_blank;
623 next[x][y] = Zplayer;
624 play_element_sound(x, y, SOUND_collect, element);
625 lev.score += lev.diamond_score;
626 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
627 game.snapshot.collected_item = TRUE;
628 ply->anim = PLY_walk_n + anim;
635 cave[x][y] = Yemerald_blank;
636 next[x][y] = Zplayer;
637 play_element_sound(x, y, SOUND_collect, element);
638 lev.score += lev.emerald_score;
639 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
640 game.snapshot.collected_item = TRUE;
641 ply->anim = PLY_walk_n + anim;
647 cave[x][y] = Ydynamite_blank;
648 next[x][y] = Zplayer;
649 play_element_sound(x, y, SOUND_collect, element);
650 lev.score += lev.dynamite_score;
651 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
652 ply->anim = PLY_walk_n + anim;
659 cave[x][y] = Ykey_1_blank;
664 cave[x][y] = Ykey_2_blank;
669 cave[x][y] = Ykey_3_blank;
674 cave[x][y] = Ykey_4_blank;
679 cave[x][y] = Ykey_5_blank;
684 cave[x][y] = Ykey_6_blank;
689 cave[x][y] = Ykey_7_blank;
694 cave[x][y] = Ykey_8_blank;
699 next[x][y] = Zplayer;
700 play_element_sound(x, y, SOUND_collect, element);
701 lev.score += lev.key_score;
702 ply->anim = PLY_walk_n + anim;
708 cave[x][y] = Ylenses_blank;
709 next[x][y] = Zplayer;
710 play_element_sound(x, y, SOUND_collect, element);
711 lev.score += lev.lenses_score;
712 lev.lenses_cnt = lev.lenses_time;
713 ply->anim = PLY_walk_n + anim;
719 cave[x][y] = Ymagnify_blank;
720 next[x][y] = Zplayer;
721 play_element_sound(x, y, SOUND_collect, element);
722 lev.score += lev.magnify_score;
723 lev.magnify_cnt = lev.magnify_time;
724 ply->anim = PLY_walk_n + anim;
733 switch (cave[x+dx][y])
746 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
747 next[x+dx][y] = Xstone_pause;
758 if (cave[x+dx+1][y-1] == Xblank)
759 cave[x+dx+1][y-1] = Xsplash_e;
760 if (cave[x+dx-1][y-1] == Xblank)
761 cave[x+dx-1][y-1] = Xsplash_w;
762 play_element_sound(x, y, SOUND_acid, Xacid_1);
766 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
767 next[x][y] = Zplayer;
768 play_element_sound(x, y, SOUND_roll, Xstone);
773 ply->anim = PLY_push_n + anim;
780 switch (cave[x+dx][y])
793 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
794 next[x+dx][y] = Xbomb_pause;
805 if (cave[x+dx+1][y-1] == Xblank)
806 cave[x+dx+1][y-1] = Xsplash_e;
807 if (cave[x+dx-1][y-1] == Xblank)
808 cave[x+dx-1][y-1] = Xsplash_w;
809 play_element_sound(x, y, SOUND_acid, Xacid_1);
813 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
814 next[x][y] = Zplayer;
815 play_element_sound(x, y, SOUND_roll, Xbomb);
820 ply->anim = PLY_push_n + anim;
827 switch (cave[x+dx][y])
840 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
841 next[x+dx][y] = Xnut_pause;
852 if (cave[x+dx+1][y-1] == Xblank)
853 cave[x+dx+1][y-1] = Xsplash_e;
854 if (cave[x+dx-1][y-1] == Xblank)
855 cave[x+dx-1][y-1] = Xsplash_w;
856 play_element_sound(x, y, SOUND_acid, Xacid_1);
860 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
861 next[x][y] = Zplayer;
862 play_element_sound(x, y, SOUND_roll, Xnut);
867 ply->anim = PLY_push_n + anim;
874 switch (cave[x+dx][y])
887 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
888 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
899 if (cave[x+dx+1][y-1] == Xblank)
900 cave[x+dx+1][y-1] = Xsplash_e;
901 if (cave[x+dx-1][y-1] == Xblank)
902 cave[x+dx-1][y-1] = Xsplash_w;
903 play_element_sound(x, y, SOUND_acid, Xacid_1);
907 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
908 next[x][y] = Zplayer;
909 play_element_sound(x, y, SOUND_roll, Xspring);
915 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
916 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
917 next[x][y] = Zplayer;
918 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
919 play_element_sound(x, y, SOUND_slurp, Xalien);
920 lev.score += lev.slurp_score;
925 ply->anim = PLY_push_n + anim;
932 case Xsand_stonein_1:
933 case Xsand_stonein_2:
934 case Xsand_stonein_3:
935 case Xsand_stonein_4:
939 ply->anim = PLY_push_n + anim;
943 switch (cave[x+dx][y+dy])
956 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
957 (dx > 0 ? Yballoon_e : Yballoon_w));
958 next[x+dx][y+dy] = Xballoon;
969 if (cave[x+dx+1][y+dy-1] == Xblank)
970 cave[x+dx+1][y+dy-1] = Xsplash_e;
971 if (cave[x+dx-1][y+dy-1] == Xblank)
972 cave[x+dx-1][y+dy-1] = Xsplash_w;
973 play_element_sound(x, y, SOUND_acid, Xacid_1);
977 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
978 (dx > 0 ? Yballoon_eB : Yballoon_wB));
979 next[x][y] = Zplayer;
980 play_element_sound(x, y, SOUND_push, Xballoon);
986 ply->anim = PLY_push_n + anim;
998 switch (cave[x+dx][y+dy])
1011 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
1012 (dx > 0 ? Yandroid_e : Yandroid_w));
1013 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
1014 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1025 if (cave[x+dx+1][y+dy-1] == Xblank)
1026 cave[x+dx+1][y+dy-1] = Xsplash_e;
1027 if (cave[x+dx-1][y+dy-1] == Xblank)
1028 cave[x+dx-1][y+dy-1] = Xsplash_w;
1029 play_element_sound(x, y, SOUND_acid, Xacid_1);
1033 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1034 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1035 next[x][y] = Zplayer;
1036 play_element_sound(x, y, SOUND_push, Xandroid);
1042 ply->anim = PLY_push_n + anim;
1047 if (ply->keys & 0x01)
1054 if (ply->keys & 0x02)
1061 if (ply->keys & 0x04)
1068 if (ply->keys & 0x08)
1075 if (ply->keys & 0x10)
1082 if (ply->keys & 0x20)
1089 if (ply->keys & 0x40)
1096 if (ply->keys & 0x80)
1103 if (!is_blank[cave[x+dx][y+dy]])
1106 if (!is_fake_acid[cave[x+dx][y+dy]])
1108 cave[x+dx][y+dy] = Zplayer;
1109 next[x+dx][y+dy] = Zplayer;
1112 play_element_sound(x, y, SOUND_door, element);
1113 ply->anim = PLY_walk_n + anim;
1119 play_element_sound(x, y, SOUND_press, element);
1120 lev.wheel_cnt = lev.wheel_time;
1126 lev.wind_direction = 0;
1130 lev.wind_direction = 1;
1134 lev.wind_direction = 2;
1138 lev.wind_direction = 3;
1142 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1147 play_element_sound(x, y, SOUND_press, element);
1148 lev.wind_cnt = lev.wind_time;
1152 play_element_sound(x, y, SOUND_press, element);
1157 play_element_sound(x, y, SOUND_press, element);
1158 lev.ball_cnt = lev.ball_time;
1159 lev.ball_active = !lev.ball_active;
1163 cave[x][y] = Yplant;
1164 next[x][y] = Xplant;
1165 play_element_sound(x, y, SOUND_blank, Xplant);
1166 ply->anim = PLY_walk_n + anim;
1177 game_em.level_solved = TRUE;
1179 ply->anim = PLY_walk_n + anim;
1186 if (ply->x == oldx && ply->y == oldy) /* no movement */
1189 else /* player wants to snap */
1191 int element = cave[x][y];
1195 /* fire is pressed */
1198 cave[x][y] = Ygrass_blank;
1199 next[x][y] = Xblank;
1200 play_element_sound(x, y, SOUND_dirt, element);
1201 ply->anim = PLY_shoot_n + anim;
1205 cave[x][y] = Ydirt_blank;
1206 next[x][y] = Xblank;
1207 play_element_sound(x, y, SOUND_dirt, element);
1208 ply->anim = PLY_shoot_n + anim;
1212 case Xdiamond_pause:
1213 cave[x][y] = Ydiamond_blank;
1214 next[x][y] = Xblank;
1215 play_element_sound(x, y, SOUND_collect, element);
1216 lev.score += lev.diamond_score;
1217 lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
1218 game.snapshot.collected_item = TRUE;
1219 ply->anim = PLY_walk_n + anim;
1223 case Xemerald_pause:
1224 cave[x][y] = Yemerald_blank;
1225 next[x][y] = Xblank;
1226 play_element_sound(x, y, SOUND_collect, element);
1227 lev.score += lev.emerald_score;
1228 lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
1229 game.snapshot.collected_item = TRUE;
1230 ply->anim = PLY_walk_n + anim;
1234 cave[x][y] = Ydynamite_blank;
1235 next[x][y] = Xblank;
1236 play_element_sound(x, y, SOUND_collect, element);
1237 lev.score += lev.dynamite_score;
1238 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1239 ply->anim = PLY_walk_n + anim;
1244 cave[x][y] = Ykey_1_blank;
1249 cave[x][y] = Ykey_2_blank;
1254 cave[x][y] = Ykey_3_blank;
1259 cave[x][y] = Ykey_4_blank;
1264 cave[x][y] = Ykey_5_blank;
1269 cave[x][y] = Ykey_6_blank;
1274 cave[x][y] = Ykey_7_blank;
1279 cave[x][y] = Ykey_8_blank;
1284 next[x][y] = Xblank;
1285 play_element_sound(x, y, SOUND_collect, element);
1286 lev.score += lev.key_score;
1287 ply->anim = PLY_walk_n + anim;
1291 cave[x][y] = Ylenses_blank;
1292 next[x][y] = Xblank;
1293 play_element_sound(x, y, SOUND_collect, element);
1294 lev.score += lev.lenses_score;
1295 lev.lenses_cnt = lev.lenses_time;
1296 ply->anim = PLY_walk_n + anim;
1300 cave[x][y] = Ymagnify_blank;
1301 next[x][y] = Xblank;
1302 play_element_sound(x, y, SOUND_collect, element);
1303 lev.score += lev.magnify_score;
1304 lev.magnify_cnt = lev.magnify_time;
1305 ply->anim = PLY_walk_n + anim;
1313 /* check for wrap-around movement */
1314 if (ply->x < lev.left ||
1315 ply->x > lev.right - 1)
1316 play_element_sound(oldx, oldy, SOUND_door, Xdoor_1);
1321 static void check_player(struct PLAYER *ply)
1329 game_em.last_player_direction[ply->num] = MV_NONE;
1331 if (ply->joy_w) /* west */
1336 else if (ply->joy_e) /* east */
1342 if (ply->joy_n) /* north */
1347 else if (ply->joy_s) /* south */
1359 boolean players_visible_before_move;
1360 boolean players_visible_after_move;
1363 players_visible_before_move = checkIfAllPlayersFitToScreen();
1368 players_visible_after_move = checkIfAllPlayersFitToScreen();
1371 player is allowed to move only in the following cases:
1372 - it is not needed to display all players (not focussed to all players)
1373 - all players are (still or again) visible after the move
1374 - some players were already outside visible screen area before the move
1376 can_move = (game.centered_player_nr != -1 ||
1377 players_visible_after_move ||
1378 !players_visible_before_move);
1394 if (dx == 0 && dy == 0)
1396 ply->joy_stick = FALSE;
1400 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1402 cave[x][y] = Xdynamite_1;
1403 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1409 ply->dynamite_cnt = 0;
1412 /* be a bit more random if the player doesn't move */
1413 game_em.random += 7;
1418 ply->joy_stick = TRUE;
1424 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1426 if (!ply->joy_snap) /* player wants to move */
1428 boolean moved = FALSE;
1430 if (ply->last_move_dir & MV_HORIZONTAL)
1432 if (!(moved = player_digfield(ply, 0, dy)))
1433 moved = player_digfield(ply, dx, 0);
1437 if (!(moved = player_digfield(ply, dx, 0)))
1438 moved = player_digfield(ply, 0, dy);
1444 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1445 else if (oldy != ply->y)
1446 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1448 game_em.any_player_moving = TRUE;
1449 game_em.last_moving_player = ply->num;
1450 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1453 else /* player wants to snap */
1455 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1459 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1461 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1464 /* default values if no players are alive anymore */
1468 for (i = 0; i < MAX_PLAYERS; i++)
1473 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1475 if (distance < distance_shortest)
1480 distance_shortest = distance;
1485 static void Lacid_1(int x, int y)
1487 next[x][y] = Xacid_2;
1490 static void Lacid_2(int x, int y)
1492 next[x][y] = Xacid_3;
1495 static void Lacid_3(int x, int y)
1497 next[x][y] = Xacid_4;
1500 static void Lacid_4(int x, int y)
1502 next[x][y] = Xacid_5;
1505 static void Lacid_5(int x, int y)
1507 next[x][y] = Xacid_6;
1510 static void Lacid_6(int x, int y)
1512 next[x][y] = Xacid_7;
1515 static void Lacid_7(int x, int y)
1517 next[x][y] = Xacid_8;
1520 static void Lacid_8(int x, int y)
1522 next[x][y] = Xacid_1;
1525 static void Lfake_acid_1(int x, int y)
1527 next[x][y] = Xfake_acid_2;
1530 static void Lfake_acid_2(int x, int y)
1532 next[x][y] = Xfake_acid_3;
1535 static void Lfake_acid_3(int x, int y)
1537 next[x][y] = Xfake_acid_4;
1540 static void Lfake_acid_4(int x, int y)
1542 next[x][y] = Xfake_acid_5;
1545 static void Lfake_acid_5(int x, int y)
1547 next[x][y] = Xfake_acid_6;
1550 static void Lfake_acid_6(int x, int y)
1552 next[x][y] = Xfake_acid_7;
1555 static void Lfake_acid_7(int x, int y)
1557 next[x][y] = Xfake_acid_8;
1560 static void Lfake_acid_8(int x, int y)
1562 next[x][y] = Xfake_acid_1;
1565 static void Landroid(int x, int y)
1569 if (lev.android_clone_cnt == 0)
1571 if (!is_android_blank[cave[x-1][y-1]] &&
1572 !is_android_blank[cave[x][y-1]] &&
1573 !is_android_blank[cave[x+1][y-1]] &&
1574 !is_android_blank[cave[x-1][y]] &&
1575 !is_android_blank[cave[x+1][y]] &&
1576 !is_android_blank[cave[x-1][y+1]] &&
1577 !is_android_blank[cave[x][y+1]] &&
1578 !is_android_blank[cave[x+1][y+1]])
1583 /* randomly find an object to clone */
1585 case 0: /* S,NE,W,NW,SE,E,SW,N */
1586 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1587 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1588 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1589 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1590 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1591 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1592 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1593 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1596 case 1: /* NW,SE,N,S,NE,SW,E,W */
1597 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1598 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1599 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1600 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1601 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1602 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1603 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1604 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1607 case 2: /* SW,E,S,W,N,NW,SE,NE */
1608 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1609 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1610 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1611 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1612 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1613 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1614 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1615 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1618 case 3: /* N,SE,NE,E,W,S,NW,SW */
1619 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1620 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1621 temp = lev.android_array[cave[x+1][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]]; if (temp != Xblank) break;
1624 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1625 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1626 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1629 case 4: /* SE,NW,E,NE,SW,W,N,S */
1630 temp = lev.android_array[cave[x+1][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]]; 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+1]]; if (temp != Xblank) break;
1635 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1636 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1637 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1640 case 5: /* NE,W,SE,SW,S,N,E,NW */
1641 temp = lev.android_array[cave[x+1][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;
1646 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1647 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1648 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1651 case 6: /* E,N,SW,S,NW,NE,SE,W */
1652 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1653 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1654 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1655 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1656 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1657 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1658 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1659 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1662 case 7: /* W,SW,NW,N,E,SE,NE,S */
1663 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1664 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1665 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1666 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1667 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1668 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1669 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1670 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1674 next[x][y] = temp; /* the item we chose to clone */
1675 play_element_sound(x, y, SOUND_android_clone, temp);
1679 /* randomly find a direction to move */
1681 case 0: /* S,NE,W,NW,SE,E,SW,N */
1682 if (is_android_blank[cave[x][y+1]]) goto android_s;
1683 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1684 if (is_android_blank[cave[x-1][y]]) goto android_w;
1685 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1686 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1687 if (is_android_blank[cave[x+1][y]]) goto android_e;
1688 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1689 if (is_android_blank[cave[x][y-1]]) goto android_n;
1692 case 1: /* NW,SE,N,S,NE,SW,E,W */
1693 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1694 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1695 if (is_android_blank[cave[x][y-1]]) goto android_n;
1696 if (is_android_blank[cave[x][y+1]]) goto android_s;
1697 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1698 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1699 if (is_android_blank[cave[x+1][y]]) goto android_e;
1700 if (is_android_blank[cave[x-1][y]]) goto android_w;
1703 case 2: /* SW,E,S,W,N,NW,SE,NE */
1704 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1705 if (is_android_blank[cave[x+1][y]]) goto android_e;
1706 if (is_android_blank[cave[x][y+1]]) goto android_s;
1707 if (is_android_blank[cave[x-1][y]]) goto android_w;
1708 if (is_android_blank[cave[x][y-1]]) goto android_n;
1709 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1710 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1711 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1714 case 3: /* N,SE,NE,E,W,S,NW,SW */
1715 if (is_android_blank[cave[x][y-1]]) goto android_n;
1716 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1717 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1718 if (is_android_blank[cave[x+1][y]]) goto android_e;
1719 if (is_android_blank[cave[x-1][y]]) goto android_w;
1720 if (is_android_blank[cave[x][y+1]]) goto android_s;
1721 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1722 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1725 case 4: /* SE,NW,E,NE,SW,W,N,S */
1726 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1727 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1728 if (is_android_blank[cave[x+1][y]]) goto android_e;
1729 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1730 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1731 if (is_android_blank[cave[x-1][y]]) goto android_w;
1732 if (is_android_blank[cave[x][y-1]]) goto android_n;
1733 if (is_android_blank[cave[x][y+1]]) goto android_s;
1736 case 5: /* NE,W,SE,SW,S,N,E,NW */
1737 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1738 if (is_android_blank[cave[x-1][y]]) goto android_w;
1739 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1740 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1741 if (is_android_blank[cave[x][y+1]]) goto android_s;
1742 if (is_android_blank[cave[x][y-1]]) goto android_n;
1743 if (is_android_blank[cave[x+1][y]]) goto android_e;
1744 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1747 case 6: /* E,N,SW,S,NW,NE,SE,W */
1748 if (is_android_blank[cave[x+1][y]]) goto android_e;
1749 if (is_android_blank[cave[x][y-1]]) goto android_n;
1750 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1751 if (is_android_blank[cave[x][y+1]]) goto android_s;
1752 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1753 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1754 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1755 if (is_android_blank[cave[x-1][y]]) goto android_w;
1758 case 7: /* W,SW,NW,N,E,SE,NE,S */
1759 if (is_android_blank[cave[x-1][y]]) goto android_w;
1760 if (is_android_blank[cave[x-1][y+1]]) goto android_sw;
1761 if (is_android_blank[cave[x-1][y-1]]) goto android_nw;
1762 if (is_android_blank[cave[x][y-1]]) goto android_n;
1763 if (is_android_blank[cave[x+1][y]]) goto android_e;
1764 if (is_android_blank[cave[x+1][y+1]]) goto android_se;
1765 if (is_android_blank[cave[x+1][y-1]]) goto android_ne;
1766 if (is_android_blank[cave[x][y+1]]) goto android_s;
1772 if (lev.android_move_cnt == 0)
1774 if (cave[x-1][y-1] == Zplayer ||
1775 cave[x][y-1] == Zplayer ||
1776 cave[x+1][y-1] == Zplayer ||
1777 cave[x-1][y] == Zplayer ||
1778 cave[x+1][y] == Zplayer ||
1779 cave[x-1][y+1] == Zplayer ||
1780 cave[x][y+1] == Zplayer ||
1781 cave[x+1][y+1] == Zplayer)
1784 set_nearest_player_xy(x, y, &dx, &dy);
1786 next[x][y] = Xblank; /* assume we will move */
1787 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1793 /* attempt clockwise move first if direct path is blocked */
1795 case 0: /* north west */
1796 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1797 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1798 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1802 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1803 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1804 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1807 case 2: /* north east */
1808 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1809 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1810 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1814 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1815 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1816 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1819 case 4: /* nowhere */
1823 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1824 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1825 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1828 case 6: /* south west */
1829 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1830 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1831 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1835 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1836 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1837 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1840 case 8: /* south east */
1841 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1842 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1843 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1851 /* attempt counterclockwise move first if direct path is blocked */
1853 case 0: /* north west */
1854 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1855 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1856 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1860 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1861 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1862 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1865 case 2: /* north east */
1866 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1867 if (is_android_walkable[cave[x][y-1]]) goto android_n;
1868 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1872 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1873 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1874 if (is_android_walkable[cave[x-1][y-1]]) goto android_nw;
1877 case 4: /* nowhere */
1881 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1882 if (is_android_walkable[cave[x+1][y-1]]) goto android_ne;
1883 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1886 case 6: /* south west */
1887 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1888 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1889 if (is_android_walkable[cave[x-1][y]]) goto android_w;
1893 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1894 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1895 if (is_android_walkable[cave[x-1][y+1]]) goto android_sw;
1898 case 8: /* south east */
1899 if (is_android_walkable[cave[x+1][y+1]]) goto android_se;
1900 if (is_android_walkable[cave[x+1][y]]) goto android_e;
1901 if (is_android_walkable[cave[x][y+1]]) goto android_s;
1908 next[x][y] = Xandroid;
1912 cave[x][y] = Yandroid_nB;
1913 cave[x][y-1] = Yandroid_n;
1914 next[x][y-1] = Xandroid;
1915 play_element_sound(x, y, SOUND_android_move, Xandroid);
1919 cave[x][y] = Yandroid_neB;
1920 cave[x+1][y-1] = Yandroid_ne;
1921 next[x+1][y-1] = Xandroid;
1922 play_element_sound(x, y, SOUND_android_move, Xandroid);
1926 cave[x][y] = Yandroid_eB;
1927 cave[x+1][y] = Yandroid_e;
1928 next[x+1][y] = Xandroid;
1929 play_element_sound(x, y, SOUND_android_move, Xandroid);
1933 cave[x][y] = Yandroid_seB;
1934 cave[x+1][y+1] = Yandroid_se;
1935 next[x+1][y+1] = Xandroid;
1936 play_element_sound(x, y, SOUND_android_move, Xandroid);
1940 cave[x][y] = Yandroid_sB;
1941 cave[x][y+1] = Yandroid_s;
1942 next[x][y+1] = Xandroid;
1943 play_element_sound(x, y, SOUND_android_move, Xandroid);
1947 cave[x][y] = Yandroid_swB;
1948 cave[x-1][y+1] = Yandroid_sw;
1949 next[x-1][y+1] = Xandroid;
1950 play_element_sound(x, y, SOUND_android_move, Xandroid);
1954 cave[x][y] = Yandroid_wB;
1955 cave[x-1][y] = Yandroid_w;
1956 next[x-1][y] = Xandroid;
1957 play_element_sound(x, y, SOUND_android_move, Xandroid);
1961 cave[x][y] = Yandroid_nwB;
1962 cave[x-1][y-1] = Yandroid_nw;
1963 next[x-1][y-1] = Xandroid;
1964 play_element_sound(x, y, SOUND_android_move, Xandroid);
1968 static void Landroid_1_n(int x, int y)
1970 switch (cave[x][y-1])
1983 cave[x][y] = Yandroid_nB;
1984 next[x][y] = Xblank;
1985 cave[x][y-1] = Yandroid_n;
1986 next[x][y-1] = Xandroid;
1987 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
1998 cave[x][y] = Yandroid_nB;
1999 next[x][y] = Xblank;
2000 if (cave[x+1][y-2] == Xblank)
2001 cave[x+1][y-2] = Xsplash_e;
2002 if (cave[x-1][y-2] == Xblank)
2003 cave[x-1][y-2] = Xsplash_w;
2004 play_element_sound(x, y, SOUND_acid, Xacid_1);
2013 static void Landroid_2_n(int x, int y)
2015 switch (cave[x][y-1])
2028 cave[x][y] = Yandroid_nB;
2029 next[x][y] = Xblank;
2030 cave[x][y-1] = Yandroid_n;
2031 next[x][y-1] = Xandroid_1_n;
2032 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
2043 cave[x][y] = Yandroid_nB;
2044 next[x][y] = Xblank;
2045 if (cave[x+1][y-2] == Xblank)
2046 cave[x+1][y-2] = Xsplash_e;
2047 if (cave[x-1][y-2] == Xblank)
2048 cave[x-1][y-2] = Xsplash_w;
2049 play_element_sound(x, y, SOUND_acid, Xacid_1);
2058 static void Landroid_1_e(int x, int y)
2060 switch (cave[x+1][y])
2073 cave[x][y] = Yandroid_eB;
2074 next[x][y] = Xblank;
2075 cave[x+1][y] = Yandroid_e;
2076 next[x+1][y] = Xandroid;
2077 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
2088 cave[x][y] = Yandroid_eB;
2089 next[x][y] = Xblank;
2090 if (cave[x+2][y-1] == Xblank)
2091 cave[x+2][y-1] = Xsplash_e;
2092 if (cave[x][y-1] == Xblank)
2093 cave[x][y-1] = Xsplash_w;
2094 play_element_sound(x, y, SOUND_acid, Xacid_1);
2103 static void Landroid_2_e(int x, int y)
2105 switch (cave[x+1][y])
2118 cave[x][y] = Yandroid_eB;
2119 next[x][y] = Xblank;
2120 cave[x+1][y] = Yandroid_e;
2121 next[x+1][y] = Xandroid_1_e;
2122 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
2133 cave[x][y] = Yandroid_eB;
2134 next[x][y] = Xblank;
2135 if (cave[x+2][y-1] == Xblank)
2136 cave[x+2][y-1] = Xsplash_e;
2137 if (cave[x][y-1] == Xblank)
2138 cave[x][y-1] = Xsplash_w;
2139 play_element_sound(x, y, SOUND_acid, Xacid_1);
2148 static void Landroid_1_s(int x, int y)
2150 switch (cave[x][y+1])
2163 cave[x][y] = Yandroid_sB;
2164 next[x][y] = Xblank;
2165 cave[x][y+1] = Yandroid_s;
2166 next[x][y+1] = Xandroid;
2167 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
2178 cave[x][y] = Yandroid_sB;
2179 next[x][y] = Xblank;
2180 if (cave[x+1][y] == Xblank)
2181 cave[x+1][y] = Xsplash_e;
2182 if (cave[x-1][y] == Xblank)
2183 cave[x-1][y] = Xsplash_w;
2184 play_element_sound(x, y, SOUND_acid, Xacid_1);
2193 static void Landroid_2_s(int x, int y)
2195 switch (cave[x][y+1])
2208 cave[x][y] = Yandroid_sB;
2209 next[x][y] = Xblank;
2210 cave[x][y+1] = Yandroid_s;
2211 next[x][y+1] = Xandroid_1_s;
2212 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
2223 cave[x][y] = Yandroid_sB;
2224 next[x][y] = Xblank;
2225 if (cave[x+1][y] == Xblank)
2226 cave[x+1][y] = Xsplash_e;
2227 if (cave[x-1][y] == Xblank)
2228 cave[x-1][y] = Xsplash_w;
2229 play_element_sound(x, y, SOUND_acid, Xacid_1);
2238 static void Landroid_1_w(int x, int y)
2240 switch (cave[x-1][y])
2253 cave[x][y] = Yandroid_wB;
2254 next[x][y] = Xblank;
2255 cave[x-1][y] = Yandroid_w;
2256 next[x-1][y] = Xandroid;
2257 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2268 cave[x][y] = Yandroid_wB;
2269 next[x][y] = Xblank;
2270 if (cave[x][y-1] == Xblank)
2271 cave[x][y-1] = Xsplash_e;
2272 if (cave[x-2][y-1] == Xblank)
2273 cave[x-2][y-1] = Xsplash_w;
2274 play_element_sound(x, y, SOUND_acid, Xacid_1);
2283 static void Landroid_2_w(int x, int y)
2285 switch (cave[x-1][y])
2298 cave[x][y] = Yandroid_wB;
2299 next[x][y] = Xblank;
2300 cave[x-1][y] = Yandroid_w;
2301 next[x-1][y] = Xandroid_1_w;
2302 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2313 cave[x][y] = Yandroid_wB;
2314 next[x][y] = Xblank;
2315 if (cave[x][y-1] == Xblank)
2316 cave[x][y-1] = Xsplash_e;
2317 if (cave[x-2][y-1] == Xblank)
2318 cave[x-2][y-1] = Xsplash_w;
2319 play_element_sound(x, y, SOUND_acid, Xacid_1);
2328 static void Leater_n(int x, int y)
2330 if (cave[x+1][y] == Xdiamond)
2332 cave[x+1][y] = Ydiamond_blank;
2333 next[x+1][y] = Xblank;
2334 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2338 if (cave[x][y+1] == Xdiamond)
2340 cave[x][y+1] = Ydiamond_blank;
2341 next[x][y+1] = Xblank;
2342 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2346 if (cave[x-1][y] == Xdiamond)
2348 cave[x-1][y] = Ydiamond_blank;
2349 next[x-1][y] = Xblank;
2350 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2354 if (cave[x][y-1] == Xdiamond)
2356 cave[x][y-1] = Ydiamond_blank;
2357 next[x][y-1] = Xblank;
2358 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2362 switch (cave[x][y-1])
2378 cave[x][y] = Yeater_nB;
2379 next[x][y] = Xblank;
2380 cave[x][y-1] = Yeater_n;
2381 next[x][y-1] = Xeater_n;
2392 cave[x][y] = Yeater_nB;
2393 next[x][y] = Xblank;
2394 if (cave[x+1][y-2] == Xblank)
2395 cave[x+1][y-2] = Xsplash_e;
2396 if (cave[x-1][y-2] == Xblank)
2397 cave[x-1][y-2] = Xsplash_w;
2398 play_element_sound(x, y, SOUND_acid, Xacid_1);
2402 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2403 play_element_sound(x, y, SOUND_eater, Xeater_n);
2408 static void Leater_e(int x, int y)
2410 if (cave[x][y+1] == Xdiamond)
2412 cave[x][y+1] = Ydiamond_blank;
2413 next[x][y+1] = Xblank;
2414 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2418 if (cave[x-1][y] == Xdiamond)
2420 cave[x-1][y] = Ydiamond_blank;
2421 next[x-1][y] = Xblank;
2422 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2426 if (cave[x][y-1] == Xdiamond)
2428 cave[x][y-1] = Ydiamond_blank;
2429 next[x][y-1] = Xblank;
2430 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2434 if (cave[x+1][y] == Xdiamond)
2436 cave[x+1][y] = Ydiamond_blank;
2437 next[x+1][y] = Xblank;
2438 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2442 switch (cave[x+1][y])
2458 cave[x][y] = Yeater_eB;
2459 next[x][y] = Xblank;
2460 cave[x+1][y] = Yeater_e;
2461 next[x+1][y] = Xeater_e;
2472 cave[x][y] = Yeater_eB;
2473 next[x][y] = Xblank;
2474 if (cave[x+2][y-1] == Xblank)
2475 cave[x+2][y-1] = Xsplash_e;
2476 if (cave[x][y-1] == Xblank)
2477 cave[x][y-1] = Xsplash_w;
2478 play_element_sound(x, y, SOUND_acid, Xacid_1);
2482 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2483 play_element_sound(x, y, SOUND_eater, Xeater_e);
2488 static void Leater_s(int x, int y)
2490 if (cave[x-1][y] == Xdiamond)
2492 cave[x-1][y] = Ydiamond_blank;
2493 next[x-1][y] = Xblank;
2494 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2498 if (cave[x][y-1] == Xdiamond)
2500 cave[x][y-1] = Ydiamond_blank;
2501 next[x][y-1] = Xblank;
2502 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2506 if (cave[x+1][y] == Xdiamond)
2508 cave[x+1][y] = Ydiamond_blank;
2509 next[x+1][y] = Xblank;
2510 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2514 if (cave[x][y+1] == Xdiamond)
2516 cave[x][y+1] = Ydiamond_blank;
2517 next[x][y+1] = Xblank;
2518 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2522 switch (cave[x][y+1])
2538 cave[x][y] = Yeater_sB;
2539 next[x][y] = Xblank;
2540 cave[x][y+1] = Yeater_s;
2541 next[x][y+1] = Xeater_s;
2552 cave[x][y] = Yeater_sB;
2553 next[x][y] = Xblank;
2554 if (cave[x+1][y] == Xblank)
2555 cave[x+1][y] = Xsplash_e;
2556 if (cave[x-1][y] == Xblank)
2557 cave[x-1][y] = Xsplash_w;
2558 play_element_sound(x, y, SOUND_acid, Xacid_1);
2562 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2563 play_element_sound(x, y, SOUND_eater, Xeater_s);
2568 static void Leater_w(int x, int y)
2570 if (cave[x][y-1] == Xdiamond)
2572 cave[x][y-1] = Ydiamond_blank;
2573 next[x][y-1] = Xblank;
2574 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2578 if (cave[x+1][y] == Xdiamond)
2580 cave[x+1][y] = Ydiamond_blank;
2581 next[x+1][y] = Xblank;
2582 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2586 if (cave[x][y+1] == Xdiamond)
2588 cave[x][y+1] = Ydiamond_blank;
2589 next[x][y+1] = Xblank;
2590 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2594 if (cave[x-1][y] == Xdiamond)
2596 cave[x-1][y] = Ydiamond_blank;
2597 next[x-1][y] = Xblank;
2598 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2602 switch (cave[x-1][y])
2618 cave[x][y] = Yeater_wB;
2619 next[x][y] = Xblank;
2620 cave[x-1][y] = Yeater_w;
2621 next[x-1][y] = Xeater_w;
2632 cave[x][y] = Yeater_wB;
2633 next[x][y] = Xblank;
2634 if (cave[x][y-1] == Xblank)
2635 cave[x][y-1] = Xsplash_e;
2636 if (cave[x-2][y-1] == Xblank)
2637 cave[x-2][y-1] = Xsplash_w;
2638 play_element_sound(x, y, SOUND_acid, Xacid_1);
2642 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2643 play_element_sound(x, y, SOUND_eater, Xeater_w);
2648 static void Lalien(int x, int y)
2659 set_nearest_player_xy(x, y, &dx, &dy);
2666 switch (cave[x][y-1])
2682 cave[x][y] = Yalien_nB;
2683 next[x][y] = Xblank;
2684 cave[x][y-1] = Yalien_n;
2685 next[x][y-1] = Xalien_pause;
2686 play_element_sound(x, y, SOUND_alien, Xalien);
2697 cave[x][y] = Yalien_nB;
2698 next[x][y] = Xblank;
2699 if (cave[x+1][y-2] == Xblank)
2700 cave[x+1][y-2] = Xsplash_e;
2701 if (cave[x-1][y-2] == Xblank)
2702 cave[x-1][y-2] = Xsplash_w;
2703 play_element_sound(x, y, SOUND_acid, Xacid_1);
2709 switch (cave[x][y+1])
2725 cave[x][y] = Yalien_sB;
2726 next[x][y] = Xblank;
2727 cave[x][y+1] = Yalien_s;
2728 next[x][y+1] = Xalien_pause;
2729 play_element_sound(x, y, SOUND_alien, Xalien);
2740 cave[x][y] = Yalien_sB;
2741 next[x][y] = Xblank;
2742 if (cave[x+1][y] == Xblank)
2743 cave[x+1][y] = Xsplash_e;
2744 if (cave[x-1][y] == Xblank)
2745 cave[x-1][y] = Xsplash_w;
2746 play_element_sound(x, y, SOUND_acid, Xacid_1);
2755 switch (cave[x+1][y])
2771 cave[x][y] = Yalien_eB;
2772 next[x][y] = Xblank;
2773 cave[x+1][y] = Yalien_e;
2774 next[x+1][y] = Xalien_pause;
2775 play_element_sound(x, y, SOUND_alien, Xalien);
2786 cave[x][y] = Yalien_eB;
2787 next[x][y] = Xblank;
2788 if (cave[x+2][y-1] == Xblank)
2789 cave[x+2][y-1] = Xsplash_e;
2790 if (cave[x][y-1] == Xblank)
2791 cave[x][y-1] = Xsplash_w;
2792 play_element_sound(x, y, SOUND_acid, Xacid_1);
2798 switch (cave[x-1][y])
2814 cave[x][y] = Yalien_wB;
2815 next[x][y] = Xblank;
2816 cave[x-1][y] = Yalien_w;
2817 next[x-1][y] = Xalien_pause;
2818 play_element_sound(x, y, SOUND_alien, Xalien);
2829 cave[x][y] = Yalien_wB;
2830 next[x][y] = Xblank;
2831 if (cave[x][y-1] == Xblank)
2832 cave[x][y-1] = Xsplash_e;
2833 if (cave[x-2][y-1] == Xblank)
2834 cave[x-2][y-1] = Xsplash_w;
2835 play_element_sound(x, y, SOUND_acid, Xacid_1);
2842 static void Lalien_pause(int x, int y)
2844 next[x][y] = Xalien;
2847 static void Lbug_n(int x, int y)
2849 switch (cave[x][y-1])
2865 cave[x][y] = Ybug_nB;
2866 next[x][y] = Xblank;
2867 cave[x][y-1] = Ybug_n;
2868 next[x][y-1] = Xbug_1_n;
2869 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2880 cave[x][y] = Ybug_nB;
2881 next[x][y] = Xblank;
2882 if (cave[x+1][y-2] == Xblank)
2883 cave[x+1][y-2] = Xsplash_e;
2884 if (cave[x-1][y-2] == Xblank)
2885 cave[x-1][y-2] = Xsplash_w;
2886 play_element_sound(x, y, SOUND_acid, Xacid_1);
2890 cave[x][y] = Ybug_n_w;
2891 next[x][y] = Xbug_2_w;
2892 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2897 static void Lbug_1_n(int x, int y)
2899 if (is_amoeba[cave[x][y-1]] ||
2900 is_amoeba[cave[x+1][y]] ||
2901 is_amoeba[cave[x][y+1]] ||
2902 is_amoeba[cave[x-1][y]])
2910 switch (cave[x+1][y])
2934 cave[x][y] = Ybug_n_e;
2935 next[x][y] = Xbug_2_e;
2936 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2945 static void Lbug_2_n(int x, int y)
2947 if (is_amoeba[cave[x][y-1]] ||
2948 is_amoeba[cave[x+1][y]] ||
2949 is_amoeba[cave[x][y+1]] ||
2950 is_amoeba[cave[x-1][y]])
2961 static void Lbug_e(int x, int y)
2963 switch (cave[x+1][y])
2979 cave[x][y] = Ybug_eB;
2980 next[x][y] = Xblank;
2981 cave[x+1][y] = Ybug_e;
2982 next[x+1][y] = Xbug_1_e;
2983 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2994 cave[x][y] = Ybug_eB;
2995 next[x][y] = Xblank;
2996 if (cave[x+2][y-1] == Xblank)
2997 cave[x+2][y-1] = Xsplash_e;
2998 if (cave[x][y-1] == Xblank)
2999 cave[x][y-1] = Xsplash_w;
3000 play_element_sound(x, y, SOUND_acid, Xacid_1);
3004 cave[x][y] = Ybug_e_n;
3005 next[x][y] = Xbug_2_n;
3006 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3011 static void Lbug_1_e(int x, int y)
3013 if (is_amoeba[cave[x][y-1]] ||
3014 is_amoeba[cave[x+1][y]] ||
3015 is_amoeba[cave[x][y+1]] ||
3016 is_amoeba[cave[x-1][y]])
3024 switch (cave[x][y+1])
3048 cave[x][y] = Ybug_e_s;
3049 next[x][y] = Xbug_2_s;
3050 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
3059 static void Lbug_2_e(int x, int y)
3061 if (is_amoeba[cave[x][y-1]] ||
3062 is_amoeba[cave[x+1][y]] ||
3063 is_amoeba[cave[x][y+1]] ||
3064 is_amoeba[cave[x-1][y]])
3075 static void Lbug_s(int x, int y)
3077 switch (cave[x][y+1])
3093 cave[x][y] = Ybug_sB;
3094 next[x][y] = Xblank;
3095 cave[x][y+1] = Ybug_s;
3096 next[x][y+1] = Xbug_1_s;
3097 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3108 cave[x][y] = Ybug_sB;
3109 next[x][y] = Xblank;
3110 if (cave[x+1][y] == Xblank)
3111 cave[x+1][y] = Xsplash_e;
3112 if (cave[x-1][y] == Xblank)
3113 cave[x-1][y] = Xsplash_w;
3114 play_element_sound(x, y, SOUND_acid, Xacid_1);
3118 cave[x][y] = Ybug_s_e;
3119 next[x][y] = Xbug_2_e;
3120 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3125 static void Lbug_1_s(int x, int y)
3127 if (is_amoeba[cave[x][y-1]] ||
3128 is_amoeba[cave[x+1][y]] ||
3129 is_amoeba[cave[x][y+1]] ||
3130 is_amoeba[cave[x-1][y]])
3138 switch (cave[x-1][y])
3162 cave[x][y] = Ybug_s_w;
3163 next[x][y] = Xbug_2_w;
3164 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3173 static void Lbug_2_s(int x, int y)
3175 if (is_amoeba[cave[x][y-1]] ||
3176 is_amoeba[cave[x+1][y]] ||
3177 is_amoeba[cave[x][y+1]] ||
3178 is_amoeba[cave[x-1][y]])
3189 static void Lbug_w(int x, int y)
3191 switch (cave[x-1][y])
3207 cave[x][y] = Ybug_wB;
3208 next[x][y] = Xblank;
3209 cave[x-1][y] = Ybug_w;
3210 next[x-1][y] = Xbug_1_w;
3211 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3222 cave[x][y] = Ybug_wB;
3223 next[x][y] = Xblank;
3224 if (cave[x][y-1] == Xblank)
3225 cave[x][y-1] = Xsplash_e;
3226 if (cave[x-2][y-1] == Xblank)
3227 cave[x-2][y-1] = Xsplash_w;
3228 play_element_sound(x, y, SOUND_acid, Xacid_1);
3232 cave[x][y] = Ybug_w_s;
3233 next[x][y] = Xbug_2_s;
3234 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3239 static void Lbug_1_w(int x, int y)
3241 if (is_amoeba[cave[x][y-1]] ||
3242 is_amoeba[cave[x+1][y]] ||
3243 is_amoeba[cave[x][y+1]] ||
3244 is_amoeba[cave[x-1][y]])
3252 switch (cave[x][y-1])
3276 cave[x][y] = Ybug_w_n;
3277 next[x][y] = Xbug_2_n;
3278 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3287 static void Lbug_2_w(int x, int y)
3289 if (is_amoeba[cave[x][y-1]] ||
3290 is_amoeba[cave[x+1][y]] ||
3291 is_amoeba[cave[x][y+1]] ||
3292 is_amoeba[cave[x-1][y]])
3303 static void Ltank_n(int x, int y)
3305 switch (cave[x][y-1])
3321 cave[x][y] = Ytank_nB;
3322 next[x][y] = Xblank;
3323 cave[x][y-1] = Ytank_n;
3324 next[x][y-1] = Xtank_1_n;
3325 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3336 cave[x][y] = Ytank_nB;
3337 next[x][y] = Xblank;
3338 if (cave[x+1][y-2] == Xblank)
3339 cave[x+1][y-2] = Xsplash_e;
3340 if (cave[x-1][y-2] == Xblank)
3341 cave[x-1][y-2] = Xsplash_w;
3342 play_element_sound(x, y, SOUND_acid, Xacid_1);
3346 cave[x][y] = Ytank_n_e;
3347 next[x][y] = Xtank_2_e;
3348 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3353 static void Ltank_1_n(int x, int y)
3355 if (is_amoeba[cave[x][y-1]] ||
3356 is_amoeba[cave[x+1][y]] ||
3357 is_amoeba[cave[x][y+1]] ||
3358 is_amoeba[cave[x-1][y]])
3366 switch (cave[x-1][y])
3390 cave[x][y] = Ytank_n_w;
3391 next[x][y] = Xtank_2_w;
3392 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3401 static void Ltank_2_n(int x, int y)
3403 if (is_amoeba[cave[x][y-1]] ||
3404 is_amoeba[cave[x+1][y]] ||
3405 is_amoeba[cave[x][y+1]] ||
3406 is_amoeba[cave[x-1][y]])
3417 static void Ltank_e(int x, int y)
3419 switch (cave[x+1][y])
3435 cave[x][y] = Ytank_eB;
3436 next[x][y] = Xblank;
3437 cave[x+1][y] = Ytank_e;
3438 next[x+1][y] = Xtank_1_e;
3439 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3450 cave[x][y] = Ytank_eB;
3451 next[x][y] = Xblank;
3452 if (cave[x+2][y-1] == Xblank)
3453 cave[x+2][y-1] = Xsplash_e;
3454 if (cave[x][y-1] == Xblank)
3455 cave[x][y-1] = Xsplash_w;
3456 play_element_sound(x, y, SOUND_acid, Xacid_1);
3460 cave[x][y] = Ytank_e_s;
3461 next[x][y] = Xtank_2_s;
3462 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3467 static void Ltank_1_e(int x, int y)
3469 if (is_amoeba[cave[x][y-1]] ||
3470 is_amoeba[cave[x+1][y]] ||
3471 is_amoeba[cave[x][y+1]] ||
3472 is_amoeba[cave[x-1][y]])
3480 switch (cave[x][y-1])
3504 cave[x][y] = Ytank_e_n;
3505 next[x][y] = Xtank_2_n;
3506 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3515 static void Ltank_2_e(int x, int y)
3517 if (is_amoeba[cave[x][y-1]] ||
3518 is_amoeba[cave[x+1][y]] ||
3519 is_amoeba[cave[x][y+1]] ||
3520 is_amoeba[cave[x-1][y]])
3531 static void Ltank_s(int x, int y)
3533 switch (cave[x][y+1])
3549 cave[x][y] = Ytank_sB;
3550 next[x][y] = Xblank;
3551 cave[x][y+1] = Ytank_s;
3552 next[x][y+1] = Xtank_1_s;
3553 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3564 cave[x][y] = Ytank_sB;
3565 next[x][y] = Xblank;
3566 if (cave[x+1][y] == Xblank)
3567 cave[x+1][y] = Xsplash_e;
3568 if (cave[x-1][y] == Xblank)
3569 cave[x-1][y] = Xsplash_w;
3570 play_element_sound(x, y, SOUND_acid, Xacid_1);
3574 cave[x][y] = Ytank_s_w;
3575 next[x][y] = Xtank_2_w;
3576 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3581 static void Ltank_1_s(int x, int y)
3583 if (is_amoeba[cave[x][y-1]] ||
3584 is_amoeba[cave[x+1][y]] ||
3585 is_amoeba[cave[x][y+1]] ||
3586 is_amoeba[cave[x-1][y]])
3594 switch (cave[x+1][y])
3618 cave[x][y] = Ytank_s_e;
3619 next[x][y] = Xtank_2_e;
3620 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3629 static void Ltank_2_s(int x, int y)
3631 if (is_amoeba[cave[x][y-1]] ||
3632 is_amoeba[cave[x+1][y]] ||
3633 is_amoeba[cave[x][y+1]] ||
3634 is_amoeba[cave[x-1][y]])
3645 static void Ltank_w(int x, int y)
3647 switch (cave[x-1][y])
3663 cave[x][y] = Ytank_wB;
3664 next[x][y] = Xblank;
3665 cave[x-1][y] = Ytank_w;
3666 next[x-1][y] = Xtank_1_w;
3667 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3678 cave[x][y] = Ytank_wB;
3679 next[x][y] = Xblank;
3680 if (cave[x][y-1] == Xblank)
3681 cave[x][y-1] = Xsplash_e;
3682 if (cave[x-2][y-1] == Xblank)
3683 cave[x-2][y-1] = Xsplash_w;
3684 play_element_sound(x, y, SOUND_acid, Xacid_1);
3688 cave[x][y] = Ytank_w_n;
3689 next[x][y] = Xtank_2_n;
3690 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3695 static void Ltank_1_w(int x, int y)
3697 if (is_amoeba[cave[x][y-1]] ||
3698 is_amoeba[cave[x+1][y]] ||
3699 is_amoeba[cave[x][y+1]] ||
3700 is_amoeba[cave[x-1][y]])
3708 switch (cave[x][y+1])
3732 cave[x][y] = Ytank_w_s;
3733 next[x][y] = Xtank_2_s;
3734 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3743 static void Ltank_2_w(int x, int y)
3745 if (is_amoeba[cave[x][y-1]] ||
3746 is_amoeba[cave[x+1][y]] ||
3747 is_amoeba[cave[x][y+1]] ||
3748 is_amoeba[cave[x-1][y]])
3759 static void Lemerald(int x, int y)
3761 switch (cave[x][y+1])
3774 cave[x][y] = Yemerald_sB;
3775 next[x][y] = Xblank;
3776 cave[x][y+1] = Yemerald_s;
3777 next[x][y+1] = Xemerald_fall;
3788 cave[x][y] = Yemerald_sB;
3789 next[x][y] = Xblank;
3790 if (cave[x+1][y] == Xblank)
3791 cave[x+1][y] = Xsplash_e;
3792 if (cave[x-1][y] == Xblank)
3793 cave[x-1][y] = Xsplash_w;
3794 play_element_sound(x, y, SOUND_acid, Xacid_1);
3807 case Xemerald_pause:
3809 case Xdiamond_pause:
3853 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
3855 cave[x][y] = Yemerald_eB;
3856 next[x][y] = Xblank;
3857 cave[x+1][y] = Yemerald_e;
3858 next[x+1][y] = Xemerald_pause;
3859 if (cave[x][y+1] == Xbumper)
3860 cave[x][y+1] = Ybumper;
3864 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
3866 cave[x][y] = Yemerald_wB;
3867 next[x][y] = Xblank;
3868 cave[x-1][y] = Yemerald_w;
3869 next[x-1][y] = Xemerald_pause;
3870 if (cave[x][y+1] == Xbumper)
3871 cave[x][y+1] = Ybumper;
3877 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
3879 cave[x][y] = Yemerald_wB;
3880 next[x][y] = Xblank;
3881 cave[x-1][y] = Yemerald_w;
3882 next[x-1][y] = Xemerald_pause;
3883 if (cave[x][y+1] == Xbumper)
3884 cave[x][y+1] = Ybumper;
3888 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
3890 cave[x][y] = Yemerald_eB;
3891 next[x][y] = Xblank;
3892 cave[x+1][y] = Yemerald_e;
3893 next[x+1][y] = Xemerald_pause;
3894 if (cave[x][y+1] == Xbumper)
3895 cave[x][y+1] = Ybumper;
3901 if (++lev.shine_cnt > 50)
3903 lev.shine_cnt = RANDOM(8);
3904 cave[x][y] = Xemerald_shine;
3911 static void Lemerald_pause(int x, int y)
3913 switch (cave[x][y+1])
3926 cave[x][y] = Yemerald_sB;
3927 next[x][y] = Xblank;
3928 cave[x][y+1] = Yemerald_s;
3929 next[x][y+1] = Xemerald_fall;
3940 cave[x][y] = Yemerald_sB;
3941 next[x][y] = Xblank;
3942 if (cave[x+1][y] == Xblank)
3943 cave[x+1][y] = Xsplash_e;
3944 if (cave[x-1][y] == Xblank)
3945 cave[x-1][y] = Xsplash_w;
3946 play_element_sound(x, y, SOUND_acid, Xacid_1);
3950 cave[x][y] = Xemerald;
3951 next[x][y] = Xemerald;
3956 static void Lemerald_fall(int x, int y)
3958 switch (cave[x][y+1])
3972 cave[x][y] = Yemerald_sB;
3973 next[x][y] = Xblank;
3974 cave[x][y+1] = Yemerald_s;
3975 next[x][y+1] = Xemerald_fall;
3986 cave[x][y] = Yemerald_sB;
3987 next[x][y] = Xblank;
3988 if (cave[x+1][y] == Xblank)
3989 cave[x+1][y] = Xsplash_e;
3990 if (cave[x-1][y] == Xblank)
3991 cave[x-1][y] = Xsplash_w;
3992 play_element_sound(x, y, SOUND_acid, Xacid_1);
3996 if (lev.wonderwall_time > 0)
3998 lev.wonderwall_active = TRUE;
3999 cave[x][y] = Yemerald_sB;
4000 next[x][y] = Xblank;
4001 if (is_blank[cave[x][y+2]])
4003 cave[x][y+2] = Ydiamond_s;
4004 next[x][y+2] = Xdiamond_fall;
4006 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4011 cave[x][y] = Xemerald;
4012 next[x][y] = Xemerald;
4013 play_element_sound(x, y, SOUND_diamond, Xemerald);
4018 static void Ldiamond(int x, int y)
4020 switch (cave[x][y+1])
4033 cave[x][y] = Ydiamond_sB;
4034 next[x][y] = Xblank;
4035 cave[x][y+1] = Ydiamond_s;
4036 next[x][y+1] = Xdiamond_fall;
4047 cave[x][y] = Ydiamond_sB;
4048 next[x][y] = Xblank;
4049 if (cave[x+1][y] == Xblank)
4050 cave[x+1][y] = Xsplash_e;
4051 if (cave[x-1][y] == Xblank)
4052 cave[x-1][y] = Xsplash_w;
4053 play_element_sound(x, y, SOUND_acid, Xacid_1);
4066 case Xemerald_pause:
4068 case Xdiamond_pause:
4112 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4114 cave[x][y] = Ydiamond_eB;
4115 next[x][y] = Xblank;
4116 cave[x+1][y] = Ydiamond_e;
4117 next[x+1][y] = Xdiamond_pause;
4118 if (cave[x][y+1] == Xbumper)
4119 cave[x][y+1] = Ybumper;
4123 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4125 cave[x][y] = Ydiamond_wB;
4126 next[x][y] = Xblank;
4127 cave[x-1][y] = Ydiamond_w;
4128 next[x-1][y] = Xdiamond_pause;
4129 if (cave[x][y+1] == Xbumper)
4130 cave[x][y+1] = Ybumper;
4136 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4138 cave[x][y] = Ydiamond_wB;
4139 next[x][y] = Xblank;
4140 cave[x-1][y] = Ydiamond_w;
4141 next[x-1][y] = Xdiamond_pause;
4142 if (cave[x][y+1] == Xbumper)
4143 cave[x][y+1] = Ybumper;
4147 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4149 cave[x][y] = Ydiamond_eB;
4150 next[x][y] = Xblank;
4151 cave[x+1][y] = Ydiamond_e;
4152 next[x+1][y] = Xdiamond_pause;
4153 if (cave[x][y+1] == Xbumper)
4154 cave[x][y+1] = Ybumper;
4160 if (++lev.shine_cnt > 50)
4162 lev.shine_cnt = RANDOM(8);
4163 cave[x][y] = Xdiamond_shine;
4170 static void Ldiamond_pause(int x, int y)
4172 switch (cave[x][y+1])
4185 cave[x][y] = Ydiamond_sB;
4186 next[x][y] = Xblank;
4187 cave[x][y+1] = Ydiamond_s;
4188 next[x][y+1] = Xdiamond_fall;
4199 cave[x][y] = Ydiamond_sB;
4200 next[x][y] = Xblank;
4201 if (cave[x+1][y] == Xblank)
4202 cave[x+1][y] = Xsplash_e;
4203 if (cave[x-1][y] == Xblank)
4204 cave[x-1][y] = Xsplash_w;
4205 play_element_sound(x, y, SOUND_acid, Xacid_1);
4209 cave[x][y] = Xdiamond;
4210 next[x][y] = Xdiamond;
4215 static void Ldiamond_fall(int x, int y)
4217 switch (cave[x][y+1])
4231 cave[x][y] = Ydiamond_sB;
4232 next[x][y] = Xblank;
4233 cave[x][y+1] = Ydiamond_s;
4234 next[x][y+1] = Xdiamond_fall;
4245 cave[x][y] = Ydiamond_sB;
4246 next[x][y] = Xblank;
4247 if (cave[x+1][y] == Xblank)
4248 cave[x+1][y] = Xsplash_e;
4249 if (cave[x-1][y] == Xblank)
4250 cave[x-1][y] = Xsplash_w;
4251 play_element_sound(x, y, SOUND_acid, Xacid_1);
4255 if (lev.wonderwall_time > 0)
4257 lev.wonderwall_active = TRUE;
4258 cave[x][y] = Ydiamond_sB;
4259 next[x][y] = Xblank;
4260 if (is_blank[cave[x][y+2]])
4262 cave[x][y+2] = Ystone_s;
4263 next[x][y+2] = Xstone_fall;
4265 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4270 cave[x][y] = Xdiamond;
4271 next[x][y] = Xdiamond;
4272 play_element_sound(x, y, SOUND_diamond, Xdiamond);
4277 static void Lstone(int x, int y)
4279 switch (cave[x][y+1])
4294 cave[x][y] = Ystone_sB;
4295 next[x][y] = Xblank;
4296 cave[x][y+1] = Ystone_s;
4297 next[x][y+1] = Xstone_fall;
4308 cave[x][y] = Ystone_sB;
4309 next[x][y] = Xblank;
4310 if (cave[x+1][y] == Xblank)
4311 cave[x+1][y] = Xsplash_e;
4312 if (cave[x-1][y] == Xblank)
4313 cave[x-1][y] = Xsplash_w;
4314 play_element_sound(x, y, SOUND_acid, Xacid_1);
4318 cave[x][y] = Xsand_stonein_1;
4319 next[x][y] = Xsand_stonein_2;
4320 cave[x][y+1] = Xsand_sandstone_1;
4321 next[x][y+1] = Xsand_sandstone_2;
4334 case Xemerald_pause:
4336 case Xdiamond_pause:
4373 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4375 cave[x][y] = Ystone_eB;
4376 next[x][y] = Xblank;
4377 cave[x+1][y] = Ystone_e;
4378 next[x+1][y] = Xstone_pause;
4379 if (cave[x][y+1] == Xbumper)
4380 cave[x][y+1] = Ybumper;
4384 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4386 cave[x][y] = Ystone_wB;
4387 next[x][y] = Xblank;
4388 cave[x-1][y] = Ystone_w;
4389 next[x-1][y] = Xstone_pause;
4390 if (cave[x][y+1] == Xbumper)
4391 cave[x][y+1] = Ybumper;
4397 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4399 cave[x][y] = Ystone_wB;
4400 next[x][y] = Xblank;
4401 cave[x-1][y] = Ystone_w;
4402 next[x-1][y] = Xstone_pause;
4403 if (cave[x][y+1] == Xbumper)
4404 cave[x][y+1] = Ybumper;
4408 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4410 cave[x][y] = Ystone_eB;
4411 next[x][y] = Xblank;
4412 cave[x+1][y] = Ystone_e;
4413 next[x+1][y] = Xstone_pause;
4414 if (cave[x][y+1] == Xbumper)
4415 cave[x][y+1] = Ybumper;
4422 static void Lstone_pause(int x, int y)
4424 switch (cave[x][y+1])
4437 cave[x][y] = Ystone_sB;
4438 next[x][y] = Xblank;
4439 cave[x][y+1] = Ystone_s;
4440 next[x][y+1] = Xstone_fall;
4451 cave[x][y] = Ystone_sB;
4452 next[x][y] = Xblank;
4453 if (cave[x+1][y] == Xblank)
4454 cave[x+1][y] = Xsplash_e;
4455 if (cave[x-1][y] == Xblank)
4456 cave[x-1][y] = Xsplash_w;
4457 play_element_sound(x, y, SOUND_acid, Xacid_1);
4461 cave[x][y] = Xstone;
4462 next[x][y] = Xstone;
4467 static void Lstone_fall(int x, int y)
4469 switch (cave[x][y+1])
4483 cave[x][y] = Ystone_sB;
4484 next[x][y] = Xblank;
4485 cave[x][y+1] = Ystone_s;
4486 next[x][y+1] = Xstone_fall;
4497 cave[x][y] = Ystone_sB;
4498 next[x][y] = Xblank;
4499 if (cave[x+1][y] == Xblank)
4500 cave[x+1][y] = Xsplash_e;
4501 if (cave[x-1][y] == Xblank)
4502 cave[x-1][y] = Xsplash_w;
4503 play_element_sound(x, y, SOUND_acid, Xacid_1);
4510 cave[x][y] = Ystone_sB;
4511 Lboom_next_new(x, y, Xblank);
4512 cave[x][y+1] = Yeater_stone;
4513 next[x][y+1] = Zeater;
4514 Lboom_eater_old(x, y+1);
4515 score += lev.eater_score;
4520 cave[x][y] = Ystone_sB;
4521 Lboom_next_new(x, y, Xblank);
4522 cave[x][y+1] = Yalien_stone;
4523 next[x][y+1] = Ztank;
4524 Lboom_tank_old(x, y+1);
4525 score += lev.alien_score;
4536 cave[x][y] = Ystone_sB;
4537 Lboom_next_new(x, y, Xblank);
4538 cave[x][y+1] = Ybug_stone;
4539 next[x][y+1] = Zbug;
4540 Lboom_bug_old(x, y+1);
4541 score += lev.bug_score;
4552 cave[x][y] = Ystone_sB;
4553 Lboom_next_new(x, y, Xblank);
4554 cave[x][y+1] = Ytank_stone;
4555 next[x][y+1] = Ztank;
4556 Lboom_tank_old(x, y+1);
4557 score += lev.tank_score;
4561 case Xdiamond_pause:
4562 switch (cave[x][y+2])
4618 next[x][y] = Xstone;
4619 play_element_sound(x, y, SOUND_stone, Xstone);
4623 cave[x][y] = Ystone_sB;
4624 next[x][y] = Xblank;
4625 cave[x][y+1] = Ydiamond_stone;
4626 next[x][y+1] = Xstone_pause;
4627 play_element_sound(x, y, SOUND_squash, Xdiamond);
4632 Lboom_cave_new(x, y, Xstone);
4633 Lboom_next_new(x, y, Xstone);
4634 cave[x][y+1] = Ybomb_blank;
4635 next[x][y+1] = Ztank;
4636 Lboom_tank_old(x, y+1);
4641 next[x][y] = Xstone;
4642 cave[x][y+1] = Ynut_stone;
4643 next[x][y+1] = Xemerald;
4644 play_element_sound(x, y, SOUND_crack, Xnut);
4645 score += lev.nut_score;
4651 switch (cave[x+1][y+1])
4666 cave[x][y+1] = Xspring_e;
4670 cave[x][y+1] = Xspring_w;
4676 switch (cave[x-1][y+1])
4691 cave[x][y+1] = Xspring_w;
4694 cave[x][y+1] = Xspring_e;
4699 next[x][y] = Xstone;
4703 if (lev.wonderwall_time > 0)
4705 lev.wonderwall_active = TRUE;
4706 cave[x][y] = Ystone_sB;
4707 next[x][y] = Xblank;
4708 if (is_blank[cave[x][y+2]])
4710 cave[x][y+2] = Yemerald_s;
4711 next[x][y+2] = Xemerald_fall;
4713 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4718 cave[x][y] = Xstone;
4719 next[x][y] = Xstone;
4720 play_element_sound(x, y, SOUND_stone, Xstone);
4725 static void Lbomb(int x, int y)
4727 switch (cave[x][y+1])
4740 cave[x][y] = Ybomb_sB;
4741 next[x][y] = Xblank;
4742 cave[x][y+1] = Ybomb_s;
4743 next[x][y+1] = Xbomb_fall;
4754 cave[x][y] = Ybomb_sB;
4755 next[x][y] = Xblank;
4756 if (cave[x+1][y] == Xblank)
4757 cave[x+1][y] = Xsplash_e;
4758 if (cave[x-1][y] == Xblank)
4759 cave[x-1][y] = Xsplash_w;
4760 play_element_sound(x, y, SOUND_acid, Xacid_1);
4773 case Xemerald_pause:
4775 case Xdiamond_pause:
4810 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4812 cave[x][y] = Ybomb_eB;
4813 next[x][y] = Xblank;
4814 cave[x+1][y] = Ybomb_e;
4815 next[x+1][y] = Xbomb_pause;
4816 if (cave[x][y+1] == Xbumper)
4817 cave[x][y+1] = Ybumper;
4821 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4823 cave[x][y] = Ybomb_wB;
4824 next[x][y] = Xblank;
4825 cave[x-1][y] = Ybomb_w;
4826 next[x-1][y] = Xbomb_pause;
4827 if (cave[x][y+1] == Xbumper)
4828 cave[x][y+1] = Ybumper;
4834 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
4836 cave[x][y] = Ybomb_wB;
4837 next[x][y] = Xblank;
4838 cave[x-1][y] = Ybomb_w;
4839 next[x-1][y] = Xbomb_pause;
4840 if (cave[x][y+1] == Xbumper)
4841 cave[x][y+1] = Ybumper;
4845 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
4847 cave[x][y] = Ybomb_eB;
4848 next[x][y] = Xblank;
4849 cave[x+1][y] = Ybomb_e;
4850 next[x+1][y] = Xbomb_pause;
4851 if (cave[x][y+1] == Xbumper)
4852 cave[x][y+1] = Ybumper;
4859 static void Lbomb_pause(int x, int y)
4861 switch (cave[x][y+1])
4874 cave[x][y] = Ybomb_sB;
4875 next[x][y] = Xblank;
4876 cave[x][y+1] = Ybomb_s;
4877 next[x][y+1] = Xbomb_fall;
4888 cave[x][y] = Ybomb_sB;
4889 next[x][y] = Xblank;
4890 if (cave[x+1][y] == Xblank)
4891 cave[x+1][y] = Xsplash_e;
4892 if (cave[x-1][y] == Xblank)
4893 cave[x-1][y] = Xsplash_w;
4894 play_element_sound(x, y, SOUND_acid, Xacid_1);
4904 static void Lbomb_fall(int x, int y)
4906 switch (cave[x][y+1])
4919 cave[x][y] = Ybomb_sB;
4920 next[x][y] = Xblank;
4921 cave[x][y+1] = Ybomb_s;
4922 next[x][y+1] = Xbomb_fall;
4933 cave[x][y] = Ybomb_sB;
4934 next[x][y] = Xblank;
4935 if (cave[x+1][y] == Xblank)
4936 cave[x+1][y] = Xsplash_e;
4937 if (cave[x-1][y] == Xblank)
4938 cave[x-1][y] = Xsplash_w;
4939 play_element_sound(x, y, SOUND_acid, Xacid_1);
4943 cave[x][y] = Ybomb_blank;
4945 Lboom_tank_old(x, y);
4950 static void Lnut(int x, int y)
4952 switch (cave[x][y+1])
4965 cave[x][y] = Ynut_sB;
4966 next[x][y] = Xblank;
4967 cave[x][y+1] = Ynut_s;
4968 next[x][y+1] = Xnut_fall;
4979 cave[x][y] = Ynut_sB;
4980 next[x][y] = Xblank;
4981 if (cave[x+1][y] == Xblank)
4982 cave[x+1][y] = Xsplash_e;
4983 if (cave[x-1][y] == Xblank)
4984 cave[x-1][y] = Xsplash_w;
4985 play_element_sound(x, y, SOUND_acid, Xacid_1);
4998 case Xemerald_pause:
5000 case Xdiamond_pause:
5035 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5037 cave[x][y] = Ynut_eB;
5038 next[x][y] = Xblank;
5039 cave[x+1][y] = Ynut_e;
5040 next[x+1][y] = Xnut_pause;
5041 if (cave[x][y+1] == Xbumper)
5042 cave[x][y+1] = Ybumper;
5046 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5048 cave[x][y] = Ynut_wB;
5049 next[x][y] = Xblank;
5050 cave[x-1][y] = Ynut_w;
5051 next[x-1][y] = Xnut_pause;
5052 if (cave[x][y+1] == Xbumper)
5053 cave[x][y+1] = Ybumper;
5059 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5061 cave[x][y] = Ynut_wB;
5062 next[x][y] = Xblank;
5063 cave[x-1][y] = Ynut_w;
5064 next[x-1][y] = Xnut_pause;
5065 if (cave[x][y+1] == Xbumper)
5066 cave[x][y+1] = Ybumper;
5070 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5072 cave[x][y] = Ynut_eB;
5073 next[x][y] = Xblank;
5074 cave[x+1][y] = Ynut_e;
5075 next[x+1][y] = Xnut_pause;
5076 if (cave[x][y+1] == Xbumper)
5077 cave[x][y+1] = Ybumper;
5084 static void Lnut_pause(int x, int y)
5086 switch (cave[x][y+1])
5099 cave[x][y] = Ynut_sB;
5100 next[x][y] = Xblank;
5101 cave[x][y+1] = Ynut_s;
5102 next[x][y+1] = Xnut_fall;
5113 cave[x][y] = Ynut_sB;
5114 next[x][y] = Xblank;
5115 if (cave[x+1][y] == Xblank)
5116 cave[x+1][y] = Xsplash_e;
5117 if (cave[x-1][y] == Xblank)
5118 cave[x-1][y] = Xsplash_w;
5119 play_element_sound(x, y, SOUND_acid, Xacid_1);
5129 static void Lnut_fall(int x, int y)
5131 switch (cave[x][y+1])
5145 cave[x][y] = Ynut_sB;
5146 next[x][y] = Xblank;
5147 cave[x][y+1] = Ynut_s;
5148 next[x][y+1] = Xnut_fall;
5159 cave[x][y] = Ynut_sB;
5160 next[x][y] = Xblank;
5161 if (cave[x+1][y] == Xblank)
5162 cave[x+1][y] = Xsplash_e;
5163 if (cave[x-1][y] == Xblank)
5164 cave[x-1][y] = Xsplash_w;
5165 play_element_sound(x, y, SOUND_acid, Xacid_1);
5171 play_element_sound(x, y, SOUND_nut, Xnut);
5176 static void Lspring(int x, int y)
5178 switch (cave[x][y+1])
5193 cave[x][y] = Yspring_sB;
5194 next[x][y] = Xblank;
5195 cave[x][y+1] = Yspring_s;
5196 next[x][y+1] = Xspring_fall;
5207 cave[x][y] = Yspring_sB;
5208 next[x][y] = Xblank;
5209 if (cave[x+1][y] == Xblank)
5210 cave[x+1][y] = Xsplash_e;
5211 if (cave[x-1][y] == Xblank)
5212 cave[x-1][y] = Xsplash_w;
5213 play_element_sound(x, y, SOUND_acid, Xacid_1);
5226 case Xemerald_pause:
5228 case Xdiamond_pause:
5263 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5265 cave[x][y] = Yspring_eB;
5266 next[x][y] = Xblank;
5267 cave[x+1][y] = Yspring_e;
5269 next[x+1][y] = Xspring_e;
5271 next[x+1][y] = Xspring_pause;
5273 if (cave[x][y+1] == Xbumper)
5274 cave[x][y+1] = Ybumper;
5278 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5280 cave[x][y] = Yspring_wB;
5281 next[x][y] = Xblank;
5282 cave[x-1][y] = Yspring_w;
5284 next[x-1][y] = Xspring_w;
5286 next[x-1][y] = Xspring_pause;
5288 if (cave[x][y+1] == Xbumper)
5289 cave[x][y+1] = Ybumper;
5295 if (is_blank[cave[x-1][y]] && is_blank_or_acid[cave[x-1][y+1]])
5297 cave[x][y] = Yspring_wB;
5298 next[x][y] = Xblank;
5299 cave[x-1][y] = Yspring_w;
5301 next[x-1][y] = Xspring_w;
5303 next[x-1][y] = Xspring_pause;
5305 if (cave[x][y+1] == Xbumper)
5306 cave[x][y+1] = Ybumper;
5310 if (is_blank[cave[x+1][y]] && is_blank_or_acid[cave[x+1][y+1]])
5312 cave[x][y] = Yspring_eB;
5313 next[x][y] = Xblank;
5314 cave[x+1][y] = Yspring_e;
5316 next[x+1][y] = Xspring_e;
5318 next[x+1][y] = Xspring_pause;
5320 if (cave[x][y+1] == Xbumper)
5321 cave[x][y+1] = Ybumper;
5328 static void Lspring_pause(int x, int y)
5330 switch (cave[x][y+1])
5343 cave[x][y] = Yspring_sB;
5344 next[x][y] = Xblank;
5345 cave[x][y+1] = Yspring_s;
5346 next[x][y+1] = Xspring_fall;
5357 cave[x][y] = Yspring_sB;
5358 next[x][y] = Xblank;
5359 if (cave[x+1][y] == Xblank)
5360 cave[x+1][y] = Xsplash_e;
5361 if (cave[x-1][y] == Xblank)
5362 cave[x-1][y] = Xsplash_w;
5363 play_element_sound(x, y, SOUND_acid, Xacid_1);
5367 cave[x][y] = Xspring;
5368 next[x][y] = Xspring;
5373 static void Lspring_e(int x, int y)
5375 switch (cave[x][y+1])
5388 cave[x][y] = Yspring_sB;
5389 next[x][y] = Xblank;
5390 cave[x][y+1] = Yspring_s;
5391 next[x][y+1] = Xspring_fall;
5402 cave[x][y] = Yspring_sB;
5403 next[x][y] = Xblank;
5404 if (cave[x+1][y] == Xblank)
5405 cave[x+1][y] = Xsplash_e;
5406 if (cave[x-1][y] == Xblank)
5407 cave[x-1][y] = Xsplash_w;
5408 play_element_sound(x, y, SOUND_acid, Xacid_1);
5412 cave[x][y+1] = Ybumper;
5415 switch (cave[x+1][y])
5432 cave[x][y] = Yspring_eB;
5433 next[x][y] = Xblank;
5434 cave[x+1][y] = Yspring_e;
5435 next[x+1][y] = Xspring_e;
5446 cave[x][y] = Yspring_eB;
5447 next[x][y] = Xblank;
5448 if (cave[x+2][y-1] == Xblank)
5449 cave[x+2][y-1] = Xsplash_e;
5450 if (cave[x][y-1] == Xblank)
5451 cave[x][y-1] = Xsplash_w;
5452 play_element_sound(x, y, SOUND_acid, Xacid_1);
5461 cave[x][y] = Yspring_alien_eB;
5462 next[x][y] = Xblank;
5463 cave[x+1][y] = Yspring_alien_e;
5464 next[x+1][y] = Xspring_e;
5465 play_element_sound(x, y, SOUND_slurp, Xalien);
5466 score += lev.slurp_score;
5471 cave[x+1][y] = Ybumper;
5472 next[x][y] = Xspring_w;
5473 play_element_sound(x, y, SOUND_spring, Xspring);
5477 cave[x][y] = Xspring;
5478 next[x][y] = Xspring;
5479 play_element_sound(x, y, SOUND_spring, Xspring);
5484 static void Lspring_w(int x, int y)
5486 switch (cave[x][y+1])
5499 cave[x][y] = Yspring_sB;
5500 next[x][y] = Xblank;
5501 cave[x][y+1] = Yspring_s;
5502 next[x][y+1] = Xspring_fall;
5513 cave[x][y] = Yspring_sB;
5514 next[x][y] = Xblank;
5515 if (cave[x+1][y] == Xblank)
5516 cave[x+1][y] = Xsplash_e;
5517 if (cave[x-1][y] == Xblank)
5518 cave[x-1][y] = Xsplash_w;
5519 play_element_sound(x, y, SOUND_acid, Xacid_1);
5523 cave[x][y+1] = Ybumper;
5526 switch (cave[x-1][y])
5543 cave[x][y] = Yspring_wB;
5544 next[x][y] = Xblank;
5545 cave[x-1][y] = Yspring_w;
5546 next[x-1][y] = Xspring_w;
5557 cave[x][y] = Yspring_wB;
5558 next[x][y] = Xblank;
5559 if (cave[x][y-1] == Xblank)
5560 cave[x][y-1] = Xsplash_e;
5561 if (cave[x-2][y-1] == Xblank)
5562 cave[x-2][y-1] = Xsplash_w;
5563 play_element_sound(x, y, SOUND_acid, Xacid_1);
5572 cave[x][y] = Yspring_alien_wB;
5573 next[x][y] = Xblank;
5574 cave[x-1][y] = Yspring_alien_w;
5575 next[x-1][y] = Xspring_w;
5576 play_element_sound(x, y, SOUND_slurp, Xalien);
5577 score += lev.slurp_score;
5582 cave[x-1][y] = Ybumper;
5583 next[x][y] = Xspring_e;
5584 play_element_sound(x, y, SOUND_spring, Xspring);
5588 cave[x][y] = Xspring;
5589 next[x][y] = Xspring;
5590 play_element_sound(x, y, SOUND_spring, Xspring);
5595 static void Lspring_fall(int x, int y)
5597 switch (cave[x][y+1])
5611 cave[x][y] = Yspring_sB;
5612 next[x][y] = Xblank;
5613 cave[x][y+1] = Yspring_s;
5614 next[x][y+1] = Xspring_fall;
5625 cave[x][y] = Yspring_sB;
5626 next[x][y] = Xblank;
5627 if (cave[x+1][y] == Xblank)
5628 cave[x+1][y] = Xsplash_e;
5629 if (cave[x-1][y] == Xblank)
5630 cave[x-1][y] = Xsplash_w;
5631 play_element_sound(x, y, SOUND_acid, Xacid_1);
5638 cave[x][y] = Yspring_sB;
5639 next[x][y] = Xblank;
5640 cave[x][y+1] = Yeater_spring;
5641 next[x][y+1] = Zeater;
5642 Lboom_eater_old(x, y+1);
5643 score += lev.eater_score;
5648 cave[x][y] = Yspring_sB;
5649 next[x][y] = Xblank;
5650 cave[x][y+1] = Yalien_spring;
5651 next[x][y+1] = Ztank;
5652 Lboom_tank_old(x, y+1);
5653 score += lev.alien_score;
5664 cave[x][y] = Yspring_sB;
5665 next[x][y] = Xblank;
5666 cave[x][y+1] = Ybug_spring;
5667 next[x][y+1] = Zbug;
5668 Lboom_bug_old(x, y+1);
5669 score += lev.bug_score;
5680 cave[x][y] = Yspring_sB;
5681 next[x][y] = Xblank;
5682 cave[x][y+1] = Ytank_spring;
5683 next[x][y+1] = Ztank;
5684 Lboom_tank_old(x, y+1);
5685 score += lev.tank_score;
5690 cave[x][y] = Xspring;
5691 next[x][y] = Xspring;
5692 cave[x][y+1] = Ybomb_blank;
5693 next[x][y+1] = Ztank;
5694 Lboom_tank_old(x, y+1);
5698 cave[x][y] = Xspring;
5699 next[x][y] = Xspring;
5700 play_element_sound(x, y, SOUND_spring, Xspring);
5705 static void Lpush_emerald_e(int x, int y)
5707 cave[x][y] = Yemerald_eB;
5708 next[x][y] = Xblank;
5710 switch (cave[x+1][y])
5734 if (cave[x+2][y-1] == Xblank)
5735 cave[x+2][y-1] = Xsplash_e;
5736 if (cave[x][y-1] == Xblank)
5737 cave[x][y-1] = Xsplash_w;
5738 play_element_sound(x, y, SOUND_acid, Xacid_1);
5743 cave[x+1][y] = Yemerald_e;
5744 next[x+1][y] = Xemerald_pause;
5747 static void Lpush_emerald_w(int x, int y)
5749 cave[x][y] = Yemerald_wB;
5750 next[x][y] = Xblank;
5752 switch (cave[x-1][y])
5776 if (cave[x][y-1] == Xblank)
5777 cave[x][y-1] = Xsplash_e;
5778 if (cave[x-2][y-1] == Xblank)
5779 cave[x-2][y-1] = Xsplash_w;
5780 play_element_sound(x, y, SOUND_acid, Xacid_1);
5785 cave[x-1][y] = Yemerald_w;
5786 next[x-1][y] = Xemerald_pause;
5789 static void Lpush_diamond_e(int x, int y)
5791 cave[x][y] = Ydiamond_eB;
5792 next[x][y] = Xblank;
5794 switch (cave[x+1][y])
5818 if (cave[x+2][y-1] == Xblank)
5819 cave[x+2][y-1] = Xsplash_e;
5820 if (cave[x][y-1] == Xblank)
5821 cave[x][y-1] = Xsplash_w;
5822 play_element_sound(x, y, SOUND_acid, Xacid_1);
5827 cave[x+1][y] = Ydiamond_e;
5828 next[x+1][y] = Xdiamond_pause;
5831 static void Lpush_diamond_w(int x, int y)
5833 cave[x][y] = Ydiamond_wB;
5834 next[x][y] = Xblank;
5836 switch (cave[x-1][y])
5860 if (cave[x][y-1] == Xblank)
5861 cave[x][y-1] = Xsplash_e;
5862 if (cave[x-2][y-1] == Xblank)
5863 cave[x-2][y-1] = Xsplash_w;
5864 play_element_sound(x, y, SOUND_acid, Xacid_1);
5869 cave[x-1][y] = Ydiamond_w;
5870 next[x-1][y] = Xdiamond_pause;
5873 static void Lpush_stone_e(int x, int y)
5875 cave[x][y] = Ystone_eB;
5876 next[x][y] = Xblank;
5878 switch (cave[x+1][y])
5902 if (cave[x+2][y-1] == Xblank)
5903 cave[x+2][y-1] = Xsplash_e;
5904 if (cave[x][y-1] == Xblank)
5905 cave[x][y-1] = Xsplash_w;
5906 play_element_sound(x, y, SOUND_acid, Xacid_1);
5911 cave[x+1][y] = Ystone_e;
5912 next[x+1][y] = Xstone_pause;
5915 static void Lpush_stone_w(int x, int y)
5917 cave[x][y] = Ystone_wB;
5918 next[x][y] = Xblank;
5920 switch (cave[x-1][y])
5944 if (cave[x][y-1] == Xblank)
5945 cave[x][y-1] = Xsplash_e;
5946 if (cave[x-2][y-1] == Xblank)
5947 cave[x-2][y-1] = Xsplash_w;
5948 play_element_sound(x, y, SOUND_acid, Xacid_1);
5953 cave[x-1][y] = Ystone_w;
5954 next[x-1][y] = Xstone_pause;
5957 static void Lpush_bomb_e(int x, int y)
5959 cave[x][y] = Ybomb_eB;
5960 next[x][y] = Xblank;
5962 switch (cave[x+1][y])
5986 if (cave[x+2][y-1] == Xblank)
5987 cave[x+2][y-1] = Xsplash_e;
5988 if (cave[x][y-1] == Xblank)
5989 cave[x][y-1] = Xsplash_w;
5990 play_element_sound(x, y, SOUND_acid, Xacid_1);
5995 cave[x+1][y] = Ybomb_e;
5996 next[x+1][y] = Xbomb_pause;
5999 static void Lpush_bomb_w(int x, int y)
6001 cave[x][y] = Ybomb_wB;
6002 next[x][y] = Xblank;
6004 switch (cave[x-1][y])
6028 if (cave[x][y-1] == Xblank)
6029 cave[x][y-1] = Xsplash_e;
6030 if (cave[x-2][y-1] == Xblank)
6031 cave[x-2][y-1] = Xsplash_w;
6032 play_element_sound(x, y, SOUND_acid, Xacid_1);
6037 cave[x-1][y] = Ybomb_w;
6038 next[x-1][y] = Xbomb_pause;
6041 static void Lpush_nut_e(int x, int y)
6043 cave[x][y] = Ynut_eB;
6044 next[x][y] = Xblank;
6046 switch (cave[x+1][y])
6070 if (cave[x+2][y-1] == Xblank)
6071 cave[x+2][y-1] = Xsplash_e;
6072 if (cave[x][y-1] == Xblank)
6073 cave[x][y-1] = Xsplash_w;
6074 play_element_sound(x, y, SOUND_acid, Xacid_1);
6079 cave[x+1][y] = Ynut_e;
6080 next[x+1][y] = Xnut_pause;
6083 static void Lpush_nut_w(int x, int y)
6085 cave[x][y] = Ynut_wB;
6086 next[x][y] = Xblank;
6088 switch (cave[x-1][y])
6112 if (cave[x][y-1] == Xblank)
6113 cave[x][y-1] = Xsplash_e;
6114 if (cave[x-2][y-1] == Xblank)
6115 cave[x-2][y-1] = Xsplash_w;
6116 play_element_sound(x, y, SOUND_acid, Xacid_1);
6121 cave[x-1][y] = Ynut_w;
6122 next[x-1][y] = Xnut_pause;
6125 static void Lpush_spring_e(int x, int y)
6127 cave[x][y] = Yspring_eB;
6128 next[x][y] = Xblank;
6130 switch (cave[x+1][y])
6154 if (cave[x+2][y-1] == Xblank)
6155 cave[x+2][y-1] = Xsplash_e;
6156 if (cave[x][y-1] == Xblank)
6157 cave[x][y-1] = Xsplash_w;
6158 play_element_sound(x, y, SOUND_acid, Xacid_1);
6163 cave[x+1][y] = Yspring_e;
6164 next[x+1][y] = Xspring_e;
6167 static void Lpush_spring_w(int x, int y)
6169 cave[x][y] = Yspring_wB;
6170 next[x][y] = Xblank;
6172 switch (cave[x-1][y])
6196 if (cave[x][y-1] == Xblank)
6197 cave[x][y-1] = Xsplash_e;
6198 if (cave[x-2][y-1] == Xblank)
6199 cave[x-2][y-1] = Xsplash_w;
6200 play_element_sound(x, y, SOUND_acid, Xacid_1);
6205 cave[x-1][y] = Yspring_w;
6206 next[x-1][y] = Xspring_w;
6209 static void Ldynamite_1(int x, int y)
6211 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
6212 next[x][y] = Xdynamite_2;
6215 static void Ldynamite_2(int x, int y)
6217 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
6218 next[x][y] = Xdynamite_3;
6221 static void Ldynamite_3(int x, int y)
6223 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
6224 next[x][y] = Xdynamite_4;
6227 static void Ldynamite_4(int x, int y)
6229 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
6230 next[x][y] = Zdynamite;
6232 Lboom_generic(x, y, Xblank, Xblank);
6235 static void Lfake_door_1(int x, int y)
6237 if (lev.magnify_cnt)
6238 cave[x][y] = Xdoor_1;
6241 static void Lfake_door_2(int x, int y)
6243 if (lev.magnify_cnt)
6244 cave[x][y] = Xdoor_2;
6247 static void Lfake_door_3(int x, int y)
6249 if (lev.magnify_cnt)
6250 cave[x][y] = Xdoor_3;
6253 static void Lfake_door_4(int x, int y)
6255 if (lev.magnify_cnt)
6256 cave[x][y] = Xdoor_4;
6259 static void Lfake_door_5(int x, int y)
6261 if (lev.magnify_cnt)
6262 cave[x][y] = Xdoor_5;
6265 static void Lfake_door_6(int x, int y)
6267 if (lev.magnify_cnt)
6268 cave[x][y] = Xdoor_6;
6271 static void Lfake_door_7(int x, int y)
6273 if (lev.magnify_cnt)
6274 cave[x][y] = Xdoor_7;
6277 static void Lfake_door_8(int x, int y)
6279 if (lev.magnify_cnt)
6280 cave[x][y] = Xdoor_8;
6283 static void Lballoon(int x, int y)
6285 if (lev.wind_cnt == 0)
6288 switch (lev.wind_direction)
6291 switch (cave[x][y-1])
6304 cave[x][y] = Yballoon_nB;
6305 next[x][y] = Xblank;
6306 cave[x][y-1] = Yballoon_n;
6307 next[x][y-1] = Xballoon;
6318 cave[x][y] = Yballoon_nB;
6319 next[x][y] = Xblank;
6320 if (cave[x+1][y-2] == Xblank)
6321 cave[x+1][y-2] = Xsplash_e;
6322 if (cave[x-1][y-2] == Xblank)
6323 cave[x-1][y-2] = Xsplash_w;
6324 play_element_sound(x, y, SOUND_acid, Xacid_1);
6330 switch (cave[x+1][y])
6343 cave[x][y] = Yballoon_eB;
6344 next[x][y] = Xblank;
6345 cave[x+1][y] = Yballoon_e;
6346 next[x+1][y] = Xballoon;
6357 cave[x][y] = Yballoon_eB;
6358 next[x][y] = Xblank;
6359 if (cave[x+2][y-1] == Xblank)
6360 cave[x+2][y-1] = Xsplash_e;
6361 if (cave[x][y-1] == Xblank)
6362 cave[x][y-1] = Xsplash_w;
6363 play_element_sound(x, y, SOUND_acid, Xacid_1);
6369 switch (cave[x][y+1])
6382 cave[x][y] = Yballoon_sB;
6383 next[x][y] = Xblank;
6384 cave[x][y+1] = Yballoon_s;
6385 next[x][y+1] = Xballoon;
6396 cave[x][y] = Yballoon_sB;
6397 next[x][y] = Xblank;
6398 if (cave[x+1][y] == Xblank)
6399 cave[x+1][y] = Xsplash_e;
6400 if (cave[x-1][y] == Xblank)
6401 cave[x-1][y] = Xsplash_w;
6402 play_element_sound(x, y, SOUND_acid, Xacid_1);
6408 switch (cave[x-1][y])
6421 cave[x][y] = Yballoon_wB;
6422 next[x][y] = Xblank;
6423 cave[x-1][y] = Yballoon_w;
6424 next[x-1][y] = Xballoon;
6435 cave[x][y] = Yballoon_wB;
6436 next[x][y] = Xblank;
6437 if (cave[x][y-1] == Xblank)
6438 cave[x][y-1] = Xsplash_e;
6439 if (cave[x-2][y-1] == Xblank)
6440 cave[x-2][y-1] = Xsplash_w;
6441 play_element_sound(x, y, SOUND_acid, Xacid_1);
6448 static void Lball_common(int x, int y)
6450 play_element_sound(x, y, SOUND_ball, Xball_1);
6452 if (lev.ball_random)
6457 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6458 is_blank[cave[x-1][y-1]])
6460 cave[x-1][y-1] = Yball_blank;
6461 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6466 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6467 is_blank[cave[x][y-1]])
6469 cave[x][y-1] = Yball_blank;
6470 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6475 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6476 is_blank[cave[x+1][y-1]])
6478 cave[x+1][y-1] = Yball_blank;
6479 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6484 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6485 is_blank[cave[x-1][y]])
6487 cave[x-1][y] = Yball_blank;
6488 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6493 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6494 is_blank[cave[x+1][y]])
6496 cave[x+1][y] = Yball_blank;
6497 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6502 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6503 is_blank[cave[x-1][y+1]])
6505 cave[x-1][y+1] = Yball_blank;
6506 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6511 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6512 is_blank[cave[x][y+1]])
6514 cave[x][y+1] = Yball_blank;
6515 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6520 if (lev.ball_array[lev.ball_pos][7] != 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][7];
6531 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6532 is_blank[cave[x-1][y-1]])
6534 cave[x-1][y-1] = Yball_blank;
6535 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6538 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6539 is_blank[cave[x][y-1]])
6541 cave[x][y-1] = Yball_blank;
6542 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6545 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6546 is_blank[cave[x+1][y-1]])
6548 cave[x+1][y-1] = Yball_blank;
6549 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6552 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6553 is_blank[cave[x-1][y]])
6555 cave[x-1][y] = Yball_blank;
6556 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6559 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6560 is_blank[cave[x+1][y]])
6562 cave[x+1][y] = Yball_blank;
6563 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6566 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6567 is_blank[cave[x-1][y+1]])
6569 cave[x-1][y+1] = Yball_blank;
6570 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6573 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6574 is_blank[cave[x][y+1]])
6576 cave[x][y+1] = Yball_blank;
6577 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6580 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6581 is_blank[cave[x+1][y+1]])
6583 cave[x+1][y+1] = Yball_blank;
6584 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6588 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
6591 static void Lball_1(int x, int y)
6593 if (!lev.ball_active)
6596 cave[x][y] = Yball_1;
6597 next[x][y] = Xball_2;
6604 static void Lball_2(int x, int y)
6606 if (!lev.ball_active)
6609 cave[x][y] = Yball_2;
6610 next[x][y] = Xball_1;
6617 static void Ldrip(int x, int y)
6619 next[x][y] = Xdrip_fall;
6622 static void Ldrip_fall(int x, int y)
6626 switch (cave[x][y+1])
6642 cave[x][y] = Ydrip_1_sB;
6643 next[x][y] = Xdrip_stretchB;
6644 cave[x][y+1] = Ydrip_1_s;
6645 next[x][y+1] = Xdrip_stretch;
6656 cave[x][y] = Ydrip_1_sB;
6657 next[x][y] = Xdrip_stretchB;
6658 if (cave[x+1][y] == Xblank)
6659 cave[x+1][y] = Xsplash_e;
6660 if (cave[x-1][y] == Xblank)
6661 cave[x-1][y] = Xsplash_w;
6662 play_element_sound(x, y, SOUND_acid, Xacid_1);
6668 case 0: temp = Xamoeba_1; break;
6669 case 1: temp = Xamoeba_2; break;
6670 case 2: temp = Xamoeba_3; break;
6671 case 3: temp = Xamoeba_4; break;
6672 case 4: temp = Xamoeba_5; break;
6673 case 5: temp = Xamoeba_6; break;
6674 case 6: temp = Xamoeba_7; break;
6675 case 7: temp = Xamoeba_8; break;
6680 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
6685 static void Ldrip_stretch(int x, int y)
6687 cave[x][y] = Ydrip_2_s;
6688 next[x][y] = Xdrip_fall;
6691 static void Ldrip_stretchB(int x, int y)
6693 cave[x][y] = Ydrip_2_sB;
6694 next[x][y] = Xblank;
6697 static void Lwonderwall(int x, int y)
6699 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
6701 cave[x][y] = Ywonderwall;
6702 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
6706 static void Lwheel(int x, int y)
6708 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
6709 cave[x][y] = Ywheel;
6712 static void Lswitch(int x, int y)
6714 if (lev.ball_active)
6715 cave[x][y] = Yswitch;
6718 static void Lfake_blank(int x, int y)
6721 cave[x][y] = Yfake_blank;
6724 static void Lfake_grass(int x, int y)
6726 if (lev.magnify_cnt)
6727 cave[x][y] = Yfake_grass;
6730 static void Lfake_amoeba(int x, int y)
6733 cave[x][y] = Yfake_amoeba;
6736 static void Lsand_stone(int x, int y)
6738 switch (cave[x][y+1])
6751 cave[x][y] = Xsand_stonesand_quickout_1;
6752 next[x][y] = Xsand_stonesand_quickout_2;
6753 cave[x][y+1] = Xsand_stoneout_1;
6754 next[x][y+1] = Xsand_stoneout_2;
6765 cave[x][y] = Xsand_stonesand_quickout_1;
6766 next[x][y] = Xsand_stonesand_quickout_2;
6767 if (cave[x+1][y] == Xblank)
6768 cave[x+1][y] = Xsplash_e;
6769 if (cave[x-1][y] == Xblank)
6770 cave[x-1][y] = Xsplash_w;
6771 play_element_sound(x, y, SOUND_acid, Xacid_1);
6775 cave[x][y] = Xsand_stonesand_1;
6776 next[x][y] = Xsand_stonesand_2;
6777 cave[x][y+1] = Xsand_sandstone_1;
6778 next[x][y+1] = Xsand_sandstone_2;
6783 static void Lsand_stonein_1(int x, int y)
6785 next[x][y] = Xsand_stonein_2;
6788 static void Lsand_stonein_2(int x, int y)
6790 next[x][y] = Xsand_stonein_3;
6793 static void Lsand_stonein_3(int x, int y)
6795 next[x][y] = Xsand_stonein_4;
6798 static void Lsand_stonein_4(int x, int y)
6800 next[x][y] = Xblank;
6803 static void Lsand_sandstone_1(int x, int y)
6805 next[x][y] = Xsand_sandstone_2;
6808 static void Lsand_sandstone_2(int x, int y)
6810 next[x][y] = Xsand_sandstone_3;
6813 static void Lsand_sandstone_3(int x, int y)
6815 next[x][y] = Xsand_sandstone_4;
6818 static void Lsand_sandstone_4(int x, int y)
6820 next[x][y] = Xsand_stone;
6823 static void Lsand_stonesand_1(int x, int y)
6825 next[x][y] = Xsand_stonesand_2;
6828 static void Lsand_stonesand_2(int x, int y)
6830 next[x][y] = Xsand_stonesand_3;
6833 static void Lsand_stonesand_3(int x, int y)
6835 next[x][y] = Xsand_stonesand_4;
6838 static void Lsand_stonesand_4(int x, int y)
6843 static void Lsand_stoneout_1(int x, int y)
6845 next[x][y] = Xsand_stoneout_2;
6848 static void Lsand_stoneout_2(int x, int y)
6850 next[x][y] = Xstone_fall;
6853 static void Lsand_stonesand_quickout_1(int x, int y)
6855 next[x][y] = Xsand_stonesand_quickout_2;
6858 static void Lsand_stonesand_quickout_2(int x, int y)
6863 static void Lslide_ns(int x, int y)
6865 if (is_blank[cave[x][y-1]])
6867 cave[x][y-1] = Yslide_ns_blank;
6868 next[x][y-1] = Xslide_ns;
6869 play_element_sound(x, y, SOUND_slide, Xslide_ns);
6872 if (is_blank[cave[x][y+1]])
6874 cave[x][y+1] = Yslide_ns_blank;
6875 next[x][y+1] = Xslide_ns;
6876 play_element_sound(x, y, SOUND_slide, Xslide_ns);
6880 static void Lslide_ew(int x, int y)
6882 if (is_blank[cave[x+1][y]])
6884 cave[x+1][y] = Yslide_ew_blank;
6885 next[x+1][y] = Xslide_ew;
6886 play_element_sound(x, y, SOUND_slide, Xslide_ew);
6889 if (is_blank[cave[x-1][y]])
6891 cave[x-1][y] = Yslide_ew_blank;
6892 next[x-1][y] = Xslide_ew;
6893 play_element_sound(x, y, SOUND_slide, Xslide_ew);
6897 static void Lexit(int x, int y)
6899 if (lev.gems_needed > 0)
6902 switch (RANDOM(64) / 21)
6905 cave[x][y] = Xexit_1;
6906 next[x][y] = Xexit_2;
6910 cave[x][y] = Xexit_2;
6911 next[x][y] = Xexit_3;
6915 cave[x][y] = Xexit_3;
6916 next[x][y] = Xexit_1;
6920 play_element_sound(x, y, SOUND_exit_open, Xexit);
6923 static void Lexit_1(int x, int y)
6925 next[x][y] = Xexit_2;
6928 static void Lexit_2(int x, int y)
6930 next[x][y] = Xexit_3;
6933 static void Lexit_3(int x, int y)
6935 next[x][y] = Xexit_1;
6938 static void Lpause(int x, int y)
6940 next[x][y] = Xblank;
6943 static void Lamoeba(int x, int y)
6963 if (is_amoeba[cave[x][y-1]] ||
6964 is_amoeba[cave[x+1][y]] ||
6965 is_amoeba[cave[x][y+1]] ||
6966 is_amoeba[cave[x-1][y]])
6971 static void Lboom_one(int x, int y, boolean by_dynamite)
7032 cave[x][y] = Xboom_android;
7043 cave[x][y] = Xboom_bug;
7044 Lboom_bug_new(x, y, TRUE);
7050 cave[x][y] = Xboom_tank;
7051 Lboom_tank_new(x, y, TRUE);
7055 cave[x][y] = Xboom_1;
7060 static void Lboom_nine(int x, int y, boolean by_dynamite)
7062 Lboom_one(x, y-1, by_dynamite);
7063 Lboom_one(x-1, y, by_dynamite);
7064 Lboom_one(x+1, y, by_dynamite);
7065 Lboom_one(x, y+1, by_dynamite);
7066 Lboom_one(x-1, y-1, by_dynamite);
7067 Lboom_one(x+1, y-1, by_dynamite);
7068 Lboom_one(x-1, y+1, by_dynamite);
7069 Lboom_one(x+1, y+1, by_dynamite);
7071 cave[x][y] = Xboom_1;
7074 static void Lexplode(int x, int y)
7079 Lboom_bug_new(x, y, FALSE);
7080 Lboom_nine(x, y, FALSE);
7084 Lboom_tank_new(x, y, FALSE);
7085 Lboom_nine(x, y, FALSE);
7089 Lboom_eater_new(x, y, FALSE);
7090 Lboom_nine(x, y, FALSE);
7094 Lboom_nine(x, y, TRUE);
7098 Lboom_nine(x, y, FALSE);
7103 static void Lboom_1(int x, int y)
7105 next[x][y] = Xboom_2;
7106 #if !PLAY_ELEMENT_SOUND
7107 if (x != lev.exit_x && y != lev.exit_y)
7108 play_sound(x, y, SOUND_boom);
7110 lev.exit_x = lev.exit_y = -1;
7114 static void Lboom_2(int x, int y)
7116 next[x][y] = boom[x][y];
7119 static void Lboom_android(int x, int y)
7121 #if PLAY_ELEMENT_SOUND
7122 play_element_sound(x, y, SOUND_boom, Xandroid);
7128 static void Lchain(int x, int y)
7133 static void handle_tile(int x, int y)
7137 case Xacid_1: Lacid_1(x, y); break;
7138 case Xacid_2: Lacid_2(x, y); break;
7139 case Xacid_3: Lacid_3(x, y); break;
7140 case Xacid_4: Lacid_4(x, y); break;
7141 case Xacid_5: Lacid_5(x, y); break;
7142 case Xacid_6: Lacid_6(x, y); break;
7143 case Xacid_7: Lacid_7(x, y); break;
7144 case Xacid_8: Lacid_8(x, y); break;
7146 case Xfake_acid_1: Lfake_acid_1(x, y); break;
7147 case Xfake_acid_2: Lfake_acid_2(x, y); break;
7148 case Xfake_acid_3: Lfake_acid_3(x, y); break;
7149 case Xfake_acid_4: Lfake_acid_4(x, y); break;
7150 case Xfake_acid_5: Lfake_acid_5(x, y); break;
7151 case Xfake_acid_6: Lfake_acid_6(x, y); break;
7152 case Xfake_acid_7: Lfake_acid_7(x, y); break;
7153 case Xfake_acid_8: Lfake_acid_8(x, y); break;
7155 case Xandroid: Landroid(x, y); break;
7156 case Xandroid_1_n: Landroid_1_n(x, y); break;
7157 case Xandroid_2_n: Landroid_2_n(x, y); break;
7158 case Xandroid_1_e: Landroid_1_e(x, y); break;
7159 case Xandroid_2_e: Landroid_2_e(x, y); break;
7160 case Xandroid_1_s: Landroid_1_s(x, y); break;
7161 case Xandroid_2_s: Landroid_2_s(x, y); break;
7162 case Xandroid_1_w: Landroid_1_w(x, y); break;
7163 case Xandroid_2_w: Landroid_2_w(x, y); break;
7165 case Xeater_n: Leater_n(x, y); break;
7166 case Xeater_e: Leater_e(x, y); break;
7167 case Xeater_s: Leater_s(x, y); break;
7168 case Xeater_w: Leater_w(x, y); break;
7170 case Xalien: Lalien(x, y); break;
7171 case Xalien_pause: Lalien_pause(x, y); break;
7173 case Xbug_1_n: Lbug_1_n(x, y); break;
7174 case Xbug_2_n: Lbug_2_n(x, y); break;
7175 case Xbug_1_e: Lbug_1_e(x, y); break;
7176 case Xbug_2_e: Lbug_2_e(x, y); break;
7177 case Xbug_1_s: Lbug_1_s(x, y); break;
7178 case Xbug_2_s: Lbug_2_s(x, y); break;
7179 case Xbug_1_w: Lbug_1_w(x, y); break;
7180 case Xbug_2_w: Lbug_2_w(x, y); break;
7182 case Xtank_1_n: Ltank_1_n(x, y); break;
7183 case Xtank_2_n: Ltank_2_n(x, y); break;
7184 case Xtank_1_e: Ltank_1_e(x, y); break;
7185 case Xtank_2_e: Ltank_2_e(x, y); break;
7186 case Xtank_1_s: Ltank_1_s(x, y); break;
7187 case Xtank_2_s: Ltank_2_s(x, y); break;
7188 case Xtank_1_w: Ltank_1_w(x, y); break;
7189 case Xtank_2_w: Ltank_2_w(x, y); break;
7191 case Xemerald: Lemerald(x, y); break;
7192 case Xemerald_pause: Lemerald_pause(x, y); break;
7193 case Xemerald_fall: Lemerald_fall(x, y); break;
7195 case Xdiamond: Ldiamond(x, y); break;
7196 case Xdiamond_pause: Ldiamond_pause(x, y); break;
7197 case Xdiamond_fall: Ldiamond_fall(x, y); break;
7199 case Xstone: Lstone(x, y); break;
7200 case Xstone_pause: Lstone_pause(x, y); break;
7201 case Xstone_fall: Lstone_fall(x, y); break;
7203 case Xbomb: Lbomb(x, y); break;
7204 case Xbomb_pause: Lbomb_pause(x, y); break;
7205 case Xbomb_fall: Lbomb_fall(x, y); break;
7207 case Xnut: Lnut(x, y); break;
7208 case Xnut_pause: Lnut_pause(x, y); break;
7209 case Xnut_fall: Lnut_fall(x, y); break;
7211 case Xspring: Lspring(x, y); break;
7212 case Xspring_pause: Lspring_pause(x, y); break;
7213 case Xspring_e: Lspring_e(x, y); break;
7214 case Xspring_w: Lspring_w(x, y); break;
7215 case Xspring_fall: Lspring_fall(x, y); break;
7217 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
7218 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
7219 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
7220 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
7221 case Xpush_stone_e: Lpush_stone_e(x, y); break;
7222 case Xpush_stone_w: Lpush_stone_w(x, y); break;
7223 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
7224 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
7225 case Xpush_nut_e: Lpush_nut_e(x, y); break;
7226 case Xpush_nut_w: Lpush_nut_w(x, y); break;
7227 case Xpush_spring_e: Lpush_spring_e(x, y); break;
7228 case Xpush_spring_w: Lpush_spring_w(x, y); break;
7230 case Xdynamite_1: Ldynamite_1(x, y); break;
7231 case Xdynamite_2: Ldynamite_2(x, y); break;
7232 case Xdynamite_3: Ldynamite_3(x, y); break;
7233 case Xdynamite_4: Ldynamite_4(x, y); break;
7235 case Xfake_door_1: Lfake_door_1(x, y); break;
7236 case Xfake_door_2: Lfake_door_2(x, y); break;
7237 case Xfake_door_3: Lfake_door_3(x, y); break;
7238 case Xfake_door_4: Lfake_door_4(x, y); break;
7239 case Xfake_door_5: Lfake_door_5(x, y); break;
7240 case Xfake_door_6: Lfake_door_6(x, y); break;
7241 case Xfake_door_7: Lfake_door_7(x, y); break;
7242 case Xfake_door_8: Lfake_door_8(x, y); break;
7244 case Xballoon: Lballoon(x, y); break;
7246 case Xball_1: Lball_1(x, y); break;
7247 case Xball_2: Lball_2(x, y); break;
7249 case Xdrip: Ldrip(x, y); break;
7250 case Xdrip_fall: Ldrip_fall(x, y); break;
7251 case Xdrip_stretch: Ldrip_stretch(x, y); break;
7252 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
7254 case Xwonderwall: Lwonderwall(x, y); break;
7256 case Xwheel: Lwheel(x, y); break;
7258 case Xswitch: Lswitch(x, y); break;
7260 case Xfake_blank: Lfake_blank(x, y); break;
7261 case Xfake_grass: Lfake_grass(x, y); break;
7262 case Xfake_amoeba: Lfake_amoeba(x, y); break;
7264 case Xsand_stone: Lsand_stone(x, y); break;
7265 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
7266 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
7267 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
7268 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
7269 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
7270 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
7271 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
7272 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
7273 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
7274 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
7275 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
7276 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
7277 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
7278 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
7279 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
7280 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
7282 case Xslide_ns: Lslide_ns(x, y); break;
7283 case Xslide_ew: Lslide_ew(x, y); break;
7285 case Xexit: Lexit(x, y); break;
7286 case Xexit_1: Lexit_1(x, y); break;
7287 case Xexit_2: Lexit_2(x, y); break;
7288 case Xexit_3: Lexit_3(x, y); break;
7290 case Xpause: Lpause(x, y); break;
7292 case Xchain: Lchain(x, y); break;
7293 case Xboom_bug: Lboom_bug(x, y); break;
7294 case Xboom_tank: Lboom_tank(x, y); break;
7295 case Xboom_android: Lboom_android(x, y); break;
7296 case Xboom_1: Lboom_1(x, y); break;
7297 case Xboom_2: Lboom_2(x, y); break;
7301 static void logic_players(void)
7310 game_em.any_player_moving = FALSE;
7311 game_em.any_player_snapping = FALSE;
7313 /* must test for death and actually kill separately */
7314 for (i = 0; i < MAX_PLAYERS; i++)
7316 boolean ply_kill = player_killed(&ply[i]);
7318 if (ply[i].alive && ply_kill)
7319 kill_player(&ply[i]);
7322 for (i = 0; i < MAX_PLAYERS; i++)
7327 /* check for wrap-around movement */
7328 if (ply[i].x < lev.left ||
7329 ply[i].x > lev.right - 1)
7331 ply[i].x = (ply[i].x < lev.left ? lev.right - 1 : lev.left);
7333 game.centered_player_nr_next = i;
7334 game.set_centered_player = TRUE;
7335 game.set_centered_player_wrap = TRUE;
7338 ply[i].prev_x = ply[i].x;
7339 ply[i].prev_y = ply[i].y;
7340 ply[i].anim = PLY_still;
7343 start_check_nr = ((game_em.random & 128 ? 0 : 1) * 2 +
7344 (game_em.random & 256 ? 0 : 1));
7346 for (i = 0; i < MAX_PLAYERS; i++)
7348 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
7350 if (ply[check_nr].alive)
7351 check_player(&ply[check_nr]);
7354 for (i = 0; i < MAX_PLAYERS; i++)
7359 if (cave[ply[i].prev_x][ply[i].prev_y] == Zplayer)
7361 cave[ply[i].prev_x][ply[i].prev_y] = Xblank;
7362 next[ply[i].prev_x][ply[i].prev_y] = Xblank;
7365 if (cave[ply[i].x][ply[i].y] == Xblank)
7367 cave[ply[i].x][ply[i].y] = Zplayer;
7368 next[ply[i].x][ply[i].y] = Zplayer;
7373 static void logic_objects(void)
7381 seed = game_em.random;
7384 for (y = lev.top; y < lev.bottom; y++)
7385 for (x = lev.left; x < lev.right; x++)
7388 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
7389 lev.score += score; /* only add a score if someone is alive */
7391 game_em.game_over = TRUE;
7393 game_em.random = seed;
7395 /* triple buffering */
7396 void *temp = lev.cave;
7397 lev.cave = lev.next;
7398 lev.next = lev.draw;
7402 static void logic_globals(void)
7407 unsigned int random;
7413 /* update variables */
7415 if (lev.score > 9999)
7418 if (lev.android_move_cnt-- == 0)
7419 lev.android_move_cnt = lev.android_move_time;
7420 if (lev.android_clone_cnt-- == 0)
7421 lev.android_clone_cnt = lev.android_clone_time;
7422 if (lev.ball_active)
7423 if (lev.ball_cnt-- == 0)
7424 lev.ball_cnt = lev.ball_time;
7427 if (lev.magnify_cnt)
7433 if (lev.wonderwall_time > 0 && lev.wonderwall_active)
7434 lev.wonderwall_time--;
7437 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
7441 random = game_em.random;
7443 for (count = lev.amoeba_time; count--;)
7445 x = lev.left - 1 + (random >> 10) % (CAVE_WIDTH + 2);
7446 y = lev.top - 1 + (random >> 20) % (CAVE_HEIGHT + 2);
7448 if (x >= lev.left && x < lev.right &&
7449 y >= lev.top && y < lev.bottom)
7452 random = random * 129 + 1;
7455 game_em.random = random;
7457 /* handle explosions */
7459 for (y = lev.top; y < lev.bottom; y++)
7460 for (x = lev.left; x < lev.right; x++)
7463 /* triple buffering */
7465 for (y = lev.top; y < lev.bottom; y++)
7466 for (x = lev.left; x < lev.right; x++)
7467 next[x][y] = cave[x][y];
7470 void logic_init(void)
7472 int splash_is_blank = !game_em.use_old_android;
7474 is_android_blank[Xsplash_e] = splash_is_blank;
7475 is_android_blank[Xsplash_w] = splash_is_blank;