fixed default screen fading for the first title screen
[rocksndiamonds.git] / src / files.c
index 9704cdfd5b294f1a7296522fac3ca6e9f8b6f999..edc1358edc4386ce944e6f6f3ecd84fbbf4cb9c1 100644 (file)
@@ -288,6 +288,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(12),
     &li.shifted_relocation,            FALSE
   },
+  {
+    EL_PLAYER_1,                       -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(15),
+    &li.lazy_relocation,               FALSE
+  },
 
   /* (these values are different for each player) */
   {
@@ -3007,6 +3012,8 @@ static int LoadLevel_NOTE(File *file, int chunk_size, struct LevelInfo *level)
   int envelope_nr = element - EL_ENVELOPE_1;
   int real_chunk_size = 2;
 
+  xx_envelope = level->envelope[envelope_nr];  /* copy into temporary buffer */
+
   while (!checkEndOfFile(file))
   {
     real_chunk_size += LoadLevel_MicroChunk(file, chunk_config_NOTE,
@@ -3016,7 +3023,7 @@ static int LoadLevel_NOTE(File *file, int chunk_size, struct LevelInfo *level)
       break;
   }
 
-  level->envelope[envelope_nr] = xx_envelope;
+  level->envelope[envelope_nr] = xx_envelope;  /* copy from temporary buffer */
 
   return real_chunk_size;
 }
@@ -7902,9 +7909,9 @@ void SaveScore(int nr)
 #define SETUP_TOKEN_SKIP_LEVELS                        15
 #define SETUP_TOKEN_TIME_LIMIT                 16
 #define SETUP_TOKEN_FULLSCREEN                 17
-#define SETUP_TOKEN_FULLSCREEN_MODE            18
-#define SETUP_TOKEN_WINDOW_SCALING_PERCENT     19
-#define SETUP_TOKEN_WINDOW_SCALING_QUALITY     20
+#define SETUP_TOKEN_WINDOW_SCALING_PERCENT     18
+#define SETUP_TOKEN_WINDOW_SCALING_QUALITY     19
+#define SETUP_TOKEN_SCREEN_RENDERING_MODE      20
 #define SETUP_TOKEN_ASK_ON_ESCAPE              21
 #define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR       22
 #define SETUP_TOKEN_QUICK_SWITCH               23
@@ -8037,8 +8044,10 @@ void SaveScore(int nr)
 #define SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE    12
 #define SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES   13
 #define SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR 14
+#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH   15
+#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT  16
 
-#define NUM_INTERNAL_SETUP_TOKENS              15
+#define NUM_INTERNAL_SETUP_TOKENS              17
 
 /* options setup */
 #define SETUP_TOKEN_OPTIONS_VERBOSE            0
@@ -8075,9 +8084,9 @@ static struct TokenInfo global_setup_tokens[] =
   { TYPE_SWITCH, &si.skip_levels,             "skip_levels"            },
   { TYPE_SWITCH, &si.time_limit,              "time_limit"             },
   { TYPE_SWITCH, &si.fullscreen,              "fullscreen"             },
-  { TYPE_STRING, &si.fullscreen_mode,         "fullscreen_mode"                },
   { TYPE_INTEGER,&si.window_scaling_percent,  "window_scaling_percent" },
   { TYPE_STRING, &si.window_scaling_quality,  "window_scaling_quality" },
+  { TYPE_STRING, &si.screen_rendering_mode,   "screen_rendering_mode"  },
   { TYPE_SWITCH, &si.ask_on_escape,           "ask_on_escape"          },
   { TYPE_SWITCH, &si.ask_on_escape_editor,    "ask_on_escape_editor"   },
   { TYPE_SWITCH, &si.quick_switch,            "quick_player_switch"    },
@@ -8209,7 +8218,9 @@ static struct TokenInfo internal_setup_tokens[] =
   { TYPE_STRING, &sxi.fallback_sounds_file,    "fallback_sounds_file"  },
   { TYPE_STRING, &sxi.fallback_music_file,     "fallback_music_file"   },
   { TYPE_STRING, &sxi.default_level_series,    "default_level_series"  },
-  { TYPE_STRING, &sxi.choose_from_top_leveldir,        "choose_from_top_leveldir" },
+  { TYPE_BOOLEAN,&sxi.choose_from_top_leveldir,        "choose_from_top_leveldir" },
+  { TYPE_INTEGER,&sxi.default_window_width,    "default_window_width"  },
+  { TYPE_INTEGER,&sxi.default_window_height,   "default_window_height" },
 };
 
 static struct TokenInfo options_setup_tokens[] =
