X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=01394c4eebded67fddf56698fe4f36f00c9d53fa;hp=58af05974d722b160b2db2860372a23d99b070a6;hb=a72578211d241dd0282ed9f803e85e027395f27a;hpb=10406b9d6cad2b0ec7c30c71520abe2c702bccbc diff --git a/src/files.c b/src/files.c index 58af0597..01394c4e 100644 --- a/src/files.c +++ b/src/files.c @@ -6326,10 +6326,6 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) level->extra_time_score = level->score[SC_TIME_BONUS]; } - // game logic of "game of life" and "biomaze" was buggy before 4.1.1.1 - if (level->game_version < VERSION_IDENT(4,1,1,1)) - level->use_life_bugs = TRUE; - if (level->game_version < VERSION_IDENT(3,2,0,7)) { // default behaviour for snapping was "not continuous" before 3.2.0-7 @@ -6427,6 +6423,14 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) // levels were solved by the first player entering an exit up to 4.1.0.0 if (level->game_version <= VERSION_IDENT(4,1,0,0)) level->solved_by_one_player = TRUE; + + // game logic of "game of life" and "biomaze" was buggy before 4.1.1.1 + if (level->game_version < VERSION_IDENT(4,1,1,1)) + level->use_life_bugs = TRUE; + + // only Sokoban fields (but not objects) had to be solved before 4.1.1.1 + if (level->game_version < VERSION_IDENT(4,1,1,1)) + level->sb_objects_needed = FALSE; } static void LoadLevel_InitStandardElements(struct LevelInfo *level) @@ -8346,240 +8350,6 @@ void SaveScore(int nr) #define TOKEN_STR_PLAYER_PREFIX "player_" -// global setup -enum -{ - SETUP_TOKEN_PLAYER_NAME = 0, - SETUP_TOKEN_SOUND, - SETUP_TOKEN_SOUND_LOOPS, - SETUP_TOKEN_SOUND_MUSIC, - SETUP_TOKEN_SOUND_SIMPLE, - SETUP_TOKEN_TOONS, - SETUP_TOKEN_SCROLL_DELAY, - SETUP_TOKEN_SCROLL_DELAY_VALUE, - SETUP_TOKEN_ENGINE_SNAPSHOT_MODE, - SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY, - SETUP_TOKEN_FADE_SCREENS, - SETUP_TOKEN_AUTORECORD, - SETUP_TOKEN_SHOW_TITLESCREEN, - SETUP_TOKEN_QUICK_DOORS, - SETUP_TOKEN_TEAM_MODE, - SETUP_TOKEN_HANDICAP, - SETUP_TOKEN_SKIP_LEVELS, - SETUP_TOKEN_INCREMENT_LEVELS, - SETUP_TOKEN_AUTO_PLAY_NEXT_LEVEL, - SETUP_TOKEN_SKIP_SCORES_AFTER_GAME, - SETUP_TOKEN_TIME_LIMIT, - SETUP_TOKEN_FULLSCREEN, - SETUP_TOKEN_WINDOW_SCALING_PERCENT, - SETUP_TOKEN_WINDOW_SCALING_QUALITY, - SETUP_TOKEN_SCREEN_RENDERING_MODE, - SETUP_TOKEN_VSYNC_MODE, - SETUP_TOKEN_ASK_ON_ESCAPE, - SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR, - SETUP_TOKEN_ASK_ON_GAME_OVER, - SETUP_TOKEN_QUICK_SWITCH, - SETUP_TOKEN_INPUT_ON_FOCUS, - SETUP_TOKEN_PREFER_AGA_GRAPHICS, - SETUP_TOKEN_GAME_SPEED_EXTENDED, - SETUP_TOKEN_GAME_FRAME_DELAY, - SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS, - SETUP_TOKEN_SMALL_GAME_GRAPHICS, - SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS, - SETUP_TOKEN_GRAPHICS_SET, - SETUP_TOKEN_SOUNDS_SET, - SETUP_TOKEN_MUSIC_SET, - SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS, - SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS, - SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC, - SETUP_TOKEN_VOLUME_SIMPLE, - SETUP_TOKEN_VOLUME_LOOPS, - SETUP_TOKEN_VOLUME_MUSIC, - SETUP_TOKEN_NETWORK_MODE, - SETUP_TOKEN_NETWORK_PLAYER_NR, - SETUP_TOKEN_NETWORK_SERVER_HOSTNAME, - SETUP_TOKEN_TOUCH_CONTROL_TYPE, - SETUP_TOKEN_TOUCH_MOVE_DISTANCE, - SETUP_TOKEN_TOUCH_DROP_DISTANCE, - SETUP_TOKEN_TOUCH_TRANSPARENCY, - SETUP_TOKEN_TOUCH_DRAW_OUTLINED, - SETUP_TOKEN_TOUCH_DRAW_PRESSED, - SETUP_TOKEN_TOUCH_GRID_XSIZE_0, - SETUP_TOKEN_TOUCH_GRID_YSIZE_0, - SETUP_TOKEN_TOUCH_GRID_XSIZE_1, - SETUP_TOKEN_TOUCH_GRID_YSIZE_1, - - NUM_GLOBAL_SETUP_TOKENS -}; - -// auto setup -enum -{ - SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE = 0, - - NUM_AUTO_SETUP_TOKENS -}; - -// editor setup -enum -{ - SETUP_TOKEN_EDITOR_EL_CLASSIC = 0, - SETUP_TOKEN_EDITOR_EL_CUSTOM, - SETUP_TOKEN_EDITOR_EL_USER_DEFINED, - SETUP_TOKEN_EDITOR_EL_DYNAMIC, - SETUP_TOKEN_EDITOR_EL_HEADLINES, - SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN, - - NUM_EDITOR_SETUP_TOKENS -}; - -// editor cascade setup -enum -{ - SETUP_TOKEN_EDITOR_CASCADE_BD = 0, - SETUP_TOKEN_EDITOR_CASCADE_EM, - SETUP_TOKEN_EDITOR_CASCADE_EMC, - SETUP_TOKEN_EDITOR_CASCADE_RND, - SETUP_TOKEN_EDITOR_CASCADE_SB, - SETUP_TOKEN_EDITOR_CASCADE_SP, - SETUP_TOKEN_EDITOR_CASCADE_DC, - SETUP_TOKEN_EDITOR_CASCADE_DX, - SETUP_TOKEN_EDITOR_CASCADE_TEXT, - SETUP_TOKEN_EDITOR_CASCADE_STEELTEXT, - SETUP_TOKEN_EDITOR_CASCADE_CE, - SETUP_TOKEN_EDITOR_CASCADE_GE, - SETUP_TOKEN_EDITOR_CASCADE_REF, - SETUP_TOKEN_EDITOR_CASCADE_USER, - SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC, - - NUM_EDITOR_CASCADE_SETUP_TOKENS -}; - -// shortcut setup -enum -{ - SETUP_TOKEN_SHORTCUT_SAVE_GAME = 0, - SETUP_TOKEN_SHORTCUT_LOAD_GAME, - SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE, - SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_1, - SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_2, - SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_3, - SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4, - SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL, - SETUP_TOKEN_SHORTCUT_TAPE_EJECT, - SETUP_TOKEN_SHORTCUT_TAPE_EXTRA, - SETUP_TOKEN_SHORTCUT_TAPE_STOP, - SETUP_TOKEN_SHORTCUT_TAPE_PAUSE, - SETUP_TOKEN_SHORTCUT_TAPE_RECORD, - SETUP_TOKEN_SHORTCUT_TAPE_PLAY, - SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE, - SETUP_TOKEN_SHORTCUT_SOUND_LOOPS, - SETUP_TOKEN_SHORTCUT_SOUND_MUSIC, - SETUP_TOKEN_SHORTCUT_SNAP_LEFT, - SETUP_TOKEN_SHORTCUT_SNAP_RIGHT, - SETUP_TOKEN_SHORTCUT_SNAP_UP, - SETUP_TOKEN_SHORTCUT_SNAP_DOWN, - - NUM_SHORTCUT_SETUP_TOKENS -}; - -// player setup -enum -{ - SETUP_TOKEN_PLAYER_USE_JOYSTICK = 0, - SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME, - SETUP_TOKEN_PLAYER_JOY_XLEFT, - SETUP_TOKEN_PLAYER_JOY_XMIDDLE, - SETUP_TOKEN_PLAYER_JOY_XRIGHT, - SETUP_TOKEN_PLAYER_JOY_YUPPER, - SETUP_TOKEN_PLAYER_JOY_YMIDDLE, - SETUP_TOKEN_PLAYER_JOY_YLOWER, - SETUP_TOKEN_PLAYER_JOY_SNAP, - SETUP_TOKEN_PLAYER_JOY_DROP, - SETUP_TOKEN_PLAYER_KEY_LEFT, - SETUP_TOKEN_PLAYER_KEY_RIGHT, - SETUP_TOKEN_PLAYER_KEY_UP, - SETUP_TOKEN_PLAYER_KEY_DOWN, - SETUP_TOKEN_PLAYER_KEY_SNAP, - SETUP_TOKEN_PLAYER_KEY_DROP, - - NUM_PLAYER_SETUP_TOKENS -}; - -// system setup -enum -{ - SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER = 0, - SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER, - SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE, - - NUM_SYSTEM_SETUP_TOKENS -}; - -// internal setup -enum -{ - SETUP_TOKEN_INT_PROGRAM_TITLE = 0, - SETUP_TOKEN_INT_PROGRAM_VERSION, - SETUP_TOKEN_INT_PROGRAM_AUTHOR, - SETUP_TOKEN_INT_PROGRAM_EMAIL, - SETUP_TOKEN_INT_PROGRAM_WEBSITE, - SETUP_TOKEN_INT_PROGRAM_COPYRIGHT, - SETUP_TOKEN_INT_PROGRAM_COMPANY, - SETUP_TOKEN_INT_PROGRAM_ICON_FILE, - SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET, - SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET, - SETUP_TOKEN_INT_DEFAULT_MUSIC_SET, - SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE, - SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE, - SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE, - SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES, - SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR, - SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE, - SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH, - SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT, - - NUM_INTERNAL_SETUP_TOKENS -}; - -// debug setup -enum -{ - SETUP_TOKEN_DEBUG_FRAME_DELAY_0 = 0, - SETUP_TOKEN_DEBUG_FRAME_DELAY_1, - SETUP_TOKEN_DEBUG_FRAME_DELAY_2, - SETUP_TOKEN_DEBUG_FRAME_DELAY_3, - SETUP_TOKEN_DEBUG_FRAME_DELAY_4, - SETUP_TOKEN_DEBUG_FRAME_DELAY_5, - SETUP_TOKEN_DEBUG_FRAME_DELAY_6, - SETUP_TOKEN_DEBUG_FRAME_DELAY_7, - SETUP_TOKEN_DEBUG_FRAME_DELAY_8, - SETUP_TOKEN_DEBUG_FRAME_DELAY_9, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_0, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_1, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_2, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_3, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_4, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_5, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_6, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_7, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_8, - SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_9, - SETUP_TOKEN_DEBUG_FRAME_DELAY_USE_MOD_KEY, - SETUP_TOKEN_DEBUG_FRAME_DELAY_GAME_ONLY, - SETUP_TOKEN_DEBUG_SHOW_FRAMES_PER_SECOND, - - NUM_DEBUG_SETUP_TOKENS -}; - -// options setup -enum -{ - SETUP_TOKEN_OPTIONS_VERBOSE = 0, - - NUM_OPTIONS_SETUP_TOKENS -}; - static struct SetupInfo si; static struct SetupAutoSetupInfo sasi; @@ -9163,7 +8933,7 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) // global setup si = setup; - for (i = 0; i < NUM_GLOBAL_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(global_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, global_setup_tokens, i); setup = si; @@ -9208,13 +8978,13 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) // editor setup sei = setup.editor; - for (i = 0; i < NUM_EDITOR_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(editor_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, editor_setup_tokens, i); setup.editor = sei; // shortcut setup ssi = setup.shortcut; - for (i = 0; i < NUM_SHORTCUT_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(shortcut_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, shortcut_setup_tokens, i); setup.shortcut = ssi; @@ -9226,7 +8996,7 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) sprintf(prefix, "%s%d", TOKEN_STR_PLAYER_PREFIX, pnr + 1); sii = setup.input[pnr]; - for (i = 0; i < NUM_PLAYER_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(player_setup_tokens); i++) { char full_token[100]; @@ -9239,25 +9009,25 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) // system setup syi = setup.system; - for (i = 0; i < NUM_SYSTEM_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(system_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, system_setup_tokens, i); setup.system = syi; // internal setup sxi = setup.internal; - for (i = 0; i < NUM_INTERNAL_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(internal_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, internal_setup_tokens, i); setup.internal = sxi; // debug setup sdi = setup.debug; - for (i = 0; i < NUM_DEBUG_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(debug_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, debug_setup_tokens, i); setup.debug = sdi; // options setup soi = setup.options; - for (i = 0; i < NUM_OPTIONS_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(options_setup_tokens); i++) setSetupInfoFromTokenInfo(setup_file_hash, options_setup_tokens, i); setup.options = soi; @@ -9273,7 +9043,7 @@ static void decodeSetupFileHash_AutoSetup(SetupFileHash *setup_file_hash) // auto setup sasi = setup.auto_setup; - for (i = 0; i < NUM_AUTO_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(auto_setup_tokens); i++) setSetupInfo(auto_setup_tokens, i, getHashEntry(setup_file_hash, auto_setup_tokens[i].text)); @@ -9289,7 +9059,7 @@ static void decodeSetupFileHash_EditorCascade(SetupFileHash *setup_file_hash) // editor cascade setup seci = setup.editor_cascade; - for (i = 0; i < NUM_EDITOR_CASCADE_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(editor_cascade_setup_tokens); i++) setSetupInfo(editor_cascade_setup_tokens, i, getHashEntry(setup_file_hash, editor_cascade_setup_tokens[i].text)); @@ -9461,16 +9231,16 @@ void SaveSetup(void) // global setup si = setup; - for (i = 0; i < NUM_GLOBAL_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(global_setup_tokens); i++) { // just to make things nicer :) - if (i == SETUP_TOKEN_PLAYER_NAME + 1 || - i == SETUP_TOKEN_GRAPHICS_SET || - i == SETUP_TOKEN_VOLUME_SIMPLE || - i == SETUP_TOKEN_NETWORK_MODE || - i == SETUP_TOKEN_TOUCH_CONTROL_TYPE || - i == SETUP_TOKEN_TOUCH_GRID_XSIZE_0 || - i == SETUP_TOKEN_TOUCH_GRID_XSIZE_1) + if (global_setup_tokens[i].value == &si.sound || + global_setup_tokens[i].value == &si.graphics_set || + global_setup_tokens[i].value == &si.volume_simple || + global_setup_tokens[i].value == &si.network_mode || + global_setup_tokens[i].value == &si.touch.control_type || + global_setup_tokens[i].value == &si.touch.grid_xsize[0] || + global_setup_tokens[i].value == &si.touch.grid_xsize[1]) fprintf(file, "\n"); fprintf(file, "%s\n", getSetupLine(global_setup_tokens, "", i)); @@ -9508,13 +9278,13 @@ void SaveSetup(void) // editor setup sei = setup.editor; fprintf(file, "\n"); - for (i = 0; i < NUM_EDITOR_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(editor_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(editor_setup_tokens, "", i)); // shortcut setup ssi = setup.shortcut; fprintf(file, "\n"); - for (i = 0; i < NUM_SHORTCUT_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(shortcut_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(shortcut_setup_tokens, "", i)); // player setup @@ -9526,14 +9296,14 @@ void SaveSetup(void) fprintf(file, "\n"); sii = setup.input[pnr]; - for (i = 0; i < NUM_PLAYER_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(player_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(player_setup_tokens, prefix, i)); } // system setup syi = setup.system; fprintf(file, "\n"); - for (i = 0; i < NUM_SYSTEM_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(system_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(system_setup_tokens, "", i)); // internal setup @@ -9542,13 +9312,13 @@ void SaveSetup(void) // debug setup sdi = setup.debug; fprintf(file, "\n"); - for (i = 0; i < NUM_DEBUG_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(debug_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(debug_setup_tokens, "", i)); // options setup soi = setup.options; fprintf(file, "\n"); - for (i = 0; i < NUM_OPTIONS_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(options_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(options_setup_tokens, "", i)); fclose(file); @@ -9574,7 +9344,7 @@ void SaveSetup_AutoSetup(void) fprintFileHeader(file, AUTOSETUP_FILENAME); sasi = setup.auto_setup; - for (i = 0; i < NUM_AUTO_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(auto_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(auto_setup_tokens, "", i)); fclose(file); @@ -9602,7 +9372,7 @@ void SaveSetup_EditorCascade(void) fprintFileHeader(file, EDITORCASCADE_FILENAME); seci = setup.editor_cascade; - for (i = 0; i < NUM_EDITOR_CASCADE_SETUP_TOKENS; i++) + for (i = 0; i < ARRAY_SIZE(editor_cascade_setup_tokens); i++) fprintf(file, "%s\n", getSetupLine(editor_cascade_setup_tokens, "", i)); fclose(file); @@ -9838,7 +9608,7 @@ static void InitMenuDesignSettings_SpecialPostProcessing(void) { NULL, NULL } }; - int i; + int i, j; // special case: initialize later added SETUP list size from LEVELS value if (menu.list_size[GAME_MODE_SETUP] == -1) @@ -9849,6 +9619,237 @@ static void InitMenuDesignSettings_SpecialPostProcessing(void) 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; + + // -------------------------------------------------------------------------- + // dynamic viewports (including playfield margins, borders and alignments) + // -------------------------------------------------------------------------- + + // dynamic viewports currently only supported for landscape mode + int display_width = MAX(video.display_width, video.display_height); + int display_height = MIN(video.display_width, video.display_height); + + for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + struct RectWithBorder *vp_window = &viewport.window[i]; + struct RectWithBorder *vp_playfield = &viewport.playfield[i]; + struct RectWithBorder *vp_door_1 = &viewport.door_1[i]; + struct RectWithBorder *vp_door_2 = &viewport.door_2[i]; + boolean dynamic_window_width = (vp_window->min_width != -1); + boolean dynamic_window_height = (vp_window->min_height != -1); + boolean dynamic_playfield_width = (vp_playfield->min_width != -1); + boolean dynamic_playfield_height = (vp_playfield->min_height != -1); + + // adjust window size if min/max width/height is specified + + if (vp_window->min_width != -1) + { + int window_width = display_width; + + // when using static window height, use aspect ratio of display + if (vp_window->min_height == -1) + window_width = vp_window->height * display_width / display_height; + + vp_window->width = MAX(vp_window->min_width, window_width); + } + + if (vp_window->min_height != -1) + { + int window_height = display_height; + + // when using static window width, use aspect ratio of display + if (vp_window->min_width == -1) + window_height = vp_window->width * display_height / display_width; + + vp_window->height = MAX(vp_window->min_height, window_height); + } + + if (vp_window->max_width != -1) + vp_window->width = MIN(vp_window->width, vp_window->max_width); + + if (vp_window->max_height != -1) + vp_window->height = MIN(vp_window->height, vp_window->max_height); + + int playfield_width = vp_window->width; + int playfield_height = vp_window->height; + + // adjust playfield size and position according to specified margins + + playfield_width -= vp_playfield->margin_left; + playfield_width -= vp_playfield->margin_right; + + playfield_height -= vp_playfield->margin_top; + playfield_height -= vp_playfield->margin_bottom; + + // adjust playfield size if min/max width/height is specified + + if (vp_playfield->min_width != -1) + vp_playfield->width = MAX(vp_playfield->min_width, playfield_width); + + if (vp_playfield->min_height != -1) + vp_playfield->height = MAX(vp_playfield->min_height, playfield_height); + + if (vp_playfield->max_width != -1) + vp_playfield->width = MIN(vp_playfield->width, vp_playfield->max_width); + + if (vp_playfield->max_height != -1) + vp_playfield->height = MIN(vp_playfield->height,vp_playfield->max_height); + + // adjust playfield position according to specified alignment + + if (vp_playfield->align == ALIGN_LEFT || vp_playfield->x > 0) + vp_playfield->x = ALIGNED_VP_XPOS(vp_playfield); + else if (vp_playfield->align == ALIGN_CENTER) + vp_playfield->x = playfield_width / 2 - vp_playfield->width / 2; + else if (vp_playfield->align == ALIGN_RIGHT) + vp_playfield->x += playfield_width - vp_playfield->width; + + if (vp_playfield->valign == VALIGN_TOP || vp_playfield->y > 0) + vp_playfield->y = ALIGNED_VP_YPOS(vp_playfield); + else if (vp_playfield->valign == VALIGN_MIDDLE) + vp_playfield->y = playfield_height / 2 - vp_playfield->height / 2; + else if (vp_playfield->valign == VALIGN_BOTTOM) + vp_playfield->y += playfield_height - vp_playfield->height; + + vp_playfield->x += vp_playfield->margin_left; + vp_playfield->y += vp_playfield->margin_top; + + // adjust individual playfield borders if only default border is specified + + if (vp_playfield->border_left == -1) + vp_playfield->border_left = vp_playfield->border_size; + if (vp_playfield->border_right == -1) + vp_playfield->border_right = vp_playfield->border_size; + if (vp_playfield->border_top == -1) + vp_playfield->border_top = vp_playfield->border_size; + if (vp_playfield->border_bottom == -1) + vp_playfield->border_bottom = vp_playfield->border_size; + + // set dynamic playfield borders if borders are specified as undefined + // (but only if window size was dynamic and playfield size was static) + + if (dynamic_window_width && !dynamic_playfield_width) + { + if (vp_playfield->border_left == -1) + { + vp_playfield->border_left = (vp_playfield->x - + vp_playfield->margin_left); + vp_playfield->x -= vp_playfield->border_left; + vp_playfield->width += vp_playfield->border_left; + } + + if (vp_playfield->border_right == -1) + { + vp_playfield->border_right = (vp_window->width - + vp_playfield->x - + vp_playfield->width - + vp_playfield->margin_right); + vp_playfield->width += vp_playfield->border_right; + } + } + + if (dynamic_window_height && !dynamic_playfield_height) + { + if (vp_playfield->border_top == -1) + { + vp_playfield->border_top = (vp_playfield->y - + vp_playfield->margin_top); + vp_playfield->y -= vp_playfield->border_top; + vp_playfield->height += vp_playfield->border_top; + } + + if (vp_playfield->border_bottom == -1) + { + vp_playfield->border_bottom = (vp_window->height - + vp_playfield->y - + vp_playfield->height - + vp_playfield->margin_bottom); + vp_playfield->height += vp_playfield->border_bottom; + } + } + + // adjust playfield size to be a multiple of a defined alignment tile size + + int align_size = vp_playfield->align_size; + int playfield_xtiles = vp_playfield->width / align_size; + int playfield_ytiles = vp_playfield->height / align_size; + int playfield_width_corrected = playfield_xtiles * align_size; + int playfield_height_corrected = playfield_ytiles * align_size; + boolean is_playfield_mode = (i == GFX_SPECIAL_ARG_PLAYING || + i == GFX_SPECIAL_ARG_EDITOR); + + if (is_playfield_mode && + dynamic_playfield_width && + vp_playfield->width != playfield_width_corrected) + { + int playfield_xdiff = vp_playfield->width - playfield_width_corrected; + + vp_playfield->width = playfield_width_corrected; + + if (vp_playfield->align == ALIGN_LEFT) + { + vp_playfield->border_left += playfield_xdiff; + } + else if (vp_playfield->align == ALIGN_RIGHT) + { + vp_playfield->border_right += playfield_xdiff; + } + else if (vp_playfield->align == ALIGN_CENTER) + { + int border_left_diff = playfield_xdiff / 2; + int border_right_diff = playfield_xdiff - border_left_diff; + + vp_playfield->border_left += border_left_diff; + vp_playfield->border_right += border_right_diff; + } + } + + if (is_playfield_mode && + dynamic_playfield_height && + vp_playfield->height != playfield_height_corrected) + { + int playfield_ydiff = vp_playfield->height - playfield_height_corrected; + + vp_playfield->height = playfield_height_corrected; + + if (vp_playfield->valign == VALIGN_TOP) + { + vp_playfield->border_top += playfield_ydiff; + } + else if (vp_playfield->align == VALIGN_BOTTOM) + { + vp_playfield->border_right += playfield_ydiff; + } + else if (vp_playfield->align == VALIGN_MIDDLE) + { + int border_top_diff = playfield_ydiff / 2; + int border_bottom_diff = playfield_ydiff - border_top_diff; + + vp_playfield->border_top += border_top_diff; + vp_playfield->border_bottom += border_bottom_diff; + } + } + + // adjust door positions according to specified alignment + + for (j = 0; j < 2; j++) + { + struct RectWithBorder *vp_door = (j == 0 ? vp_door_1 : vp_door_2); + + if (vp_door->align == ALIGN_LEFT || vp_door->x > 0) + vp_door->x = ALIGNED_VP_XPOS(vp_door); + else if (vp_door->align == ALIGN_CENTER) + vp_door->x = vp_window->width / 2 - vp_door->width / 2; + else if (vp_door->align == ALIGN_RIGHT) + vp_door->x += vp_window->width - vp_door->width; + + if (vp_door->valign == VALIGN_TOP || vp_door->y > 0) + vp_door->y = ALIGNED_VP_YPOS(vp_door); + else if (vp_door->valign == VALIGN_MIDDLE) + vp_door->y = vp_window->height / 2 - vp_door->height / 2; + else if (vp_door->valign == VALIGN_BOTTOM) + vp_door->y += vp_window->height - vp_door->height; + } + } } static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(void) @@ -9890,6 +9891,40 @@ static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(void) *editor_buttons_xy[i].dst = *editor_buttons_xy[i].src; } } + + // adjust editor palette rows and columns if specified to be dynamic + + if (editor.palette.cols == -1) + { + int vp_width = viewport.playfield[GFX_SPECIAL_ARG_EDITOR].width; + int bt_width = graphic_info[IMG_EDITOR_PALETTE_BUTTON].width; + int sc_width = graphic_info[IMG_EDITOR_PALETTE_SCROLLBAR].width; + + editor.palette.cols = (vp_width - sc_width) / bt_width; + + if (editor.palette.x == -1) + { + int palette_width = editor.palette.cols * bt_width + sc_width; + + editor.palette.x = (vp_width - palette_width) / 2; + } + } + + if (editor.palette.rows == -1) + { + int vp_height = viewport.playfield[GFX_SPECIAL_ARG_EDITOR].height; + int bt_height = graphic_info[IMG_EDITOR_PALETTE_BUTTON].height; + int tx_height = getFontHeight(FONT_TEXT_2); + + editor.palette.rows = (vp_height - tx_height) / bt_height; + + if (editor.palette.y == -1) + { + int palette_height = editor.palette.rows * bt_height + tx_height; + + editor.palette.y = (vp_height - palette_height) / 2; + } + } } static void LoadMenuDesignSettingsFromFilename(char *filename) @@ -9999,36 +10034,41 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) // (e.g., init "menu.draw_xoffset.INFO" from "menu.draw_xoffset") for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) { - 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"); + struct TokenIntPtrInfo menu_config[] = + { + { "menu.draw_xoffset", &menu.draw_xoffset[i] }, + { "menu.draw_yoffset", &menu.draw_yoffset[i] }, + { "menu.list_size", &menu.list_size[i] } + }; - 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); + for (j = 0; j < ARRAY_SIZE(menu_config); j++) + { + char *token = menu_config[j].token; + char *value = getHashEntry(setup_file_hash, token); + + if (value != NULL) + *menu_config[j].value = get_integer_from_string(value); + } } // special case: initialize with default values that may be overwritten // (eg, init "menu.draw_xoffset.INFO[XXX]" from "menu.draw_xoffset.INFO") for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++) { - 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); + struct TokenIntPtrInfo menu_config[] = + { + { "menu.draw_xoffset.INFO", &menu.draw_xoffset_info[i] }, + { "menu.draw_yoffset.INFO", &menu.draw_yoffset_info[i] }, + { "menu.list_size.INFO", &menu.list_size_info[i] } + }; - if (i == GFX_SPECIAL_ARG_INFO_ELEMENTS) + for (j = 0; j < ARRAY_SIZE(menu_config); j++) { - char *value_1 = getHashEntry(setup_file_hash, "menu.list_size.INFO"); + char *token = menu_config[j].token; + char *value = getHashEntry(setup_file_hash, token); - if (value_1 != NULL) - menu.list_size_info[i] = get_integer_from_string(value_1); + if (value != NULL) + *menu_config[j].value = get_integer_from_string(value); } } @@ -10036,179 +10076,131 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) // (eg, init "menu.draw_xoffset.SETUP[XXX]" from "menu.draw_xoffset.SETUP") for (i = 0; i < NUM_SPECIAL_GFX_SETUP_ARGS; i++) { - char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset.SETUP"); - char *value_2 = getHashEntry(setup_file_hash, "menu.draw_yoffset.SETUP"); + struct TokenIntPtrInfo menu_config[] = + { + { "menu.draw_xoffset.SETUP", &menu.draw_xoffset_setup[i] }, + { "menu.draw_yoffset.SETUP", &menu.draw_yoffset_setup[i] } + }; - if (value_1 != NULL) - menu.draw_xoffset_setup[i] = get_integer_from_string(value_1); - if (value_2 != NULL) - menu.draw_yoffset_setup[i] = get_integer_from_string(value_2); + for (j = 0; j < ARRAY_SIZE(menu_config); j++) + { + char *token = menu_config[j].token; + char *value = getHashEntry(setup_file_hash, token); + + if (value != NULL) + *menu_config[j].value = get_integer_from_string(value); + } } // special case: initialize with default values that may be overwritten // (eg, init "menu.line_spacing.INFO[XXX]" from "menu.line_spacing.INFO") for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++) { - char *value_1 = getHashEntry(setup_file_hash,"menu.left_spacing.INFO"); - char *value_2 = getHashEntry(setup_file_hash,"menu.right_spacing.INFO"); - char *value_3 = getHashEntry(setup_file_hash,"menu.top_spacing.INFO"); - char *value_4 = getHashEntry(setup_file_hash,"menu.bottom_spacing.INFO"); - char *value_5 = getHashEntry(setup_file_hash,"menu.paragraph_spacing.INFO"); - char *value_6 = getHashEntry(setup_file_hash,"menu.headline1_spacing.INFO"); - char *value_7 = getHashEntry(setup_file_hash,"menu.headline2_spacing.INFO"); - char *value_8 = getHashEntry(setup_file_hash,"menu.line_spacing.INFO"); - char *value_9 = getHashEntry(setup_file_hash,"menu.extra_spacing.INFO"); - - if (value_1 != NULL) - menu.left_spacing_info[i] = get_integer_from_string(value_1); - if (value_2 != NULL) - menu.right_spacing_info[i] = get_integer_from_string(value_2); - if (value_3 != NULL) - menu.top_spacing_info[i] = get_integer_from_string(value_3); - if (value_4 != NULL) - menu.bottom_spacing_info[i] = get_integer_from_string(value_4); - if (value_5 != NULL) - menu.paragraph_spacing_info[i] = get_integer_from_string(value_5); - if (value_6 != NULL) - menu.headline1_spacing_info[i] = get_integer_from_string(value_6); - if (value_7 != NULL) - menu.headline2_spacing_info[i] = get_integer_from_string(value_7); - if (value_8 != NULL) - menu.line_spacing_info[i] = get_integer_from_string(value_8); - if (value_9 != NULL) - menu.extra_spacing_info[i] = get_integer_from_string(value_9); + struct TokenIntPtrInfo menu_config[] = + { + { "menu.left_spacing.INFO", &menu.left_spacing_info[i] }, + { "menu.right_spacing.INFO", &menu.right_spacing_info[i] }, + { "menu.top_spacing.INFO", &menu.top_spacing_info[i] }, + { "menu.bottom_spacing.INFO", &menu.bottom_spacing_info[i] }, + { "menu.paragraph_spacing.INFO", &menu.paragraph_spacing_info[i] }, + { "menu.headline1_spacing.INFO", &menu.headline1_spacing_info[i] }, + { "menu.headline2_spacing.INFO", &menu.headline2_spacing_info[i] }, + { "menu.line_spacing.INFO", &menu.line_spacing_info[i] }, + { "menu.extra_spacing.INFO", &menu.extra_spacing_info[i] }, + }; + + for (j = 0; j < ARRAY_SIZE(menu_config); j++) + { + char *token = menu_config[j].token; + char *value = getHashEntry(setup_file_hash, token); + + if (value != NULL) + *menu_config[j].value = get_integer_from_string(value); + } } // 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 *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, - 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); - 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); + struct TokenIntPtrInfo menu_config[] = + { + { "menu.enter_screen.fade_mode", &menu.enter_screen[i].fade_mode }, + { "menu.enter_screen.fade_delay", &menu.enter_screen[i].fade_delay }, + { "menu.enter_screen.post_delay", &menu.enter_screen[i].post_delay }, + { "menu.leave_screen.fade_mode", &menu.leave_screen[i].fade_mode }, + { "menu.leave_screen.fade_delay", &menu.leave_screen[i].fade_delay }, + { "menu.leave_screen.post_delay", &menu.leave_screen[i].post_delay }, + { "menu.next_screen.fade_mode", &menu.next_screen[i].fade_mode }, + { "menu.next_screen.fade_delay", &menu.next_screen[i].fade_delay }, + { "menu.next_screen.post_delay", &menu.next_screen[i].post_delay } + }; + + for (j = 0; j < ARRAY_SIZE(menu_config); j++) + { + char *token = menu_config[j].token; + char *value = getHashEntry(setup_file_hash, token); + + if (value != NULL) + *menu_config[j].value = get_token_parameter_value(token, value); + } } // 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"; - char *token_04 = "viewport.playfield.height"; - char *token_05 = "viewport.playfield.border_size"; - char *token_06 = "viewport.door_1.x"; - char *token_07 = "viewport.door_1.y"; - char *token_08 = "viewport.door_1.width"; - char *token_09 = "viewport.door_1.height"; - char *token_10 = "viewport.door_1.border_size"; - char *token_11 = "viewport.door_2.x"; - char *token_12 = "viewport.door_2.y"; - 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); - char *value_04 = getHashEntry(setup_file_hash, token_04); - char *value_05 = getHashEntry(setup_file_hash, token_05); - char *value_06 = getHashEntry(setup_file_hash, token_06); - char *value_07 = getHashEntry(setup_file_hash, token_07); - char *value_08 = getHashEntry(setup_file_hash, token_08); - char *value_09 = getHashEntry(setup_file_hash, token_09); - char *value_10 = getHashEntry(setup_file_hash, token_10); - char *value_11 = getHashEntry(setup_file_hash, token_11); - char *value_12 = getHashEntry(setup_file_hash, token_12); - char *value_13 = getHashEntry(setup_file_hash, token_13); - 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) - viewport.playfield[i].y = get_token_parameter_value(token_02, value_02); - if (value_03 != NULL) - viewport.playfield[i].width = get_token_parameter_value(token_03, - value_03); - if (value_04 != NULL) - viewport.playfield[i].height = get_token_parameter_value(token_04, - value_04); - if (value_05 != NULL) - viewport.playfield[i].border_size = get_token_parameter_value(token_05, - value_05); - if (value_06 != NULL) - viewport.door_1[i].x = get_token_parameter_value(token_06, value_06); - if (value_07 != NULL) - viewport.door_1[i].y = get_token_parameter_value(token_07, value_07); - if (value_08 != NULL) - viewport.door_1[i].width = get_token_parameter_value(token_08, value_08); - if (value_09 != NULL) - viewport.door_1[i].height = get_token_parameter_value(token_09, value_09); - if (value_10 != NULL) - viewport.door_1[i].border_size = get_token_parameter_value(token_10, - value_10); - if (value_11 != NULL) - viewport.door_2[i].x = get_token_parameter_value(token_11, value_11); - if (value_12 != NULL) - viewport.door_2[i].y = get_token_parameter_value(token_12, value_12); - if (value_13 != NULL) - viewport.door_2[i].width = get_token_parameter_value(token_13, value_13); - if (value_14 != NULL) - viewport.door_2[i].height = get_token_parameter_value(token_14, value_14); - if (value_15 != NULL) - viewport.door_1[i].border_size = get_token_parameter_value(token_15, - value_15); + struct + { + char *token_prefix; + struct RectWithBorder *struct_ptr; + } + vp_struct[] = + { + { "viewport.window", &viewport.window[i] }, + { "viewport.playfield", &viewport.playfield[i] }, + { "viewport.door_1", &viewport.door_1[i] }, + { "viewport.door_2", &viewport.door_2[i] } + }; + + for (j = 0; j < ARRAY_SIZE(vp_struct); j++) + { + struct TokenIntPtrInfo vp_config[] = + { + { ".x", &vp_struct[j].struct_ptr->x }, + { ".y", &vp_struct[j].struct_ptr->y }, + { ".width", &vp_struct[j].struct_ptr->width }, + { ".height", &vp_struct[j].struct_ptr->height }, + { ".min_width", &vp_struct[j].struct_ptr->min_width }, + { ".min_height", &vp_struct[j].struct_ptr->min_height }, + { ".max_width", &vp_struct[j].struct_ptr->max_width }, + { ".max_height", &vp_struct[j].struct_ptr->max_height }, + { ".margin_left", &vp_struct[j].struct_ptr->margin_left }, + { ".margin_right", &vp_struct[j].struct_ptr->margin_right }, + { ".margin_top", &vp_struct[j].struct_ptr->margin_top }, + { ".margin_bottom", &vp_struct[j].struct_ptr->margin_bottom }, + { ".border_left", &vp_struct[j].struct_ptr->border_left }, + { ".border_right", &vp_struct[j].struct_ptr->border_right }, + { ".border_top", &vp_struct[j].struct_ptr->border_top }, + { ".border_bottom", &vp_struct[j].struct_ptr->border_bottom }, + { ".border_size", &vp_struct[j].struct_ptr->border_size }, + { ".align_size", &vp_struct[j].struct_ptr->align_size }, + { ".align", &vp_struct[j].struct_ptr->align }, + { ".valign", &vp_struct[j].struct_ptr->valign } + }; + + for (k = 0; k < ARRAY_SIZE(vp_config); k++) + { + char *token = getStringCat2(vp_struct[j].token_prefix, + vp_config[k].token); + char *value = getHashEntry(setup_file_hash, token); + + if (value != NULL) + *vp_config[k].value = get_token_parameter_value(token, value); + + free(token); + } + } } // special case: initialize with default values that may be overwritten @@ -11039,7 +11031,6 @@ void ConvertLevels(void) void CreateLevelSketchImages(void) { -#if defined(TARGET_SDL) Bitmap *bitmap1; Bitmap *bitmap2; int i; @@ -11095,7 +11086,6 @@ void CreateLevelSketchImages(void) Error(ERR_INFO, "%d normal and small images created", NUM_FILE_ELEMENTS); CloseAllAndExit(0); -#endif } @@ -11105,7 +11095,6 @@ void CreateLevelSketchImages(void) void CreateCustomElementImages(char *directory) { -#if defined(TARGET_SDL) char *src_basename = "RocksCE-template.ilbm"; char *dst_basename = "RocksCE.bmp"; char *src_filename = getPath2(directory, src_basename); @@ -11197,5 +11186,4 @@ void CreateCustomElementImages(char *directory) FreeBitmap(bitmap); CloseAllAndExit(0); -#endif }