rnd-20070312-3-src
[rocksndiamonds.git] / src / files.c
index 66fbeec693f338686f54c703e7df3476beab2a6c..979bd4f63620fb537568585205cda1fb597920ac 100644 (file)
@@ -739,6 +739,17 @@ static struct LevelFileConfigInfo chunk_config_NOTE[] =
     &xx_envelope.ysize,                        MAX_ENVELOPE_YSIZE,
   },
 
+  {
+    -1,                                        -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(3),
+    &xx_envelope.autowrap,             FALSE
+  },
+  {
+    -1,                                        -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(4),
+    &xx_envelope.centered,             FALSE
+  },
+
   {
     -1,                                        -1,
     TYPE_STRING,                       CONF_VALUE_BYTES(1),
@@ -4133,7 +4144,7 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x0e77:       /* quicksand (boulder) */
-      element = EL_QUICKSAND_FULL;
+      element = EL_QUICKSAND_FAST_FULL;
       break;
 
     case 0x0e99:       /* slow quicksand (boulder) */
@@ -4141,35 +4152,35 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x0ed2:
-      element = EL_EXIT_OPEN;
+      element = EL_EM_EXIT_OPEN;
       break;
 
     case 0x0ee3:
-      element = EL_EXIT_CLOSED;
+      element = EL_EM_EXIT_CLOSED;
       break;
 
     case 0x0eeb:
-      element = EL_STEEL_EXIT_OPEN;
+      element = EL_EM_STEEL_EXIT_OPEN;
       break;
 
     case 0x0efc:
-      element = EL_STEEL_EXIT_CLOSED;
+      element = EL_EM_STEEL_EXIT_CLOSED;
       break;
 
     case 0x0f4f:       /* dynamite (lit 1) */
-      element = EL_DYNAMITE_ACTIVE;
+      element = EL_EM_DYNAMITE_ACTIVE;
       break;
 
     case 0x0f57:       /* dynamite (lit 2) */
-      element = EL_DYNAMITE_ACTIVE;
+      element = EL_EM_DYNAMITE_ACTIVE;
       break;
 
     case 0x0f5f:       /* dynamite (lit 3) */
-      element = EL_DYNAMITE_ACTIVE;
+      element = EL_EM_DYNAMITE_ACTIVE;
       break;
 
     case 0x0f67:       /* dynamite (lit 4) */
-      element = EL_DYNAMITE_ACTIVE;
+      element = EL_EM_DYNAMITE_ACTIVE;
       break;
 
     case 0x0f81:
@@ -4184,7 +4195,7 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x0fb9:
-      element = EL_MAGIC_WALL;
+      element = EL_DC_MAGIC_WALL;
       break;
 
     case 0x0fd0:
@@ -4332,7 +4343,7 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x14e9:
-      element = EL_SHIELD_NORMAL;
+      element = EL_SHIELD_DEADLY;
       break;
 
     case 0x1501:
@@ -4348,7 +4359,7 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x1578:       /* quicksand (empty) */
-      element = EL_QUICKSAND_EMPTY;
+      element = EL_QUICKSAND_FAST_EMPTY;
       break;
 
     case 0x1579:       /* slow quicksand (empty) */
@@ -4362,7 +4373,7 @@ int getMappedElement_DC(int element)
       /* EL_DC_LANDMINE */
 
     case 0x15a0:
-      element = EL_DYNAMITE;
+      element = EL_EM_DYNAMITE;
       break;
 
     case 0x15a1:       /* key (red) */
@@ -4382,7 +4393,7 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x15a5:       /* key (white) */
-      element = EL_KEY_WHITE;
+      element = EL_DC_KEY_WHITE;
       break;
 
     case 0x15a6:
@@ -5294,15 +5305,15 @@ int getMappedElement_DC(int element)
       break;
 
     case 0x1689:       /* gate (white) */
-      element = EL_DOOR_WHITE;
+      element = EL_DC_GATE_WHITE;
       break;
 
     case 0x168a:       /* secret gate (white) */
-      element = EL_DOOR_WHITE_GRAY;
+      element = EL_DC_GATE_WHITE_GRAY;
       break;
 
     case 0x168b:       /* secret gate (no key) */
-      element = EL_UNKNOWN;
+      element = EL_DC_GATE_FAKE_GRAY;
       break;
 
     case 0x168c:
@@ -5615,6 +5626,11 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level,
 
   level->envelope[0].text[envelope_size] = '\0';
 
+  level->envelope[0].xsize = MAX_ENVELOPE_XSIZE;
+  level->envelope[0].ysize = 10;
+  level->envelope[0].autowrap = TRUE;
+  level->envelope[0].centered = TRUE;
+
   for (i = 0; i < level_name_len; i++)
     level->name[i] = header[level_name_pos + 1 + i];
   level->name[level_name_len] = '\0';
@@ -7675,14 +7691,15 @@ void SaveScore(int nr)
 #define SETUP_TOKEN_QUICK_SWITCH               20
 #define SETUP_TOKEN_INPUT_ON_FOCUS             21
 #define SETUP_TOKEN_PREFER_AGA_GRAPHICS                22
-#define SETUP_TOKEN_GRAPHICS_SET               23
-#define SETUP_TOKEN_SOUNDS_SET                 24
-#define SETUP_TOKEN_MUSIC_SET                  25
-#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    26
-#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      27
-#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       28
+#define SETUP_TOKEN_GAME_FRAME_DELAY           23
+#define SETUP_TOKEN_GRAPHICS_SET               24
+#define SETUP_TOKEN_SOUNDS_SET                 25
+#define SETUP_TOKEN_MUSIC_SET                  26
+#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    27
+#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      28
+#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       29
 
-#define NUM_GLOBAL_SETUP_TOKENS                        29
+#define NUM_GLOBAL_SETUP_TOKENS                        30
 
 /* editor setup */
 #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH      0
@@ -7757,10 +7774,11 @@ void SaveScore(int nr)
 #define NUM_PLAYER_SETUP_TOKENS                        16
 
 /* system setup */
-#define SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER     0
-#define SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE 1
+#define SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER     0
+#define SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER     1
+#define SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE 2
 
-#define NUM_SYSTEM_SETUP_TOKENS                        2
+#define NUM_SYSTEM_SETUP_TOKENS                        3
 
 /* options setup */
 #define SETUP_TOKEN_OPTIONS_VERBOSE            0
@@ -7801,6 +7819,7 @@ static struct TokenInfo global_setup_tokens[] =
   { TYPE_SWITCH, &si.quick_switch,     "quick_player_switch"           },
   { TYPE_SWITCH, &si.input_on_focus,   "input_on_focus"                },
   { TYPE_SWITCH, &si.prefer_aga_graphics, "prefer_aga_graphics"                },
+  { TYPE_INTEGER,&si.game_frame_delay, "game_frame_delay"              },
   { TYPE_STRING, &si.graphics_set,     "graphics_set"                  },
   { TYPE_STRING, &si.sounds_set,       "sounds_set"                    },
   { TYPE_STRING, &si.music_set,                "music_set"                     },
@@ -7899,6 +7918,7 @@ static struct TokenInfo player_setup_tokens[] =
 
 static struct TokenInfo system_setup_tokens[] =
 {
+  { TYPE_STRING,  &syi.sdl_videodriver,        "system.sdl_videodriver"        },
   { TYPE_STRING,  &syi.sdl_audiodriver,        "system.sdl_audiodriver"        },
   { TYPE_INTEGER, &syi.audio_fragment_size,"system.audio_fragment_size"        },
 };
@@ -7953,6 +7973,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->quick_switch = FALSE;
   si->input_on_focus = FALSE;
   si->prefer_aga_graphics = TRUE;
+  si->game_frame_delay = GAME_FRAME_DELAY;
 
   si->graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR);
   si->sounds_set = getStringCopy(SND_CLASSIC_SUBDIR);
