renamed some functions
[rocksndiamonds.git] / src / game.c
index e22a7367d4e296ffc6a0975c2723db1eed6dbdcc..5bf2c6a47488c989818e6c7e1f2d30c545249942 100644 (file)
@@ -4,7 +4,7 @@
 // (c) 1995-2014 by Artsoft Entertainment
 //                         Holger Schemel
 //                 info@artsoft.org
-//                 http://www.artsoft.org/
+//                 https://www.artsoft.org/
 // ----------------------------------------------------------------------------
 // game.c
 // ============================================================================
@@ -1092,8 +1092,8 @@ static void FadeLevelSoundsAndMusic(void);
 
 static void HandleGameButtons(struct GadgetInfo *);
 
-int AmoebeNachbarNr(int, int);
-void AmoebeUmwandeln(int, int);
+int AmoebaNeighbourNr(int, int);
+void AmoebaToDiamond(int, int);
 void ContinueMoving(int, int);
 void Bang(int, int);
 void InitMovDir(int, int);
@@ -1785,7 +1785,7 @@ static void InitPlayerField(int x, int y, int element, boolean init_game)
     player->jy = player->last_jy = y;
   }
 
-  if (!init_game)
+  // always check if player was just killed and should be reanimated
   {
     int player_nr = GET_PLAYER_NR(element);
     struct PlayerInfo *player = &stored_player[player_nr];
@@ -1877,6 +1877,8 @@ static void InitField(int x, int y, boolean init_game)
     case EL_MOLE_RIGHT:
     case EL_MOLE_UP:
     case EL_MOLE_DOWN:
+    case EL_SPRING_LEFT:
+    case EL_SPRING_RIGHT:
       InitMovDir(x, y);
       break;
 
@@ -2840,6 +2842,19 @@ static void InitGameEngine(void)
     game.team_mode = (num_players > 1);
   }
 
+#if 0
+  printf("level %d: level.game_version  == %06d\n", level_nr,
+        level.game_version);
+  printf("          tape.file_version   == %06d\n",
+        tape.file_version);
+  printf("          tape.game_version   == %06d\n",
+        tape.game_version);
+  printf("          tape.engine_version == %06d\n",
+        tape.engine_version);
+  printf("       => game.engine_version == %06d [tape mode: %s]\n",
+        game.engine_version, (tape.playing ? "PLAYING" : "RECORDING"));
+#endif
+
   // --------------------------------------------------------------------------
   // set flags for bugs and changes according to active game engine version
   // --------------------------------------------------------------------------
@@ -2852,12 +2867,12 @@ static void InitGameEngine(void)
     2.0.1
 
     Bug was fixed in version:
-    4.1.4.2
+    4.2.0.0
 
     Description:
     In version 2.0.1, a new run-time element "EL_AMOEBA_DROPPING" was added,
     but the property "can fall" was missing, which caused some levels to be
-    unsolvable. This was fixed in version 4.1.4.2.
+    unsolvable. This was fixed in version 4.2.0.0.
 
     Affected levels/tapes:
     An example for a tape that was fixed by this bugfix is tape 029 from the