@@ -8255,9 +8266,9 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->skip_levels = TRUE;
   si->time_limit = TRUE;
   si->fullscreen = FALSE;
-  si->fullscreen_mode = getStringCopy(DEFAULT_FULLSCREEN_MODE);
   si->window_scaling_percent = STD_WINDOW_SCALING_PERCENT;
   si->window_scaling_quality = getStringCopy(SCALING_QUALITY_DEFAULT);
+  si->screen_rendering_mode = getStringCopy(STR_SPECIAL_RENDERING_DEFAULT);
   si->ask_on_escape = TRUE;
   si->ask_on_escape_editor = TRUE;
   si->quick_switch = FALSE;
@@ -8372,6 +8383,9 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->internal.default_level_series = getStringCopy(UNDEFINED_LEVELSET);
   si->internal.choose_from_top_leveldir = FALSE;
 
+  si->internal.default_window_width  = WIN_XSIZE_DEFAULT;
+  si->internal.default_window_height = WIN_YSIZE_DEFAULT;
+
   si->options.verbose = FALSE;
 
 #if defined(PLATFORM_ANDROID)
@@ -8750,6 +8764,39 @@ static void InitMenuDesignSettings_SpecialPreProcessing()
 
   /* special case: initialize "ARG_DEFAULT" values in static default config */
   /* (e.g., initialize "[titlemessage].fade_mode" from "[title].fade_mode") */
+  titlescreen_initial_first_default.fade_mode  =
+    title_initial_first_default.fade_mode;
+  titlescreen_initial_first_default.fade_delay =
+    title_initial_first_default.fade_delay;
+  titlescreen_initial_first_default.post_delay =
+    title_initial_first_default.post_delay;
+  titlescreen_initial_first_default.auto_delay =
+    title_initial_first_default.auto_delay;
+  titlescreen_first_default.fade_mode  = title_first_default.fade_mode;
+  titlescreen_first_default.fade_delay = title_first_default.fade_delay;
+  titlescreen_first_default.post_delay = title_first_default.post_delay;
+  titlescreen_first_default.auto_delay = title_first_default.auto_delay;
+  titlemessage_initial_first_default.fade_mode  =
+    title_initial_first_default.fade_mode;
+  titlemessage_initial_first_default.fade_delay =
+    title_initial_first_default.fade_delay;
+  titlemessage_initial_first_default.post_delay =
+    title_initial_first_default.post_delay;
+  titlemessage_initial_first_default.auto_delay =
+    title_initial_first_default.auto_delay;
+  titlemessage_first_default.fade_mode  = title_first_default.fade_mode;
+  titlemessage_first_default.fade_delay = title_first_default.fade_delay;
+  titlemessage_first_default.post_delay = title_first_default.post_delay;
+  titlemessage_first_default.auto_delay = title_first_default.auto_delay;
+
+  titlescreen_initial_default.fade_mode  = title_initial_default.fade_mode;
+  titlescreen_initial_default.fade_delay = title_initial_default.fade_delay;
+  titlescreen_initial_default.post_delay = title_initial_default.post_delay;
+  titlescreen_initial_default.auto_delay = title_initial_default.auto_delay;
+  titlescreen_default.fade_mode  = title_default.fade_mode;
+  titlescreen_default.fade_delay = title_default.fade_delay;
+  titlescreen_default.post_delay = title_default.post_delay;
+  titlescreen_default.auto_delay = title_default.auto_delay;
   titlemessage_initial_default.fade_mode  = title_initial_default.fade_mode;
   titlemessage_initial_default.fade_delay = title_initial_default.fade_delay;
   titlemessage_initial_default.post_delay = title_initial_default.post_delay;
