X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=ac4bd38a2e7c1e85290dcda36b8358207794c39a;hb=b4865a65808ffd72a4f98d09cdb332582e464500;hp=a1901caea52d996c7fb7a5cd58f975d35f102165;hpb=009c5cf7cf504775f90e2223241fe19131182e96;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index a1901cae..ac4bd38a 100644 --- a/src/files.c +++ b/src/files.c @@ -6131,6 +6131,7 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, level->time = 0; level->use_step_counter = TRUE; + level->auto_exit_sokoban = TRUE; if (load_xsb_to_ces) { @@ -6474,6 +6475,32 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) level->keep_walkable_ce = TRUE; } +static void LoadLevel_InitSettings_SB(struct LevelInfo *level) +{ + boolean is_sokoban_level = TRUE; // unless non-Sokoban elements found + int x, y; + + // check if this level is (not) a Sokoban level + for (y = 0; y < level->fieldy; y++) + for (x = 0; x < level->fieldx; x++) + if (!IS_SB_ELEMENT(Tile[x][y])) + is_sokoban_level = FALSE; + + if (is_sokoban_level) + { + // set special level settings for Sokoban levels + level->time = 0; + level->use_step_counter = TRUE; + level->auto_exit_sokoban = TRUE; + } +} + +static void LoadLevel_InitSettings(struct LevelInfo *level) +{ + // adjust level settings for (non-native) Sokoban-style levels + LoadLevel_InitSettings_SB(level); +} + static void LoadLevel_InitStandardElements(struct LevelInfo *level) { int i, x, y; @@ -6700,6 +6727,7 @@ static void LoadLevelTemplate_LoadAndInit(void) LoadLevel_InitVersion(&level_template); LoadLevel_InitElements(&level_template); + LoadLevel_InitSettings(&level_template); ActivateLevelTemplate(); } @@ -6740,6 +6768,7 @@ static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level) LoadLevel_InitVersion(&level); LoadLevel_InitElements(&level); LoadLevel_InitPlayfield(&level); + LoadLevel_InitSettings(&level); LoadLevel_InitNativeEngines(&level); }