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;
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 ?
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 :
// do not handle game end if game over and automatically asking for game restart
if (game_over && setup.ask_on_game_over)
+ {
+ // (this is a special case: player pressed "return" key or fire button shortly before
+ // automatically asking to restart the game, so skip asking and restart right away)
+
+ CloseDoor(DOOR_CLOSE_1);
+
+ StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+
return;
+ }
// do not handle game end if request dialog is already active
if (checkRequestActive())
// 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)
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)
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)
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)