@@ -8763,6 +8810,13 @@ static void InitMenuDesignSettings_SpecialPreProcessing()
   /* (e.g., init "titlemessage_1.fade_mode" from "[titlemessage].fade_mode") */
   for (i = 0; i < MAX_NUM_TITLE_MESSAGES; i++)
   {
+    titlescreen_initial_first[i] = titlescreen_initial_first_default;
+    titlescreen_first[i] = titlescreen_first_default;
+    titlemessage_initial_first[i] = titlemessage_initial_first_default;
+    titlemessage_first[i] = titlemessage_first_default;
+
+    titlescreen_initial[i] = titlescreen_initial_default;
+    titlescreen[i] = titlescreen_default;
     titlemessage_initial[i] = titlemessage_initial_default;
     titlemessage[i] = titlemessage_default;
   }
@@ -8771,18 +8825,26 @@ static void InitMenuDesignSettings_SpecialPreProcessing()
   /* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */
   for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++)
   {
+    if (i == GFX_SPECIAL_ARG_TITLE)    /* title values already initialized */
+      continue;
+
     menu.enter_screen[i] = menu.enter_screen[GFX_SPECIAL_ARG_DEFAULT];
     menu.leave_screen[i] = menu.leave_screen[GFX_SPECIAL_ARG_DEFAULT];
+    menu.next_screen[i]  = menu.next_screen[GFX_SPECIAL_ARG_DEFAULT];
   }
 
   /* special case: initialize "ARG_DEFAULT" values in static default config */
   /* (eg, init "viewport.door_1.MAIN.xyz" from "viewport.door_1.xyz") */
   for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++)
   {
+    viewport.window[i]    = viewport.window[GFX_SPECIAL_ARG_DEFAULT];
     viewport.playfield[i] = viewport.playfield[GFX_SPECIAL_ARG_DEFAULT];
-    viewport.door_1[i] = viewport.door_1[GFX_SPECIAL_ARG_DEFAULT];
-    if (i != GFX_SPECIAL_ARG_EDITOR)   /* editor value already initialized */
-      viewport.door_2[i] = viewport.door_2[GFX_SPECIAL_ARG_DEFAULT];
+    viewport.door_1[i]    = viewport.door_1[GFX_SPECIAL_ARG_DEFAULT];
+
+    if (i == GFX_SPECIAL_ARG_EDITOR)   /* editor values already initialized */
+      continue;
+
+    viewport.door_2[i] = viewport.door_2[GFX_SPECIAL_ARG_DEFAULT];
   }
 }
 
