X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=72603889acbf17cf5a076801d63a9ddb541950ea;hb=4231c290a878b5fb95bffdf78b5486359ce1268f;hp=60782f76520d2c2ea511dcd695be2590ff84c85c;hpb=db0cf963a41d958dc11ee1d3cfb2b1f88cba7f76;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 60782f76..72603889 100644 --- a/src/files.c +++ b/src/files.c @@ -264,6 +264,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = TYPE_BOOLEAN, CONF_VALUE_8_BIT(6), &li.continuous_snapping, TRUE }, + { + EL_PLAYER_1, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(12), + &li.shifted_relocation, FALSE + }, /* (these values are different for each player) */ { @@ -5948,6 +5953,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) change->target_element == EL_SOKOBAN_FIELD_PLAYER) change->target_element = EL_PLAYER_1; } + + /* not centering level after relocating player was default only in 3.2.3 */ + if (level->game_version == VERSION_IDENT(3,2,3,0)) /* (no pre-releases) */ + level->shifted_relocation = TRUE; } static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) @@ -7675,31 +7684,32 @@ void SaveScore(int nr) #define SETUP_TOKEN_SOUND_SIMPLE 4 #define SETUP_TOKEN_TOONS 5 #define SETUP_TOKEN_SCROLL_DELAY 6 -#define SETUP_TOKEN_SOFT_SCROLLING 7 -#define SETUP_TOKEN_FADE_SCREENS 8 -#define SETUP_TOKEN_AUTORECORD 9 -#define SETUP_TOKEN_SHOW_TITLESCREEN 10 -#define SETUP_TOKEN_QUICK_DOORS 11 -#define SETUP_TOKEN_TEAM_MODE 12 -#define SETUP_TOKEN_HANDICAP 13 -#define SETUP_TOKEN_SKIP_LEVELS 14 -#define SETUP_TOKEN_TIME_LIMIT 15 -#define SETUP_TOKEN_FULLSCREEN 16 -#define SETUP_TOKEN_FULLSCREEN_MODE 17 -#define SETUP_TOKEN_ASK_ON_ESCAPE 18 -#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 19 -#define SETUP_TOKEN_QUICK_SWITCH 20 -#define SETUP_TOKEN_INPUT_ON_FOCUS 21 -#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 22 -#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 30 +#define SETUP_TOKEN_SCROLL_DELAY_VALUE 7 +#define SETUP_TOKEN_SOFT_SCROLLING 8 +#define SETUP_TOKEN_FADE_SCREENS 9 +#define SETUP_TOKEN_AUTORECORD 10 +#define SETUP_TOKEN_SHOW_TITLESCREEN 11 +#define SETUP_TOKEN_QUICK_DOORS 12 +#define SETUP_TOKEN_TEAM_MODE 13 +#define SETUP_TOKEN_HANDICAP 14 +#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_ASK_ON_ESCAPE 19 +#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 20 +#define SETUP_TOKEN_QUICK_SWITCH 21 +#define SETUP_TOKEN_INPUT_ON_FOCUS 22 +#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 23 +#define SETUP_TOKEN_GAME_FRAME_DELAY 24 +#define SETUP_TOKEN_GRAPHICS_SET 25 +#define SETUP_TOKEN_SOUNDS_SET 26 +#define SETUP_TOKEN_MUSIC_SET 27 +#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 28 +#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 29 +#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 30 + +#define NUM_GLOBAL_SETUP_TOKENS 31 /* editor setup */ #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 @@ -7774,10 +7784,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 @@ -7802,6 +7813,7 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH, &si.sound_simple, "simple_sound_effects" }, { TYPE_SWITCH, &si.toons, "toons" }, { TYPE_SWITCH, &si.scroll_delay, "scroll_delay" }, + { TYPE_INTEGER,&si.scroll_delay_value,"scroll_delay_value" }, { TYPE_SWITCH, &si.soft_scrolling, "soft_scrolling" }, { TYPE_SWITCH, &si.fade_screens, "fade_screens" }, { TYPE_SWITCH, &si.autorecord, "automatic_tape_recording" }, @@ -7917,6 +7929,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" }, }; @@ -7955,6 +7968,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->double_buffering = TRUE; si->direct_draw = !si->double_buffering; si->scroll_delay = TRUE; + si->scroll_delay_value = STD_SCROLL_DELAY; si->soft_scrolling = TRUE; si->fade_screens = TRUE; si->autorecord = TRUE; @@ -8028,6 +8042,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; @@ -8157,6 +8172,17 @@ void LoadSetup() player_name_new = get_corrected_login_name(setup.player_name); free(setup.player_name); setup.player_name = player_name_new; + + /* "scroll_delay: on(3) / off(0)" was replaced by scroll delay value */ + if (setup.scroll_delay == FALSE) + { + setup.scroll_delay_value = MIN_SCROLL_DELAY; + setup.scroll_delay = TRUE; /* now always "on" */ + } + + /* make sure that scroll delay value stays inside valid range */ + setup.scroll_delay_value = + MIN(MAX(MIN_SCROLL_DELAY, setup.scroll_delay_value), MAX_SCROLL_DELAY); } else Error(ERR_WARN, "using default setup values"); @@ -8318,10 +8344,94 @@ void LoadCustomElementDescriptions() freeSetupFileHash(setup_file_hash); } +static int getElementFromToken(char *token) +{ + int i; + + /* !!! OPTIMIZE THIS BY USING HASH !!! */ + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + if (strEqual(token, element_info[i].token_name)) + return i; + + Error(ERR_WARN, "unknown element token '%s'", token); + + return EL_UNDEFINED; +} + +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 1 + if (strEqual(suffix, ".element")) + return getElementFromToken(value_raw); +#endif + +#if 0 + 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; + } +#endif + + /* !!! USE CORRECT VALUE TYPE (currently works also for TYPE_BOOLEAN) !!! */ + return get_parameter_value(value_raw, suffix, TYPE_INTEGER); +} + static void LoadSpecialMenuDesignSettingsFromFilename(char *filename) { + static struct TitleMessageInfo tmi; + static struct TokenInfo titlemessage_tokens[] = + { + { TYPE_INTEGER, &tmi.x, ".x" }, + { TYPE_INTEGER, &tmi.y, ".y" }, + { TYPE_INTEGER, &tmi.width, ".width" }, + { TYPE_INTEGER, &tmi.height, ".height" }, + { TYPE_INTEGER, &tmi.chars, ".chars" }, + { TYPE_INTEGER, &tmi.lines, ".lines" }, + { TYPE_INTEGER, &tmi.align, ".align" }, + { TYPE_INTEGER, &tmi.valign, ".valign" }, + { TYPE_INTEGER, &tmi.font, ".font" }, + { TYPE_BOOLEAN, &tmi.autowrap, ".autowrap" }, + { TYPE_BOOLEAN, &tmi.centered, ".centered" }, + { TYPE_BOOLEAN, &tmi.parse_comments, ".parse_comments" }, + { TYPE_INTEGER, &tmi.sort_priority, ".sort_priority" }, + { TYPE_INTEGER, &tmi.fade_mode, ".fade_mode" }, + { TYPE_INTEGER, &tmi.fade_delay, ".fade_delay" }, + { TYPE_INTEGER, &tmi.post_delay, ".post_delay" }, + { TYPE_INTEGER, &tmi.auto_delay, ".auto_delay" }, + + { -1, NULL, NULL } + }; + static struct + { + struct TitleMessageInfo *array; + char *text; + } + titlemessage_arrays[] = + { + { titlemessage_initial, "[titlemessage_initial]" }, + { titlemessage, "[titlemessage]" }, + + { NULL, NULL } + }; SetupFileHash *setup_file_hash; - int i; + int i, j, k; #if 0 printf("LoadSpecialMenuDesignSettings from file '%s' ...\n", filename); @@ -8330,31 +8440,105 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename) if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; + /* the following initializes hierarchical values from dynamic configuration */ + /* special case: initialize with default values that may be overwritten */ + /* (e.g., init "menu.draw_xoffset.INFO" from "menu.draw_xoffset") */ 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"); - char *list_size = getHashEntry(setup_file_hash, "menu.list_size"); + char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset"); + char *value_2 = getHashEntry(setup_file_hash, "menu.draw_yoffset"); + char *value_3 = getHashEntry(setup_file_hash, "menu.list_size"); - 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); - if (list_size != NULL) - menu.list_size[i] = get_integer_from_string(list_size); + if (value_1 != NULL) + menu.draw_xoffset[i] = get_integer_from_string(value_1); + if (value_2 != NULL) + menu.draw_yoffset[i] = get_integer_from_string(value_2); + if (value_3 != NULL) + menu.list_size[i] = get_integer_from_string(value_3); } /* special case: initialize with default values that may be overwritten */ + /* (eg, init "menu.draw_xoffset.INFO[MUSIC]" from "menu.draw_xoffset.INFO") */ for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++) { - char *value_x = getHashEntry(setup_file_hash, "menu.draw_xoffset.INFO"); - char *value_y = getHashEntry(setup_file_hash, "menu.draw_yoffset.INFO"); + char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset.INFO"); + char *value_2 = getHashEntry(setup_file_hash, "menu.draw_yoffset.INFO"); + + if (value_1 != NULL) + menu.draw_xoffset_info[i] = get_integer_from_string(value_1); + if (value_2 != NULL) + menu.draw_yoffset_info[i] = get_integer_from_string(value_2); + } + + /* special case: initialize with default values that may be overwritten */ + /* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */ + for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + char *token_1 = "menu.enter_screen.fade_mode"; + char *token_2 = "menu.enter_screen.fade_delay"; + char *token_3 = "menu.enter_screen.post_delay"; + 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 *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); + + if (value_1 != NULL) + menu.enter_screen[i].fade_mode = get_token_parameter_value(token_1, + value_1); + if (value_2 != NULL) + menu.enter_screen[i].fade_delay = get_token_parameter_value(token_2, + value_2); + if (value_3 != NULL) + menu.enter_screen[i].post_delay = get_token_parameter_value(token_3, + value_3); + if (value_4 != NULL) + menu.leave_screen[i].fade_mode = get_token_parameter_value(token_4, + value_4); + if (value_5 != NULL) + menu.leave_screen[i].fade_delay = get_token_parameter_value(token_5, + value_5); + if (value_6 != NULL) + menu.leave_screen[i].post_delay = get_token_parameter_value(token_6, + value_6); + } + + /* 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++) + { + struct TitleMessageInfo *array = titlemessage_arrays[i].array; + char *base_token = titlemessage_arrays[i].text; + + for (j = 0; titlemessage_tokens[j].type != -1; j++) + { + char *token = getStringCat2(base_token, titlemessage_tokens[j].text); + char *value = getHashEntry(setup_file_hash, token); - if (value_x != NULL) - menu.draw_xoffset_info[i] = get_integer_from_string(value_x); - if (value_y != NULL) - menu.draw_yoffset_info[i] = get_integer_from_string(value_y); + if (value != NULL) + { + int parameter_value = get_token_parameter_value(token, value); + + for (k = 0; k < MAX_NUM_TITLE_MESSAGES; k++) + { + 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; + + array[k] = tmi; + } + } + + free(token); + } } /* read (and overwrite with) values that may be specified in config file */ @@ -8364,7 +8548,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); @@ -8375,13 +8559,42 @@ void LoadSpecialMenuDesignSettings() char *filename_base = UNDEFINED_FILENAME, *filename_local; int i, j; - /* always start with reliable default values from default config */ + /* always start with reliable default values from static default config */ for (i = 0; image_config_vars[i].token != NULL; i++) 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); + + /* the following initializes hierarchical values from static configuration */ + + /* special case: initialize "ARG_DEFAULT" values in static default config */ + /* (e.g., initialize "[titlemessage].fade_mode" from "[title].fade_mode") */ + 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; + titlemessage_initial_default.auto_delay = title_initial_default.auto_delay; + titlemessage_default.fade_mode = title_default.fade_mode; + titlemessage_default.fade_delay = title_default.fade_delay; + titlemessage_default.post_delay = title_default.post_delay; + titlemessage_default.auto_delay = title_default.auto_delay; + + /* special case: initialize "ARG_DEFAULT" values in static default config */ + /* (e.g., init "titlemessage_1.fade_mode" from "[titlemessage].fade_mode") */ + for (i = 0; i < MAX_NUM_TITLE_MESSAGES; i++) + { + titlemessage_initial[i] = titlemessage_initial_default; + titlemessage[i] = titlemessage_default; + } + + /* special case: initialize "ARG_DEFAULT" values in static default config */ + /* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */ + for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + menu.enter_screen[i] = menu.enter_screen[GFX_SPECIAL_ARG_DEFAULT]; + menu.leave_screen[i] = menu.leave_screen[GFX_SPECIAL_ARG_DEFAULT]; + } if (!SETUP_OVERRIDE_ARTWORK(setup, ARTWORK_TYPE_GRAPHICS)) {