added functions for JSON handling
[rocksndiamonds.git] / src / game.c
index 0dc37771206428ec53ab7a72d6bccf0ea9cee016..3d0e2d3bff7aca38e3d10df5f29e8111d5c5f194 100644 (file)
@@ -4696,6 +4696,40 @@ void InitAmoebaNr(int x, int y)
   AmoebaCnt2[group_nr]++;
 }
 
+static void LevelSolved_SetFinalGameValues(void)
+{
+  game.time_final = (game.no_time_limit ? TimePlayed : TimeLeft);
+  game.score_time_final = (level.use_step_counter ? TimePlayed :
+                          TimePlayed * FRAMES_PER_SECOND + TimeFrames);
+
+  game.score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
+                     game_em.lev->score :
+                     level.game_engine_type == GAME_ENGINE_TYPE_MM ?
+                     game_mm.score :
+                     game.score);
+
+  game.health_final = (level.game_engine_type == GAME_ENGINE_TYPE_MM ?
+                      MM_HEALTH(game_mm.laser_overload_value) :
+                      game.health);
+
+  game.LevelSolved_CountingTime = game.time_final;
+  game.LevelSolved_CountingScore = game.score_final;
+  game.LevelSolved_CountingHealth = game.health_final;
+}
+
+static void LevelSolved_DisplayFinalGameValues(int time, int score, int health)
+{
+  game.LevelSolved_CountingTime = time;
+  game.LevelSolved_CountingScore = score;
+  game.LevelSolved_CountingHealth = health;
+
+  game_panel_controls[GAME_PANEL_TIME].value = time;
+  game_panel_controls[GAME_PANEL_SCORE].value = score;
+  game_panel_controls[GAME_PANEL_HEALTH].value = health;
+
+  DisplayGameControlValues();
+}
+
 static void LevelSolved(void)
 {
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND &&
@@ -4704,6 +4738,9 @@ static void LevelSolved(void)
 
   game.LevelSolved = TRUE;
   game.GameOver = TRUE;
+
+  // needed here to display correct panel values while player walks into exit
+  LevelSolved_SetFinalGameValues();
 }
 
 void GameWon(void)
@@ -4726,23 +4763,8 @@ void GameWon(void)
     if (local_player->active && local_player->MovPos)
       return;
 
-    game.time_final = (game.no_time_limit ? TimePlayed : TimeLeft);
-    game.score_time_final = (level.use_step_counter ? TimePlayed :
-                            TimePlayed * FRAMES_PER_SECOND + TimeFrames);
-
-    game.score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
-                       game_em.lev->score :
-                       level.game_engine_type == GAME_ENGINE_TYPE_MM ?
-                       game_mm.score :
-                       game.score);
-
-    game.health_final = (level.game_engine_type == GAME_ENGINE_TYPE_MM ?
-                        MM_HEALTH(game_mm.laser_overload_value) :
-                        game.health);
-
-    game.LevelSolved_CountingTime = game.time_final;
-    game.LevelSolved_CountingScore = game.score_final;
-    game.LevelSolved_CountingHealth = game.health_final;
+    // calculate final game values after player finished walking into exit
+    LevelSolved_SetFinalGameValues();
 
     game.LevelSolved_GameWon = TRUE;
     game.LevelSolved_SaveTape = tape.recording;
@@ -4768,6 +4790,10 @@ void GameWon(void)
     score = score_final = game.score_final;
     health = health_final = game.health_final;
 
+    // update game panel values before (delayed) counting of score (if any)
+    LevelSolved_DisplayFinalGameValues(time, score, health);
+
+    // if level has time score defined, calculate new final game values
     if (time_score > 0)
     {
       int time_final_max = 999;
@@ -4801,18 +4827,13 @@ void GameWon(void)
       game.health_final = health_final;
     }
 
+    // if not counting score after game, immediately update game panel values
     if (level_editor_test_game || !setup.count_score_after_game)
     {
       time = time_final;
       score = score_final;
 
-      game.LevelSolved_CountingTime = time;
-      game.LevelSolved_CountingScore = score;
-
-      game_panel_controls[GAME_PANEL_TIME].value = time;
-      game_panel_controls[GAME_PANEL_SCORE].value = score;
-
-      DisplayGameControlValues();
+      LevelSolved_DisplayFinalGameValues(time, score, health);
     }
 
     if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
@@ -4889,13 +4910,7 @@ void GameWon(void)
       if (time == time_final)
        score = score_final;
 
-      game.LevelSolved_CountingTime = time;
-      game.LevelSolved_CountingScore = score;
-
-      game_panel_controls[GAME_PANEL_TIME].value = time;
-      game_panel_controls[GAME_PANEL_SCORE].value = score;
-
-      DisplayGameControlValues();
+      LevelSolved_DisplayFinalGameValues(time, score, health);
 
       if (time == time_final)
        StopSound(SND_GAME_LEVELTIME_BONUS);
@@ -4921,13 +4936,7 @@ void GameWon(void)
       health += health_count_dir;
       score  += time_score;
 
-      game.LevelSolved_CountingHealth = health;
-      game.LevelSolved_CountingScore = score;
-
-      game_panel_controls[GAME_PANEL_HEALTH].value = health;
-      game_panel_controls[GAME_PANEL_SCORE].value = score;
-
-      DisplayGameControlValues();
+      LevelSolved_DisplayFinalGameValues(time, score, health);
 
       if (health == health_final)
        StopSound(SND_GAME_LEVELTIME_BONUS);