@@ -8009,6 +8030,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
     si->input[i].key.drop  = (i == 0 ? DEFAULT_KEY_DROP  : KSYM_UNDEFINED);
   }
 
+  si->system.sdl_videodriver = getStringCopy(ARG_DEFAULT);
   si->system.sdl_audiodriver = getStringCopy(ARG_DEFAULT);
   si->system.audio_fragment_size = DEFAULT_AUDIO_FRAGMENT_SIZE;
 
@@ -8299,6 +8321,33 @@ void LoadCustomElementDescriptions()
   freeSetupFileHash(setup_file_hash);
 }
 
+static int get_token_parameter_value(char *token, char *value_raw)
+{
+  char *suffix;
+
+  if (token == NULL || value_raw == NULL)
+    return ARG_UNDEFINED_VALUE;
+
+  suffix = strrchr(token, '.');
+  if (suffix == NULL)
+    suffix = token;
+
+  if (strncmp(suffix, ".font", 5) == 0)
+  {
+    int i;
+
+    /* !!! OPTIMIZE THIS BY USING HASH !!! */
+    for (i = 0; i < NUM_FONTS; i++)
+      if (strEqual(value_raw, font_info[i].token_name))
+       return i;
+
+    /* if font not found, use reliable default value */
+    return FONT_INITIAL_1;
+  }
+
+  return get_parameter_value(value_raw, suffix, TYPE_INTEGER);
+}
+
 static void LoadSpecialMenuDesignSettingsFromFilename(char *filename)
 {
   SetupFileHash *setup_file_hash;
@@ -8345,7 +8394,7 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename)
 
     if (value != NULL)
       *image_config_vars[i].value =
