X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=f8b9e8b859c9fe94e2eb09f8a13c2f92e3ddfa31;hp=47e26ffa6707a6e57a6433589209bba86ce6586d;hb=eb72f4adc74084da40e39484b2545e3d49d39eaa;hpb=7927e26b1ec2ef8b787a35d7867bdc40249cd2ee diff --git a/src/files.c b/src/files.c index 47e26ffa..f8b9e8b8 100644 --- a/src/files.c +++ b/src/files.c @@ -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; } @@ -8209,7 +8216,7 @@ 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" }, }; static struct TokenInfo options_setup_tokens[] = @@ -8750,6 +8757,14 @@ 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_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 +8778,8 @@ 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[i] = titlescreen_initial_default; + titlescreen[i] = titlescreen_default; titlemessage_initial[i] = titlemessage_initial_default; titlemessage[i] = titlemessage_default; } @@ -8771,31 +8788,76 @@ 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]; } } static void InitMenuDesignSettings_SpecialPostProcessing() { + static struct + { + struct XY *dst, *src; + } + game_buttons_xy[] = + { + { &game.button.save, &game.button.stop }, + { &game.button.pause2, &game.button.pause }, + { &game.button.load, &game.button.play }, + { &game.button.undo, &game.button.stop }, + { &game.button.redo, &game.button.play }, + + { NULL, NULL } + }; + int i; + /* special case: initialize later added SETUP list size from LEVELS value */ if (menu.list_size[GAME_MODE_SETUP] == -1) menu.list_size[GAME_MODE_SETUP] = menu.list_size[GAME_MODE_LEVELS]; + + /* set default position for snapshot buttons to stop/pause/play buttons */ + for (i = 0; game_buttons_xy[i].dst != NULL; i++) + { + if ((*game_buttons_xy[i].dst).x == -1 && + (*game_buttons_xy[i].dst).y == -1) + { + (*game_buttons_xy[i].dst).x = (*game_buttons_xy[i].src).x; + (*game_buttons_xy[i].dst).y = (*game_buttons_xy[i].src).y; + } + } } 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" }, @@ -8819,12 +8881,56 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) { -1, NULL, NULL } }; static struct + { + struct TitleFadingInfo *info; + char *text; + } + title_info[] = + { + /* 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]" }, @@ -8898,12 +9004,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, @@ -8923,12 +9035,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"; @@ -8944,6 +9067,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); @@ -8960,6 +9085,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) @@ -8997,6 +9126,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++) @@ -9018,9 +9174,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; }