@@ -8822,7 +8884,17 @@ static void InitMenuDesignSettings_SpecialPostProcessing()
 
 static void LoadMenuDesignSettingsFromFilename(char *filename)
 {
+  static struct TitleFadingInfo tfi;
   static struct TitleMessageInfo tmi;
+  static struct TokenInfo title_tokens[] =
+  {
+    { TYPE_INTEGER,    &tfi.fade_mode,         ".fade_mode"            },
+    { TYPE_INTEGER,    &tfi.fade_delay,        ".fade_delay"           },
+    { TYPE_INTEGER,    &tfi.post_delay,        ".post_delay"           },
+    { TYPE_INTEGER,    &tfi.auto_delay,        ".auto_delay"           },
+
+    { -1,              NULL,                   NULL                    }
+  };
   static struct TokenInfo titlemessage_tokens[] =
   {
     { TYPE_INTEGER,    &tmi.x,                 ".x"                    },
@@ -8846,12 +8918,60 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
     { -1,              NULL,                   NULL                    }
   };
   static struct
+  {
+    struct TitleFadingInfo *info;
+    char *text;
+  }
+  title_info[] =
+  {
+    /* initialize first titles from "enter screen" definitions, if defined */
+    { &title_initial_first_default,    "menu.enter_screen.TITLE"       },
+    { &title_first_default,            "menu.enter_screen.TITLE"       },
+
+    /* initialize title screens from "next screen" definitions, if defined */
+    { &title_initial_default,          "menu.next_screen.TITLE"        },
+    { &title_default,                  "menu.next_screen.TITLE"        },
+
+    { NULL,                            NULL                            }
+  };
+  static struct
   {
     struct TitleMessageInfo *array;
     char *text;
   }
   titlemessage_arrays[] =
   {
+    /* initialize first titles from "enter screen" definitions, if defined */
+    { titlescreen_initial_first,       "menu.enter_screen.TITLE"       },
+    { titlescreen_first,               "menu.enter_screen.TITLE"       },
+    { titlemessage_initial_first,      "menu.enter_screen.TITLE"       },
+    { titlemessage_first,              "menu.enter_screen.TITLE"       },
+
+    /* initialize titles from "next screen" definitions, if defined */
+    { titlescreen_initial,             "menu.next_screen.TITLE"        },
+    { titlescreen,                     "menu.next_screen.TITLE"        },
+    { titlemessage_initial,            "menu.next_screen.TITLE"        },
+    { titlemessage,                    "menu.next_screen.TITLE"        },
+
+    /* overwrite titles with title definitions, if defined */
+    { titlescreen_initial_first,       "[title_initial]"               },
+    { titlescreen_first,               "[title]"                       },
+    { titlemessage_initial_first,      "[title_initial]"               },
+    { titlemessage_first,              "[title]"                       },
+
+    { titlescreen_initial,             "[title_initial]"               },
+    { titlescreen,                     "[title]"                       },
+    { titlemessage_initial,            "[title_initial]"               },
+    { titlemessage,                    "[title]"                       },
+
+    /* overwrite titles with title screen/message definitions, if defined */
+    { titlescreen_initial_first,       "[titlescreen_initial]"         },
+    { titlescreen_first,               "[titlescreen]"                 },
+    { titlemessage_initial_first,      "[titlemessage_initial]"        },
+    { titlemessage_first,              "[titlemessage]"                },
+
+    { titlescreen_initial,             "[titlescreen_initial]"         },
+    { titlescreen,                     "[titlescreen]"                 },
     { titlemessage_initial,            "[titlemessage_initial]"        },
     { titlemessage,                    "[titlemessage]"                },
 
@@ -8925,12 +9045,18 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
     char *token_4 = "menu.leave_screen.fade_mode";
     char *token_5 = "menu.leave_screen.fade_delay";
     char *token_6 = "menu.leave_screen.post_delay";
+    char *token_7 = "menu.next_screen.fade_mode";
+    char *token_8 = "menu.next_screen.fade_delay";
+    char *token_9 = "menu.next_screen.post_delay";
     char *value_1 = getHashEntry(setup_file_hash, token_1);
     char *value_2 = getHashEntry(setup_file_hash, token_2);
     char *value_3 = getHashEntry(setup_file_hash, token_3);
     char *value_4 = getHashEntry(setup_file_hash, token_4);
     char *value_5 = getHashEntry(setup_file_hash, token_5);
     char *value_6 = getHashEntry(setup_file_hash, token_6);
+    char *value_7 = getHashEntry(setup_file_hash, token_7);
+    char *value_8 = getHashEntry(setup_file_hash, token_8);
+    char *value_9 = getHashEntry(setup_file_hash, token_9);
 
     if (value_1 != NULL)
       menu.enter_screen[i].fade_mode = get_token_parameter_value(token_1,
@@ -8950,12 +9076,23 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
     if (value_6 != NULL)
       menu.leave_screen[i].post_delay = get_token_parameter_value(token_6,
                                                                  value_6);
+    if (value_7 != NULL)
+      menu.next_screen[i].fade_mode = get_token_parameter_value(token_7,
+                                                               value_7);
+    if (value_8 != NULL)
+      menu.next_screen[i].fade_delay = get_token_parameter_value(token_8,
+                                                                value_8);
+    if (value_9 != NULL)
+      menu.next_screen[i].post_delay = get_token_parameter_value(token_9,
+                                                                value_9);
   }
 
   /* special case: initialize with default values that may be overwritten */
   /* (eg, init "viewport.door_1.MAIN.xyz" from "viewport.door_1.xyz") */
   for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++)
   {
+    char *token_w1 = "viewport.window.width";
+    char *token_w2 = "viewport.window.height";
     char *token_01 = "viewport.playfield.x";
     char *token_02 = "viewport.playfield.y";
     char *token_03 = "viewport.playfield.width";
@@ -8971,6 +9108,8 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
     char *token_13 = "viewport.door_2.width";
     char *token_14 = "viewport.door_2.height";
     char *token_15 = "viewport.door_2.border_size";
+    char *value_w1 = getHashEntry(setup_file_hash, token_w1);
+    char *value_w2 = getHashEntry(setup_file_hash, token_w2);
     char *value_01 = getHashEntry(setup_file_hash, token_01);
     char *value_02 = getHashEntry(setup_file_hash, token_02);
     char *value_03 = getHashEntry(setup_file_hash, token_03);
@@ -8987,6 +9126,10 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
     char *value_14 = getHashEntry(setup_file_hash, token_14);
     char *value_15 = getHashEntry(setup_file_hash, token_15);
 
+    if (value_w1 != NULL)
+      viewport.window[i].width = get_token_parameter_value(token_w1, value_w1);
+    if (value_w2 != NULL)
+      viewport.window[i].height = get_token_parameter_value(token_w2, value_w2);
     if (value_01 != NULL)
       viewport.playfield[i].x = get_token_parameter_value(token_01, value_01);
     if (value_02 != NULL)
@@ -9024,6 +9167,33 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
                                                                 value_15);
   }
 
