rnd-20030509-1-src
[rocksndiamonds.git] / src / files.c
index 87c4204f67cf7d573db4ebfb726e1338dc1f5a83..ce657d225e0f8e89710df0ce47b46d85a50daa83 100644 (file)
@@ -45,7 +45,7 @@
 
 static void setLevelInfoToDefaults()
 {
-  int i, x, y;
+  int i, j, x, y;
 
   level.file_version = FILE_VERSION_ACTUAL;
   level.game_version = GAME_VERSION_ACTUAL;
@@ -97,8 +97,19 @@ static void setLevelInfoToDefaults()
 
   for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
   {
-    level.custom_element_successor[i] = EL_EMPTY_SPACE;
-    Properties[EL_CUSTOM_START + i][EP_BITFIELD_BASE] = EP_BITMASK_DEFAULT;
+    int element = EL_CUSTOM_START + i;
+
+    level.custom_element[i].use_gfx_element = FALSE;
+    level.custom_element[i].gfx_element = EL_EMPTY_SPACE;
+
+    level.custom_element[i].change.events = CE_BITMASK_DEFAULT;
+    level.custom_element[i].change.delay_fixed = 0;
+    level.custom_element[i].change.delay_random = 0;
+    level.custom_element[i].change.successor = EL_EMPTY_SPACE;
+
+    /* start with no properties at all */
+    for (j=0; j < NUM_EP_BITFIELDS; j++)
+      Properties[element][j] = EP_BITMASK_DEFAULT;
   }
 
   BorderElement = EL_STEELWALL;
@@ -365,7 +376,7 @@ static int LoadLevel_CUS2(FILE *file, int chunk_size, struct LevelInfo *level)
     int i = element - EL_CUSTOM_START;
 
     if (IS_CUSTOM_ELEMENT(element))
-      level->custom_element_successor[i] = custom_element_successor;
+      level->custom_element[i].change.successor = custom_element_successor;
     else
       Error(ERR_WARN, "invalid custom element number %d", element);
   }
@@ -755,12 +766,12 @@ static void SaveLevel_CUS2(FILE *file, struct LevelInfo *level,
   {
     int element = EL_CUSTOM_START + i;
 
-    if (level->custom_element_successor[i] != EL_EMPTY_SPACE)
+    if (level->custom_element[i].change.successor != EL_EMPTY_SPACE)
     {
       if (check < num_changed_custom_elements)
       {
        putFile16BitBE(file, element);
-       putFile16BitBE(file, level->custom_element_successor[i]);
+       putFile16BitBE(file, level->custom_element[i].change.successor);
       }
 
       check++;
@@ -820,7 +831,7 @@ void SaveLevel(int level_nr)
 
   /* check for non-standard custom elements and calculate "CUS2" chunk size */
   for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
-    if (level.custom_element_successor[i] != EL_EMPTY_SPACE)
+    if (level.custom_element[i].change.successor != EL_EMPTY_SPACE)
       num_changed_custom_elements2++;
 
   putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED);
@@ -1900,47 +1911,38 @@ void LoadSpecialMenuDesignSettings()
 {
   char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);
   SetupFileHash *setup_file_hash;
-  char *value;
+  int i, j;
 
-  /* !!! CHANGE THIS !!! (redundant initialization) !!! */
-  global.num_toons = 20;
-  global.menu_draw_xoffset = 0;
-  global.menu_draw_yoffset = 0;
-  global.menu_draw_xoffset_MAIN = 0;
-  global.menu_draw_yoffset_MAIN = 0;
-  global.door_step_offset = 2;
-  global.door_step_delay = 10;
+  /* always start with reliable default values from default config */
+  for (i=0; image_config_vars[i].token != NULL; i++)
+    for (j=0; image_config[j].token != NULL; j++)
+      if (strcmp(image_config_vars[i].token, image_config[j].token) == 0)
+       *image_config_vars[i].value =
+         get_integer_from_string(image_config[j].value);
 
   if ((setup_file_hash = loadSetupFileHash(filename)) == NULL)
     return;
 
-  value = getHashEntry(setup_file_hash, "global.num_toons");
-  if (value != NULL)
-    global.num_toons = get_integer_from_string(value);
-
-  value = getHashEntry(setup_file_hash, "menu.draw_xoffset");
-  if (value != NULL)
-    global.menu_draw_xoffset = get_integer_from_string(value);
-
-  value = getHashEntry(setup_file_hash, "menu.draw_yoffset");
-  if (value != NULL)
-    global.menu_draw_yoffset = get_integer_from_string(value);
-
-  value = getHashEntry(setup_file_hash, "menu.draw_xoffset.MAIN");
-  if (value != NULL)
-    global.menu_draw_xoffset_MAIN = get_integer_from_string(value);
+  /* special case: initialize with default values that may be overwrittem */
+  for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++)
+  {
+    char *value_x = getHashEntry(setup_file_hash, "menu.draw_xoffset");
+    char *value_y = getHashEntry(setup_file_hash, "menu.draw_yoffset");
 
-  value = getHashEntry(setup_file_hash, "menu.draw_yoffset.MAIN");
-  if (value != NULL)
-    global.menu_draw_yoffset_MAIN = get_integer_from_string(value);
+    if (value_x != NULL)
+      menu.draw_xoffset[i] = get_integer_from_string(value_x);
+    if (value_y != NULL)
+      menu.draw_yoffset[i] = get_integer_from_string(value_y);
+  }
 
-  value = getHashEntry(setup_file_hash, "door.step_offset");
-  if (value != NULL)
-    global.door_step_offset = get_integer_from_string(value);
+  /* read (and overwrite with) values that may be specified in config file */
+  for (i=0; image_config_vars[i].token != NULL; i++)
+  {
+    char *value = getHashEntry(setup_file_hash, image_config_vars[i].token);
 
-  value = getHashEntry(setup_file_hash, "door.step_delay");
-  if (value != NULL)
-    global.door_step_delay = get_integer_from_string(value);
+    if (value != NULL)
+      *image_config_vars[i].value = get_integer_from_string(value);
+  }
 
   freeSetupFileHash(setup_file_hash);
 }