added pushed objects going into acid (with compile time option)
[rocksndiamonds.git] / src / game_em / logic.c
index 19930d24eba7d12cf920d40f787907ebca1fd2be..e149fc6f0561cee15d147667d7855e7a029a064a 100644 (file)
@@ -9,6 +9,8 @@
 
 
 #define SPRING_ROLL    /* spring rolling off round things continues to roll */
+#define ACID_ROLL      /* rolling objects go into acid rather than remove it */
+
 #define USE_CHANGED_ACID_STUFF
 
 #define RANDOM_RAW     (seed = seed << 31 | seed >> 1)
@@ -533,7 +535,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
        next[x][y] = Zplayer;
        play_element_sound(x, y, SOUND_collect, element);
        lev.score += lev.diamond_score;
-       lev.required = lev.required < 3 ? 0 : lev.required - 3;
+       lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
        game.snapshot.collected_item = TRUE;
        ply->anim = PLY_walk_n + anim;
        ply->x = x;
@@ -546,7 +548,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
        next[x][y] = Zplayer;
        play_element_sound(x, y, SOUND_collect, element);
        lev.score += lev.emerald_score;
-       lev.required = lev.required < 1 ? 0 : lev.required - 1;
+       lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
        game.snapshot.collected_item = TRUE;
        ply->anim = PLY_walk_n + anim;
        ply->x = x;
@@ -1124,7 +1126,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
        next[x][y] = Xblank;
        play_element_sound(x, y, SOUND_collect, element);
        lev.score += lev.diamond_score;
-       lev.required = lev.required < 3 ? 0 : lev.required - 3;
+       lev.gems_needed = lev.gems_needed < 3 ? 0 : lev.gems_needed - 3;
        game.snapshot.collected_item = TRUE;
        ply->anim = PLY_walk_n + anim;
        break;
@@ -1135,7 +1137,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
        next[x][y] = Xblank;
        play_element_sound(x, y, SOUND_collect, element);
        lev.score += lev.emerald_score;
-       lev.required = lev.required < 1 ? 0 : lev.required - 1;
+       lev.gems_needed = lev.gems_needed < 1 ? 0 : lev.gems_needed - 1;
        game.snapshot.collected_item = TRUE;
        ply->anim = PLY_walk_n + anim;
        break;
@@ -3713,6 +3715,7 @@ static void Lemerald(int x, int y)
     case Xwonderwall:
     case Xswitch:
     case Xbumper:
+    case Ybumper:
     case Xacid_ne:
     case Xacid_nw:
     case Xslide_ns:
