X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=4370cba412ca3492d03ab7644f1111fd2cb12ed9;hp=aa44fc262827a1db45233cd0dd5c2728a427b0f5;hb=71c4b8d626b4a731a72840facb6bd548c7e33da9;hpb=2ad8cf8c19e8023f19e36b372c45f747997d1054 diff --git a/src/files.c b/src/files.c index aa44fc26..4370cba4 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) */ { @@ -1760,14 +1765,19 @@ static void setLevelInfoToDefaults_Elements(struct LevelInfo *level) } static void setLevelInfoToDefaults(struct LevelInfo *level, - boolean level_info_only) + boolean level_info_only, + boolean reset_file_status) { setLevelInfoToDefaults_Level(level); if (!level_info_only) setLevelInfoToDefaults_Elements(level); - level->no_valid_file = FALSE; + if (reset_file_status) + { + level->no_valid_file = FALSE; + level->no_level_file = FALSE; + } level->changed = FALSE; } @@ -1781,10 +1791,41 @@ static void setFileInfoToDefaults(struct LevelFileInfo *level_file_info) level_file_info->filename = NULL; } +int getMappedElement_SB(int, boolean); + static void ActivateLevelTemplate() { int x, y; + if (check_special_flags("load_xsb_to_ces")) + { + /* fill smaller playfields with padding "beyond border wall" elements */ + if (level.fieldx < level_template.fieldx || + level.fieldy < level_template.fieldy) + { + short field[level.fieldx][level.fieldy]; + int new_fieldx = MAX(level.fieldx, level_template.fieldx); + int new_fieldy = MAX(level.fieldy, level_template.fieldy); + int pos_fieldx = (new_fieldx - level.fieldx) / 2; + int pos_fieldy = (new_fieldy - level.fieldy) / 2; + + /* copy old playfield (which is smaller than the visible area) */ + for (y = 0; y < level.fieldy; y++) for (x = 0; x < level.fieldx; x++) + field[x][y] = level.field[x][y]; + + /* fill new, larger playfield with "beyond border wall" elements */ + for (y = 0; y < new_fieldy; y++) for (x = 0; x < new_fieldx; x++) + level.field[x][y] = getMappedElement_SB('_', TRUE); + + /* copy the old playfield to the middle of the new playfield */ + for (y = 0; y < level.fieldy; y++) for (x = 0; x < level.fieldx; x++) + level.field[pos_fieldx + x][pos_fieldy + y] = field[x][y]; + + level.fieldx = new_fieldx; + level.fieldy = new_fieldy; + } + } + /* Currently there is no special action needed to activate the template data, because 'element_info' property settings overwrite the original level data, while all other variables do not change. */ @@ -1825,13 +1866,14 @@ static void ActivateLevelTemplate() static char *getLevelFilenameFromBasename(char *basename) { - static char *filename = NULL; + static char *filename[2] = { NULL, NULL }; + int pos = (strEqual(basename, LEVELTEMPLATE_FILENAME) ? 0 : 1); - checked_free(filename); + checked_free(filename[pos]); - filename = getPath2(getCurrentLevelDir(), basename); + filename[pos] = getPath2(getCurrentLevelDir(), basename); - return filename; + return filename[pos]; } static int getFileTypeFromBasename(char *basename) @@ -1885,7 +1927,7 @@ static char *getSingleLevelBasenameExt(int nr, char *extension) static char basename[MAX_FILENAME_LEN]; if (nr < 0) - sprintf(basename, "template.%s", extension); + sprintf(basename, "%s", LEVELTEMPLATE_FILENAME); else sprintf(basename, "%03d.%s", nr, extension); @@ -2017,31 +2059,47 @@ static int getFiletypeFromID(char *filetype_id) return filetype; } -static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi) +char *getLocalLevelTemplateFilename() { - int nr = lfi->nr; + return getDefaultLevelFilename(-1); +} - /* special case: level number is negative => check for level template file */ - if (nr < 0) +char *getGlobalLevelTemplateFilename() +{ + /* global variable "leveldir_current" must be modified in the loop below */ + LevelDirTree *leveldir_current_last = leveldir_current; + char *filename = NULL; + + /* check for template level in path from current to topmost tree node */ + + while (leveldir_current != NULL) { - /* global variable "leveldir_current" must be modified in the loop below */ - LevelDirTree *leveldir_current_last = leveldir_current; + filename = getDefaultLevelFilename(-1); - /* check for template level in path from current to topmost tree node */ + if (fileExists(filename)) + break; - while (leveldir_current != NULL) - { - setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND, - "template.%s", LEVELFILE_EXTENSION); + leveldir_current = leveldir_current->node_parent; + } - if (fileExists(lfi->filename)) - break; + /* restore global variable "leveldir_current" modified in above loop */ + leveldir_current = leveldir_current_last; - leveldir_current = leveldir_current->node_parent; - } + return filename; +} - /* restore global variable "leveldir_current" modified in above loop */ - leveldir_current = leveldir_current_last; +static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi) +{ + int nr = lfi->nr; + + /* special case: level number is negative => check for level template file */ + if (nr < 0) + { + setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND, + getSingleLevelBasename(-1)); + + /* replace local level template filename with global template filename */ + lfi->filename = getGlobalLevelTemplateFilename(); /* no fallback if template file not existing */ return; @@ -3007,6 +3065,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 +3076,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; } @@ -3126,11 +3186,26 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, if (!(file = openFile(filename, MODE_READ))) { level->no_valid_file = TRUE; + level->no_level_file = TRUE; - if (!level_info_only) - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (level_info_only) + return; - return; + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + + if (!setup.editor.use_template_for_new_levels) + return; + + /* if level file not found, try to initialize level data from template */ + filename = getGlobalLevelTemplateFilename(); + + if (!(file = openFile(filename, MODE_READ))) + return; + + /* default: for empty levels, use level template for custom elements */ + level->use_custom_template = TRUE; + + level->no_valid_file = FALSE; } getFileChunkBE(file, chunk_name, NULL); @@ -5749,32 +5824,6 @@ static void LoadLevelFromFileInfo_SB(struct LevelInfo *level, { /* special global settings can now be set in level template */ - /* fill smaller playfields with padding "beyond border wall" elements */ - if (level->fieldx < SCR_FIELDX || - level->fieldy < SCR_FIELDY) - { - short field[level->fieldx][level->fieldy]; - int new_fieldx = MAX(level->fieldx, SCR_FIELDX); - int new_fieldy = MAX(level->fieldy, SCR_FIELDY); - int pos_fieldx = (new_fieldx - level->fieldx) / 2; - int pos_fieldy = (new_fieldy - level->fieldy) / 2; - - /* copy old playfield (which is smaller than the visible area) */ - for (y = 0; y < level->fieldy; y++) for (x = 0; x < level->fieldx; x++) - field[x][y] = level->field[x][y]; - - /* fill new, larger playfield with "beyond border wall" elements */ - for (y = 0; y < new_fieldy; y++) for (x = 0; x < new_fieldx; x++) - level->field[x][y] = getMappedElement_SB('_', load_xsb_to_ces); - - /* copy the old playfield to the middle of the new playfield */ - for (y = 0; y < level->fieldy; y++) for (x = 0; x < level->fieldx; x++) - level->field[pos_fieldx + x][pos_fieldy + y] = field[x][y]; - - level->fieldx = new_fieldx; - level->fieldy = new_fieldy; - } - level->use_custom_template = TRUE; } } @@ -5846,7 +5895,7 @@ static void LoadLevelFromFileInfo(struct LevelInfo *level, boolean level_info_only) { /* always start with reliable default values */ - setLevelInfoToDefaults(level, level_info_only); + setLevelInfoToDefaults(level, level_info_only, TRUE); switch (level_file_info->type) { @@ -5879,11 +5928,7 @@ static void LoadLevelFromFileInfo(struct LevelInfo *level, /* if level file is invalid, restore level structure to default values */ if (level->no_valid_file) - { - setLevelInfoToDefaults(level, level_info_only); - - level->no_valid_file = TRUE; /* but keep "no valid file" flag */ - } + setLevelInfoToDefaults(level, level_info_only, FALSE); if (level->game_engine_type == GAME_ENGINE_TYPE_UNKNOWN) level->game_engine_type = GAME_ENGINE_TYPE_RND; @@ -7020,7 +7065,8 @@ static int SaveLevel_GRPX(FILE *file, struct LevelInfo *level, int element) return chunk_size; } -static void SaveLevelFromFilename(struct LevelInfo *level, char *filename) +static void SaveLevelFromFilename(struct LevelInfo *level, char *filename, + boolean save_as_template) { int chunk_size; int i; @@ -7084,7 +7130,7 @@ static void SaveLevelFromFilename(struct LevelInfo *level, char *filename) } /* if not using template level, check for non-default custom/group elements */ - if (!level->use_custom_template) + if (!level->use_custom_template || save_as_template) { for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) { @@ -7120,14 +7166,14 @@ void SaveLevel(int nr) { char *filename = getDefaultLevelFilename(nr); - SaveLevelFromFilename(&level, filename); + SaveLevelFromFilename(&level, filename, FALSE); } void SaveLevelTemplate() { - char *filename = getDefaultLevelFilename(-1); + char *filename = getLocalLevelTemplateFilename(); - SaveLevelFromFilename(&level, filename); + SaveLevelFromFilename(&level, filename, TRUE); } boolean SaveLevelChecked(int nr) @@ -7151,7 +7197,7 @@ boolean SaveLevelChecked(int nr) void DumpLevel(struct LevelInfo *level) { - if (level->no_valid_file) + if (level->no_level_file || level->no_valid_file) { Error(ERR_WARN, "cannot dump -- no valid level file found"); @@ -7855,6 +7901,7 @@ void LoadScore(int nr) void SaveScore(int nr) { int i; + int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE); char *filename = getScoreFilename(nr); FILE *file; @@ -7873,7 +7920,7 @@ void SaveScore(int nr) fclose(file); - SetFilePermissions(filename, PERMS_PUBLIC); + SetFilePermissions(filename, permissions); } @@ -7893,61 +7940,53 @@ void SaveScore(int nr) #define SETUP_TOKEN_SCROLL_DELAY 6 #define SETUP_TOKEN_SCROLL_DELAY_VALUE 7 #define SETUP_TOKEN_ENGINE_SNAPSHOT_MODE 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_WINDOW_SCALING_PERCENT 19 -#define SETUP_TOKEN_WINDOW_SCALING_QUALITY 20 -#define SETUP_TOKEN_ASK_ON_ESCAPE 21 -#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 22 -#define SETUP_TOKEN_QUICK_SWITCH 23 -#define SETUP_TOKEN_INPUT_ON_FOCUS 24 -#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 25 -#define SETUP_TOKEN_GAME_FRAME_DELAY 26 -#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS 27 -#define SETUP_TOKEN_SMALL_GAME_GRAPHICS 28 -#define SETUP_TOKEN_GRAPHICS_SET 29 -#define SETUP_TOKEN_SOUNDS_SET 30 -#define SETUP_TOKEN_MUSIC_SET 31 -#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 32 -#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 33 -#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 34 -#define SETUP_TOKEN_VOLUME_SIMPLE 35 -#define SETUP_TOKEN_VOLUME_LOOPS 36 -#define SETUP_TOKEN_VOLUME_MUSIC 37 -#define SETUP_TOKEN_TOUCH_CONTROL_TYPE 38 -#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 39 -#define SETUP_TOKEN_TOUCH_DROP_DISTANCE 40 - -#define NUM_GLOBAL_SETUP_TOKENS 41 +#define SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY 9 +#define SETUP_TOKEN_FADE_SCREENS 10 +#define SETUP_TOKEN_AUTORECORD 11 +#define SETUP_TOKEN_SHOW_TITLESCREEN 12 +#define SETUP_TOKEN_QUICK_DOORS 13 +#define SETUP_TOKEN_TEAM_MODE 14 +#define SETUP_TOKEN_HANDICAP 15 +#define SETUP_TOKEN_SKIP_LEVELS 16 +#define SETUP_TOKEN_INCREMENT_LEVELS 17 +#define SETUP_TOKEN_TIME_LIMIT 18 +#define SETUP_TOKEN_FULLSCREEN 19 +#define SETUP_TOKEN_WINDOW_SCALING_PERCENT 20 +#define SETUP_TOKEN_WINDOW_SCALING_QUALITY 21 +#define SETUP_TOKEN_SCREEN_RENDERING_MODE 22 +#define SETUP_TOKEN_ASK_ON_ESCAPE 23 +#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 24 +#define SETUP_TOKEN_QUICK_SWITCH 25 +#define SETUP_TOKEN_INPUT_ON_FOCUS 26 +#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 27 +#define SETUP_TOKEN_GAME_FRAME_DELAY 28 +#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS 29 +#define SETUP_TOKEN_SMALL_GAME_GRAPHICS 30 +#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS 31 +#define SETUP_TOKEN_GRAPHICS_SET 32 +#define SETUP_TOKEN_SOUNDS_SET 33 +#define SETUP_TOKEN_MUSIC_SET 34 +#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 35 +#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 36 +#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 37 +#define SETUP_TOKEN_VOLUME_SIMPLE 38 +#define SETUP_TOKEN_VOLUME_LOOPS 39 +#define SETUP_TOKEN_VOLUME_MUSIC 40 +#define SETUP_TOKEN_TOUCH_CONTROL_TYPE 41 +#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 42 +#define SETUP_TOKEN_TOUCH_DROP_DISTANCE 43 + +#define NUM_GLOBAL_SETUP_TOKENS 44 /* editor setup */ -#define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 -#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE 1 -#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE_CLUB 2 -#define SETUP_TOKEN_EDITOR_EL_MORE 3 -#define SETUP_TOKEN_EDITOR_EL_SOKOBAN 4 -#define SETUP_TOKEN_EDITOR_EL_SUPAPLEX 5 -#define SETUP_TOKEN_EDITOR_EL_DIAMOND_CAVES 6 -#define SETUP_TOKEN_EDITOR_EL_DX_BOULDERDASH 7 -#define SETUP_TOKEN_EDITOR_EL_CHARS 8 -#define SETUP_TOKEN_EDITOR_EL_STEEL_CHARS 9 -#define SETUP_TOKEN_EDITOR_EL_CUSTOM 10 -#define SETUP_TOKEN_EDITOR_EL_HEADLINES 11 -#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED 12 -#define SETUP_TOKEN_EDITOR_EL_DYNAMIC 13 -#define SETUP_TOKEN_EDITOR_EL_BY_GAME 14 -#define SETUP_TOKEN_EDITOR_EL_BY_TYPE 15 -#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN 16 - -#define NUM_EDITOR_SETUP_TOKENS 17 +#define SETUP_TOKEN_EDITOR_EL_CLASSIC 0 +#define SETUP_TOKEN_EDITOR_EL_CUSTOM 1 +#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED 2 +#define SETUP_TOKEN_EDITOR_EL_DYNAMIC 3 +#define SETUP_TOKEN_EDITOR_EL_HEADLINES 4 +#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN 5 + +#define NUM_EDITOR_SETUP_TOKENS 6 /* editor cascade setup */ #define SETUP_TOKEN_EDITOR_CASCADE_BD 0 @@ -8036,8 +8075,36 @@ 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 NUM_INTERNAL_SETUP_TOKENS 15 +#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH 15 +#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT 16 + +#define NUM_INTERNAL_SETUP_TOKENS 17 + +/* debug setup */ +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_0 0 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_1 1 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_2 2 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_3 3 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_4 4 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_5 5 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_6 6 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_7 7 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_8 8 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_9 9 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_0 10 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_1 11 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_2 12 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_3 13 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_4 14 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_5 15 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_6 16 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_7 17 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_8 18 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_9 19 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_USE_MOD_KEY 20 +#define SETUP_TOKEN_DEBUG_FRAME_DELAY_GAME_ONLY 21 + +#define NUM_DEBUG_SETUP_TOKENS 22 /* options setup */ #define SETUP_TOKEN_OPTIONS_VERBOSE 0 @@ -8052,6 +8119,7 @@ static struct SetupShortcutInfo ssi; static struct SetupInputInfo sii; static struct SetupSystemInfo syi; static struct SetupInternalInfo sxi; +static struct SetupDebugInfo sdi; static struct OptionInfo soi; static struct TokenInfo global_setup_tokens[] = @@ -8065,6 +8133,7 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH, &si.scroll_delay, "scroll_delay" }, { TYPE_INTEGER,&si.scroll_delay_value, "scroll_delay_value" }, { TYPE_STRING, &si.engine_snapshot_mode, "engine_snapshot_mode" }, + { TYPE_INTEGER,&si.engine_snapshot_memory, "engine_snapshot_memory" }, { TYPE_SWITCH, &si.fade_screens, "fade_screens" }, { TYPE_SWITCH, &si.autorecord, "automatic_tape_recording"}, { TYPE_SWITCH, &si.show_titlescreen, "show_titlescreen" }, @@ -8072,11 +8141,12 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH, &si.team_mode, "team_mode" }, { TYPE_SWITCH, &si.handicap, "handicap" }, { TYPE_SWITCH, &si.skip_levels, "skip_levels" }, + { TYPE_SWITCH, &si.increment_levels, "increment_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" }, @@ -8085,6 +8155,7 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_INTEGER,&si.game_frame_delay, "game_frame_delay" }, { TYPE_SWITCH, &si.sp_show_border_elements, "sp_show_border_elements" }, { TYPE_SWITCH, &si.small_game_graphics, "small_game_graphics" }, + { TYPE_SWITCH, &si.show_snapshot_buttons, "show_snapshot_buttons" }, { TYPE_STRING, &si.graphics_set, "graphics_set" }, { TYPE_STRING, &si.sounds_set, "sounds_set" }, { TYPE_STRING, &si.music_set, "music_set" }, @@ -8101,22 +8172,11 @@ static struct TokenInfo global_setup_tokens[] = static struct TokenInfo editor_setup_tokens[] = { - { TYPE_SWITCH, &sei.el_boulderdash, "editor.el_boulderdash" }, - { TYPE_SWITCH, &sei.el_emerald_mine, "editor.el_emerald_mine" }, - { TYPE_SWITCH, &sei.el_emerald_mine_club,"editor.el_emerald_mine_club"}, - { TYPE_SWITCH, &sei.el_more, "editor.el_more" }, - { TYPE_SWITCH, &sei.el_sokoban, "editor.el_sokoban" }, - { TYPE_SWITCH, &sei.el_supaplex, "editor.el_supaplex" }, - { TYPE_SWITCH, &sei.el_diamond_caves, "editor.el_diamond_caves" }, - { TYPE_SWITCH, &sei.el_dx_boulderdash,"editor.el_dx_boulderdash" }, - { TYPE_SWITCH, &sei.el_chars, "editor.el_chars" }, - { TYPE_SWITCH, &sei.el_steel_chars, "editor.el_steel_chars" }, + { TYPE_SWITCH, &sei.el_classic, "editor.el_classic" }, { TYPE_SWITCH, &sei.el_custom, "editor.el_custom" }, - { TYPE_SWITCH, &sei.el_headlines, "editor.el_headlines" }, { TYPE_SWITCH, &sei.el_user_defined, "editor.el_user_defined" }, { TYPE_SWITCH, &sei.el_dynamic, "editor.el_dynamic" }, - { TYPE_SWITCH, &sei.el_by_game, "editor.el_by_game" }, - { TYPE_SWITCH, &sei.el_by_type, "editor.el_by_type" }, + { TYPE_SWITCH, &sei.el_headlines, "editor.el_headlines" }, { TYPE_SWITCH, &sei.show_element_token,"editor.show_element_token" }, }; @@ -8207,7 +8267,35 @@ 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 debug_setup_tokens[] = +{ + { TYPE_INTEGER, &sdi.frame_delay[0], "debug.frame_delay_0" }, + { TYPE_INTEGER, &sdi.frame_delay[1], "debug.frame_delay_1" }, + { TYPE_INTEGER, &sdi.frame_delay[2], "debug.frame_delay_2" }, + { TYPE_INTEGER, &sdi.frame_delay[3], "debug.frame_delay_3" }, + { TYPE_INTEGER, &sdi.frame_delay[4], "debug.frame_delay_4" }, + { TYPE_INTEGER, &sdi.frame_delay[5], "debug.frame_delay_5" }, + { TYPE_INTEGER, &sdi.frame_delay[6], "debug.frame_delay_6" }, + { TYPE_INTEGER, &sdi.frame_delay[7], "debug.frame_delay_7" }, + { TYPE_INTEGER, &sdi.frame_delay[8], "debug.frame_delay_8" }, + { TYPE_INTEGER, &sdi.frame_delay[9], "debug.frame_delay_9" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[0], "debug.key.frame_delay_0" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[1], "debug.key.frame_delay_1" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[2], "debug.key.frame_delay_2" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[3], "debug.key.frame_delay_3" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[4], "debug.key.frame_delay_4" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[5], "debug.key.frame_delay_5" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[6], "debug.key.frame_delay_6" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[7], "debug.key.frame_delay_7" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[8], "debug.key.frame_delay_8" }, + { TYPE_KEY_X11, &sdi.frame_delay_key[9], "debug.key.frame_delay_9" }, + { TYPE_BOOLEAN, &sdi.frame_delay_use_mod_key,"debug.frame_delay.use_mod_key"}, + { TYPE_BOOLEAN, &sdi.frame_delay_game_only, "debug.frame_delay.game_only" }, }; static struct TokenInfo options_setup_tokens[] = @@ -8244,6 +8332,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->scroll_delay = TRUE; si->scroll_delay_value = STD_SCROLL_DELAY; si->engine_snapshot_mode = getStringCopy(STR_SNAPSHOT_MODE_DEFAULT); + si->engine_snapshot_memory = SNAPSHOT_MEMORY_DEFAULT; si->fade_screens = TRUE; si->autorecord = TRUE; si->show_titlescreen = TRUE; @@ -8251,11 +8340,12 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->team_mode = FALSE; si->handicap = TRUE; si->skip_levels = TRUE; + si->increment_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; @@ -8264,6 +8354,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->game_frame_delay = GAME_FRAME_DELAY; si->sp_show_border_elements = FALSE; si->small_game_graphics = FALSE; + si->show_snapshot_buttons = FALSE; si->graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR); si->sounds_set = getStringCopy(SND_CLASSIC_SUBDIR); @@ -8291,13 +8382,18 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->editor.el_dx_boulderdash = TRUE; si->editor.el_chars = TRUE; si->editor.el_steel_chars = TRUE; + + si->editor.el_classic = TRUE; si->editor.el_custom = TRUE; - si->editor.el_headlines = TRUE; - si->editor.el_user_defined = FALSE; - si->editor.el_dynamic = TRUE; + si->editor.el_user_defined = FALSE; + si->editor.el_dynamic = TRUE; + + si->editor.el_headlines = TRUE; + + si->editor.show_element_token = FALSE; - si->editor.show_element_token = FALSE; + si->editor.use_template_for_new_levels = TRUE; si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME; si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME; @@ -8369,6 +8465,34 @@ 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->debug.frame_delay[0] = DEFAULT_FRAME_DELAY_0; + si->debug.frame_delay[1] = DEFAULT_FRAME_DELAY_1; + si->debug.frame_delay[2] = DEFAULT_FRAME_DELAY_2; + si->debug.frame_delay[3] = DEFAULT_FRAME_DELAY_3; + si->debug.frame_delay[4] = DEFAULT_FRAME_DELAY_4; + si->debug.frame_delay[5] = DEFAULT_FRAME_DELAY_5; + si->debug.frame_delay[6] = DEFAULT_FRAME_DELAY_6; + si->debug.frame_delay[7] = DEFAULT_FRAME_DELAY_7; + si->debug.frame_delay[8] = DEFAULT_FRAME_DELAY_8; + si->debug.frame_delay[9] = DEFAULT_FRAME_DELAY_9; + + si->debug.frame_delay_key[0] = DEFAULT_KEY_FRAME_DELAY_0; + si->debug.frame_delay_key[1] = DEFAULT_KEY_FRAME_DELAY_1; + si->debug.frame_delay_key[2] = DEFAULT_KEY_FRAME_DELAY_2; + si->debug.frame_delay_key[3] = DEFAULT_KEY_FRAME_DELAY_3; + si->debug.frame_delay_key[4] = DEFAULT_KEY_FRAME_DELAY_4; + si->debug.frame_delay_key[5] = DEFAULT_KEY_FRAME_DELAY_5; + si->debug.frame_delay_key[6] = DEFAULT_KEY_FRAME_DELAY_6; + si->debug.frame_delay_key[7] = DEFAULT_KEY_FRAME_DELAY_7; + si->debug.frame_delay_key[8] = DEFAULT_KEY_FRAME_DELAY_8; + si->debug.frame_delay_key[9] = DEFAULT_KEY_FRAME_DELAY_9; + + si->debug.frame_delay_use_mod_key = DEFAULT_FRAME_DELAY_USE_MOD_KEY; + si->debug.frame_delay_game_only = DEFAULT_FRAME_DELAY_GAME_ONLY; + si->options.verbose = FALSE; #if defined(PLATFORM_ANDROID) @@ -8457,6 +8581,13 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) getHashEntry(setup_file_hash, internal_setup_tokens[i].text)); setup.internal = sxi; + /* debug setup */ + sdi = setup.debug; + for (i = 0; i < NUM_DEBUG_SETUP_TOKENS; i++) + setSetupInfo(debug_setup_tokens, i, + getHashEntry(setup_file_hash, debug_setup_tokens[i].text)); + setup.debug = sdi; + /* options setup */ soi = setup.options; for (i = 0; i < NUM_OPTIONS_SETUP_TOKENS; i++) @@ -8623,6 +8754,12 @@ void SaveSetup() /* internal setup */ /* (internal setup values not saved to user setup file) */ + /* debug setup */ + sdi = setup.debug; + fprintf(file, "\n"); + for (i = 0; i < NUM_DEBUG_SETUP_TOKENS; i++) + fprintf(file, "%s\n", getSetupLine(debug_setup_tokens, "", i)); + /* options setup */ soi = setup.options; fprintf(file, "\n"); @@ -8747,6 +8884,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; @@ -8760,6 +8930,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; } @@ -8768,31 +8945,112 @@ 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 = *game_buttons_xy[i].src; +} + +static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics() +{ + static struct + { + struct XYTileSize *dst, *src; + int graphic; + } + editor_buttons_xy[] = + { + { + &editor.button.element_left, &editor.palette.element_left, + IMG_GFX_EDITOR_BUTTON_ELEMENT_LEFT + }, + { + &editor.button.element_middle, &editor.palette.element_middle, + IMG_GFX_EDITOR_BUTTON_ELEMENT_MIDDLE + }, + { + &editor.button.element_right, &editor.palette.element_right, + IMG_GFX_EDITOR_BUTTON_ELEMENT_RIGHT + }, + + { NULL, NULL } + }; + int i; + + /* set default position for element buttons to element graphics */ + for (i = 0; editor_buttons_xy[i].dst != NULL; i++) + { + if ((*editor_buttons_xy[i].dst).x == -1 && + (*editor_buttons_xy[i].dst).y == -1) + { + struct GraphicInfo *gd = &graphic_info[editor_buttons_xy[i].graphic]; + + gd->width = gd->height = editor_buttons_xy[i].src->tile_size; + + *editor_buttons_xy[i].dst = *editor_buttons_xy[i].src; + } + } } 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" }, @@ -8816,12 +9074,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]" }, @@ -8862,6 +9168,14 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) 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); + + if (i == GFX_SPECIAL_ARG_INFO_ELEMENTS) + { + char *value_1 = getHashEntry(setup_file_hash, "menu.list_size.INFO"); + + if (value_1 != NULL) + menu.list_size_info[i] = get_integer_from_string(value_1); + } } /* special case: initialize with default values that may be overwritten */ @@ -8887,12 +9201,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, @@ -8912,12 +9232,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"; @@ -8933,6 +9264,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); @@ -8949,6 +9282,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) @@ -8986,6 +9323,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++) @@ -9007,9 +9371,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; } @@ -9057,6 +9421,11 @@ void LoadMenuDesignSettings() InitMenuDesignSettings_SpecialPostProcessing(); } +void LoadMenuDesignSettings_AfterGraphics() +{ + InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(); +} + void LoadUserDefinedEditorElementList(int **elements, int *num_elements) { char *filename = getEditorSetupFilename(); @@ -9694,15 +10063,15 @@ void ConvertLevels() convert_level_nr = convert_leveldir->first_level; - printf_line("=", 79); - printf("Converting levels\n"); - printf_line("-", 79); - printf("Level series identifier: '%s'\n", convert_leveldir->identifier); - printf("Level series name: '%s'\n", convert_leveldir->name); - printf("Level series author: '%s'\n", convert_leveldir->author); - printf("Number of levels: %d\n", convert_leveldir->levels); - printf_line("=", 79); - printf("\n"); + PrintLine("=", 79); + Print("Converting levels\n"); + PrintLine("-", 79); + Print("Level series identifier: '%s'\n", convert_leveldir->identifier); + Print("Level series name: '%s'\n", convert_leveldir->name); + Print("Level series author: '%s'\n", convert_leveldir->author); + Print("Number of levels: %d\n", convert_leveldir->levels); + PrintLine("=", 79); + Print("\n"); for (i = 0; i < MAX_NUM_CONVERT_LEVELS; i++) levels_failed[i] = FALSE; @@ -9714,16 +10083,16 @@ void ConvertLevels() level_nr = convert_level_nr++; - printf("Level %03d: ", level_nr); + Print("Level %03d: ", level_nr); LoadLevel(level_nr); - if (level.no_valid_file) + if (level.no_level_file || level.no_valid_file) { - printf("(no level)\n"); + Print("(no level)\n"); continue; } - printf("converting level ... "); + Print("converting level ... "); level_filename = getDefaultLevelFilename(level_nr); new_level = !fileExists(level_filename); @@ -9734,28 +10103,28 @@ void ConvertLevels() num_levels_converted++; - printf("converted.\n"); + Print("converted.\n"); } else { if (level_nr >= 0 && level_nr < MAX_NUM_CONVERT_LEVELS) levels_failed[level_nr] = TRUE; - printf("NOT CONVERTED -- LEVEL ALREADY EXISTS.\n"); + Print("NOT CONVERTED -- LEVEL ALREADY EXISTS.\n"); } num_levels_handled++; } - printf("\n"); - printf_line("=", 79); - printf("Number of levels handled: %d\n", num_levels_handled); - printf("Number of levels converted: %d (%d%%)\n", num_levels_converted, + Print("\n"); + PrintLine("=", 79); + Print("Number of levels handled: %d\n", num_levels_handled); + Print("Number of levels converted: %d (%d%%)\n", num_levels_converted, (num_levels_handled ? num_levels_converted * 100 / num_levels_handled : 0)); - printf_line("-", 79); - printf("Summary (for automatic parsing by scripts):\n"); - printf("LEVELDIR '%s', CONVERTED %d/%d (%d%%)", + PrintLine("-", 79); + Print("Summary (for automatic parsing by scripts):\n"); + Print("LEVELDIR '%s', CONVERTED %d/%d (%d%%)", convert_leveldir->identifier, num_levels_converted, num_levels_handled, (num_levels_handled ? @@ -9763,14 +10132,14 @@ void ConvertLevels() if (num_levels_handled != num_levels_converted) { - printf(", FAILED:"); + Print(", FAILED:"); for (i = 0; i < MAX_NUM_CONVERT_LEVELS; i++) if (levels_failed[i]) - printf(" %03d", i); + Print(" %03d", i); } - printf("\n"); - printf_line("=", 79); + Print("\n"); + PrintLine("=", 79); CloseAllAndExit(0); } @@ -9861,6 +10230,8 @@ void CreateCustomElementImages(char *directory) SDLInitVideoDisplay(); + ReCreateBitmap(&backbuffer, video.width, video.height); + src_bitmap = LoadImage(src_filename); bitmap = CreateBitmap(TILEX * 16 * 2,