@@ -2869,10 +2884,10 @@ static void InitGameEngine(void)
 
   boolean use_amoeba_dropping_cannot_fall_bug =
     ((game.engine_version >= VERSION_IDENT(2,0,1,0) &&
-      game.engine_version <= VERSION_IDENT(4,1,4,1)) ||
+      game.engine_version <  VERSION_IDENT(4,2,0,0)) ||
      (tape.playing &&
       tape.game_version >= VERSION_IDENT(2,0,1,0) &&
-      tape.game_version <= VERSION_IDENT(4,1,4,1)));
+      tape.game_version <  VERSION_IDENT(4,2,0,0)));
 
   /*
     Summary of bugfix/change:
@@ -2893,7 +2908,7 @@ static void InitGameEngine(void)
     The second condition is an exception from the above case and is needed for
     the special case of tapes recorded with game (not engine!) version 2.0.1 or
     above, but before it was known that this change would break tapes like the
-    above and was fixed in 4.1.4.2, so that the changed behaviour was active
+    above and was fixed in 4.2.0.0, so that the changed behaviour was active
     although the engine version while recording maybe was before 2.0.1. There
     are a lot of tapes that are affected by this exception, like tape 006 from
     the level set "rnd_conor_mancone".
@@ -2903,7 +2918,7 @@ static void InitGameEngine(void)
     (game.engine_version < VERSION_IDENT(2,0,1,0) &&
      !(tape.playing &&
        tape.game_version >= VERSION_IDENT(2,0,1,0) &&
-       tape.game_version <  VERSION_IDENT(4,1,4,2)));
+       tape.game_version <  VERSION_IDENT(4,2,0,0)));
 
   /*
     Summary of bugfix/change:
@@ -2975,8 +2990,17 @@ static void InitGameEngine(void)
   game_em.use_snap_key_bug =
     (game.engine_version < VERSION_IDENT(4,0,1,0));
 
-  game_em.use_old_explosions =
-    (game.engine_version < VERSION_IDENT(4,1,4,2));
+  game_em.use_random_bug =
+    (tape.property_bits & TAPE_PROPERTY_EM_RANDOM_BUG);
+
+  boolean use_old_em_engine = (game.engine_version < VERSION_IDENT(4,2,0,0));
+
+  game_em.use_old_explosions           = use_old_em_engine;
+  game_em.use_old_android              = use_old_em_engine;
+  game_em.use_old_push_elements                = use_old_em_engine;
+  game_em.use_old_push_into_acid       = use_old_em_engine;
+
+  game_em.use_wrap_around              = !use_old_em_engine;
 
   // --------------------------------------------------------------------------
 
@@ -2991,18 +3015,10 @@ static void InitGameEngine(void)
 
   // ---------- initialize special element properties -------------------------
 
-  // "EL_AMOEBA_DROPPING" missed property "can fall" between 2.0.1 and 4.1.4.1
+  // "EL_AMOEBA_DROPPING" missed property "can fall" in older game versions
   if (use_amoeba_dropping_cannot_fall_bug)
     SET_PROPERTY(EL_AMOEBA_DROPPING, EP_CAN_FALL, FALSE);
 
-#if 0
-  printf("level %d: level version == %06d\n", level_nr, level.game_version);
-  printf("          tape version == %06d [%s] [file: %06d]\n",
-        tape.engine_version, (tape.playing ? "PLAYING" : "RECORDING"),
-        tape.file_version);
-  printf("       => game.engine_version == %06d\n", game.engine_version);
-#endif
-
   // ---------- initialize player's initial move delay ------------------------
 
   // dynamically adjust player properties according to level information
@@ -4389,12 +4405,6 @@ void UpdateEngineValues(int actual_scroll_x, int actual_scroll_y,
 {
   // this is used for non-R'n'D game engines to update certain engine values
 
-  if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
-  {
-    actual_player_x = correctLevelPosX_EM(actual_player_x);
-    actual_player_y = correctLevelPosY_EM(actual_player_y);
-  }
-
   // needed to determine if sounds are played within the visible screen area
   scroll_x = actual_scroll_x;
   scroll_y = actual_scroll_y;
@@ -4487,6 +4497,12 @@ void InitMovDir(int x, int y)
       MovDir[x][y] = direction[2][element - EL_MOLE_LEFT];
       break;
 
+    case EL_SPRING_LEFT:
+    case EL_SPRING_RIGHT:
+      Feld[x][y] = EL_SPRING;
+      MovDir[x][y] = direction[2][element - EL_SPRING_LEFT];
+      break;
+
     default:
       if (IS_CUSTOM_ELEMENT(element))
       {
@@ -4583,7 +4599,7 @@ void InitMovDir(int x, int y)
 void InitAmoebaNr(int x, int y)
 {
   int i;
-  int group_nr = AmoebeNachbarNr(x, y);
+  int group_nr = AmoebaNeighbourNr(x, y);
 
   if (group_nr == 0)
   {
@@ -5753,7 +5769,7 @@ static void Explode(int ex, int ey, int phase, int mode)
     }
     else if (border_element == EL_AMOEBA_TO_DIAMOND)
     {
-      AmoebeUmwandeln(x, y);
+      AmoebaToDiamond(x, y);
       Store2[x][y] = 0;
       border_explosion = TRUE;
     }
@@ -8674,7 +8690,7 @@ void ContinueMoving(int x, int y)
                             MV_DIR_OPPOSITE(direction));
 }
 
-int AmoebeNachbarNr(int ax, int ay)
+int AmoebaNeighbourNr(int ax, int ay)
 {
   int i;
   int element = Feld[ax][ay];
@@ -8702,7 +8718,7 @@ int AmoebeNachbarNr(int ax, int ay)
   return group_nr;
 }
 
-static void AmoebenVereinigen(int ax, int ay)
+static void AmoebaMerge(int ax, int ay)
 {
   int i, x, y, xx, yy;
   int new_group_nr = AmoebaNr[ax][ay];
@@ -8749,7 +8765,7 @@ static void AmoebenVereinigen(int ax, int ay)
   }
 }
 
-void AmoebeUmwandeln(int ax, int ay)
+void AmoebaToDiamond(int ax, int ay)
 {
   int i, x, y;
 
@@ -8760,8 +8776,8 @@ void AmoebeUmwandeln(int ax, int ay)
 #ifdef DEBUG
     if (group_nr == 0)
     {
-      printf("AmoebeUmwandeln(): ax = %d, ay = %d\n", ax, ay);
-      printf("AmoebeUmwandeln(): This should never happen!\n");
+      printf("AmoebaToDiamond(): ax = %d, ay = %d\n", ax, ay);
+      printf("AmoebaToDiamond(): This should never happen!\n");
       return;
     }
 #endif
@@ -8809,7 +8825,7 @@ void AmoebeUmwandeln(int ax, int ay)
   }
 }
 
-static void AmoebeUmwandelnBD(int ax, int ay, int new_element)
+static void AmoebaToDiamondBD(int ax, int ay, int new_element)
 {
   int x, y;
   int group_nr = AmoebaNr[ax][ay];
@@ -8818,8 +8834,8 @@ static void AmoebeUmwandelnBD(int ax, int ay, int new_element)
 #ifdef DEBUG
   if (group_nr == 0)
   {
-    printf("AmoebeUmwandelnBD(): ax = %d, ay = %d\n", ax, ay);
-    printf("AmoebeUmwandelnBD(): This should never happen!\n");
+    printf("AmoebaToDiamondBD(): ax = %d, ay = %d\n", ax, ay);
+    printf("AmoebaToDiamondBD(): This should never happen!\n");
     return;
   }
 #endif
@@ -8845,7 +8861,7 @@ static void AmoebeUmwandelnBD(int ax, int ay, int new_element)
                            SND_BD_AMOEBA_TURNING_TO_GEM));
 }
 
-static void AmoebeWaechst(int x, int y)
+static void AmoebaGrowing(int x, int y)
 {
   static unsigned int sound_delay = 0;
   static unsigned int sound_delay_value = 0;
@@ -8881,7 +8897,7 @@ static void AmoebeWaechst(int x, int y)
   }
 }
 
-static void AmoebaDisappearing(int x, int y)
+static void AmoebaShrinking(int x, int y)
 {
   static unsigned int sound_delay = 0;
   static unsigned int sound_delay_value = 0;
@@ -8917,7 +8933,7 @@ static void AmoebaDisappearing(int x, int y)
   }
 }
 
-static void AmoebeAbleger(int ax, int ay)
+static void AmoebaReproduce(int ax, int ay)
 {
   int i;
   int element = Feld[ax][ay];
@@ -9011,9 +9027,9 @@ static void AmoebeAbleger(int ax, int ay)
        if (AmoebaCnt[AmoebaNr[ax][ay]] <= 0)   // amoeba is completely dead
        {
          if (element == EL_AMOEBA_FULL)
-           AmoebeUmwandeln(ax, ay);
+           AmoebaToDiamond(ax, ay);
          else if (element == EL_BD_AMOEBA)
-           AmoebeUmwandelnBD(ax, ay, level.amoeba_content);
+           AmoebaToDiamondBD(ax, ay, level.amoeba_content);
        }
       }
       return;
@@ -9027,8 +9043,8 @@ static void AmoebeAbleger(int ax, int ay)
 #ifdef DEBUG
   if (new_group_nr == 0)
   {
-    printf("AmoebeAbleger(): newax = %d, neway = %d\n", newax, neway);
-    printf("AmoebeAbleger(): This should never happen!\n");
+    printf("AmoebaReproduce(): newax = %d, neway = %d\n", newax, neway);
+    printf("AmoebaReproduce(): This should never happen!\n");
     return;
   }
 #endif
@@ -9038,11 +9054,11 @@ static void AmoebeAbleger(int ax, int ay)
       AmoebaCnt2[new_group_nr]++;
 
       // if amoeba touches other amoeba(s) after growing, unify them
-      AmoebenVereinigen(newax, neway);
+      AmoebaMerge(newax, neway);
 
       if (element == EL_BD_AMOEBA && AmoebaCnt2[new_group_nr] >= 200)
       {
-       AmoebeUmwandelnBD(newax, neway, EL_BD_ROCK);
+       AmoebaToDiamondBD(newax, neway, EL_BD_ROCK);
        return;
       }
     }
@@ -12084,13 +12100,13 @@ void GameActions_RND(void)
     else if (IS_ACTIVE_BOMB(element))
       CheckDynamite(x, y);
     else if (element == EL_AMOEBA_GROWING)
-      AmoebeWaechst(x, y);
+      AmoebaGrowing(x, y);
     else if (element == EL_AMOEBA_SHRINKING)
-      AmoebaDisappearing(x, y);
+      AmoebaShrinking(x, y);
 
 #if !USE_NEW_AMOEBA_CODE
     else if (IS_AMOEBALIVE(element))
-      AmoebeAbleger(x, y);
+      AmoebaReproduce(x, y);
 #endif
 
     else if (element == EL_GAME_OF_LIFE || element == EL_BIOMAZE)
@@ -14853,9 +14869,9 @@ static void PlayLevelMusic(void)
 void PlayLevelSound_EM(int xx, int yy, int element_em, int sample)
 {
   int element = (element_em > -1 ? map_element_EM_to_RND_game(element_em) : 0);
-  int offset = (BorderElement == EL_STEELWALL ? 1 : 0);
-  int x = xx - 1 - offset;
-  int y = yy - 1 - offset;
+  int offset = 0;
+  int x = xx - offset;
+  int y = yy - offset;
 
   switch (sample)
   {