@@ -3737,6 +3740,8 @@ static void Lemerald(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Yemerald_e;
          next[x+1][y] = Xemerald_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -3746,6 +3751,8 @@ static void Lemerald(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Yemerald_w;
          next[x-1][y] = Xemerald_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -3757,6 +3764,8 @@ static void Lemerald(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Yemerald_w;
          next[x-1][y] = Xemerald_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -3766,6 +3775,8 @@ static void Lemerald(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Yemerald_e;
          next[x+1][y] = Xemerald_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -3963,6 +3974,7 @@ static void Ldiamond(int x, int y)
     case Xwonderwall:
     case Xswitch:
     case Xbumper:
+    case Ybumper:
     case Xacid_ne:
     case Xacid_nw:
     case Xslide_ns:
@@ -3987,6 +3999,8 @@ static void Ldiamond(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ydiamond_e;
          next[x+1][y] = Xdiamond_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -3996,6 +4010,8 @@ static void Ldiamond(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ydiamond_w;
          next[x-1][y] = Xdiamond_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4007,6 +4023,8 @@ static void Ldiamond(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ydiamond_w;
          next[x-1][y] = Xdiamond_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4016,6 +4034,8 @@ static void Ldiamond(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ydiamond_e;
          next[x+1][y] = Xdiamond_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4221,6 +4241,7 @@ static void Lstone(int x, int y)
     case Xball_2:
     case Xswitch:
     case Xbumper:
+    case Ybumper:
     case Xacid_ne:
     case Xacid_nw:
     case Xlenses:
@@ -4239,6 +4260,8 @@ static void Lstone(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ystone_e;
          next[x+1][y] = Xstone_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4248,6 +4271,8 @@ static void Lstone(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ystone_w;
          next[x-1][y] = Xstone_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4259,6 +4284,8 @@ static void Lstone(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ystone_w;
          next[x-1][y] = Xstone_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4268,6 +4295,8 @@ static void Lstone(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ystone_e;
          next[x+1][y] = Xstone_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4640,6 +4669,7 @@ static void Lbomb(int x, int y)
     case Xball_2:
     case Xswitch:
     case Xbumper:
+    case Ybumper:
     case Xacid_ne:
     case Xacid_nw:
     case Xslide_ns:
@@ -4656,6 +4686,8 @@ static void Lbomb(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ybomb_e;
          next[x+1][y] = Xbomb_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4665,6 +4697,8 @@ static void Lbomb(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ybomb_w;
          next[x-1][y] = Xbomb_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4676,6 +4710,8 @@ static void Lbomb(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ybomb_w;
          next[x-1][y] = Xbomb_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4685,6 +4721,8 @@ static void Lbomb(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ybomb_e;
          next[x+1][y] = Xbomb_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4855,6 +4893,7 @@ static void Lnut(int x, int y)
     case Xball_2:
     case Xswitch:
     case Xbumper:
+    case Ybumper:
     case Xacid_ne:
     case Xacid_nw:
     case Xslide_ns:
@@ -4871,6 +4910,8 @@ static void Lnut(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ynut_e;
          next[x+1][y] = Xnut_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4880,6 +4921,8 @@ static void Lnut(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ynut_w;
          next[x-1][y] = Xnut_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -4891,6 +4934,8 @@ static void Lnut(int x, int y)
          next[x][y] = Xblank;
          cave[x-1][y] = Ynut_w;
          next[x-1][y] = Xnut_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -4900,6 +4945,8 @@ static void Lnut(int x, int y)
          next[x][y] = Xblank;
          cave[x+1][y] = Ynut_e;
          next[x+1][y] = Xnut_pause;
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -5074,6 +5121,7 @@ static void Lspring(int x, int y)
     case Xball_2:
     case Xswitch:
     case Xbumper:
+    case Ybumper:
     case Xacid_ne:
     case Xacid_nw:
     case Xslide_ns:
@@ -5089,14 +5137,13 @@ static void Lspring(int x, int y)
          cave[x][y] = Yspring_eB;
          next[x][y] = Xblank;
          cave[x+1][y] = Yspring_e;
-         if (cave[x][y+1] == Xbumper)
-           cave[x][y+1] = Ybumper;
-
 #ifdef SPRING_ROLL
          next[x+1][y] = Xspring_e;
 #else
          next[x+1][y] = Xspring_pause;
 #endif
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -5105,14 +5152,13 @@ static void Lspring(int x, int y)
          cave[x][y] = Yspring_wB;
          next[x][y] = Xblank;
          cave[x-1][y] = Yspring_w;
-         if (cave[x][y+1] == Xbumper)
-           cave[x][y+1] = Ybumper;
-
 #ifdef SPRING_ROLL
          next[x-1][y] = Xspring_w;
 #else
          next[x-1][y] = Xspring_pause;
 #endif
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -5123,14 +5169,13 @@ static void Lspring(int x, int y)
          cave[x][y] = Yspring_wB;
          next[x][y] = Xblank;
          cave[x-1][y] = Yspring_w;
-         if (cave[x][y+1] == Xbumper)
-           cave[x][y+1] = Ybumper;
-
 #ifdef SPRING_ROLL
          next[x-1][y] = Xspring_w;
 #else
          next[x-1][y] = Xspring_pause;
 #endif
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
 
@@ -5139,14 +5184,13 @@ static void Lspring(int x, int y)
          cave[x][y] = Yspring_eB;
          next[x][y] = Xblank;
          cave[x+1][y] = Yspring_e;
-         if (cave[x][y+1] == Xbumper)
-           cave[x][y+1] = Ybumper;
-
 #ifdef SPRING_ROLL
          next[x+1][y] = Xspring_e;
 #else
          next[x+1][y] = Xspring_pause;
 #endif
+         if (cave[x][y+1] == Xbumper)
+           cave[x][y+1] = Ybumper;
          return;
        }
       }
@@ -5535,6 +5579,25 @@ static void Lpush_emerald_e(int x, int y)
       next[x][y] = Xemerald;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Yemerald_eB;
+      next[x][y] = Xblank;
+      if (cave[x+2][y-1] == Xblank)
+       cave[x+2][y-1] = Xsplash_e;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Yemerald_eB;
       next[x][y] = Xblank;
@@ -5560,6 +5623,25 @@ static void Lpush_emerald_w(int x, int y)
       next[x][y] = Xemerald;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Yemerald_wB;
+      next[x][y] = Xblank;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_e;
+      if (cave[x-2][y-1] == Xblank)
+       cave[x-2][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Yemerald_wB;
       next[x][y] = Xblank;
@@ -5585,6 +5667,25 @@ static void Lpush_diamond_e(int x, int y)
       next[x][y] = Xdiamond;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ydiamond_eB;
+      next[x][y] = Xblank;
+      if (cave[x+2][y-1] == Xblank)
+       cave[x+2][y-1] = Xsplash_e;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ydiamond_eB;
       next[x][y] = Xblank;
@@ -5610,6 +5711,25 @@ static void Lpush_diamond_w(int x, int y)
       next[x][y] = Xdiamond;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ydiamond_wB;
+      next[x][y] = Xblank;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_e;
+      if (cave[x-2][y-1] == Xblank)
+       cave[x-2][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ydiamond_wB;
       next[x][y] = Xblank;
@@ -5635,6 +5755,25 @@ static void Lpush_stone_e(int x, int y)
       next[x][y] = Xstone;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ystone_eB;
+      next[x][y] = Xblank;
+      if (cave[x+2][y-1] == Xblank)
+       cave[x+2][y-1] = Xsplash_e;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ystone_eB;
       next[x][y] = Xblank;
@@ -5660,6 +5799,25 @@ static void Lpush_stone_w(int x, int y)
       next[x][y] = Xstone;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ystone_wB;
+      next[x][y] = Xblank;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_e;
+      if (cave[x-2][y-1] == Xblank)
+       cave[x-2][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ystone_wB;
       next[x][y] = Xblank;
@@ -5685,6 +5843,25 @@ static void Lpush_bomb_e(int x, int y)
       next[x][y] = Xbomb;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ybomb_eB;
+      next[x][y] = Xblank;
+      if (cave[x+2][y-1] == Xblank)
+       cave[x+2][y-1] = Xsplash_e;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ybomb_eB;
       next[x][y] = Xblank;
@@ -5710,6 +5887,25 @@ static void Lpush_bomb_w(int x, int y)
       next[x][y] = Xbomb;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ybomb_wB;
+      next[x][y] = Xblank;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_e;
+      if (cave[x-2][y-1] == Xblank)
+       cave[x-2][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ybomb_wB;
       next[x][y] = Xblank;
@@ -5735,6 +5931,25 @@ static void Lpush_nut_e(int x, int y)
       next[x][y] = Xnut;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ynut_eB;
+      next[x][y] = Xblank;
+      if (cave[x+2][y-1] == Xblank)
+       cave[x+2][y-1] = Xsplash_e;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ynut_eB;
       next[x][y] = Xblank;
@@ -5760,6 +5975,25 @@ static void Lpush_nut_w(int x, int y)
       next[x][y] = Xnut;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Ynut_wB;
+      next[x][y] = Xblank;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_e;
+      if (cave[x-2][y-1] == Xblank)
+       cave[x-2][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Ynut_wB;
       next[x][y] = Xblank;
@@ -5785,6 +6019,25 @@ static void Lpush_spring_e(int x, int y)
       next[x][y] = Xspring;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Yspring_eB;
+      next[x][y] = Xblank;
+      if (cave[x+2][y-1] == Xblank)
+       cave[x+2][y-1] = Xsplash_e;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Yspring_eB;
       next[x][y] = Xblank;
@@ -5810,6 +6063,25 @@ static void Lpush_spring_w(int x, int y)
       next[x][y] = Xspring;
       return;
 
+#ifdef ACID_ROLL
+    case Xacid_1:
+    case Xacid_2:
+    case Xacid_3:
+    case Xacid_4:
+    case Xacid_5:
+    case Xacid_6:
+    case Xacid_7:
+    case Xacid_8:
+      cave[x][y] = Yspring_wB;
+      next[x][y] = Xblank;
+      if (cave[x][y-1] == Xblank)
+       cave[x][y-1] = Xsplash_e;
+      if (cave[x-2][y-1] == Xblank)
+       cave[x-2][y-1] = Xsplash_w;
+      play_element_sound(x, y, SOUND_acid, Xacid_1);
+      return;
+#endif
+
     default:
       cave[x][y] = Yspring_wB;
       next[x][y] = Xblank;
@@ -6509,7 +6781,7 @@ static void Lslide_ew(int x, int y)
 
 static void Lexit(int x, int y)
 {
-  if (lev.required > 0)
+  if (lev.gems_needed > 0)
     return;
 
   switch (RANDOM(64) / 21)