moved setting auto-exit for Sokoban-style levels from runtime to level
[rocksndiamonds.git] / src / files.c
index 83efc95803ba9dd0324b153219d81728ad06d33c..ac4bd38a2e7c1e85290dcda36b8358207794c39a 100644 (file)
@@ -327,6 +327,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(16),
     &li.finish_dig_collect,            TRUE
   },
+  {
+    EL_PLAYER_1,                       -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(17),
+    &li.keep_walkable_ce,              FALSE
+  },
 
   // (these values are different for each player)
   {
@@ -3637,7 +3642,7 @@ static void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   // initialize player positions and delete players from the playfield
   for (y = 0; y < cav->height; y++) for (x = 0; x < cav->width; x++)
   {
-    if (ELEM_IS_PLAYER(level->field[x][y]))
+    if (IS_PLAYER_ELEMENT(level->field[x][y]))
     {
       int player_nr = GET_PLAYER_NR(level->field[x][y]);
 
@@ -6126,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)
   {
@@ -6463,6 +6469,36 @@ static void LoadLevel_InitVersion(struct LevelInfo *level)
   // CE actions were triggered by unfinished digging/collecting up to 4.2.2.0
   if (level->game_version <= VERSION_IDENT(4,2,2,0))
     level->finish_dig_collect = FALSE;
+
+  // CE changing to player was kept under the player if walkable up to 4.2.3.1
+  if (level->game_version <= VERSION_IDENT(4,2,3,1))
+    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)
@@ -6691,6 +6727,7 @@ static void LoadLevelTemplate_LoadAndInit(void)
 
   LoadLevel_InitVersion(&level_template);
   LoadLevel_InitElements(&level_template);
+  LoadLevel_InitSettings(&level_template);
 
   ActivateLevelTemplate();
 }
@@ -6731,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);
 }