moved code to separate function
[rocksndiamonds.git] / src / game.c
index b050950d7ff899a5894b31fcef21b98f9bc42aa9..83b0c1f3cb94a98767c21573f527dcdaac6ee1c2 100644 (file)
@@ -89,7 +89,7 @@
 // game panel display and control definitions
 #define GAME_PANEL_LEVEL_NUMBER                        0
 #define GAME_PANEL_GEMS                                1
-#define GAME_PANEL_GEMS_TOTAL                  2
+#define GAME_PANEL_GEMS_NEEDED                 2
 #define GAME_PANEL_GEMS_COLLECTED              3
 #define GAME_PANEL_GEMS_SCORE                  4
 #define GAME_PANEL_INVENTORY_COUNT             5
@@ -246,8 +246,8 @@ static struct GamePanelControlInfo game_panel_controls[] =
     TYPE_INTEGER,
   },
   {
-    GAME_PANEL_GEMS_TOTAL,
-    &game.panel.gems_total,
+    GAME_PANEL_GEMS_NEEDED,
+    &game.panel.gems_needed,
     TYPE_INTEGER,
   },
   {
@@ -1835,6 +1835,29 @@ static void InitPlayerField(int x, int y, int element, boolean init_game)
   }
 }
 
+static void InitFieldForEngine_RND(int x, int y)
+{
+  int element = Tile[x][y];
+
+  // convert BD engine elements to corresponding R'n'D engine elements
+  element = (element == EL_BD_EMPTY            ? EL_EMPTY :
+            element == EL_BD_PLAYER            ? EL_PLAYER_1 :
+            element == EL_BD_INBOX             ? EL_PLAYER_1 :
+            element == EL_BD_SAND              ? EL_SAND :
+            element == EL_BD_STEELWALL         ? EL_STEELWALL :
+            element == EL_BD_EXIT_CLOSED       ? EL_EXIT_CLOSED :
+            element == EL_BD_EXIT_OPEN         ? EL_EXIT_OPEN :
+            element);
+
+  Tile[x][y] = element;
+}
+
+static void InitFieldForEngine(int x, int y)
+{
+  if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
+    InitFieldForEngine_RND(x, y);
+}
+
 static void InitField(int x, int y, boolean init_game)
 {
   int element = Tile[x][y];
@@ -2291,10 +2314,10 @@ static void UpdateGameControlValues(void)
              level.game_engine_type == GAME_ENGINE_TYPE_MM ?
              game_mm.kettles_still_needed :
              game.gems_still_needed);
-  int gems_total = level.gems_needed;
+  int gems_needed = level.gems_needed;
   int gems_collected = (level.game_engine_type == GAME_ENGINE_TYPE_BD ?
                        game_bd.game->cave->diamonds_collected :
-                       gems_total - gems);
+                       gems_needed - gems);
   int gems_score = (level.game_engine_type == GAME_ENGINE_TYPE_BD ?
                    game_bd.game->cave->diamond_value :
                    level.score[SC_EMERALD]);
@@ -2325,7 +2348,7 @@ static void UpdateGameControlValues(void)
   // used instead of "level_nr" (for network games)
   game_panel_controls[GAME_PANEL_LEVEL_NUMBER].value = levelset.level_nr;
   game_panel_controls[GAME_PANEL_GEMS].value = gems;
-  game_panel_controls[GAME_PANEL_GEMS_TOTAL].value = gems_total;
+  game_panel_controls[GAME_PANEL_GEMS_NEEDED].value = gems_needed;
   game_panel_controls[GAME_PANEL_GEMS_COLLECTED].value = gems_collected;
   game_panel_controls[GAME_PANEL_GEMS_SCORE].value = gems_score;
 
@@ -4007,6 +4030,8 @@ void InitGame(void)
 
   SCAN_PLAYFIELD(x, y)
   {
+    InitFieldForEngine(x, y);
+
     if (emulate_bd && !IS_BD_ELEMENT(Tile[x][y]))
       emulate_bd = FALSE;
     if (emulate_sp && !IS_SP_ELEMENT(Tile[x][y]))
@@ -4881,6 +4906,27 @@ static void LevelSolved(void)
   LevelSolved_SetFinalGameValues();
 }
 
+static void AdvanceToNextLevel(void)
+{
+  if (setup.increment_levels &&
+      level_nr < leveldir_current->last_level &&
+      !network_playing)
+  {
+    level_nr++;                // advance to next level
+    TapeErase();       // start with empty tape
+
+    if (setup.auto_play_next_level)
+    {
+      scores.continue_playing = TRUE;
+      scores.next_level_nr = level_nr;
+
+      LoadLevel(level_nr);
+
+      SaveLevelSetup_SeriesInfo();
+    }
+  }
+}
+
 void GameWon(void)
 {
   static int time_count_steps;
@@ -5158,23 +5204,8 @@ void GameEnd(void)
   // save score and score tape before potentially erasing tape below
   NewHighScore(last_level_nr, tape_saved);
 
-  if (setup.increment_levels &&
-      level_nr < leveldir_current->last_level &&
-      !network_playing)
-  {
-    level_nr++;                // advance to next level
-    TapeErase();       // start with empty tape
-
-    if (setup.auto_play_next_level)
-    {
-      scores.continue_playing = TRUE;
-      scores.next_level_nr = level_nr;
-
-      LoadLevel(level_nr);
-
-      SaveLevelSetup_SeriesInfo();
-    }
-  }
+  // increment and load next level (if possible and not configured otherwise)
+  AdvanceToNextLevel();
 
   if (scores.last_added >= 0 && setup.show_scores_after_game)
   {