X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=c0f256c73c27016f42c2af688f47f97cc0769111;hp=1d4562aebda4a826d41f7f08252210ea99a1f54f;hb=8d71e6fb8309bd90ce5f2900d84c686b17950492;hpb=4dad971280a07058d01449d5e6db2b036470015d diff --git a/src/files.c b/src/files.c index 1d4562ae..c0f256c7 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) */ { @@ -1781,10 +1786,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. */ @@ -3007,6 +3043,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 +3054,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; } @@ -5749,32 +5787,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; } } @@ -7893,7 +7905,7 @@ 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_SOFT_SCROLLING 9 +#define SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY 9 #define SETUP_TOKEN_FADE_SCREENS 10 #define SETUP_TOKEN_AUTORECORD 11 #define SETUP_TOKEN_SHOW_TITLESCREEN 12 @@ -7903,9 +7915,9 @@ void SaveScore(int nr) #define SETUP_TOKEN_SKIP_LEVELS 16 #define SETUP_TOKEN_TIME_LIMIT 17 #define SETUP_TOKEN_FULLSCREEN 18 -#define SETUP_TOKEN_FULLSCREEN_MODE 19 -#define SETUP_TOKEN_WINDOW_SCALING_PERCENT 20 -#define SETUP_TOKEN_WINDOW_SCALING_QUALITY 21 +#define SETUP_TOKEN_WINDOW_SCALING_PERCENT 19 +#define SETUP_TOKEN_WINDOW_SCALING_QUALITY 20 +#define SETUP_TOKEN_SCREEN_RENDERING_MODE 21 #define SETUP_TOKEN_ASK_ON_ESCAPE 22 #define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 23 #define SETUP_TOKEN_QUICK_SWITCH 24 @@ -7914,20 +7926,21 @@ void SaveScore(int nr) #define SETUP_TOKEN_GAME_FRAME_DELAY 27 #define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS 28 #define SETUP_TOKEN_SMALL_GAME_GRAPHICS 29 -#define SETUP_TOKEN_GRAPHICS_SET 30 -#define SETUP_TOKEN_SOUNDS_SET 31 -#define SETUP_TOKEN_MUSIC_SET 32 -#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 33 -#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 34 -#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 35 -#define SETUP_TOKEN_VOLUME_SIMPLE 36 -#define SETUP_TOKEN_VOLUME_LOOPS 37 -#define SETUP_TOKEN_VOLUME_MUSIC 38 -#define SETUP_TOKEN_TOUCH_CONTROL_TYPE 39 -#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 40 -#define SETUP_TOKEN_TOUCH_DROP_DISTANCE 41 - -#define NUM_GLOBAL_SETUP_TOKENS 42 +#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS 30 +#define SETUP_TOKEN_GRAPHICS_SET 31 +#define SETUP_TOKEN_SOUNDS_SET 32 +#define SETUP_TOKEN_MUSIC_SET 33 +#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 34 +#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 35 +#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 36 +#define SETUP_TOKEN_VOLUME_SIMPLE 37 +#define SETUP_TOKEN_VOLUME_LOOPS 38 +#define SETUP_TOKEN_VOLUME_MUSIC 39 +#define SETUP_TOKEN_TOUCH_CONTROL_TYPE 40 +#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 41 +#define SETUP_TOKEN_TOUCH_DROP_DISTANCE 42 + +#define NUM_GLOBAL_SETUP_TOKENS 43 /* editor setup */ #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 @@ -8037,8 +8050,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 @@ -8053,6 +8094,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[] = @@ -8066,7 +8108,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_SWITCH, &si.soft_scrolling, "soft_scrolling" }, + { 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" }, @@ -8076,9 +8118,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" }, @@ -8087,6 +8129,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" }, @@ -8209,7 +8252,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[] = @@ -8246,7 +8317,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->soft_scrolling = TRUE; + si->engine_snapshot_memory = SNAPSHOT_MEMORY_DEFAULT; si->fade_screens = TRUE; si->autorecord = TRUE; si->show_titlescreen = TRUE; @@ -8256,9 +8327,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; @@ -8267,6 +8338,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); @@ -8372,6 +8444,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) @@ -8460,6 +8560,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++) @@ -8626,6 +8733,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"); @@ -8750,6 +8863,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 +8909,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,31 +8924,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" }, @@ -8819,12 +9053,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]" }, @@ -8865,6 +9147,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 */ @@ -8890,12 +9180,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, @@ -8915,12 +9211,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"; @@ -8936,6 +9243,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); @@ -8952,6 +9261,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) @@ -8989,6 +9302,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++) @@ -9010,9 +9350,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; } @@ -9060,6 +9400,11 @@ void LoadMenuDesignSettings() InitMenuDesignSettings_SpecialPostProcessing(); } +void LoadMenuDesignSettings_AfterGraphics() +{ + InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(); +} + void LoadUserDefinedEditorElementList(int **elements, int *num_elements) { char *filename = getEditorSetupFilename(); @@ -9697,15 +10042,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; @@ -9717,16 +10062,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) { - 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); @@ -9737,28 +10082,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 ? @@ -9766,14 +10111,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); }