+  /* special case: initialize with default values that may be overwritten */
+  /* (e.g., init "[title].fade_mode" from "menu.next_screen.TITLE.fade_mode") */
+  for (i = 0; title_info[i].info != NULL; i++)
+  {
+    struct TitleFadingInfo *info = title_info[i].info;
+    char *base_token = title_info[i].text;
+
+    for (j = 0; title_tokens[j].type != -1; j++)
+    {
+      char *token = getStringCat2(base_token, title_tokens[j].text);
+      char *value = getHashEntry(setup_file_hash, token);
+
+      if (value != NULL)
+      {
+       int parameter_value = get_token_parameter_value(token, value);
+
+       tfi = *info;
+
+       *(int *)title_tokens[j].value = (int)parameter_value;
+
+       *info = tfi;
+      }
+
+      free(token);
+    }
+  }
+
   /* special case: initialize with default values that may be overwritten */
   /* (e.g., init "titlemessage_1.fade_mode" from "[titlemessage].fade_mode") */
   for (i = 0; titlemessage_arrays[i].array != NULL; i++)
@@ -9045,9 +9215,9 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
          tmi = array[k];
 
          if (titlemessage_tokens[j].type == TYPE_INTEGER)
-           *(boolean *)titlemessage_tokens[j].value = (boolean)parameter_value;
-         else
            *(int     *)titlemessage_tokens[j].value = (int)parameter_value;
+         else
+           *(boolean *)titlemessage_tokens[j].value = (boolean)parameter_value;
 
          array[k] = tmi;
        }