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 = (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 ?
else
{
SetGameStatus(GAME_MODE_PLAYING);
+
+ // do not cover screen before fading out when starting from main menu
+ game_bd.cover_screen = FALSE;
}
if (level_editor_test_game)
game.restart_level = FALSE;
game.request_active = FALSE;
game.envelope_active = FALSE;
+ game.any_door_active = FALSE;
if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
InitGameActions_MM();
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 :
// used instead of "level_nr" (needed for network games)
int last_level_nr = levelset.level_nr;
boolean tape_saved = FALSE;
+ boolean game_over = checkGameFailed();
// Important note: This function is not only called after "GameWon()", but also after
// "game over" (if automatically asking for restarting the game is disabled in setup)
+ // 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())
+ return;
+
if (game.LevelSolved)
game.LevelSolved_GameEnd = TRUE;
// 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)
case GD_S_DIAMOND_FALLING_8:
nr = (sample == GD_S_DIAMOND_FALLING_RANDOM ? GetSimpleRandom(8) :
sample - GD_S_DIAMOND_FALLING_1);
- sound_effect = SND_BD_DIAMOND_FALLING_RANDOM_1 + nr;
+ sound_effect = SND_BDX_DIAMOND_FALLING_RANDOM_1 + nr;
if (getSoundInfoEntryFilename(sound_effect) == NULL)
- sound_effect = SND_BD_DIAMOND_FALLING;
+ sound_effect = SND_BDX_DIAMOND_FALLING;
break;
case GD_S_DIAMOND_IMPACT_RANDOM:
case GD_S_DIAMOND_IMPACT_8:
nr = (sample == GD_S_DIAMOND_IMPACT_RANDOM ? GetSimpleRandom(8) :
sample - GD_S_DIAMOND_IMPACT_1);
- sound_effect = SND_BD_DIAMOND_IMPACT_RANDOM_1 + nr;
+ sound_effect = SND_BDX_DIAMOND_IMPACT_RANDOM_1 + nr;
if (getSoundInfoEntryFilename(sound_effect) == NULL)
- sound_effect = SND_BD_DIAMOND_IMPACT;
+ sound_effect = SND_BDX_DIAMOND_IMPACT;
break;
case GD_S_FLYING_DIAMOND_FALLING_RANDOM:
case GD_S_FLYING_DIAMOND_FALLING_8:
nr = (sample == GD_S_FLYING_DIAMOND_FALLING_RANDOM ? GetSimpleRandom(8) :
sample - GD_S_FLYING_DIAMOND_FALLING_1);
- sound_effect = SND_BD_FLYING_DIAMOND_FALLING_RANDOM_1 + nr;
+ sound_effect = SND_BDX_FLYING_DIAMOND_FALLING_RANDOM_1 + nr;
if (getSoundInfoEntryFilename(sound_effect) == NULL)
- sound_effect = SND_BD_FLYING_DIAMOND_FALLING;
+ sound_effect = SND_BDX_FLYING_DIAMOND_FALLING;
break;
case GD_S_FLYING_DIAMOND_IMPACT_RANDOM:
case GD_S_FLYING_DIAMOND_IMPACT_8:
nr = (sample == GD_S_FLYING_DIAMOND_IMPACT_RANDOM ? GetSimpleRandom(8) :
sample - GD_S_FLYING_DIAMOND_IMPACT_1);
- sound_effect = SND_BD_FLYING_DIAMOND_IMPACT_RANDOM_1 + nr;
+ sound_effect = SND_BDX_FLYING_DIAMOND_IMPACT_RANDOM_1 + nr;
if (getSoundInfoEntryFilename(sound_effect) == NULL)
- sound_effect = SND_BD_FLYING_DIAMOND_IMPACT;
+ sound_effect = SND_BDX_FLYING_DIAMOND_IMPACT;
break;
case GD_S_TIMEOUT_0:
break;
case GD_S_AMOEBA_MAGIC:
- sound_effect = SND_BD_AMOEBA_OTHER;
+ sound_effect = SND_BDX_AMOEBA_1_OTHER;
break;
case GD_S_FINISHED:
}
// do not ask to play again if request dialog is already active
- if (game.request_active)
+ if (checkRequestActive())
return FALSE;
// do not ask to play again if request dialog already handled
return (checkGameSolved() || checkGameFailed());
}
+boolean checkRequestActive(void)
+{
+ return (game.request_active || game.envelope_active || game.any_door_active);
+}
+
// ----------------------------------------------------------------------------
// random generator functions