5 * my own version of the emerald mine engine
11 #define SPRING_ROLL /* spring rolling off round things continues to roll */
12 #define USE_CHANGED_ACID_STUFF
14 #define RANDOM_RAW (seed = seed << 31 | seed >> 1)
15 #define RANDOM(x) (RANDOM_RAW & (x - 1))
17 static short **cave, **next, **boom;
18 static unsigned int seed;
21 static void Lboom_generic(int x, int y, int element, int element_middle)
23 boom[x-1][y-1] = element;
24 boom[x][y-1] = element;
25 boom[x+1][y-1] = element;
26 boom[x-1][y] = element;
27 boom[x][y] = element_middle;
28 boom[x+1][y] = element;
29 boom[x-1][y+1] = element;
30 boom[x][y+1] = element;
31 boom[x+1][y+1] = element;
34 static void Lboom_bug(int x, int y, int by_element)
38 Lboom_generic(x, y, Xemerald, Xdiamond);
40 #if PLAY_ELEMENT_SOUND
41 play_element_sound(x, y, SOUND_boom, by_element);
45 static void Lboom_tank(int x, int y, int by_element)
49 Lboom_generic(x, y, Xblank, Xblank);
51 #if PLAY_ELEMENT_SOUND
52 play_element_sound(x, y, SOUND_boom, by_element);
56 static void Lboom_eater(int x, int y, int by_element)
60 boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0];
61 boom[x][y-1] = lev.eater_array[lev.eater_pos][1];
62 boom[x+1][y-1] = lev.eater_array[lev.eater_pos][2];
63 boom[x-1][y] = lev.eater_array[lev.eater_pos][3];
64 boom[x][y] = lev.eater_array[lev.eater_pos][4];
65 boom[x+1][y] = lev.eater_array[lev.eater_pos][5];
66 boom[x-1][y+1] = lev.eater_array[lev.eater_pos][6];
67 boom[x][y+1] = lev.eater_array[lev.eater_pos][7];
68 boom[x+1][y+1] = lev.eater_array[lev.eater_pos][8];
70 lev.eater_pos = (lev.eater_pos + 1) & 7;
72 #if PLAY_ELEMENT_SOUND
73 play_element_sound(x, y, SOUND_boom, by_element);
77 static boolean player_killed(struct PLAYER *ply)
85 if (lev.killed_out_of_time && setup.time_limit)
109 switch (cave[x+1][y])
130 switch (cave[x][y+1])
151 switch (cave[x-1][y])
177 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
198 static void kill_player(struct PLAYER *ply)
205 switch (cave[x][y-1])
215 cave[x][y-1] = Xboom_bug;
226 cave[x][y-1] = Xboom_bomb;
230 switch (cave[x+1][y])
240 cave[x+1][y] = Xboom_bug;
251 cave[x+1][y] = Xboom_bomb;
255 switch (cave[x][y+1])
265 cave[x][y+1] = Xboom_bug;
276 cave[x][y+1] = Xboom_bomb;
280 switch (cave[x-1][y])
290 cave[x-1][y] = Xboom_bug;
301 cave[x-1][y] = Xboom_bomb;
312 play_element_sound(x, y, SOUND_exit_leave, Xexit_1);
316 play_element_sound(x, y, SOUND_die, Zplayer);
322 #ifdef USE_CHANGED_ACID_STUFF
335 cave[x][y] = Xboom_1;
341 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
343 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
348 boolean result = TRUE;
350 if (!dx && !dy) /* no direction specified */
353 if (dx && dy && ply->joy_snap) /* more than one direction specified */
356 if (ply->joy_snap == 0) /* player wants to move */
358 int element = cave[x][y];
362 /* fire is released */
366 cave[x][y] = Zplayer;
367 next[x][y] = Zplayer;
368 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
378 play_element_sound(x, y, SOUND_blank, Xblank);
379 ply->anim = PLY_walk_n + anim;
384 #ifdef USE_CHANGED_ACID_STUFF
393 if (cave[x+1][y-1] == Xblank)
394 cave[x+1][y-1] = Xacid_splash_e;
395 if (cave[x-1][y-1] == Xblank)
396 cave[x-1][y-1] = Xacid_splash_w;
397 play_element_sound(x, y, SOUND_acid, Xacid_1);
419 #ifndef USE_CHANGED_ACID_STUFF
429 ply->anim = PLY_walk_n + anim;
435 cave[x][y] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
436 (dx > 0 ? Ygrass_eB : Ygrass_wB));
437 next[x][y] = Zplayer;
438 play_element_sound(x, y, SOUND_dirt, Xgrass);
439 ply->anim = PLY_walk_n + anim;
445 cave[x][y] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
446 (dx > 0 ? Ydirt_eB : Ydirt_wB));
447 next[x][y] = Zplayer;
448 play_element_sound(x, y, SOUND_dirt, Xdirt);
449 ply->anim = PLY_walk_n + anim;
456 cave[x][y] = Ydiamond_blank;
457 next[x][y] = Zplayer;
458 play_element_sound(x, y, SOUND_collect, element);
459 lev.score += lev.diamond_score;
460 lev.required = lev.required < 3 ? 0 : lev.required - 3;
461 game.snapshot.collected_item = TRUE;
462 ply->anim = PLY_walk_n + anim;
469 cave[x][y] = Yemerald_blank;
470 next[x][y] = Zplayer;
471 play_element_sound(x, y, SOUND_collect, element);
472 lev.score += lev.emerald_score;
473 lev.required = lev.required < 1 ? 0 : lev.required - 1;
474 game.snapshot.collected_item = TRUE;
475 ply->anim = PLY_walk_n + anim;
481 cave[x][y] = Ydynamite_blank;
482 next[x][y] = Zplayer;
483 play_element_sound(x, y, SOUND_collect, element);
484 lev.score += lev.dynamite_score;
485 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
486 ply->anim = PLY_walk_n + anim;
493 cave[x][y] = Ykey_1_blank;
498 cave[x][y] = Ykey_2_blank;
503 cave[x][y] = Ykey_3_blank;
508 cave[x][y] = Ykey_4_blank;
513 cave[x][y] = Ykey_5_blank;
518 cave[x][y] = Ykey_6_blank;
523 cave[x][y] = Ykey_7_blank;
528 cave[x][y] = Ykey_8_blank;
533 next[x][y] = Zplayer;
534 play_element_sound(x, y, SOUND_collect, element);
535 lev.score += lev.key_score;
536 ply->anim = PLY_walk_n + anim;
542 cave[x][y] = Ylenses_blank;
543 next[x][y] = Zplayer;
544 play_element_sound(x, y, SOUND_collect, element);
545 lev.score += lev.lenses_score;
546 lev.lenses_cnt = lev.lenses_time;
547 ply->anim = PLY_walk_n + anim;
553 cave[x][y] = Ymagnify_blank;
554 next[x][y] = Zplayer;
555 play_element_sound(x, y, SOUND_collect, element);
556 lev.score += lev.magnify_score;
557 lev.magnify_cnt = lev.magnify_time;
558 ply->anim = PLY_walk_n + anim;
567 switch (cave[x+dx][y])
572 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
582 cave[x+dx][y] = dx > 0 ? Ystone_e : Ystone_w;
583 next[x+dx][y] = Xstone_pause;
594 if (cave[x+dx+1][y-1] == Xblank)
595 cave[x+dx+1][y-1] = Xacid_splash_e;
596 if (cave[x+dx-1][y-1] == Xblank)
597 cave[x+dx-1][y-1] = Xacid_splash_w;
598 play_element_sound(x, y, SOUND_acid, Xacid_1);
602 cave[x][y] = dx > 0 ? Ystone_eB : Ystone_wB;
603 next[x][y] = Zplayer;
604 play_element_sound(x, y, SOUND_roll, Xstone);
609 ply->anim = PLY_push_n + anim;
616 switch (cave[x+dx][y])
621 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
631 cave[x+dx][y] = dx > 0 ? Ybomb_e : Ybomb_w;
632 next[x+dx][y] = Xbomb_pause;
643 if (cave[x+dx+1][y-1] == Xblank)
644 cave[x+dx+1][y-1] = Xacid_splash_e;
645 if (cave[x+dx-1][y-1] == Xblank)
646 cave[x+dx-1][y-1] = Xacid_splash_w;
647 play_element_sound(x, y, SOUND_acid, Xacid_1);
651 cave[x][y] = dx > 0 ? Ybomb_eB : Ybomb_wB;
652 next[x][y] = Zplayer;
653 play_element_sound(x, y, SOUND_roll, Xbomb);
658 ply->anim = PLY_push_n + anim;
665 switch (cave[x+dx][y])
670 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
680 cave[x+dx][y] = dx > 0 ? Ynut_e : Ynut_w;
681 next[x+dx][y] = Xnut_pause;
692 if (cave[x+dx+1][y-1] == Xblank)
693 cave[x+dx+1][y-1] = Xacid_splash_e;
694 if (cave[x+dx-1][y-1] == Xblank)
695 cave[x+dx-1][y-1] = Xacid_splash_w;
696 play_element_sound(x, y, SOUND_acid, Xacid_1);
700 cave[x][y] = dx > 0 ? Ynut_eB : Ynut_wB;
701 next[x][y] = Zplayer;
702 play_element_sound(x, y, SOUND_roll, Xnut);
707 ply->anim = PLY_push_n + anim;
714 switch (cave[x+dx][y])
719 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
729 cave[x+dx][y] = dx > 0 ? Yspring_e : Yspring_w;
730 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
741 if (cave[x+dx+1][y-1] == Xblank)
742 cave[x+dx+1][y-1] = Xacid_splash_e;
743 if (cave[x+dx-1][y-1] == Xblank)
744 cave[x+dx-1][y-1] = Xacid_splash_w;
745 play_element_sound(x, y, SOUND_acid, Xacid_1);
749 cave[x][y] = dx > 0 ? Yspring_eB : Yspring_wB;
750 next[x][y] = Zplayer;
751 play_element_sound(x, y, SOUND_roll, Xspring);
757 cave[x][y] = dx > 0 ? Yspring_alien_eB : Yspring_alien_wB;
758 cave[x+dx][y] = dx > 0 ? Yspring_alien_e : Yspring_alien_w;
759 next[x][y] = Zplayer;
760 next[x+dx][y] = dx > 0 ? Xspring_e : Xspring_w;
761 play_element_sound(x, y, SOUND_slurp, Xalien);
762 lev.score += lev.slurp_score;
767 ply->anim = PLY_push_n + anim;
774 case Xsand_stonein_1:
775 case Xsand_stonein_2:
776 case Xsand_stonein_3:
777 case Xsand_stonein_4:
781 ply->anim = PLY_push_n + anim;
785 switch (cave[x+dx][y+dy])
790 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
800 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
801 (dx > 0 ? Yballoon_e : Yballoon_w));
802 next[x+dx][y+dy] = Xballoon;
813 if (cave[x+dx+1][y+dy-1] == Xblank)
814 cave[x+dx+1][y+dy-1] = Xacid_splash_e;
815 if (cave[x+dx-1][y+dy-1] == Xblank)
816 cave[x+dx-1][y+dy-1] = Xacid_splash_w;
817 play_element_sound(x, y, SOUND_acid, Xacid_1);
821 cave[x][y] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
822 (dx > 0 ? Yballoon_eB : Yballoon_wB));
823 next[x][y] = Zplayer;
824 play_element_sound(x, y, SOUND_push, Xballoon);
830 ply->anim = PLY_push_n + anim;
842 switch (cave[x+dx][y+dy])
847 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
857 cave[x+dx][y+dy] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
858 (dx > 0 ? Yandroid_e : Yandroid_w));
859 next[x+dx][y+dy] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
860 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
871 if (cave[x+dx+1][y+dy-1] == Xblank)
872 cave[x+dx+1][y+dy-1] = Xacid_splash_e;
873 if (cave[x+dx-1][y+dy-1] == Xblank)
874 cave[x+dx-1][y+dy-1] = Xacid_splash_w;
875 play_element_sound(x, y, SOUND_acid, Xacid_1);
879 cave[x][y] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
880 (dx > 0 ? Yandroid_eB : Yandroid_wB));
881 next[x][y] = Zplayer;
882 play_element_sound(x, y, SOUND_push, Xandroid);
888 ply->anim = PLY_push_n + anim;
893 if (ply->keys & 0x01)
900 if (ply->keys & 0x02)
907 if (ply->keys & 0x04)
914 if (ply->keys & 0x08)
921 if (ply->keys & 0x10)
928 if (ply->keys & 0x20)
935 if (ply->keys & 0x40)
942 if (ply->keys & 0x80)
949 if (!tab_blank[cave[x+dx][y+dy]])
952 if (!tab_fake_acid[cave[x+dx][y+dy]])
954 cave[x+dx][y+dy] = Zplayer;
955 next[x+dx][y+dy] = Zplayer;
958 play_element_sound(x, y, SOUND_door, element);
959 ply->anim = PLY_walk_n + anim;
965 play_element_sound(x, y, SOUND_press, element);
966 lev.wheel_cnt = lev.wheel_time;
972 lev.wind_direction = 0;
976 lev.wind_direction = 1;
980 lev.wind_direction = 2;
984 lev.wind_direction = 3;
988 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
993 play_element_sound(x, y, SOUND_press, element);
994 lev.wind_cnt = lev.wind_time;
998 play_element_sound(x, y, SOUND_press, element);
1003 play_element_sound(x, y, SOUND_press, element);
1004 lev.ball_cnt = lev.ball_time;
1005 lev.ball_state = !lev.ball_state;
1009 cave[x][y] = Yplant;
1010 next[x][y] = Xplant;
1011 play_element_sound(x, y, SOUND_blank, Xplant);
1012 ply->anim = PLY_walk_n + anim;
1023 game_em.level_solved = TRUE;
1025 ply->anim = PLY_walk_n + anim;
1032 if (ply->x == oldx && ply->y == oldy) /* no movement */
1035 else /* player wants to snap */
1037 int element = cave[x][y];
1041 /* fire is pressed */
1044 cave[x][y] = Ygrass_blank;
1045 next[x][y] = Xblank;
1046 play_element_sound(x, y, SOUND_dirt, element);
1047 ply->anim = PLY_shoot_n + anim;
1051 cave[x][y] = Ydirt_blank;
1052 next[x][y] = Xblank;
1053 play_element_sound(x, y, SOUND_dirt, element);
1054 ply->anim = PLY_shoot_n + anim;
1058 case Xdiamond_pause:
1059 cave[x][y] = Ydiamond_blank;
1060 next[x][y] = Xblank;
1061 play_element_sound(x, y, SOUND_collect, element);
1062 lev.score += lev.diamond_score;
1063 lev.required = lev.required < 3 ? 0 : lev.required - 3;
1064 game.snapshot.collected_item = TRUE;
1065 ply->anim = PLY_walk_n + anim;
1069 case Xemerald_pause:
1070 cave[x][y] = Yemerald_blank;
1071 next[x][y] = Xblank;
1072 play_element_sound(x, y, SOUND_collect, element);
1073 lev.score += lev.emerald_score;
1074 lev.required = lev.required < 1 ? 0 : lev.required - 1;
1075 game.snapshot.collected_item = TRUE;
1076 ply->anim = PLY_walk_n + anim;
1080 cave[x][y] = Ydynamite_blank;
1081 next[x][y] = Xblank;
1082 play_element_sound(x, y, SOUND_collect, element);
1083 lev.score += lev.dynamite_score;
1084 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1085 ply->anim = PLY_walk_n + anim;
1090 cave[x][y] = Ykey_1_blank;
1095 cave[x][y] = Ykey_2_blank;
1100 cave[x][y] = Ykey_3_blank;
1105 cave[x][y] = Ykey_4_blank;
1110 cave[x][y] = Ykey_5_blank;
1115 cave[x][y] = Ykey_6_blank;
1120 cave[x][y] = Ykey_7_blank;
1125 cave[x][y] = Ykey_8_blank;
1130 next[x][y] = Xblank;
1131 play_element_sound(x, y, SOUND_collect, element);
1132 lev.score += lev.key_score;
1133 ply->anim = PLY_walk_n + anim;
1137 cave[x][y] = Ylenses_blank;
1138 next[x][y] = Xblank;
1139 play_element_sound(x, y, SOUND_collect, element);
1140 lev.score += lev.lenses_score;
1141 lev.lenses_cnt = lev.lenses_time;
1142 ply->anim = PLY_walk_n + anim;
1146 cave[x][y] = Ymagnify_blank;
1147 next[x][y] = Xblank;
1148 play_element_sound(x, y, SOUND_collect, element);
1149 lev.score += lev.magnify_score;
1150 lev.magnify_cnt = lev.magnify_time;
1151 ply->anim = PLY_walk_n + anim;
1162 static void check_player(struct PLAYER *ply)
1170 game_em.last_player_direction[ply->num] = MV_NONE;
1172 if (ply->joy_w) /* west */
1177 else if (ply->joy_e) /* east */
1183 if (ply->joy_n) /* north */
1188 else if (ply->joy_s) /* south */
1200 boolean players_visible_before_move;
1201 boolean players_visible_after_move;
1204 players_visible_before_move = checkIfAllPlayersFitToScreen();
1209 players_visible_after_move = checkIfAllPlayersFitToScreen();
1212 player is allowed to move only in the following cases:
1213 - it is not needed to display all players (not focussed to all players)
1214 - all players are (still or again) visible after the move
1215 - some players were already outside visible screen area before the move
1217 can_move = (game.centered_player_nr != -1 ||
1218 players_visible_after_move ||
1219 !players_visible_before_move);
1226 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
1232 if (dx == 0 && dy == 0)
1238 if (++ply->dynamite_cnt == 5 && ply->dynamite)
1240 cave[x][y] = Xdynamite_1;
1241 play_element_sound(x, y, SOUND_dynamite, Xdynamite_1);
1247 ply->dynamite_cnt = 0;
1250 RandomEM += 7; /* be a bit more random if the player doesn't move */
1256 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
1257 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
1258 ply->joy_spin = !ply->joy_spin;
1260 if (ply->joy_snap == 0) /* player wants to move */
1262 boolean moved = FALSE;
1264 if (ply->last_move_dir & MV_HORIZONTAL)
1266 if (!(moved = player_digfield(ply, 0, dy)))
1267 moved = player_digfield(ply, dx, 0);
1271 if (!(moved = player_digfield(ply, dx, 0)))
1272 moved = player_digfield(ply, 0, dy);
1278 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
1279 else if (oldy != ply->y)
1280 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
1282 game_em.any_player_moving = TRUE;
1283 game_em.last_moving_player = ply->num;
1284 game_em.last_player_direction[ply->num] = ply->last_move_dir;
1287 else /* player wants to snap */
1289 game_em.any_player_snapping = player_digfield(ply, dx, dy);
1293 static void set_nearest_player_xy(int x, int y, int *dx, int *dy)
1295 int distance, distance_shortest = CAVE_WIDTH + CAVE_HEIGHT;
1298 /* default values if no players are alive anymore */
1302 for (i = 0; i < MAX_PLAYERS; i++)
1307 distance = ABS(ply[i].x - x) + ABS(ply[i].y - y);
1309 if (distance < distance_shortest)
1314 distance_shortest = distance;
1319 static void Lacid_1(int x, int y)
1321 next[x][y] = Xacid_2;
1324 static void Lacid_2(int x, int y)
1326 next[x][y] = Xacid_3;
1329 static void Lacid_3(int x, int y)
1331 next[x][y] = Xacid_4;
1334 static void Lacid_4(int x, int y)
1336 next[x][y] = Xacid_5;
1339 static void Lacid_5(int x, int y)
1341 next[x][y] = Xacid_6;
1344 static void Lacid_6(int x, int y)
1346 next[x][y] = Xacid_7;
1349 static void Lacid_7(int x, int y)
1351 next[x][y] = Xacid_8;
1354 static void Lacid_8(int x, int y)
1356 next[x][y] = Xacid_1;
1359 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1360 static void Lfake_acid_1(int x, int y)
1362 next[x][y] = Xfake_acid_2;
1365 static void Lfake_acid_2(int x, int y)
1367 next[x][y] = Xfake_acid_3;
1370 static void Lfake_acid_3(int x, int y)
1372 next[x][y] = Xfake_acid_4;
1375 static void Lfake_acid_4(int x, int y)
1377 next[x][y] = Xfake_acid_5;
1380 static void Lfake_acid_5(int x, int y)
1382 next[x][y] = Xfake_acid_6;
1385 static void Lfake_acid_6(int x, int y)
1387 next[x][y] = Xfake_acid_7;
1390 static void Lfake_acid_7(int x, int y)
1392 next[x][y] = Xfake_acid_8;
1395 static void Lfake_acid_8(int x, int y)
1397 next[x][y] = Xfake_acid_1;
1401 static void Landroid(int x, int y)
1405 if (lev.android_clone_cnt == 0)
1407 if (cave[x-1][y-1] != Xblank &&
1408 cave[x][y-1] != Xblank &&
1409 cave[x+1][y-1] != Xblank &&
1410 cave[x-1][y] != Xblank &&
1411 cave[x+1][y] != Xblank &&
1412 cave[x-1][y+1] != Xblank &&
1413 cave[x][y+1] != Xblank &&
1414 cave[x+1][y+1] != Xblank)
1419 /* randomly find an object to clone */
1421 case 0: /* S,NE,W,NW,SE,E,SW,N */
1422 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1423 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1424 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1425 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1426 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1427 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1428 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1429 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1432 case 1: /* NW,SE,N,S,NE,SW,E,W */
1433 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1434 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1435 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1436 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1437 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1438 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1439 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1440 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1443 case 2: /* SW,E,S,W,N,NW,SE,NE */
1444 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1445 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1446 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1447 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1448 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1449 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1450 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1451 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1454 case 3: /* N,SE,NE,E,W,S,NW,SW */
1455 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1456 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1457 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1458 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1459 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1460 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1461 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1462 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1465 case 4: /* SE,NW,E,NE,SW,W,N,S */
1466 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1467 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1468 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1469 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1470 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1471 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1472 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1473 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1476 case 5: /* NE,W,SE,SW,S,N,E,NW */
1477 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1478 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1479 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1480 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1481 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1482 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1483 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1484 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1487 case 6: /* E,N,SW,S,NW,NE,SE,W */
1488 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1489 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1490 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1491 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1492 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1493 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1494 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1495 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1498 case 7: /* W,SW,NW,N,E,SE,NE,S */
1499 temp = lev.android_array[cave[x-1][y]]; if (temp != Xblank) break;
1500 temp = lev.android_array[cave[x-1][y+1]]; if (temp != Xblank) break;
1501 temp = lev.android_array[cave[x-1][y-1]]; if (temp != Xblank) break;
1502 temp = lev.android_array[cave[x][y-1]]; if (temp != Xblank) break;
1503 temp = lev.android_array[cave[x+1][y]]; if (temp != Xblank) break;
1504 temp = lev.android_array[cave[x+1][y+1]]; if (temp != Xblank) break;
1505 temp = lev.android_array[cave[x+1][y-1]]; if (temp != Xblank) break;
1506 temp = lev.android_array[cave[x][y+1]]; if (temp != Xblank) break;
1510 next[x][y] = temp; /* the item we chose to clone */
1511 play_element_sound(x, y, SOUND_android_clone, temp);
1515 /* randomly find a direction to move */
1517 case 0: /* S,NE,W,NW,SE,E,SW,N */
1518 if (cave[x][y+1] == Xblank) goto android_s;
1519 if (cave[x+1][y-1] == Xblank) goto android_ne;
1520 if (cave[x-1][y] == Xblank) goto android_w;
1521 if (cave[x-1][y-1] == Xblank) goto android_nw;
1522 if (cave[x+1][y+1] == Xblank) goto android_se;
1523 if (cave[x+1][y] == Xblank) goto android_e;
1524 if (cave[x-1][y+1] == Xblank) goto android_sw;
1525 if (cave[x][y-1] == Xblank) goto android_n;
1528 case 1: /* NW,SE,N,S,NE,SW,E,W */
1529 if (cave[x-1][y-1] == Xblank) goto android_nw;
1530 if (cave[x+1][y+1] == Xblank) goto android_se;
1531 if (cave[x][y-1] == Xblank) goto android_n;
1532 if (cave[x][y+1] == Xblank) goto android_s;
1533 if (cave[x+1][y-1] == Xblank) goto android_ne;
1534 if (cave[x-1][y+1] == Xblank) goto android_sw;
1535 if (cave[x+1][y] == Xblank) goto android_e;
1536 if (cave[x-1][y] == Xblank) goto android_w;
1539 case 2: /* SW,E,S,W,N,NW,SE,NE */
1540 if (cave[x-1][y+1] == Xblank) goto android_sw;
1541 if (cave[x+1][y] == Xblank) goto android_e;
1542 if (cave[x][y+1] == Xblank) goto android_s;
1543 if (cave[x-1][y] == Xblank) goto android_w;
1544 if (cave[x][y-1] == Xblank) goto android_n;
1545 if (cave[x-1][y-1] == Xblank) goto android_nw;
1546 if (cave[x+1][y+1] == Xblank) goto android_se;
1547 if (cave[x+1][y-1] == Xblank) goto android_ne;
1550 case 3: /* N,SE,NE,E,W,S,NW,SW */
1551 if (cave[x][y-1] == Xblank) goto android_n;
1552 if (cave[x+1][y+1] == Xblank) goto android_se;
1553 if (cave[x+1][y-1] == Xblank) goto android_ne;
1554 if (cave[x+1][y] == Xblank) goto android_e;
1555 if (cave[x-1][y] == Xblank) goto android_w;
1556 if (cave[x][y+1] == Xblank) goto android_s;
1557 if (cave[x-1][y-1] == Xblank) goto android_nw;
1558 if (cave[x-1][y+1] == Xblank) goto android_sw;
1561 case 4: /* SE,NW,E,NE,SW,W,N,S */
1562 if (cave[x+1][y+1] == Xblank) goto android_se;
1563 if (cave[x-1][y-1] == Xblank) goto android_nw;
1564 if (cave[x+1][y] == Xblank) goto android_e;
1565 if (cave[x+1][y-1] == Xblank) goto android_ne;
1566 if (cave[x-1][y+1] == Xblank) goto android_sw;
1567 if (cave[x-1][y] == Xblank) goto android_w;
1568 if (cave[x][y-1] == Xblank) goto android_n;
1569 if (cave[x][y+1] == Xblank) goto android_s;
1572 case 5: /* NE,W,SE,SW,S,N,E,NW */
1573 if (cave[x+1][y-1] == Xblank) goto android_ne;
1574 if (cave[x-1][y] == Xblank) goto android_w;
1575 if (cave[x+1][y+1] == Xblank) goto android_se;
1576 if (cave[x-1][y+1] == Xblank) goto android_sw;
1577 if (cave[x][y+1] == Xblank) goto android_s;
1578 if (cave[x][y-1] == Xblank) goto android_n;
1579 if (cave[x+1][y] == Xblank) goto android_e;
1580 if (cave[x-1][y-1] == Xblank) goto android_nw;
1583 case 6: /* E,N,SW,S,NW,NE,SE,W */
1584 if (cave[x+1][y] == Xblank) goto android_e;
1585 if (cave[x][y-1] == Xblank) goto android_n;
1586 if (cave[x-1][y+1] == Xblank) goto android_sw;
1587 if (cave[x][y+1] == Xblank) goto android_s;
1588 if (cave[x-1][y-1] == Xblank) goto android_nw;
1589 if (cave[x+1][y-1] == Xblank) goto android_ne;
1590 if (cave[x+1][y+1] == Xblank) goto android_se;
1591 if (cave[x-1][y] == Xblank) goto android_w;
1594 case 7: /* W,SW,NW,N,E,SE,NE,S */
1595 if (cave[x-1][y] == Xblank) goto android_w;
1596 if (cave[x-1][y+1] == Xblank) goto android_sw;
1597 if (cave[x-1][y-1] == Xblank) goto android_nw;
1598 if (cave[x][y-1] == Xblank) goto android_n;
1599 if (cave[x+1][y] == Xblank) goto android_e;
1600 if (cave[x+1][y+1] == Xblank) goto android_se;
1601 if (cave[x+1][y-1] == Xblank) goto android_ne;
1602 if (cave[x][y+1] == Xblank) goto android_s;
1608 if (lev.android_move_cnt == 0)
1610 if (cave[x-1][y-1] == Zplayer ||
1611 cave[x][y-1] == Zplayer ||
1612 cave[x+1][y-1] == Zplayer ||
1613 cave[x-1][y] == Zplayer ||
1614 cave[x+1][y] == Zplayer ||
1615 cave[x-1][y+1] == Zplayer ||
1616 cave[x][y+1] == Zplayer ||
1617 cave[x+1][y+1] == Zplayer)
1620 set_nearest_player_xy(x, y, &dx, &dy);
1622 next[x][y] = Xblank; /* assume we will move */
1623 temp = ((x < dx) + 1 - (x > dx)) + ((y < dy) + 1 - (y > dy)) * 3;
1629 /* attempt clockwise move first if direct path is blocked */
1631 case 0: /* north west */
1632 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1633 if (tab_android_move[cave[x][y-1]]) goto android_n;
1634 if (tab_android_move[cave[x-1][y]]) goto android_w;
1638 if (tab_android_move[cave[x][y-1]]) goto android_n;
1639 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1640 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1643 case 2: /* north east */
1644 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1645 if (tab_android_move[cave[x+1][y]]) goto android_e;
1646 if (tab_android_move[cave[x][y-1]]) goto android_n;
1650 if (tab_android_move[cave[x-1][y]]) goto android_w;
1651 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1652 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1655 case 4: /* nowhere */
1659 if (tab_android_move[cave[x+1][y]]) goto android_e;
1660 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1661 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1664 case 6: /* south west */
1665 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1666 if (tab_android_move[cave[x-1][y]]) goto android_w;
1667 if (tab_android_move[cave[x][y+1]]) goto android_s;
1671 if (tab_android_move[cave[x][y+1]]) goto android_s;
1672 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1673 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1676 case 8: /* south east */
1677 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1678 if (tab_android_move[cave[x][y+1]]) goto android_s;
1679 if (tab_android_move[cave[x+1][y]]) goto android_e;
1687 /* attempt counterclockwise move first if direct path is blocked */
1689 case 0: /* north west */
1690 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1691 if (tab_android_move[cave[x-1][y]]) goto android_w;
1692 if (tab_android_move[cave[x][y-1]]) goto android_n;
1696 if (tab_android_move[cave[x][y-1]]) goto android_n;
1697 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1698 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1701 case 2: /* north east */
1702 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1703 if (tab_android_move[cave[x][y-1]]) goto android_n;
1704 if (tab_android_move[cave[x+1][y]]) goto android_e;
1708 if (tab_android_move[cave[x-1][y]]) goto android_w;
1709 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1710 if (tab_android_move[cave[x-1][y-1]]) goto android_nw;
1713 case 4: /* nowhere */
1717 if (tab_android_move[cave[x+1][y]]) goto android_e;
1718 if (tab_android_move[cave[x+1][y-1]]) goto android_ne;
1719 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1722 case 6: /* south west */
1723 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1724 if (tab_android_move[cave[x][y+1]]) goto android_s;
1725 if (tab_android_move[cave[x-1][y]]) goto android_w;
1729 if (tab_android_move[cave[x][y+1]]) goto android_s;
1730 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1731 if (tab_android_move[cave[x-1][y+1]]) goto android_sw;
1734 case 8: /* south east */
1735 if (tab_android_move[cave[x+1][y+1]]) goto android_se;
1736 if (tab_android_move[cave[x+1][y]]) goto android_e;
1737 if (tab_android_move[cave[x][y+1]]) goto android_s;
1744 next[x][y] = Xandroid;
1748 cave[x][y] = Yandroid_nB;
1749 cave[x][y-1] = Yandroid_n;
1750 next[x][y-1] = Xandroid;
1751 play_element_sound(x, y, SOUND_android_move, Xandroid);
1755 cave[x][y] = Yandroid_neB;
1756 cave[x+1][y-1] = Yandroid_ne;
1757 next[x+1][y-1] = Xandroid;
1758 play_element_sound(x, y, SOUND_android_move, Xandroid);
1762 cave[x][y] = Yandroid_eB;
1763 cave[x+1][y] = Yandroid_e;
1764 next[x+1][y] = Xandroid;
1765 play_element_sound(x, y, SOUND_android_move, Xandroid);
1769 cave[x][y] = Yandroid_seB;
1770 cave[x+1][y+1] = Yandroid_se;
1771 next[x+1][y+1] = Xandroid;
1772 play_element_sound(x, y, SOUND_android_move, Xandroid);
1776 cave[x][y] = Yandroid_sB;
1777 cave[x][y+1] = Yandroid_s;
1778 next[x][y+1] = Xandroid;
1779 play_element_sound(x, y, SOUND_android_move, Xandroid);
1783 cave[x][y] = Yandroid_swB;
1784 cave[x-1][y+1] = Yandroid_sw;
1785 next[x-1][y+1] = Xandroid;
1786 play_element_sound(x, y, SOUND_android_move, Xandroid);
1790 cave[x][y] = Yandroid_wB;
1791 cave[x-1][y] = Yandroid_w;
1792 next[x-1][y] = Xandroid;
1793 play_element_sound(x, y, SOUND_android_move, Xandroid);
1797 cave[x][y] = Yandroid_nwB;
1798 cave[x-1][y-1] = Yandroid_nw;
1799 next[x-1][y-1] = Xandroid;
1800 play_element_sound(x, y, SOUND_android_move, Xandroid);
1804 static void Landroid_1_n(int x, int y)
1806 switch (cave[x][y-1])
1809 case Xacid_splash_e:
1810 case Xacid_splash_w:
1811 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1821 cave[x][y] = Yandroid_nB;
1822 next[x][y] = Xblank;
1823 cave[x][y-1] = Yandroid_n;
1824 next[x][y-1] = Xandroid;
1825 play_element_sound(x, y, SOUND_android_move, Xandroid_1_n);
1836 cave[x][y] = Yandroid_nB;
1837 next[x][y] = Xblank;
1838 if (cave[x+1][y-2] == Xblank)
1839 cave[x+1][y-2] = Xacid_splash_e;
1840 if (cave[x-1][y-2] == Xblank)
1841 cave[x-1][y-2] = Xacid_splash_w;
1842 play_element_sound(x, y, SOUND_acid, Xacid_1);
1851 static void Landroid_2_n(int x, int y)
1853 switch (cave[x][y-1])
1856 case Xacid_splash_e:
1857 case Xacid_splash_w:
1858 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1868 cave[x][y] = Yandroid_nB;
1869 next[x][y] = Xblank;
1870 cave[x][y-1] = Yandroid_n;
1871 next[x][y-1] = Xandroid_1_n;
1872 play_element_sound(x, y, SOUND_android_move, Xandroid_2_n);
1883 cave[x][y] = Yandroid_nB;
1884 next[x][y] = Xblank;
1885 if (cave[x+1][y-2] == Xblank)
1886 cave[x+1][y-2] = Xacid_splash_e;
1887 if (cave[x-1][y-2] == Xblank)
1888 cave[x-1][y-2] = Xacid_splash_w;
1889 play_element_sound(x, y, SOUND_acid, Xacid_1);
1898 static void Landroid_1_e(int x, int y)
1900 switch (cave[x+1][y])
1903 case Xacid_splash_e:
1904 case Xacid_splash_w:
1905 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1915 cave[x][y] = Yandroid_eB;
1916 next[x][y] = Xblank;
1917 cave[x+1][y] = Yandroid_e;
1918 next[x+1][y] = Xandroid;
1919 play_element_sound(x, y, SOUND_android_move, Xandroid_1_e);
1930 cave[x][y] = Yandroid_eB;
1931 next[x][y] = Xblank;
1932 if (cave[x+2][y-1] == Xblank)
1933 cave[x+2][y-1] = Xacid_splash_e;
1934 if (cave[x][y-1] == Xblank)
1935 cave[x][y-1] = Xacid_splash_w;
1936 play_element_sound(x, y, SOUND_acid, Xacid_1);
1945 static void Landroid_2_e(int x, int y)
1947 switch (cave[x+1][y])
1950 case Xacid_splash_e:
1951 case Xacid_splash_w:
1952 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
1962 cave[x][y] = Yandroid_eB;
1963 next[x][y] = Xblank;
1964 cave[x+1][y] = Yandroid_e;
1965 next[x+1][y] = Xandroid_1_e;
1966 play_element_sound(x, y, SOUND_android_move, Xandroid_2_e);
1977 cave[x][y] = Yandroid_eB;
1978 next[x][y] = Xblank;
1979 if (cave[x+2][y-1] == Xblank)
1980 cave[x+2][y-1] = Xacid_splash_e;
1981 if (cave[x][y-1] == Xblank)
1982 cave[x][y-1] = Xacid_splash_w;
1983 play_element_sound(x, y, SOUND_acid, Xacid_1);
1992 static void Landroid_1_s(int x, int y)
1994 switch (cave[x][y+1])
1997 case Xacid_splash_e:
1998 case Xacid_splash_w:
1999 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2009 cave[x][y] = Yandroid_sB;
2010 next[x][y] = Xblank;
2011 cave[x][y+1] = Yandroid_s;
2012 next[x][y+1] = Xandroid;
2013 play_element_sound(x, y, SOUND_android_move, Xandroid_1_s);
2024 cave[x][y] = Yandroid_sB;
2025 next[x][y] = Xblank;
2026 if (cave[x+1][y] == Xblank)
2027 cave[x+1][y] = Xacid_splash_e;
2028 if (cave[x-1][y] == Xblank)
2029 cave[x-1][y] = Xacid_splash_w;
2030 play_element_sound(x, y, SOUND_acid, Xacid_1);
2039 static void Landroid_2_s(int x, int y)
2041 switch (cave[x][y+1])
2044 case Xacid_splash_e:
2045 case Xacid_splash_w:
2046 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2056 cave[x][y] = Yandroid_sB;
2057 next[x][y] = Xblank;
2058 cave[x][y+1] = Yandroid_s;
2059 next[x][y+1] = Xandroid_1_s;
2060 play_element_sound(x, y, SOUND_android_move, Xandroid_2_s);
2071 cave[x][y] = Yandroid_sB;
2072 next[x][y] = Xblank;
2073 if (cave[x+1][y] == Xblank)
2074 cave[x+1][y] = Xacid_splash_e;
2075 if (cave[x-1][y] == Xblank)
2076 cave[x-1][y] = Xacid_splash_w;
2077 play_element_sound(x, y, SOUND_acid, Xacid_1);
2086 static void Landroid_1_w(int x, int y)
2088 switch (cave[x-1][y])
2091 case Xacid_splash_e:
2092 case Xacid_splash_w:
2093 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2103 cave[x][y] = Yandroid_wB;
2104 next[x][y] = Xblank;
2105 cave[x-1][y] = Yandroid_w;
2106 next[x-1][y] = Xandroid;
2107 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2118 cave[x][y] = Yandroid_wB;
2119 next[x][y] = Xblank;
2120 if (cave[x][y-1] == Xblank)
2121 cave[x][y-1] = Xacid_splash_e;
2122 if (cave[x-2][y-1] == Xblank)
2123 cave[x-2][y-1] = Xacid_splash_w;
2124 play_element_sound(x, y, SOUND_acid, Xacid_1);
2133 static void Landroid_2_w(int x, int y)
2135 switch (cave[x-1][y])
2138 case Xacid_splash_e:
2139 case Xacid_splash_w:
2140 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2150 cave[x][y] = Yandroid_wB;
2151 next[x][y] = Xblank;
2152 cave[x-1][y] = Yandroid_w;
2153 next[x-1][y] = Xandroid_1_w;
2154 play_element_sound(x, y, SOUND_android_move, Xandroid_1_w);
2165 cave[x][y] = Yandroid_wB;
2166 next[x][y] = Xblank;
2167 if (cave[x][y-1] == Xblank)
2168 cave[x][y-1] = Xacid_splash_e;
2169 if (cave[x-2][y-1] == Xblank)
2170 cave[x-2][y-1] = Xacid_splash_w;
2171 play_element_sound(x, y, SOUND_acid, Xacid_1);
2180 static void Leater_n(int x, int y)
2182 if (cave[x+1][y] == Xdiamond)
2184 cave[x+1][y] = Ydiamond_blank;
2185 next[x+1][y] = Xblank;
2186 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2190 if (cave[x][y+1] == Xdiamond)
2192 cave[x][y+1] = Ydiamond_blank;
2193 next[x][y+1] = Xblank;
2194 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2198 if (cave[x-1][y] == Xdiamond)
2200 cave[x-1][y] = Ydiamond_blank;
2201 next[x-1][y] = Xblank;
2202 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2206 if (cave[x][y-1] == Xdiamond)
2208 cave[x][y-1] = Ydiamond_blank;
2209 next[x][y-1] = Xblank;
2210 play_element_sound(x, y, SOUND_eater_eat, Xeater_n);
2214 switch (cave[x][y-1])
2217 case Xacid_splash_e:
2218 case Xacid_splash_w:
2219 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2232 cave[x][y] = Yeater_nB;
2233 next[x][y] = Xblank;
2234 cave[x][y-1] = Yeater_n;
2235 next[x][y-1] = Xeater_n;
2246 cave[x][y] = Yeater_nB;
2247 next[x][y] = Xblank;
2248 if (cave[x+1][y-2] == Xblank)
2249 cave[x+1][y-2] = Xacid_splash_e;
2250 if (cave[x-1][y-2] == Xblank)
2251 cave[x-1][y-2] = Xacid_splash_w;
2252 play_element_sound(x, y, SOUND_acid, Xacid_1);
2256 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2257 play_element_sound(x, y, SOUND_eater, Xeater_n);
2262 static void Leater_e(int x, int y)
2264 if (cave[x][y+1] == Xdiamond)
2266 cave[x][y+1] = Ydiamond_blank;
2267 next[x][y+1] = Xblank;
2268 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2272 if (cave[x-1][y] == Xdiamond)
2274 cave[x-1][y] = Ydiamond_blank;
2275 next[x-1][y] = Xblank;
2276 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2280 if (cave[x][y-1] == Xdiamond)
2282 cave[x][y-1] = Ydiamond_blank;
2283 next[x][y-1] = Xblank;
2284 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2288 if (cave[x+1][y] == Xdiamond)
2290 cave[x+1][y] = Ydiamond_blank;
2291 next[x+1][y] = Xblank;
2292 play_element_sound(x, y, SOUND_eater_eat, Xeater_e);
2296 switch (cave[x+1][y])
2299 case Xacid_splash_e:
2300 case Xacid_splash_w:
2301 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2314 cave[x][y] = Yeater_eB;
2315 next[x][y] = Xblank;
2316 cave[x+1][y] = Yeater_e;
2317 next[x+1][y] = Xeater_e;
2328 cave[x][y] = Yeater_eB;
2329 next[x][y] = Xblank;
2330 if (cave[x+2][y-1] == Xblank)
2331 cave[x+2][y-1] = Xacid_splash_e;
2332 if (cave[x][y-1] == Xblank)
2333 cave[x][y-1] = Xacid_splash_w;
2334 play_element_sound(x, y, SOUND_acid, Xacid_1);
2338 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2339 play_element_sound(x, y, SOUND_eater, Xeater_e);
2344 static void Leater_s(int x, int y)
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_s);
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_s);
2362 if (cave[x+1][y] == Xdiamond)
2364 cave[x+1][y] = Ydiamond_blank;
2365 next[x+1][y] = Xblank;
2366 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2370 if (cave[x][y+1] == Xdiamond)
2372 cave[x][y+1] = Ydiamond_blank;
2373 next[x][y+1] = Xblank;
2374 play_element_sound(x, y, SOUND_eater_eat, Xeater_s);
2378 switch (cave[x][y+1])
2381 case Xacid_splash_e:
2382 case Xacid_splash_w:
2383 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2396 cave[x][y] = Yeater_sB;
2397 next[x][y] = Xblank;
2398 cave[x][y+1] = Yeater_s;
2399 next[x][y+1] = Xeater_s;
2410 cave[x][y] = Yeater_sB;
2411 next[x][y] = Xblank;
2412 if (cave[x+1][y] == Xblank)
2413 cave[x+1][y] = Xacid_splash_e;
2414 if (cave[x-1][y] == Xblank)
2415 cave[x-1][y] = Xacid_splash_w;
2416 play_element_sound(x, y, SOUND_acid, Xacid_1);
2420 next[x][y] = RANDOM(2) ? Xeater_e : Xeater_w;
2421 play_element_sound(x, y, SOUND_eater, Xeater_s);
2426 static void Leater_w(int x, int y)
2428 if (cave[x][y-1] == Xdiamond)
2430 cave[x][y-1] = Ydiamond_blank;
2431 next[x][y-1] = Xblank;
2432 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2436 if (cave[x+1][y] == Xdiamond)
2438 cave[x+1][y] = Ydiamond_blank;
2439 next[x+1][y] = Xblank;
2440 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2444 if (cave[x][y+1] == Xdiamond)
2446 cave[x][y+1] = Ydiamond_blank;
2447 next[x][y+1] = Xblank;
2448 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2452 if (cave[x-1][y] == Xdiamond)
2454 cave[x-1][y] = Ydiamond_blank;
2455 next[x-1][y] = Xblank;
2456 play_element_sound(x, y, SOUND_eater_eat, Xeater_w);
2460 switch (cave[x-1][y])
2463 case Xacid_splash_e:
2464 case Xacid_splash_w:
2465 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2478 cave[x][y] = Yeater_wB;
2479 next[x][y] = Xblank;
2480 cave[x-1][y] = Yeater_w;
2481 next[x-1][y] = Xeater_w;
2492 cave[x][y] = Yeater_wB;
2493 next[x][y] = Xblank;
2494 if (cave[x][y-1] == Xblank)
2495 cave[x][y-1] = Xacid_splash_e;
2496 if (cave[x-2][y-1] == Xblank)
2497 cave[x-2][y-1] = Xacid_splash_w;
2498 play_element_sound(x, y, SOUND_acid, Xacid_1);
2502 next[x][y] = RANDOM(2) ? Xeater_n : Xeater_s;
2503 play_element_sound(x, y, SOUND_eater, Xeater_w);
2508 static void Lalien(int x, int y)
2519 set_nearest_player_xy(x, y, &dx, &dy);
2526 switch (cave[x][y-1])
2529 case Xacid_splash_e:
2530 case Xacid_splash_w:
2531 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2544 cave[x][y] = Yalien_nB;
2545 next[x][y] = Xblank;
2546 cave[x][y-1] = Yalien_n;
2547 next[x][y-1] = Xalien_pause;
2548 play_element_sound(x, y, SOUND_alien, Xalien);
2559 cave[x][y] = Yalien_nB;
2560 next[x][y] = Xblank;
2561 if (cave[x+1][y-2] == Xblank)
2562 cave[x+1][y-2] = Xacid_splash_e;
2563 if (cave[x-1][y-2] == Xblank)
2564 cave[x-1][y-2] = Xacid_splash_w;
2565 play_element_sound(x, y, SOUND_acid, Xacid_1);
2571 switch (cave[x][y+1])
2574 case Xacid_splash_e:
2575 case Xacid_splash_w:
2576 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2589 cave[x][y] = Yalien_sB;
2590 next[x][y] = Xblank;
2591 cave[x][y+1] = Yalien_s;
2592 next[x][y+1] = Xalien_pause;
2593 play_element_sound(x, y, SOUND_alien, Xalien);
2604 cave[x][y] = Yalien_sB;
2605 next[x][y] = Xblank;
2606 if (cave[x+1][y] == Xblank)
2607 cave[x+1][y] = Xacid_splash_e;
2608 if (cave[x-1][y] == Xblank)
2609 cave[x-1][y] = Xacid_splash_w;
2610 play_element_sound(x, y, SOUND_acid, Xacid_1);
2619 switch (cave[x+1][y])
2622 case Xacid_splash_e:
2623 case Xacid_splash_w:
2624 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2637 cave[x][y] = Yalien_eB;
2638 next[x][y] = Xblank;
2639 cave[x+1][y] = Yalien_e;
2640 next[x+1][y] = Xalien_pause;
2641 play_element_sound(x, y, SOUND_alien, Xalien);
2652 cave[x][y] = Yalien_eB;
2653 next[x][y] = Xblank;
2654 if (cave[x+2][y-1] == Xblank)
2655 cave[x+2][y-1] = Xacid_splash_e;
2656 if (cave[x][y-1] == Xblank)
2657 cave[x][y-1] = Xacid_splash_w;
2658 play_element_sound(x, y, SOUND_acid, Xacid_1);
2664 switch (cave[x-1][y])
2667 case Xacid_splash_e:
2668 case Xacid_splash_w:
2669 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2682 cave[x][y] = Yalien_wB;
2683 next[x][y] = Xblank;
2684 cave[x-1][y] = Yalien_w;
2685 next[x-1][y] = Xalien_pause;
2686 play_element_sound(x, y, SOUND_alien, Xalien);
2697 cave[x][y] = Yalien_wB;
2698 next[x][y] = Xblank;
2699 if (cave[x][y-1] == Xblank)
2700 cave[x][y-1] = Xacid_splash_e;
2701 if (cave[x-2][y-1] == Xblank)
2702 cave[x-2][y-1] = Xacid_splash_w;
2703 play_element_sound(x, y, SOUND_acid, Xacid_1);
2710 static void Lalien_pause(int x, int y)
2712 next[x][y] = Xalien;
2715 static void Lbug_n(int x, int y)
2717 switch (cave[x][y-1])
2720 case Xacid_splash_e:
2721 case Xacid_splash_w:
2722 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2735 cave[x][y] = Ybug_nB;
2736 next[x][y] = Xblank;
2737 cave[x][y-1] = Ybug_n;
2738 next[x][y-1] = Xbug_1_n;
2739 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2750 cave[x][y] = Ybug_nB;
2751 next[x][y] = Xblank;
2752 if (cave[x+1][y-2] == Xblank)
2753 cave[x+1][y-2] = Xacid_splash_e;
2754 if (cave[x-1][y-2] == Xblank)
2755 cave[x-1][y-2] = Xacid_splash_w;
2756 play_element_sound(x, y, SOUND_acid, Xacid_1);
2760 cave[x][y] = Ybug_n_w;
2761 next[x][y] = Xbug_2_w;
2762 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2767 static void Lbug_1_n(int x, int y)
2769 if (tab_amoeba[cave[x][y-1]] ||
2770 tab_amoeba[cave[x+1][y]] ||
2771 tab_amoeba[cave[x][y+1]] ||
2772 tab_amoeba[cave[x-1][y]])
2774 Lboom_bug(x, y, Xbug_1_n);
2779 switch (cave[x+1][y])
2782 case Xacid_splash_e:
2783 case Xacid_splash_w:
2784 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2805 cave[x][y] = Ybug_n_e;
2806 next[x][y] = Xbug_2_e;
2807 play_element_sound(x, y, SOUND_bug, Xbug_1_n);
2816 static void Lbug_2_n(int x, int y)
2818 if (tab_amoeba[cave[x][y-1]] ||
2819 tab_amoeba[cave[x+1][y]] ||
2820 tab_amoeba[cave[x][y+1]] ||
2821 tab_amoeba[cave[x-1][y]])
2823 Lboom_bug(x, y, Xbug_2_n);
2831 static void Lbug_e(int x, int y)
2833 switch (cave[x+1][y])
2836 case Xacid_splash_e:
2837 case Xacid_splash_w:
2838 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2851 cave[x][y] = Ybug_eB;
2852 next[x][y] = Xblank;
2853 cave[x+1][y] = Ybug_e;
2854 next[x+1][y] = Xbug_1_e;
2855 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2866 cave[x][y] = Ybug_eB;
2867 next[x][y] = Xblank;
2868 if (cave[x+2][y-1] == Xblank)
2869 cave[x+2][y-1] = Xacid_splash_e;
2870 if (cave[x][y-1] == Xblank)
2871 cave[x][y-1] = Xacid_splash_w;
2872 play_element_sound(x, y, SOUND_acid, Xacid_1);
2876 cave[x][y] = Ybug_e_n;
2877 next[x][y] = Xbug_2_n;
2878 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2883 static void Lbug_1_e(int x, int y)
2885 if (tab_amoeba[cave[x][y-1]] ||
2886 tab_amoeba[cave[x+1][y]] ||
2887 tab_amoeba[cave[x][y+1]] ||
2888 tab_amoeba[cave[x-1][y]])
2890 Lboom_bug(x, y, Xbug_1_e);
2895 switch (cave[x][y+1])
2898 case Xacid_splash_e:
2899 case Xacid_splash_w:
2900 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2921 cave[x][y] = Ybug_e_s;
2922 next[x][y] = Xbug_2_s;
2923 play_element_sound(x, y, SOUND_bug, Xbug_1_e);
2932 static void Lbug_2_e(int x, int y)
2934 if (tab_amoeba[cave[x][y-1]] ||
2935 tab_amoeba[cave[x+1][y]] ||
2936 tab_amoeba[cave[x][y+1]] ||
2937 tab_amoeba[cave[x-1][y]])
2939 Lboom_bug(x, y, Xbug_2_e);
2947 static void Lbug_s(int x, int y)
2949 switch (cave[x][y+1])
2952 case Xacid_splash_e:
2953 case Xacid_splash_w:
2954 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
2967 cave[x][y] = Ybug_sB;
2968 next[x][y] = Xblank;
2969 cave[x][y+1] = Ybug_s;
2970 next[x][y+1] = Xbug_1_s;
2971 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2982 cave[x][y] = Ybug_sB;
2983 next[x][y] = Xblank;
2984 if (cave[x+1][y] == Xblank)
2985 cave[x+1][y] = Xacid_splash_e;
2986 if (cave[x-1][y] == Xblank)
2987 cave[x-1][y] = Xacid_splash_w;
2988 play_element_sound(x, y, SOUND_acid, Xacid_1);
2992 cave[x][y] = Ybug_s_e;
2993 next[x][y] = Xbug_2_e;
2994 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
2999 static void Lbug_1_s(int x, int y)
3001 if (tab_amoeba[cave[x][y-1]] ||
3002 tab_amoeba[cave[x+1][y]] ||
3003 tab_amoeba[cave[x][y+1]] ||
3004 tab_amoeba[cave[x-1][y]])
3006 Lboom_bug(x, y, Xbug_1_s);
3011 switch (cave[x-1][y])
3014 case Xacid_splash_e:
3015 case Xacid_splash_w:
3016 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3037 cave[x][y] = Ybug_s_w;
3038 next[x][y] = Xbug_2_w;
3039 play_element_sound(x, y, SOUND_bug, Xbug_1_s);
3048 static void Lbug_2_s(int x, int y)
3050 if (tab_amoeba[cave[x][y-1]] ||
3051 tab_amoeba[cave[x+1][y]] ||
3052 tab_amoeba[cave[x][y+1]] ||
3053 tab_amoeba[cave[x-1][y]])
3055 Lboom_bug(x, y, Xbug_2_s);
3063 static void Lbug_w(int x, int y)
3065 switch (cave[x-1][y])
3068 case Xacid_splash_e:
3069 case Xacid_splash_w:
3070 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3083 cave[x][y] = Ybug_wB;
3084 next[x][y] = Xblank;
3085 cave[x-1][y] = Ybug_w;
3086 next[x-1][y] = Xbug_1_w;
3087 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3098 cave[x][y] = Ybug_wB;
3099 next[x][y] = Xblank;
3100 if (cave[x][y-1] == Xblank)
3101 cave[x][y-1] = Xacid_splash_e;
3102 if (cave[x-2][y-1] == Xblank)
3103 cave[x-2][y-1] = Xacid_splash_w;
3104 play_element_sound(x, y, SOUND_acid, Xacid_1);
3108 cave[x][y] = Ybug_w_s;
3109 next[x][y] = Xbug_2_s;
3110 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3115 static void Lbug_1_w(int x, int y)
3117 if (tab_amoeba[cave[x][y-1]] ||
3118 tab_amoeba[cave[x+1][y]] ||
3119 tab_amoeba[cave[x][y+1]] ||
3120 tab_amoeba[cave[x-1][y]])
3122 Lboom_bug(x, y, Xbug_1_w);
3127 switch (cave[x][y-1])
3130 case Xacid_splash_e:
3131 case Xacid_splash_w:
3132 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3153 cave[x][y] = Ybug_w_n;
3154 next[x][y] = Xbug_2_n;
3155 play_element_sound(x, y, SOUND_bug, Xbug_1_w);
3164 static void Lbug_2_w(int x, int y)
3166 if (tab_amoeba[cave[x][y-1]] ||
3167 tab_amoeba[cave[x+1][y]] ||
3168 tab_amoeba[cave[x][y+1]] ||
3169 tab_amoeba[cave[x-1][y]])
3171 Lboom_bug(x, y, Xbug_2_w);
3179 static void Ltank_n(int x, int y)
3181 switch (cave[x][y-1])
3184 case Xacid_splash_e:
3185 case Xacid_splash_w:
3186 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3199 cave[x][y] = Ytank_nB;
3200 next[x][y] = Xblank;
3201 cave[x][y-1] = Ytank_n;
3202 next[x][y-1] = Xtank_1_n;
3203 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3214 cave[x][y] = Ytank_nB;
3215 next[x][y] = Xblank;
3216 if (cave[x+1][y-2] == Xblank)
3217 cave[x+1][y-2] = Xacid_splash_e;
3218 if (cave[x-1][y-2] == Xblank)
3219 cave[x-1][y-2] = Xacid_splash_w;
3220 play_element_sound(x, y, SOUND_acid, Xacid_1);
3224 cave[x][y] = Ytank_n_e;
3225 next[x][y] = Xtank_2_e;
3226 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3231 static void Ltank_1_n(int x, int y)
3233 if (tab_amoeba[cave[x][y-1]] ||
3234 tab_amoeba[cave[x+1][y]] ||
3235 tab_amoeba[cave[x][y+1]] ||
3236 tab_amoeba[cave[x-1][y]])
3238 Lboom_tank(x, y, Xtank_1_n);
3243 switch (cave[x-1][y])
3246 case Xacid_splash_e:
3247 case Xacid_splash_w:
3248 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3269 cave[x][y] = Ytank_n_w;
3270 next[x][y] = Xtank_2_w;
3271 play_element_sound(x, y, SOUND_tank, Xtank_1_n);
3280 static void Ltank_2_n(int x, int y)
3282 if (tab_amoeba[cave[x][y-1]] ||
3283 tab_amoeba[cave[x+1][y]] ||
3284 tab_amoeba[cave[x][y+1]] ||
3285 tab_amoeba[cave[x-1][y]])
3287 Lboom_tank(x, y, Xtank_2_n);
3295 static void Ltank_e(int x, int y)
3297 switch (cave[x+1][y])
3300 case Xacid_splash_e:
3301 case Xacid_splash_w:
3302 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3315 cave[x][y] = Ytank_eB;
3316 next[x][y] = Xblank;
3317 cave[x+1][y] = Ytank_e;
3318 next[x+1][y] = Xtank_1_e;
3319 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3330 cave[x][y] = Ytank_eB;
3331 next[x][y] = Xblank;
3332 if (cave[x+2][y-1] == Xblank)
3333 cave[x+2][y-1] = Xacid_splash_e;
3334 if (cave[x][y-1] == Xblank)
3335 cave[x][y-1] = Xacid_splash_w;
3336 play_element_sound(x, y, SOUND_acid, Xacid_1);
3340 cave[x][y] = Ytank_e_s;
3341 next[x][y] = Xtank_2_s;
3342 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3347 static void Ltank_1_e(int x, int y)
3349 if (tab_amoeba[cave[x][y-1]] ||
3350 tab_amoeba[cave[x+1][y]] ||
3351 tab_amoeba[cave[x][y+1]] ||
3352 tab_amoeba[cave[x-1][y]])
3354 Lboom_tank(x, y, Xtank_1_e);
3359 switch (cave[x][y-1])
3362 case Xacid_splash_e:
3363 case Xacid_splash_w:
3364 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3385 cave[x][y] = Ytank_e_n;
3386 next[x][y] = Xtank_2_n;
3387 play_element_sound(x, y, SOUND_tank, Xtank_1_e);
3396 static void Ltank_2_e(int x, int y)
3398 if (tab_amoeba[cave[x][y-1]] ||
3399 tab_amoeba[cave[x+1][y]] ||
3400 tab_amoeba[cave[x][y+1]] ||
3401 tab_amoeba[cave[x-1][y]])
3403 Lboom_tank(x, y, Xtank_2_e);
3411 static void Ltank_s(int x, int y)
3413 switch (cave[x][y+1])
3416 case Xacid_splash_e:
3417 case Xacid_splash_w:
3418 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3431 cave[x][y] = Ytank_sB;
3432 next[x][y] = Xblank;
3433 cave[x][y+1] = Ytank_s;
3434 next[x][y+1] = Xtank_1_s;
3435 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3446 cave[x][y] = Ytank_sB;
3447 next[x][y] = Xblank;
3448 if (cave[x+1][y] == Xblank)
3449 cave[x+1][y] = Xacid_splash_e;
3450 if (cave[x-1][y] == Xblank)
3451 cave[x-1][y] = Xacid_splash_w;
3452 play_element_sound(x, y, SOUND_acid, Xacid_1);
3456 cave[x][y] = Ytank_s_w;
3457 next[x][y] = Xtank_2_w;
3458 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3463 static void Ltank_1_s(int x, int y)
3465 if (tab_amoeba[cave[x][y-1]] ||
3466 tab_amoeba[cave[x+1][y]] ||
3467 tab_amoeba[cave[x][y+1]] ||
3468 tab_amoeba[cave[x-1][y]])
3470 Lboom_tank(x, y, Xtank_1_s);
3475 switch (cave[x+1][y])
3478 case Xacid_splash_e:
3479 case Xacid_splash_w:
3480 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3501 cave[x][y] = Ytank_s_e;
3502 next[x][y] = Xtank_2_e;
3503 play_element_sound(x, y, SOUND_tank, Xtank_1_s);
3512 static void Ltank_2_s(int x, int y)
3514 if (tab_amoeba[cave[x][y-1]] ||
3515 tab_amoeba[cave[x+1][y]] ||
3516 tab_amoeba[cave[x][y+1]] ||
3517 tab_amoeba[cave[x-1][y]])
3519 Lboom_tank(x, y, Xtank_2_s);
3527 static void Ltank_w(int x, int y)
3529 switch (cave[x-1][y])
3532 case Xacid_splash_e:
3533 case Xacid_splash_w:
3534 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3547 cave[x][y] = Ytank_wB;
3548 next[x][y] = Xblank;
3549 cave[x-1][y] = Ytank_w;
3550 next[x-1][y] = Xtank_1_w;
3551 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3562 cave[x][y] = Ytank_wB;
3563 next[x][y] = Xblank;
3564 if (cave[x][y-1] == Xblank)
3565 cave[x][y-1] = Xacid_splash_e;
3566 if (cave[x-2][y-1] == Xblank)
3567 cave[x-2][y-1] = Xacid_splash_w;
3568 play_element_sound(x, y, SOUND_acid, Xacid_1);
3572 cave[x][y] = Ytank_w_n;
3573 next[x][y] = Xtank_2_n;
3574 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3579 static void Ltank_1_w(int x, int y)
3581 if (tab_amoeba[cave[x][y-1]] ||
3582 tab_amoeba[cave[x+1][y]] ||
3583 tab_amoeba[cave[x][y+1]] ||
3584 tab_amoeba[cave[x-1][y]])
3586 Lboom_tank(x, y, Xtank_1_w);
3591 switch (cave[x][y+1])
3594 case Xacid_splash_e:
3595 case Xacid_splash_w:
3596 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3617 cave[x][y] = Ytank_w_s;
3618 next[x][y] = Xtank_2_s;
3619 play_element_sound(x, y, SOUND_tank, Xtank_1_w);
3628 static void Ltank_2_w(int x, int y)
3630 if (tab_amoeba[cave[x][y-1]] ||
3631 tab_amoeba[cave[x+1][y]] ||
3632 tab_amoeba[cave[x][y+1]] ||
3633 tab_amoeba[cave[x-1][y]])
3635 Lboom_tank(x, y, Xtank_2_w);
3643 static void Lemerald(int x, int y)
3645 switch (cave[x][y+1])
3648 case Xacid_splash_e:
3649 case Xacid_splash_w:
3650 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3660 cave[x][y] = Yemerald_sB;
3661 next[x][y] = Xblank;
3662 cave[x][y+1] = Yemerald_s;
3663 next[x][y+1] = Xemerald_fall;
3674 cave[x][y] = Yemerald_sB;
3675 next[x][y] = Xblank;
3676 if (cave[x+1][y] == Xblank)
3677 cave[x+1][y] = Xacid_splash_e;
3678 if (cave[x-1][y] == Xblank)
3679 cave[x-1][y] = Xacid_splash_w;
3680 play_element_sound(x, y, SOUND_acid, Xacid_1);
3699 case Xemerald_pause:
3701 case Xdiamond_pause:
3738 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3740 cave[x][y] = Yemerald_eB;
3741 next[x][y] = Xblank;
3742 cave[x+1][y] = Yemerald_e;
3743 next[x+1][y] = Xemerald_pause;
3747 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3749 cave[x][y] = Yemerald_wB;
3750 next[x][y] = Xblank;
3751 cave[x-1][y] = Yemerald_w;
3752 next[x-1][y] = Xemerald_pause;
3758 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
3760 cave[x][y] = Yemerald_wB;
3761 next[x][y] = Xblank;
3762 cave[x-1][y] = Yemerald_w;
3763 next[x-1][y] = Xemerald_pause;
3767 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3769 cave[x][y] = Yemerald_eB;
3770 next[x][y] = Xblank;
3771 cave[x+1][y] = Yemerald_e;
3772 next[x+1][y] = Xemerald_pause;
3778 if (++lev.shine_cnt > 50)
3780 lev.shine_cnt = RANDOM(8);
3781 cave[x][y] = Xemerald_shine;
3788 static void Lemerald_pause(int x, int y)
3790 switch (cave[x][y+1])
3793 case Xacid_splash_e:
3794 case Xacid_splash_w:
3795 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3805 cave[x][y] = Yemerald_sB;
3806 next[x][y] = Xblank;
3807 cave[x][y+1] = Yemerald_s;
3808 next[x][y+1] = Xemerald_fall;
3819 cave[x][y] = Yemerald_sB;
3820 next[x][y] = Xblank;
3821 if (cave[x+1][y] == Xblank)
3822 cave[x+1][y] = Xacid_splash_e;
3823 if (cave[x-1][y] == Xblank)
3824 cave[x-1][y] = Xacid_splash_w;
3825 play_element_sound(x, y, SOUND_acid, Xacid_1);
3829 cave[x][y] = Xemerald;
3830 next[x][y] = Xemerald;
3835 static void Lemerald_fall(int x, int y)
3837 switch (cave[x][y+1])
3840 case Xacid_splash_e:
3841 case Xacid_splash_w:
3842 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3853 cave[x][y] = Yemerald_sB;
3854 next[x][y] = Xblank;
3855 cave[x][y+1] = Yemerald_s;
3856 next[x][y+1] = Xemerald_fall;
3867 cave[x][y] = Yemerald_sB;
3868 next[x][y] = Xblank;
3869 if (cave[x+1][y] == Xblank)
3870 cave[x+1][y] = Xacid_splash_e;
3871 if (cave[x-1][y] == Xblank)
3872 cave[x-1][y] = Xacid_splash_w;
3873 play_element_sound(x, y, SOUND_acid, Xacid_1);
3877 if (lev.wonderwall_time)
3879 lev.wonderwall_state = 1;
3880 cave[x][y] = Yemerald_sB;
3881 if (tab_blank[cave[x][y+2]])
3883 cave[x][y+2] = Ydiamond_s;
3884 next[x][y+2] = Xdiamond_fall;
3887 next[x][y] = Xblank;
3888 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
3893 cave[x][y] = Xemerald;
3894 next[x][y] = Xemerald;
3895 play_element_sound(x, y, SOUND_diamond, Xemerald);
3900 static void Ldiamond(int x, int y)
3902 switch (cave[x][y+1])
3905 case Xacid_splash_e:
3906 case Xacid_splash_w:
3907 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
3917 cave[x][y] = Ydiamond_sB;
3918 next[x][y] = Xblank;
3919 cave[x][y+1] = Ydiamond_s;
3920 next[x][y+1] = Xdiamond_fall;
3931 cave[x][y] = Ydiamond_sB;
3932 next[x][y] = Xblank;
3933 if (cave[x+1][y] == Xblank)
3934 cave[x+1][y] = Xacid_splash_e;
3935 if (cave[x-1][y] == Xblank)
3936 cave[x-1][y] = Xacid_splash_w;
3937 play_element_sound(x, y, SOUND_acid, Xacid_1);
3956 case Xemerald_pause:
3958 case Xdiamond_pause:
3995 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
3997 cave[x][y] = Ydiamond_eB;
3998 next[x][y] = Xblank;
3999 cave[x+1][y] = Ydiamond_e;
4000 next[x+1][y] = Xdiamond_pause;
4004 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4006 cave[x][y] = Ydiamond_wB;
4007 next[x][y] = Xblank;
4008 cave[x-1][y] = Ydiamond_w;
4009 next[x-1][y] = Xdiamond_pause;
4015 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4017 cave[x][y] = Ydiamond_wB;
4018 next[x][y] = Xblank;
4019 cave[x-1][y] = Ydiamond_w;
4020 next[x-1][y] = Xdiamond_pause;
4024 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4026 cave[x][y] = Ydiamond_eB;
4027 next[x][y] = Xblank;
4028 cave[x+1][y] = Ydiamond_e;
4029 next[x+1][y] = Xdiamond_pause;
4035 if (++lev.shine_cnt > 50)
4037 lev.shine_cnt = RANDOM(8);
4038 cave[x][y] = Xdiamond_shine;
4045 static void Ldiamond_pause(int x, int y)
4047 switch (cave[x][y+1])
4050 case Xacid_splash_e:
4051 case Xacid_splash_w:
4052 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4062 cave[x][y] = Ydiamond_sB;
4063 next[x][y] = Xblank;
4064 cave[x][y+1] = Ydiamond_s;
4065 next[x][y+1] = Xdiamond_fall;
4076 cave[x][y] = Ydiamond_sB;
4077 next[x][y] = Xblank;
4078 if (cave[x+1][y] == Xblank)
4079 cave[x+1][y] = Xacid_splash_e;
4080 if (cave[x-1][y] == Xblank)
4081 cave[x-1][y] = Xacid_splash_w;
4082 play_element_sound(x, y, SOUND_acid, Xacid_1);
4086 cave[x][y] = Xdiamond;
4087 next[x][y] = Xdiamond;
4092 static void Ldiamond_fall(int x, int y)
4094 switch (cave[x][y+1])
4097 case Xacid_splash_e:
4098 case Xacid_splash_w:
4099 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4110 cave[x][y] = Ydiamond_sB;
4111 next[x][y] = Xblank;
4112 cave[x][y+1] = Ydiamond_s;
4113 next[x][y+1] = Xdiamond_fall;
4124 cave[x][y] = Ydiamond_sB;
4125 next[x][y] = Xblank;
4126 if (cave[x+1][y] == Xblank)
4127 cave[x+1][y] = Xacid_splash_e;
4128 if (cave[x-1][y] == Xblank)
4129 cave[x-1][y] = Xacid_splash_w;
4130 play_element_sound(x, y, SOUND_acid, Xacid_1);
4134 if (lev.wonderwall_time)
4136 lev.wonderwall_state = 1;
4137 cave[x][y] = Ydiamond_sB;
4138 if (tab_blank[cave[x][y+2]])
4140 cave[x][y+2] = Ystone_s;
4141 next[x][y+2] = Xstone_fall;
4144 next[x][y] = Xblank;
4145 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4150 cave[x][y] = Xdiamond;
4151 next[x][y] = Xdiamond;
4152 play_element_sound(x, y, SOUND_diamond, Xdiamond);
4157 static void Lstone(int x, int y)
4159 switch (cave[x][y+1])
4162 case Xacid_splash_e:
4163 case Xacid_splash_w:
4164 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4176 cave[x][y] = Ystone_sB;
4177 next[x][y] = Xblank;
4178 cave[x][y+1] = Ystone_s;
4179 next[x][y+1] = Xstone_fall;
4190 cave[x][y] = Ystone_sB;
4191 next[x][y] = Xblank;
4192 if (cave[x+1][y] == Xblank)
4193 cave[x+1][y] = Xacid_splash_e;
4194 if (cave[x-1][y] == Xblank)
4195 cave[x-1][y] = Xacid_splash_w;
4196 play_element_sound(x, y, SOUND_acid, Xacid_1);
4200 cave[x][y] = Xsand_stonein_1;
4201 next[x][y] = Xsand_stonein_2;
4202 cave[x][y+1] = Xsand_sandstone_1;
4203 next[x][y+1] = Xsand_sandstone_2;
4222 case Xemerald_pause:
4224 case Xdiamond_pause:
4254 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4256 cave[x][y] = Ystone_eB;
4257 next[x][y] = Xblank;
4258 cave[x+1][y] = Ystone_e;
4259 next[x+1][y] = Xstone_pause;
4263 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4265 cave[x][y] = Ystone_wB;
4266 next[x][y] = Xblank;
4267 cave[x-1][y] = Ystone_w;
4268 next[x-1][y] = Xstone_pause;
4274 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4276 cave[x][y] = Ystone_wB;
4277 next[x][y] = Xblank;
4278 cave[x-1][y] = Ystone_w;
4279 next[x-1][y] = Xstone_pause;
4283 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4285 cave[x][y] = Ystone_eB;
4286 next[x][y] = Xblank;
4287 cave[x+1][y] = Ystone_e;
4288 next[x+1][y] = Xstone_pause;
4295 static void Lstone_pause(int x, int y)
4297 switch (cave[x][y+1])
4300 case Xacid_splash_e:
4301 case Xacid_splash_w:
4302 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4312 cave[x][y] = Ystone_sB;
4313 next[x][y] = Xblank;
4314 cave[x][y+1] = Ystone_s;
4315 next[x][y+1] = Xstone_fall;
4326 cave[x][y] = Ystone_sB;
4327 next[x][y] = Xblank;
4328 if (cave[x+1][y] == Xblank)
4329 cave[x+1][y] = Xacid_splash_e;
4330 if (cave[x-1][y] == Xblank)
4331 cave[x-1][y] = Xacid_splash_w;
4332 play_element_sound(x, y, SOUND_acid, Xacid_1);
4336 cave[x][y] = Xstone;
4337 next[x][y] = Xstone;
4342 static void Lstone_fall(int x, int y)
4344 switch (cave[x][y+1])
4347 case Xacid_splash_e:
4348 case Xacid_splash_w:
4349 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4360 cave[x][y] = Ystone_sB;
4361 next[x][y] = Xblank;
4362 cave[x][y+1] = Ystone_s;
4363 next[x][y+1] = Xstone_fall;
4374 cave[x][y] = Ystone_sB;
4375 next[x][y] = Xblank;
4376 if (cave[x+1][y] == Xblank)
4377 cave[x+1][y] = Xacid_splash_e;
4378 if (cave[x-1][y] == Xblank)
4379 cave[x-1][y] = Xacid_splash_w;
4380 play_element_sound(x, y, SOUND_acid, Xacid_1);
4385 next[x][y] = Xstone;
4386 cave[x][y+1] = Ynut_stone;
4387 next[x][y+1] = Xemerald;
4388 play_element_sound(x, y, SOUND_crack, Xnut);
4389 score += lev.nut_score;
4400 cave[x][y] = Ystone_sB;
4401 cave[x][y+1] = Ybug_stone;
4402 Lboom_bug(x, y+1, Xstone_fall);
4403 score += lev.bug_score;
4414 cave[x][y] = Ystone_sB;
4415 cave[x][y+1] = Ytank_stone;
4416 Lboom_tank(x, y+1, Xstone_fall);
4417 score += lev.tank_score;
4423 switch (cave[x+1][y+1])
4426 case Xacid_splash_e:
4427 case Xacid_splash_w:
4428 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4440 cave[x][y+1] = Xspring_e;
4444 cave[x][y+1] = Xspring_w;
4450 switch (cave[x-1][y+1])
4453 case Xacid_splash_e:
4454 case Xacid_splash_w:
4455 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4467 cave[x][y+1] = Xspring_w;
4470 cave[x][y+1] = Xspring_e;
4475 next[x][y] = Xstone;
4482 cave[x][y] = Ystone_sB;
4483 cave[x][y+1] = Yeater_stone;
4484 Lboom_eater(x, y+1, Xstone_fall);
4485 score += lev.eater_score;
4490 cave[x][y] = Ystone_sB;
4491 cave[x][y+1] = Yalien_stone;
4492 Lboom_tank(x, y+1, Xstone_fall);
4493 score += lev.alien_score;
4497 case Xdiamond_pause:
4498 switch (cave[x][y+2])
4501 case Xacid_splash_e:
4502 case Xacid_splash_w:
4503 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4556 next[x][y] = Xstone;
4557 play_element_sound(x, y, SOUND_stone, Xstone);
4561 cave[x][y] = Ystone_sB;
4562 next[x][y] = Xblank;
4563 cave[x][y+1] = Ydiamond_stone;
4564 next[x][y+1] = Xstone_pause;
4565 play_element_sound(x, y, SOUND_squash, Xdiamond);
4570 cave[x][y+1] = Ybomb_blank;
4571 Lboom_tank(x, y+1, Xstone_fall);
4575 if (lev.wonderwall_time)
4577 lev.wonderwall_state = 1;
4578 cave[x][y] = Ystone_sB;
4580 if (tab_blank[cave[x][y+2]])
4582 cave[x][y+2] = Yemerald_s;
4583 next[x][y+2] = Xemerald_fall;
4586 next[x][y] = Xblank;
4587 play_element_sound(x, y, SOUND_wonderfall, Xwonderwall);
4592 cave[x][y] = Xstone;
4593 next[x][y] = Xstone;
4594 play_element_sound(x, y, SOUND_stone, Xstone);
4599 static void Lbomb(int x, int y)
4601 switch (cave[x][y+1])
4604 case Xacid_splash_e:
4605 case Xacid_splash_w:
4606 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4616 cave[x][y] = Ybomb_sB;
4617 next[x][y] = Xblank;
4618 cave[x][y+1] = Ybomb_s;
4619 next[x][y+1] = Xbomb_fall;
4630 cave[x][y] = Ybomb_sB;
4631 next[x][y] = Xblank;
4632 if (cave[x+1][y] == Xblank)
4633 cave[x+1][y] = Xacid_splash_e;
4634 if (cave[x-1][y] == Xblank)
4635 cave[x-1][y] = Xacid_splash_w;
4636 play_element_sound(x, y, SOUND_acid, Xacid_1);
4655 case Xemerald_pause:
4657 case Xdiamond_pause:
4685 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4687 cave[x][y] = Ybomb_eB;
4688 next[x][y] = Xblank;
4689 cave[x+1][y] = Ybomb_e;
4690 next[x+1][y] = Xbomb_pause;
4694 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4696 cave[x][y] = Ybomb_wB;
4697 next[x][y] = Xblank;
4698 cave[x-1][y] = Ybomb_w;
4699 next[x-1][y] = Xbomb_pause;
4705 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4707 cave[x][y] = Ybomb_wB;
4708 next[x][y] = Xblank;
4709 cave[x-1][y] = Ybomb_w;
4710 next[x-1][y] = Xbomb_pause;
4714 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4716 cave[x][y] = Ybomb_eB;
4717 next[x][y] = Xblank;
4718 cave[x+1][y] = Ybomb_e;
4719 next[x+1][y] = Xbomb_pause;
4726 static void Lbomb_pause(int x, int y)
4728 switch (cave[x][y+1])
4731 case Xacid_splash_e:
4732 case Xacid_splash_w:
4733 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4743 cave[x][y] = Ybomb_sB;
4744 next[x][y] = Xblank;
4745 cave[x][y+1] = Ybomb_s;
4746 next[x][y+1] = Xbomb_fall;
4757 cave[x][y] = Ybomb_sB;
4758 next[x][y] = Xblank;
4759 if (cave[x+1][y] == Xblank)
4760 cave[x+1][y] = Xacid_splash_e;
4761 if (cave[x-1][y] == Xblank)
4762 cave[x-1][y] = Xacid_splash_w;
4763 play_element_sound(x, y, SOUND_acid, Xacid_1);
4773 static void Lbomb_fall(int x, int y)
4775 switch (cave[x][y+1])
4778 case Xacid_splash_e:
4779 case Xacid_splash_w:
4780 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4790 cave[x][y] = Ybomb_sB;
4791 next[x][y] = Xblank;
4792 cave[x][y+1] = Ybomb_s;
4793 next[x][y+1] = Xbomb_fall;
4804 cave[x][y] = Ybomb_sB;
4805 next[x][y] = Xblank;
4806 if (cave[x+1][y] == Xblank)
4807 cave[x+1][y] = Xacid_splash_e;
4808 if (cave[x-1][y] == Xblank)
4809 cave[x-1][y] = Xacid_splash_w;
4810 play_element_sound(x, y, SOUND_acid, Xacid_1);
4814 cave[x][y] = Ybomb_blank;
4815 Lboom_tank(x, y, Xbomb_fall);
4820 static void Lnut(int x, int y)
4822 switch (cave[x][y+1])
4825 case Xacid_splash_e:
4826 case Xacid_splash_w:
4827 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4837 cave[x][y] = Ynut_sB;
4838 next[x][y] = Xblank;
4839 cave[x][y+1] = Ynut_s;
4840 next[x][y+1] = Xnut_fall;
4851 cave[x][y] = Ynut_sB;
4852 next[x][y] = Xblank;
4853 if (cave[x+1][y] == Xblank)
4854 cave[x+1][y] = Xacid_splash_e;
4855 if (cave[x-1][y] == Xblank)
4856 cave[x-1][y] = Xacid_splash_w;
4857 play_element_sound(x, y, SOUND_acid, Xacid_1);
4876 case Xemerald_pause:
4878 case Xdiamond_pause:
4906 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4908 cave[x][y] = Ynut_eB;
4909 next[x][y] = Xblank;
4910 cave[x+1][y] = Ynut_e;
4911 next[x+1][y] = Xnut_pause;
4915 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4917 cave[x][y] = Ynut_wB;
4918 next[x][y] = Xblank;
4919 cave[x-1][y] = Ynut_w;
4920 next[x-1][y] = Xnut_pause;
4926 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
4928 cave[x][y] = Ynut_wB;
4929 next[x][y] = Xblank;
4930 cave[x-1][y] = Ynut_w;
4931 next[x-1][y] = Xnut_pause;
4935 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
4937 cave[x][y] = Ynut_eB;
4938 next[x][y] = Xblank;
4939 cave[x+1][y] = Ynut_e;
4940 next[x+1][y] = Xnut_pause;
4947 static void Lnut_pause(int x, int y)
4949 switch (cave[x][y+1])
4952 case Xacid_splash_e:
4953 case Xacid_splash_w:
4954 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
4964 cave[x][y] = Ynut_sB;
4965 next[x][y] = Xblank;
4966 cave[x][y+1] = Ynut_s;
4967 next[x][y+1] = Xnut_fall;
4978 cave[x][y] = Ynut_sB;
4979 next[x][y] = Xblank;
4980 if (cave[x+1][y] == Xblank)
4981 cave[x+1][y] = Xacid_splash_e;
4982 if (cave[x-1][y] == Xblank)
4983 cave[x-1][y] = Xacid_splash_w;
4984 play_element_sound(x, y, SOUND_acid, Xacid_1);
4994 static void Lnut_fall(int x, int y)
4996 switch (cave[x][y+1])
4999 case Xacid_splash_e:
5000 case Xacid_splash_w:
5001 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5012 cave[x][y] = Ynut_sB;
5013 next[x][y] = Xblank;
5014 cave[x][y+1] = Ynut_s;
5015 next[x][y+1] = Xnut_fall;
5026 cave[x][y] = Ynut_sB;
5027 next[x][y] = Xblank;
5028 if (cave[x+1][y] == Xblank)
5029 cave[x+1][y] = Xacid_splash_e;
5030 if (cave[x-1][y] == Xblank)
5031 cave[x-1][y] = Xacid_splash_w;
5032 play_element_sound(x, y, SOUND_acid, Xacid_1);
5038 play_element_sound(x, y, SOUND_nut, Xnut);
5043 static void Lspring(int x, int y)
5045 switch (cave[x][y+1])
5048 case Xacid_splash_e:
5049 case Xacid_splash_w:
5050 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5062 cave[x][y] = Yspring_sB;
5063 next[x][y] = Xblank;
5064 cave[x][y+1] = Yspring_s;
5065 next[x][y+1] = Xspring_fall;
5076 cave[x][y] = Yspring_sB;
5077 next[x][y] = Xblank;
5078 if (cave[x+1][y] == Xblank)
5079 cave[x+1][y] = Xacid_splash_e;
5080 if (cave[x-1][y] == Xblank)
5081 cave[x-1][y] = Xacid_splash_w;
5082 play_element_sound(x, y, SOUND_acid, Xacid_1);
5101 case Xemerald_pause:
5103 case Xdiamond_pause:
5131 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
5133 cave[x][y] = Yspring_eB;
5134 next[x][y] = Xblank;
5135 cave[x+1][y] = Yspring_e;
5136 if (cave[x][y+1] == Xbumper)
5137 cave[x][y+1] = XbumperB;
5140 next[x+1][y] = Xspring_e;
5142 next[x+1][y] = Xspring_pause;
5147 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
5149 cave[x][y] = Yspring_wB;
5150 next[x][y] = Xblank;
5151 cave[x-1][y] = Yspring_w;
5152 if (cave[x][y+1] == Xbumper)
5153 cave[x][y+1] = XbumperB;
5156 next[x-1][y] = Xspring_w;
5158 next[x-1][y] = Xspring_pause;
5165 if (tab_blank[cave[x-1][y]] && tab_acid[cave[x-1][y+1]])
5167 cave[x][y] = Yspring_wB;
5168 next[x][y] = Xblank;
5169 cave[x-1][y] = Yspring_w;
5170 if (cave[x][y+1] == Xbumper)
5171 cave[x][y+1] = XbumperB;
5174 next[x-1][y] = Xspring_w;
5176 next[x-1][y] = Xspring_pause;
5181 if (tab_blank[cave[x+1][y]] && tab_acid[cave[x+1][y+1]])
5183 cave[x][y] = Yspring_eB;
5184 next[x][y] = Xblank;
5185 cave[x+1][y] = Yspring_e;
5186 if (cave[x][y+1] == Xbumper)
5187 cave[x][y+1] = XbumperB;
5190 next[x+1][y] = Xspring_e;
5192 next[x+1][y] = Xspring_pause;
5200 static void Lspring_pause(int x, int y)
5202 switch (cave[x][y+1])
5205 case Xacid_splash_e:
5206 case Xacid_splash_w:
5207 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5217 cave[x][y] = Yspring_sB;
5218 next[x][y] = Xblank;
5219 cave[x][y+1] = Yspring_s;
5220 next[x][y+1] = Xspring_fall;
5231 cave[x][y] = Yspring_sB;
5232 next[x][y] = Xblank;
5233 if (cave[x+1][y] == Xblank)
5234 cave[x+1][y] = Xacid_splash_e;
5235 if (cave[x-1][y] == Xblank)
5236 cave[x-1][y] = Xacid_splash_w;
5237 play_element_sound(x, y, SOUND_acid, Xacid_1);
5241 cave[x][y] = Xspring;
5242 next[x][y] = Xspring;
5247 static void Lspring_e(int x, int y)
5249 switch (cave[x][y+1])
5252 case Xacid_splash_e:
5253 case Xacid_splash_w:
5254 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5264 cave[x][y] = Yspring_sB;
5265 next[x][y] = Xblank;
5266 cave[x][y+1] = Yspring_s;
5267 next[x][y+1] = Xspring_fall;
5278 cave[x][y] = Yspring_sB;
5279 next[x][y] = Xblank;
5280 if (cave[x+1][y] == Xblank)
5281 cave[x+1][y] = Xacid_splash_e;
5282 if (cave[x-1][y] == Xblank)
5283 cave[x-1][y] = Xacid_splash_w;
5284 play_element_sound(x, y, SOUND_acid, Xacid_1);
5288 cave[x][y+1] = XbumperB;
5291 switch (cave[x+1][y])
5294 case Xacid_splash_e:
5295 case Xacid_splash_w:
5296 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5310 cave[x][y] = Yspring_eB;
5311 next[x][y] = Xblank;
5312 cave[x+1][y] = Yspring_e;
5313 next[x+1][y] = Xspring_e;
5324 cave[x][y] = Yspring_eB;
5325 next[x][y] = Xblank;
5326 if (cave[x+2][y-1] == Xblank)
5327 cave[x+2][y-1] = Xacid_splash_e;
5328 if (cave[x][y-1] == Xblank)
5329 cave[x][y-1] = Xacid_splash_w;
5330 play_element_sound(x, y, SOUND_acid, Xacid_1);
5339 cave[x][y] = Yspring_alien_eB;
5340 next[x][y] = Xblank;
5341 cave[x+1][y] = Yspring_alien_e;
5342 next[x+1][y] = Xspring_e;
5343 play_element_sound(x, y, SOUND_slurp, Xalien);
5344 score += lev.slurp_score;
5349 cave[x+1][y] = XbumperB;
5350 next[x][y] = Xspring_w;
5351 play_element_sound(x, y, SOUND_spring, Xspring);
5355 cave[x][y] = Xspring;
5356 next[x][y] = Xspring;
5357 play_element_sound(x, y, SOUND_spring, Xspring);
5362 static void Lspring_w(int x, int y)
5364 switch (cave[x][y+1])
5367 case Xacid_splash_e:
5368 case Xacid_splash_w:
5369 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5379 cave[x][y] = Yspring_sB;
5380 next[x][y] = Xblank;
5381 cave[x][y+1] = Yspring_s;
5382 next[x][y+1] = Xspring_fall;
5393 cave[x][y] = Yspring_sB;
5394 next[x][y] = Xblank;
5395 if (cave[x+1][y] == Xblank)
5396 cave[x+1][y] = Xacid_splash_e;
5397 if (cave[x-1][y] == Xblank)
5398 cave[x-1][y] = Xacid_splash_w;
5399 play_element_sound(x, y, SOUND_acid, Xacid_1);
5403 cave[x][y+1] = XbumperB;
5406 switch (cave[x-1][y])
5409 case Xacid_splash_e:
5410 case Xacid_splash_w:
5411 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5425 cave[x][y] = Yspring_wB;
5426 next[x][y] = Xblank;
5427 cave[x-1][y] = Yspring_w;
5428 next[x-1][y] = Xspring_w;
5439 cave[x][y] = Yspring_wB;
5440 next[x][y] = Xblank;
5441 if (cave[x][y-1] == Xblank)
5442 cave[x][y-1] = Xacid_splash_e;
5443 if (cave[x-2][y-1] == Xblank)
5444 cave[x-2][y-1] = Xacid_splash_w;
5445 play_element_sound(x, y, SOUND_acid, Xacid_1);
5454 cave[x][y] = Yspring_alien_wB;
5455 next[x][y] = Xblank;
5456 cave[x-1][y] = Yspring_alien_w;
5457 next[x-1][y] = Xspring_w;
5458 play_element_sound(x, y, SOUND_slurp, Xalien);
5459 score += lev.slurp_score;
5464 cave[x-1][y] = XbumperB;
5465 next[x][y] = Xspring_e;
5466 play_element_sound(x, y, SOUND_spring, Xspring);
5470 cave[x][y] = Xspring;
5471 next[x][y] = Xspring;
5472 play_element_sound(x, y, SOUND_spring, Xspring);
5477 static void Lspring_fall(int x, int y)
5479 switch (cave[x][y+1])
5482 case Xacid_splash_e:
5483 case Xacid_splash_w:
5484 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5495 cave[x][y] = Yspring_sB;
5496 next[x][y] = Xblank;
5497 cave[x][y+1] = Yspring_s;
5498 next[x][y+1] = Xspring_fall;
5509 cave[x][y] = Yspring_sB;
5510 next[x][y] = Xblank;
5511 if (cave[x+1][y] == Xblank)
5512 cave[x+1][y] = Xacid_splash_e;
5513 if (cave[x-1][y] == Xblank)
5514 cave[x-1][y] = Xacid_splash_w;
5515 play_element_sound(x, y, SOUND_acid, Xacid_1);
5520 cave[x][y+1] = Ybomb_blank;
5521 Lboom_tank(x, y+1, Xspring_fall);
5532 cave[x][y] = Yspring_sB;
5533 cave[x][y+1] = Ybug_spring;
5534 Lboom_bug(x, y+1, Xspring_fall);
5535 score += lev.bug_score;
5546 cave[x][y] = Yspring_sB;
5547 cave[x][y+1] = Ytank_spring;
5548 Lboom_tank(x, y+1, Xspring_fall);
5549 score += lev.tank_score;
5556 cave[x][y] = Yspring_sB;
5557 cave[x][y+1] = Yeater_spring;
5558 Lboom_eater(x, y+1, Xspring_fall);
5559 score += lev.eater_score;
5564 cave[x][y] = Yspring_sB;
5565 cave[x][y+1] = Yalien_spring;
5566 Lboom_tank(x, y+1, Xspring_fall);
5567 score += lev.alien_score;
5571 cave[x][y] = Xspring;
5572 next[x][y] = Xspring;
5573 play_element_sound(x, y, SOUND_spring, Xspring);
5578 static void Lpush_emerald_e(int x, int y)
5580 switch (cave[x+1][y])
5590 cave[x][y] = Xemerald;
5591 next[x][y] = Xemerald;
5595 cave[x][y] = Yemerald_eB;
5596 next[x][y] = Xblank;
5597 cave[x+1][y] = Yemerald_e;
5598 next[x+1][y] = Xemerald_pause;
5603 static void Lpush_emerald_w(int x, int y)
5605 switch (cave[x-1][y])
5615 cave[x][y] = Xemerald;
5616 next[x][y] = Xemerald;
5620 cave[x][y] = Yemerald_wB;
5621 next[x][y] = Xblank;
5622 cave[x-1][y] = Yemerald_w;
5623 next[x-1][y] = Xemerald_pause;
5628 static void Lpush_diamond_e(int x, int y)
5630 switch (cave[x+1][y])
5640 cave[x][y] = Xdiamond;
5641 next[x][y] = Xdiamond;
5645 cave[x][y] = Ydiamond_eB;
5646 next[x][y] = Xblank;
5647 cave[x+1][y] = Ydiamond_e;
5648 next[x+1][y] = Xdiamond_pause;
5653 static void Lpush_diamond_w(int x, int y)
5655 switch (cave[x-1][y])
5665 cave[x][y] = Xdiamond;
5666 next[x][y] = Xdiamond;
5670 cave[x][y] = Ydiamond_wB;
5671 next[x][y] = Xblank;
5672 cave[x-1][y] = Ydiamond_w;
5673 next[x-1][y] = Xdiamond_pause;
5678 static void Lpush_stone_e(int x, int y)
5680 switch (cave[x+1][y])
5690 cave[x][y] = Xstone;
5691 next[x][y] = Xstone;
5695 cave[x][y] = Ystone_eB;
5696 next[x][y] = Xblank;
5697 cave[x+1][y] = Ystone_e;
5698 next[x+1][y] = Xstone_pause;
5703 static void Lpush_stone_w(int x, int y)
5705 switch (cave[x-1][y])
5715 cave[x][y] = Xstone;
5716 next[x][y] = Xstone;
5720 cave[x][y] = Ystone_wB;
5721 next[x][y] = Xblank;
5722 cave[x-1][y] = Ystone_w;
5723 next[x-1][y] = Xstone_pause;
5728 static void Lpush_bomb_e(int x, int y)
5730 switch (cave[x+1][y])
5745 cave[x][y] = Ybomb_eB;
5746 next[x][y] = Xblank;
5747 cave[x+1][y] = Ybomb_e;
5748 next[x+1][y] = Xbomb_pause;
5753 static void Lpush_bomb_w(int x, int y)
5755 switch (cave[x-1][y])
5770 cave[x][y] = Ybomb_wB;
5771 next[x][y] = Xblank;
5772 cave[x-1][y] = Ybomb_w;
5773 next[x-1][y] = Xbomb_pause;
5778 static void Lpush_nut_e(int x, int y)
5780 switch (cave[x+1][y])
5795 cave[x][y] = Ynut_eB;
5796 next[x][y] = Xblank;
5797 cave[x+1][y] = Ynut_e;
5798 next[x+1][y] = Xnut_pause;
5803 static void Lpush_nut_w(int x, int y)
5805 switch (cave[x-1][y])
5820 cave[x][y] = Ynut_wB;
5821 next[x][y] = Xblank;
5822 cave[x-1][y] = Ynut_w;
5823 next[x-1][y] = Xnut_pause;
5828 static void Lpush_spring_e(int x, int y)
5830 switch (cave[x+1][y])
5840 cave[x][y] = Xspring;
5841 next[x][y] = Xspring;
5845 cave[x][y] = Yspring_eB;
5846 next[x][y] = Xblank;
5847 cave[x+1][y] = Yspring_e;
5848 next[x+1][y] = Xspring_e;
5853 static void Lpush_spring_w(int x, int y)
5855 switch (cave[x-1][y])
5865 cave[x][y] = Xspring;
5866 next[x][y] = Xspring;
5870 cave[x][y] = Yspring_wB;
5871 next[x][y] = Xblank;
5872 cave[x-1][y] = Yspring_w;
5873 next[x-1][y] = Xspring_w;
5878 static void Ldynamite_1(int x, int y)
5880 play_element_sound(x, y, SOUND_tick, Xdynamite_1);
5881 next[x][y] = Xdynamite_2;
5884 static void Ldynamite_2(int x, int y)
5886 play_element_sound(x, y, SOUND_tick, Xdynamite_2);
5887 next[x][y] = Xdynamite_3;
5890 static void Ldynamite_3(int x, int y)
5892 play_element_sound(x, y, SOUND_tick, Xdynamite_3);
5893 next[x][y] = Xdynamite_4;
5896 static void Ldynamite_4(int x, int y)
5898 play_element_sound(x, y, SOUND_tick, Xdynamite_4);
5899 next[x][y] = Zdynamite;
5901 Lboom_generic(x, y, Xblank, Xblank);
5904 static void Lfake_door_1(int x, int y)
5906 if (lev.magnify_cnt)
5907 cave[x][y] = Xdoor_1;
5910 static void Lfake_door_2(int x, int y)
5912 if (lev.magnify_cnt)
5913 cave[x][y] = Xdoor_2;
5916 static void Lfake_door_3(int x, int y)
5918 if (lev.magnify_cnt)
5919 cave[x][y] = Xdoor_3;
5922 static void Lfake_door_4(int x, int y)
5924 if (lev.magnify_cnt)
5925 cave[x][y] = Xdoor_4;
5928 static void Lfake_door_5(int x, int y)
5930 if (lev.magnify_cnt)
5931 cave[x][y] = Xdoor_5;
5934 static void Lfake_door_6(int x, int y)
5936 if (lev.magnify_cnt)
5937 cave[x][y] = Xdoor_6;
5940 static void Lfake_door_7(int x, int y)
5942 if (lev.magnify_cnt)
5943 cave[x][y] = Xdoor_7;
5946 static void Lfake_door_8(int x, int y)
5948 if (lev.magnify_cnt)
5949 cave[x][y] = Xdoor_8;
5952 static void Lballoon(int x, int y)
5954 if (lev.wind_cnt == 0)
5957 switch (lev.wind_direction)
5960 switch (cave[x][y-1])
5963 case Xacid_splash_e:
5964 case Xacid_splash_w:
5965 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
5975 cave[x][y] = Yballoon_nB;
5976 next[x][y] = Xblank;
5977 cave[x][y-1] = Yballoon_n;
5978 next[x][y-1] = Xballoon;
5989 cave[x][y] = Yballoon_nB;
5990 next[x][y] = Xblank;
5991 if (cave[x+1][y-2] == Xblank)
5992 cave[x+1][y-2] = Xacid_splash_e;
5993 if (cave[x-1][y-2] == Xblank)
5994 cave[x-1][y-2] = Xacid_splash_w;
5995 play_element_sound(x, y, SOUND_acid, Xacid_1);
6001 switch (cave[x+1][y])
6004 case Xacid_splash_e:
6005 case Xacid_splash_w:
6006 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6016 cave[x][y] = Yballoon_eB;
6017 next[x][y] = Xblank;
6018 cave[x+1][y] = Yballoon_e;
6019 next[x+1][y] = Xballoon;
6030 cave[x][y] = Yballoon_eB;
6031 next[x][y] = Xblank;
6032 if (cave[x+2][y-1] == Xblank)
6033 cave[x+2][y-1] = Xacid_splash_e;
6034 if (cave[x][y-1] == Xblank)
6035 cave[x][y-1] = Xacid_splash_w;
6036 play_element_sound(x, y, SOUND_acid, Xacid_1);
6042 switch (cave[x][y+1])
6045 case Xacid_splash_e:
6046 case Xacid_splash_w:
6047 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6057 cave[x][y] = Yballoon_sB;
6058 next[x][y] = Xblank;
6059 cave[x][y+1] = Yballoon_s;
6060 next[x][y+1] = Xballoon;
6071 cave[x][y] = Yballoon_sB;
6072 next[x][y] = Xblank;
6073 if (cave[x+1][y] == Xblank)
6074 cave[x+1][y] = Xacid_splash_e;
6075 if (cave[x-1][y] == Xblank)
6076 cave[x-1][y] = Xacid_splash_w;
6077 play_element_sound(x, y, SOUND_acid, Xacid_1);
6083 switch (cave[x-1][y])
6086 case Xacid_splash_e:
6087 case Xacid_splash_w:
6088 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6098 cave[x][y] = Yballoon_wB;
6099 next[x][y] = Xblank;
6100 cave[x-1][y] = Yballoon_w;
6101 next[x-1][y] = Xballoon;
6112 cave[x][y] = Yballoon_wB;
6113 next[x][y] = Xblank;
6114 if (cave[x][y-1] == Xblank)
6115 cave[x][y-1] = Xacid_splash_e;
6116 if (cave[x-2][y-1] == Xblank)
6117 cave[x-2][y-1] = Xacid_splash_w;
6118 play_element_sound(x, y, SOUND_acid, Xacid_1);
6125 static void Lball_common(int x, int y)
6127 play_element_sound(x, y, SOUND_ball, Xball_1);
6129 if (lev.ball_random)
6134 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6135 tab_blank[cave[x-1][y-1]])
6137 cave[x-1][y-1] = Yball_blank;
6138 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6143 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6144 tab_blank[cave[x][y-1]])
6146 cave[x][y-1] = Yball_blank;
6147 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6152 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6153 tab_blank[cave[x+1][y-1]])
6155 cave[x+1][y-1] = Yball_blank;
6156 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6161 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6162 tab_blank[cave[x-1][y]])
6164 cave[x-1][y] = Yball_blank;
6165 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6170 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6171 tab_blank[cave[x+1][y]])
6173 cave[x+1][y] = Yball_blank;
6174 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6179 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6180 tab_blank[cave[x-1][y+1]])
6182 cave[x-1][y+1] = Yball_blank;
6183 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6188 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6189 tab_blank[cave[x][y+1]])
6191 cave[x][y+1] = Yball_blank;
6192 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6197 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6198 tab_blank[cave[x+1][y+1]])
6200 cave[x+1][y+1] = Yball_blank;
6201 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6208 if (lev.ball_array[lev.ball_pos][0] != Xblank &&
6209 tab_blank[cave[x-1][y-1]])
6211 cave[x-1][y-1] = Yball_blank;
6212 next[x-1][y-1] = lev.ball_array[lev.ball_pos][0];
6215 if (lev.ball_array[lev.ball_pos][1] != Xblank &&
6216 tab_blank[cave[x][y-1]])
6218 cave[x][y-1] = Yball_blank;
6219 next[x][y-1] = lev.ball_array[lev.ball_pos][1];
6222 if (lev.ball_array[lev.ball_pos][2] != Xblank &&
6223 tab_blank[cave[x+1][y-1]])
6225 cave[x+1][y-1] = Yball_blank;
6226 next[x+1][y-1] = lev.ball_array[lev.ball_pos][2];
6229 if (lev.ball_array[lev.ball_pos][3] != Xblank &&
6230 tab_blank[cave[x-1][y]])
6232 cave[x-1][y] = Yball_blank;
6233 next[x-1][y] = lev.ball_array[lev.ball_pos][3];
6236 if (lev.ball_array[lev.ball_pos][4] != Xblank &&
6237 tab_blank[cave[x+1][y]])
6239 cave[x+1][y] = Yball_blank;
6240 next[x+1][y] = lev.ball_array[lev.ball_pos][4];
6243 if (lev.ball_array[lev.ball_pos][5] != Xblank &&
6244 tab_blank[cave[x-1][y+1]])
6246 cave[x-1][y+1] = Yball_blank;
6247 next[x-1][y+1] = lev.ball_array[lev.ball_pos][5];
6250 if (lev.ball_array[lev.ball_pos][6] != Xblank &&
6251 tab_blank[cave[x][y+1]])
6253 cave[x][y+1] = Yball_blank;
6254 next[x][y+1] = lev.ball_array[lev.ball_pos][6];
6257 if (lev.ball_array[lev.ball_pos][7] != Xblank &&
6258 tab_blank[cave[x+1][y+1]])
6260 cave[x+1][y+1] = Yball_blank;
6261 next[x+1][y+1] = lev.ball_array[lev.ball_pos][7];
6265 lev.ball_pos = (lev.ball_pos + 1) % lev.num_ball_arrays;
6268 static void Lball_1(int x, int y)
6270 if (lev.ball_state == 0)
6273 cave[x][y] = Yball_1;
6274 next[x][y] = Xball_2;
6281 static void Lball_2(int x, int y)
6283 if (lev.ball_state == 0)
6286 cave[x][y] = Yball_2;
6287 next[x][y] = Xball_1;
6294 static void Ldrip(int x, int y)
6296 next[x][y] = Xdrip_fall;
6299 static void Ldrip_fall(int x, int y)
6303 switch (cave[x][y+1])
6306 case Xacid_splash_e:
6307 case Xacid_splash_w:
6308 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6321 cave[x][y] = Ydrip_1_sB;
6322 next[x][y] = Xdrip_stretchB;
6323 cave[x][y+1] = Ydrip_1_s;
6324 next[x][y+1] = Xdrip_stretch;
6335 cave[x][y] = Ydrip_1_sB;
6336 next[x][y] = Xdrip_stretchB;
6337 if (cave[x+1][y] == Xblank)
6338 cave[x+1][y] = Xacid_splash_e;
6339 if (cave[x-1][y] == Xblank)
6340 cave[x-1][y] = Xacid_splash_w;
6341 play_element_sound(x, y, SOUND_acid, Xacid_1);
6347 case 0: temp = Xamoeba_1; break;
6348 case 1: temp = Xamoeba_2; break;
6349 case 2: temp = Xamoeba_3; break;
6350 case 3: temp = Xamoeba_4; break;
6351 case 4: temp = Xamoeba_5; break;
6352 case 5: temp = Xamoeba_6; break;
6353 case 6: temp = Xamoeba_7; break;
6354 case 7: temp = Xamoeba_8; break;
6359 play_element_sound(x, y, SOUND_drip, Xdrip_fall);
6364 static void Ldrip_stretch(int x, int y)
6366 cave[x][y] = Ydrip_2_s;
6367 next[x][y] = Xdrip_fall;
6370 static void Ldrip_stretchB(int x, int y)
6372 cave[x][y] = Ydrip_2_sB;
6373 next[x][y] = Xblank;
6376 static void Lwonderwall(int x, int y)
6378 if (lev.wonderwall_time && lev.wonderwall_state)
6380 cave[x][y] = XwonderwallB;
6381 play_element_sound(x, y, SOUND_wonder, Xwonderwall);
6385 static void Lwheel(int x, int y)
6387 if (lev.wheel_cnt && x == lev.wheel_x && y == lev.wheel_y)
6388 cave[x][y] = XwheelB;
6391 static void Lswitch(int x, int y)
6394 cave[x][y] = XswitchB;
6397 static void Lfake_blank(int x, int y)
6400 cave[x][y] = Xfake_blankB;
6403 static void Lfake_grass(int x, int y)
6405 if (lev.magnify_cnt)
6406 cave[x][y] = Xfake_grassB;
6409 static void Lfake_amoeba(int x, int y)
6412 cave[x][y] = Xfake_amoebaB;
6415 static void Lsand_stone(int x, int y)
6417 switch (cave[x][y+1])
6420 case Xacid_splash_e:
6421 case Xacid_splash_w:
6422 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6432 cave[x][y] = Xsand_stonesand_quickout_1;
6433 next[x][y] = Xsand_stonesand_quickout_2;
6434 cave[x][y+1] = Xsand_stoneout_1;
6435 next[x][y+1] = Xsand_stoneout_2;
6446 cave[x][y] = Xsand_stonesand_quickout_1;
6447 next[x][y] = Xsand_stonesand_quickout_2;
6448 if (cave[x+1][y] == Xblank)
6449 cave[x+1][y] = Xacid_splash_e;
6450 if (cave[x-1][y] == Xblank)
6451 cave[x-1][y] = Xacid_splash_w;
6452 play_element_sound(x, y, SOUND_acid, Xacid_1);
6456 cave[x][y] = Xsand_stonesand_1;
6457 next[x][y] = Xsand_stonesand_2;
6458 cave[x][y+1] = Xsand_sandstone_1;
6459 next[x][y+1] = Xsand_sandstone_2;
6464 static void Lsand_stonein_1(int x, int y)
6466 next[x][y] = Xsand_stonein_2;
6469 static void Lsand_stonein_2(int x, int y)
6471 next[x][y] = Xsand_stonein_3;
6474 static void Lsand_stonein_3(int x, int y)
6476 next[x][y] = Xsand_stonein_4;
6479 static void Lsand_stonein_4(int x, int y)
6481 next[x][y] = Xblank;
6484 static void Lsand_sandstone_1(int x, int y)
6486 next[x][y] = Xsand_sandstone_2;
6489 static void Lsand_sandstone_2(int x, int y)
6491 next[x][y] = Xsand_sandstone_3;
6494 static void Lsand_sandstone_3(int x, int y)
6496 next[x][y] = Xsand_sandstone_4;
6499 static void Lsand_sandstone_4(int x, int y)
6501 next[x][y] = Xsand_stone;
6504 static void Lsand_stonesand_1(int x, int y)
6506 next[x][y] = Xsand_stonesand_2;
6509 static void Lsand_stonesand_2(int x, int y)
6511 next[x][y] = Xsand_stonesand_3;
6514 static void Lsand_stonesand_3(int x, int y)
6516 next[x][y] = Xsand_stonesand_4;
6519 static void Lsand_stonesand_4(int x, int y)
6524 static void Lsand_stoneout_1(int x, int y)
6526 next[x][y] = Xsand_stoneout_2;
6529 static void Lsand_stoneout_2(int x, int y)
6531 next[x][y] = Xstone_fall;
6534 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6535 static void Lsand_stonesand_quickout_1(int x, int y)
6537 next[x][y] = Xsand_stonesand_quickout_2;
6540 static void Lsand_stonesand_quickout_2(int x, int y)
6546 static void Lslidewall_ns(int x, int y)
6548 if (tab_blank[cave[x][y-1]])
6550 cave[x][y-1] = Yslidewall_ns_blank;
6551 next[x][y-1] = Xslidewall_ns;
6552 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ns);
6555 if (tab_blank[cave[x][y+1]])
6557 cave[x][y+1] = Yslidewall_ns_blank;
6558 next[x][y+1] = Xslidewall_ns;
6559 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ns);
6563 static void Lslidewall_ew(int x, int y)
6565 if (tab_blank[cave[x+1][y]])
6567 cave[x+1][y] = Yslidewall_ew_blank;
6568 next[x+1][y] = Xslidewall_ew;
6569 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ew);
6572 if (tab_blank[cave[x-1][y]])
6574 cave[x-1][y] = Yslidewall_ew_blank;
6575 next[x-1][y] = Xslidewall_ew;
6576 play_element_sound(x, y, SOUND_slidewall, Xslidewall_ew);
6580 static void Lexit(int x, int y)
6582 if (lev.required > 0)
6585 switch (RANDOM(64) / 21)
6588 cave[x][y] = Xexit_1;
6589 next[x][y] = Xexit_2;
6593 cave[x][y] = Xexit_2;
6594 next[x][y] = Xexit_3;
6598 cave[x][y] = Xexit_3;
6599 next[x][y] = Xexit_1;
6603 play_element_sound(x, y, SOUND_exit_open, Xexit);
6606 static void Lexit_1(int x, int y)
6608 next[x][y] = Xexit_2;
6611 static void Lexit_2(int x, int y)
6613 next[x][y] = Xexit_3;
6616 static void Lexit_3(int x, int y)
6618 next[x][y] = Xexit_1;
6621 static void Lpause(int x, int y)
6623 next[x][y] = Xblank;
6626 static void Lamoeba(int x, int y)
6631 case Xacid_splash_e:
6632 case Xacid_splash_w:
6633 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6648 if (tab_amoeba[cave[x][y-1]] ||
6649 tab_amoeba[cave[x+1][y]] ||
6650 tab_amoeba[cave[x][y+1]] ||
6651 tab_amoeba[cave[x-1][y]])
6656 static void Lexplode(int x, int y)
6661 cave[x][y] = Xboom_1;
6662 cave[x][y-1] = tab_explode_normal[cave[x][y-1]];
6663 cave[x-1][y] = tab_explode_normal[cave[x-1][y]];
6664 cave[x+1][y] = tab_explode_normal[cave[x+1][y]];
6665 cave[x][y+1] = tab_explode_normal[cave[x][y+1]];
6666 cave[x-1][y-1] = tab_explode_normal[cave[x-1][y-1]];
6667 cave[x+1][y-1] = tab_explode_normal[cave[x+1][y-1]];
6668 cave[x-1][y+1] = tab_explode_normal[cave[x-1][y+1]];
6669 cave[x+1][y+1] = tab_explode_normal[cave[x+1][y+1]];
6673 cave[x][y] = Xboom_1;
6674 cave[x][y-1] = tab_explode_dynamite[cave[x][y-1]];
6675 cave[x-1][y] = tab_explode_dynamite[cave[x-1][y]];
6676 cave[x+1][y] = tab_explode_dynamite[cave[x+1][y]];
6677 cave[x][y+1] = tab_explode_dynamite[cave[x][y+1]];
6678 cave[x-1][y-1] = tab_explode_dynamite[cave[x-1][y-1]];
6679 cave[x+1][y-1] = tab_explode_dynamite[cave[x+1][y-1]];
6680 cave[x-1][y+1] = tab_explode_dynamite[cave[x-1][y+1]];
6681 cave[x+1][y+1] = tab_explode_dynamite[cave[x+1][y+1]];
6686 static void Lboom_1(int x, int y)
6688 next[x][y] = Xboom_2;
6689 #if !PLAY_ELEMENT_SOUND
6690 if (x != lev.exit_x && y != lev.exit_y)
6691 play_sound(x, y, SOUND_boom);
6693 lev.exit_x = lev.exit_y = -1;
6697 static void Lboom_2(int x, int y)
6699 next[x][y] = boom[x][y];
6702 static void Lboom_android(int x, int y)
6704 #if PLAY_ELEMENT_SOUND
6705 play_element_sound(x, y, SOUND_boom, Xandroid);
6711 static void handle_tile(int x, int y)
6715 case Xacid_1: Lacid_1(x, y); break;
6716 case Xacid_2: Lacid_2(x, y); break;
6717 case Xacid_3: Lacid_3(x, y); break;
6718 case Xacid_4: Lacid_4(x, y); break;
6719 case Xacid_5: Lacid_5(x, y); break;
6720 case Xacid_6: Lacid_6(x, y); break;
6721 case Xacid_7: Lacid_7(x, y); break;
6722 case Xacid_8: Lacid_8(x, y); break;
6724 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6725 case Xfake_acid_1: Lfake_acid_1(x, y); break;
6726 case Xfake_acid_2: Lfake_acid_2(x, y); break;
6727 case Xfake_acid_3: Lfake_acid_3(x, y); break;
6728 case Xfake_acid_4: Lfake_acid_4(x, y); break;
6729 case Xfake_acid_5: Lfake_acid_5(x, y); break;
6730 case Xfake_acid_6: Lfake_acid_6(x, y); break;
6731 case Xfake_acid_7: Lfake_acid_7(x, y); break;
6732 case Xfake_acid_8: Lfake_acid_8(x, y); break;
6735 case Xandroid: Landroid(x, y); break;
6736 case Xandroid_1_n: Landroid_1_n(x, y); break;
6737 case Xandroid_2_n: Landroid_2_n(x, y); break;
6738 case Xandroid_1_e: Landroid_1_e(x, y); break;
6739 case Xandroid_2_e: Landroid_2_e(x, y); break;
6740 case Xandroid_1_s: Landroid_1_s(x, y); break;
6741 case Xandroid_2_s: Landroid_2_s(x, y); break;
6742 case Xandroid_1_w: Landroid_1_w(x, y); break;
6743 case Xandroid_2_w: Landroid_2_w(x, y); break;
6745 case Xeater_n: Leater_n(x, y); break;
6746 case Xeater_e: Leater_e(x, y); break;
6747 case Xeater_s: Leater_s(x, y); break;
6748 case Xeater_w: Leater_w(x, y); break;
6750 case Xalien: Lalien(x, y); break;
6751 case Xalien_pause: Lalien_pause(x, y); break;
6753 case Xbug_1_n: Lbug_1_n(x, y); break;
6754 case Xbug_2_n: Lbug_2_n(x, y); break;
6755 case Xbug_1_e: Lbug_1_e(x, y); break;
6756 case Xbug_2_e: Lbug_2_e(x, y); break;
6757 case Xbug_1_s: Lbug_1_s(x, y); break;
6758 case Xbug_2_s: Lbug_2_s(x, y); break;
6759 case Xbug_1_w: Lbug_1_w(x, y); break;
6760 case Xbug_2_w: Lbug_2_w(x, y); break;
6762 case Xtank_1_n: Ltank_1_n(x, y); break;
6763 case Xtank_2_n: Ltank_2_n(x, y); break;
6764 case Xtank_1_e: Ltank_1_e(x, y); break;
6765 case Xtank_2_e: Ltank_2_e(x, y); break;
6766 case Xtank_1_s: Ltank_1_s(x, y); break;
6767 case Xtank_2_s: Ltank_2_s(x, y); break;
6768 case Xtank_1_w: Ltank_1_w(x, y); break;
6769 case Xtank_2_w: Ltank_2_w(x, y); break;
6771 case Xemerald: Lemerald(x, y); break;
6772 case Xemerald_pause: Lemerald_pause(x, y); break;
6773 case Xemerald_fall: Lemerald_fall(x, y); break;
6775 case Xdiamond: Ldiamond(x, y); break;
6776 case Xdiamond_pause: Ldiamond_pause(x, y); break;
6777 case Xdiamond_fall: Ldiamond_fall(x, y); break;
6779 case Xstone: Lstone(x, y); break;
6780 case Xstone_pause: Lstone_pause(x, y); break;
6781 case Xstone_fall: Lstone_fall(x, y); break;
6783 case Xbomb: Lbomb(x, y); break;
6784 case Xbomb_pause: Lbomb_pause(x, y); break;
6785 case Xbomb_fall: Lbomb_fall(x, y); break;
6787 case Xnut: Lnut(x, y); break;
6788 case Xnut_pause: Lnut_pause(x, y); break;
6789 case Xnut_fall: Lnut_fall(x, y); break;
6791 case Xspring: Lspring(x, y); break;
6792 case Xspring_pause: Lspring_pause(x, y); break;
6793 case Xspring_e: Lspring_e(x, y); break;
6794 case Xspring_w: Lspring_w(x, y); break;
6795 case Xspring_fall: Lspring_fall(x, y); break;
6797 case Xpush_emerald_e: Lpush_emerald_e(x, y); break;
6798 case Xpush_emerald_w: Lpush_emerald_w(x, y); break;
6799 case Xpush_diamond_e: Lpush_diamond_e(x, y); break;
6800 case Xpush_diamond_w: Lpush_diamond_w(x, y); break;
6801 case Xpush_stone_e: Lpush_stone_e(x, y); break;
6802 case Xpush_stone_w: Lpush_stone_w(x, y); break;
6803 case Xpush_bomb_e: Lpush_bomb_e(x, y); break;
6804 case Xpush_bomb_w: Lpush_bomb_w(x, y); break;
6805 case Xpush_nut_e: Lpush_nut_e(x, y); break;
6806 case Xpush_nut_w: Lpush_nut_w(x, y); break;
6807 case Xpush_spring_e: Lpush_spring_e(x, y); break;
6808 case Xpush_spring_w: Lpush_spring_w(x, y); break;
6810 case Xdynamite_1: Ldynamite_1(x, y); break;
6811 case Xdynamite_2: Ldynamite_2(x, y); break;
6812 case Xdynamite_3: Ldynamite_3(x, y); break;
6813 case Xdynamite_4: Ldynamite_4(x, y); break;
6815 case Xfake_door_1: Lfake_door_1(x, y); break;
6816 case Xfake_door_2: Lfake_door_2(x, y); break;
6817 case Xfake_door_3: Lfake_door_3(x, y); break;
6818 case Xfake_door_4: Lfake_door_4(x, y); break;
6819 case Xfake_door_5: Lfake_door_5(x, y); break;
6820 case Xfake_door_6: Lfake_door_6(x, y); break;
6821 case Xfake_door_7: Lfake_door_7(x, y); break;
6822 case Xfake_door_8: Lfake_door_8(x, y); break;
6824 case Xballoon: Lballoon(x, y); break;
6826 case Xball_1: Lball_1(x, y); break;
6827 case Xball_2: Lball_2(x, y); break;
6829 case Xdrip: Ldrip(x, y); break;
6830 case Xdrip_fall: Ldrip_fall(x, y); break;
6831 case Xdrip_stretch: Ldrip_stretch(x, y); break;
6832 case Xdrip_stretchB: Ldrip_stretchB(x, y); break;
6834 case Xwonderwall: Lwonderwall(x, y); break;
6836 case Xwheel: Lwheel(x, y); break;
6838 case Xswitch: Lswitch(x, y); break;
6840 case Xfake_blank: Lfake_blank(x, y); break;
6841 case Xfake_grass: Lfake_grass(x, y); break;
6842 case Xfake_amoeba: Lfake_amoeba(x, y); break;
6844 case Xsand_stone: Lsand_stone(x, y); break;
6845 case Xsand_stonein_1: Lsand_stonein_1(x, y); break;
6846 case Xsand_stonein_2: Lsand_stonein_2(x, y); break;
6847 case Xsand_stonein_3: Lsand_stonein_3(x, y); break;
6848 case Xsand_stonein_4: Lsand_stonein_4(x, y); break;
6849 case Xsand_sandstone_1: Lsand_sandstone_1(x, y); break;
6850 case Xsand_sandstone_2: Lsand_sandstone_2(x, y); break;
6851 case Xsand_sandstone_3: Lsand_sandstone_3(x, y); break;
6852 case Xsand_sandstone_4: Lsand_sandstone_4(x, y); break;
6853 case Xsand_stonesand_1: Lsand_stonesand_1(x, y); break;
6854 case Xsand_stonesand_2: Lsand_stonesand_2(x, y); break;
6855 case Xsand_stonesand_3: Lsand_stonesand_3(x, y); break;
6856 case Xsand_stonesand_4: Lsand_stonesand_4(x, y); break;
6857 case Xsand_stoneout_1: Lsand_stoneout_1(x, y); break;
6858 case Xsand_stoneout_2: Lsand_stoneout_2(x, y); break;
6859 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
6860 case Xsand_stonesand_quickout_1: Lsand_stonesand_quickout_1(x, y); break;
6861 case Xsand_stonesand_quickout_2: Lsand_stonesand_quickout_2(x, y); break;
6864 case Xslidewall_ns: Lslidewall_ns(x, y); break;
6865 case Xslidewall_ew: Lslidewall_ew(x, y); break;
6867 case Xexit: Lexit(x, y); break;
6868 case Xexit_1: Lexit_1(x, y); break;
6869 case Xexit_2: Lexit_2(x, y); break;
6870 case Xexit_3: Lexit_3(x, y); break;
6872 case Xpause: Lpause(x, y); break;
6874 case Xboom_bug: Lboom_bug(x, y, Xboom_bug); break;
6875 case Xboom_bomb: Lboom_tank(x, y, Xboom_bomb); break;
6876 case Xboom_android: Lboom_android(x, y); break;
6877 case Xboom_1: Lboom_1(x, y); break;
6878 case Xboom_2: Lboom_2(x, y); break;
6891 game_em.any_player_moving = FALSE;
6892 game_em.any_player_snapping = FALSE;
6894 /* must test for death and actually kill separately */
6895 for (i = 0; i < MAX_PLAYERS; i++)
6897 boolean ply_kill = player_killed(&ply[i]);
6899 if (ply[i].alive && ply_kill)
6900 kill_player(&ply[i]);
6903 for (i = 0; i < MAX_PLAYERS; i++)
6905 /* check for wrap-around movement */
6906 if (ply[i].x < lev.left ||
6907 ply[i].x > lev.right - 1)
6909 ply[i].x = (ply[i].x < lev.left ? lev.right - 1 : lev.left);
6911 game.centered_player_nr_next = i;
6912 game.set_centered_player = TRUE;
6913 game.set_centered_player_fast = TRUE;
6916 ply[i].oldx = ply[i].x;
6917 ply[i].oldy = ply[i].y;
6918 ply[i].anim = PLY_still;
6921 start_check_nr = (RandomEM & 128 ? 0 : 1) * 2 + (RandomEM & 256 ? 0 : 1);
6923 for (i = 0; i < MAX_PLAYERS; i++)
6925 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
6927 if (ply[check_nr].alive)
6928 check_player(&ply[check_nr]);
6931 for (i = 0; i < MAX_PLAYERS; i++)
6936 if (cave[ply[i].oldx][ply[i].oldy] == Zplayer)
6938 cave[ply[i].oldx][ply[i].oldy] = Xblank;
6939 next[ply[i].oldx][ply[i].oldy] = Xblank;
6942 if (cave[ply[i].x][ply[i].y] == Xblank)
6944 cave[ply[i].x][ply[i].y] = Zplayer;
6945 next[ply[i].x][ply[i].y] = Zplayer;
6961 for (y = lev.top; y < lev.bottom; y++)
6962 for (x = lev.left; x < lev.right; x++)
6965 if (ply[0].alive || ply[1].alive || ply[2].alive || ply[3].alive)
6966 lev.score += score; /* only add a score if someone is alive */
6968 game_em.game_over = TRUE;
6972 /* triple buffering */
6973 void *temp = lev.cave;
6974 lev.cave = lev.next;
6975 lev.next = lev.draw;
6984 unsigned int random;
6990 /* update variables */
6992 if (lev.score > 9999)
6995 if (lev.android_move_cnt-- == 0)
6996 lev.android_move_cnt = lev.android_move_time;
6997 if (lev.android_clone_cnt-- == 0)
6998 lev.android_clone_cnt = lev.android_clone_time;
7000 if (lev.ball_cnt-- == 0)
7001 lev.ball_cnt = lev.ball_time;
7004 if (lev.magnify_cnt)
7010 if (lev.wonderwall_time && lev.wonderwall_state)
7011 lev.wonderwall_time--;
7014 play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
7020 for (count = lev.amoeba_time; count--;)
7022 x = lev.left - 1 + (random >> 10) % (CAVE_WIDTH + 2);
7023 y = lev.top - 1 + (random >> 20) % (CAVE_HEIGHT + 2);
7025 if (x >= lev.left && x < lev.right &&
7026 y >= lev.top && y < lev.bottom)
7029 random = random * 129 + 1;
7034 /* handle explosions */
7036 for (y = lev.top; y < lev.bottom; y++)
7037 for (x = lev.left; x < lev.right; x++)
7040 /* triple buffering */
7042 for (y = lev.top; y < lev.bottom; y++)
7043 for (x = lev.left; x < lev.right; x++)
7044 next[x][y] = cave[x][y];