-       get_auto_parameter_value(image_config_vars[i].token, value);
+       get_token_parameter_value(image_config_vars[i].token, value);
   }
 
   freeSetupFileHash(setup_file_hash);
@@ -8361,8 +8410,8 @@ void LoadSpecialMenuDesignSettings()
     for (j = 0; image_config[j].token != NULL; j++)
       if (strEqual(image_config_vars[i].token, image_config[j].token))
        *image_config_vars[i].value =
-         get_auto_parameter_value(image_config_vars[i].token,
-                                  image_config[j].value);
+         get_token_parameter_value(image_config_vars[i].token,
+                                   image_config[j].value);
 
   if (!SETUP_OVERRIDE_ARTWORK(setup, ARTWORK_TYPE_GRAPHICS))
   {
@@ -8434,19 +8483,19 @@ void LoadUserDefinedEditorElementList(int **elements, int *num_elements)
     {
       if (num_unknown_tokens == 0)
       {
-       Error(ERR_RETURN_LINE, "-");
-       Error(ERR_RETURN, "warning: unknown token(s) found in config file:");
-       Error(ERR_RETURN, "- config file: '%s'", filename);
+       Error(ERR_INFO_LINE, "-");
+       Error(ERR_INFO, "warning: unknown token(s) found in config file:");
+       Error(ERR_INFO, "- config file: '%s'", filename);
 
        num_unknown_tokens++;
       }
 
-      Error(ERR_RETURN, "- token: '%s'", list->token);
+      Error(ERR_INFO, "- token: '%s'", list->token);
     }
   }
 
   if (num_unknown_tokens > 0)
-    Error(ERR_RETURN_LINE, "-");
+    Error(ERR_INFO_LINE, "-");
 
   while (*num_elements % 4)    /* pad with empty elements, if needed */
     (*elements)[(*num_elements)++] = EL_EMPTY;
@@ -8747,18 +8796,18 @@ void print_unknown_token(char *filename, char *token, int token_nr)
 {
   if (token_nr == 0)
   {
-    Error(ERR_RETURN_LINE, "-");
-    Error(ERR_RETURN, "warning: unknown token(s) found in config file:");
-    Error(ERR_RETURN, "- config file: '%s'", filename);
+    Error(ERR_INFO_LINE, "-");
+    Error(ERR_INFO, "warning: unknown token(s) found in config file:");
+    Error(ERR_INFO, "- config file: '%s'", filename);
   }
 
-  Error(ERR_RETURN, "- token: '%s'", token);
+  Error(ERR_INFO, "- token: '%s'", token);
 }
 
 void print_unknown_token_end(int token_nr)
 {
   if (token_nr > 0)
-    Error(ERR_RETURN_LINE, "-");
+    Error(ERR_INFO_LINE, "-");
 }
 
 void LoadHelpAnimInfo()