added single step support for BD engine
[rocksndiamonds.git] / src / game.c
index 831ec9010a5a0a4a9460d471bb8aaf2574b53045..a516155ce76b269b2704d5ecc3ffe2112899e4c1 100644 (file)
@@ -1840,13 +1840,30 @@ 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_BDX_EMPTY           ? EL_EMPTY :
-            element == EL_BDX_PLAYER           ? EL_PLAYER_1 :
-            element == EL_BDX_INBOX            ? EL_PLAYER_1 :
-            element == EL_BDX_SAND_1           ? EL_SAND :
-            element == EL_BDX_STEELWALL        ? EL_STEELWALL :
-            element == EL_BDX_EXIT_CLOSED      ? EL_EXIT_CLOSED :
-            element == EL_BDX_EXIT_OPEN        ? EL_EXIT_OPEN :
+  element = (element == EL_BDX_EMPTY                           ? EL_EMPTY :
+            element == EL_BDX_PLAYER                           ? EL_PLAYER_1 :
+            element == EL_BDX_INBOX                            ? EL_PLAYER_1 :
+            element == EL_BDX_SAND_1                           ? EL_SAND :
+            element == EL_BDX_WALL                             ? EL_BD_WALL :
+            element == EL_BDX_STEELWALL                        ? EL_STEELWALL :
+            element == EL_BDX_ROCK                             ? EL_BD_ROCK :
+            element == EL_BDX_DIAMOND                          ? EL_BD_DIAMOND :
+            element == EL_BDX_AMOEBA_1                         ? EL_BD_AMOEBA :
+            element == EL_BDX_MAGIC_WALL                       ? EL_BD_MAGIC_WALL :
+            element == EL_BDX_BUTTERFLY_1_RIGHT                ? EL_BD_BUTTERFLY_RIGHT :
+            element == EL_BDX_BUTTERFLY_1_UP                   ? EL_BD_BUTTERFLY_UP :
+            element == EL_BDX_BUTTERFLY_1_LEFT                 ? EL_BD_BUTTERFLY_LEFT :
+            element == EL_BDX_BUTTERFLY_1_DOWN                 ? EL_BD_BUTTERFLY_DOWN :
+            element == EL_BDX_BUTTERFLY_1                      ? EL_BD_BUTTERFLY :
+            element == EL_BDX_FIREFLY_1_RIGHT                  ? EL_BD_FIREFLY_RIGHT :
+            element == EL_BDX_FIREFLY_1_UP                     ? EL_BD_FIREFLY_UP :
+            element == EL_BDX_FIREFLY_1_LEFT                   ? EL_BD_FIREFLY_LEFT :
+            element == EL_BDX_FIREFLY_1_DOWN                   ? EL_BD_FIREFLY_DOWN :
+            element == EL_BDX_FIREFLY_1                        ? EL_BD_FIREFLY :
+            element == EL_BDX_EXPANDABLE_WALL_HORIZONTAL       ? EL_BD_EXPANDABLE_WALL :
+            element == EL_BDX_WALL_DIAMOND                     ? EL_WALL_BD_DIAMOND :
+            element == EL_BDX_EXIT_CLOSED                      ? EL_EXIT_CLOSED :
+            element == EL_BDX_EXIT_OPEN                        ? EL_EXIT_OPEN :
             element);
 
   Tile[x][y] = element;
@@ -2286,7 +2303,7 @@ static void UpdateGameControlValues(void)
   int time = (game.LevelSolved ?
              game.LevelSolved_CountingTime :
              level.game_engine_type == GAME_ENGINE_TYPE_BD ?
-             game_bd.time_played :
+             game_bd.time_left :
              level.game_engine_type == GAME_ENGINE_TYPE_EM ?
              game_em.lev->time :
              level.game_engine_type == GAME_ENGINE_TYPE_SP ?
@@ -4862,9 +4879,10 @@ void InitAmoebaNr(int x, int y)
 
 static void LevelSolved_SetFinalGameValues(void)
 {
-  game.time_final = (level.game_engine_type == GAME_ENGINE_TYPE_BD ? game_bd.time_played :
+  game.time_final = (level.game_engine_type == GAME_ENGINE_TYPE_BD ? game_bd.time_left :
                     game.no_level_time_limit ? TimePlayed : TimeLeft);
-  game.score_time_final = (level.use_step_counter ? TimePlayed :
+  game.score_time_final = (level.game_engine_type == GAME_ENGINE_TYPE_BD ? game_bd.frames_played :
+                           level.use_step_counter ? TimePlayed :
                           TimePlayed * FRAMES_PER_SECOND + TimeFrames);
 
   game.score_final = (level.game_engine_type == GAME_ENGINE_TYPE_BD ? game_bd.score :
@@ -11835,6 +11853,9 @@ static void CheckLevelTime(void)
     // if last second running, wait for native engine time to exactly reach zero
     if (getTimeLeft_BD() == 1 && TimeLeft == 1)
       TimeFrames = frames_per_second - 1;
+
+    // needed to store final time after solving game (before counting down remaining time)
+    SetTimeFrames_BD(TimePlayed * FRAMES_PER_SECOND + TimeFrames);
   }
 
   if (TimeFrames >= frames_per_second)
@@ -16591,6 +16612,8 @@ static ListNode *SaveEngineSnapshotBuffers(void)
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
     SaveEngineSnapshotValues_RND();
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    SaveEngineSnapshotValues_BD();
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
     SaveEngineSnapshotValues_EM();
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
@@ -16602,6 +16625,8 @@ static ListNode *SaveEngineSnapshotBuffers(void)
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
     SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_rnd));
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_bd));
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
     SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_em));
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
@@ -16741,6 +16766,8 @@ static void LoadEngineSnapshotValues(void)
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
     LoadEngineSnapshotValues_RND();
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    LoadEngineSnapshotValues_BD();
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
     LoadEngineSnapshotValues_EM();
   if (level.game_engine_type == GAME_ENGINE_TYPE_SP)