+ fclose(file);
+}
+
+void SaveScore(int nr)
+{
+ int i;
+ int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE);
+ char *filename = getScoreFilename(nr);
+ FILE *file;
+
+ // used instead of "leveldir_current->subdir" (for network games)
+ InitScoreDirectory(levelset.identifier);
+
+ if (!(file = fopen(filename, MODE_WRITE)))
+ {
+ Error(ERR_WARN, "cannot save score for level %d", nr);
+ return;
+ }
+
+ fprintf(file, "%s\n\n", SCORE_COOKIE);
+
+ for (i = 0; i < MAX_SCORE_ENTRIES; i++)
+ fprintf(file, "%d %s\n", highscore[i].Score, highscore[i].Name);
+
+ fclose(file);
+
+ SetFilePermissions(filename, permissions);
+}
+
+
+// ============================================================================
+// setup file functions
+// ============================================================================
+
+#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;
+static struct SetupEditorInfo sei;
+static struct SetupEditorCascadeInfo seci;
+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[] =
+{
+ { TYPE_STRING, &si.player_name, "player_name" },
+ { TYPE_SWITCH, &si.sound, "sound" },
+ { TYPE_SWITCH, &si.sound_loops, "repeating_sound_loops" },
+ { TYPE_SWITCH, &si.sound_music, "background_music" },
+ { TYPE_SWITCH, &si.sound_simple, "simple_sound_effects" },
+ { TYPE_SWITCH, &si.toons, "toons" },
+ { TYPE_SWITCH, &si.scroll_delay, "scroll_delay" },
+ { TYPE_INTEGER,&si.scroll_delay_value, "scroll_delay_value" },
+ { TYPE_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" },
+ { TYPE_SWITCH, &si.quick_doors, "quick_doors" },
+ { 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.auto_play_next_level, "auto_play_next_level" },
+ { TYPE_SWITCH, &si.skip_scores_after_game, "skip_scores_after_game" },
+ { TYPE_SWITCH, &si.time_limit, "time_limit" },
+ { TYPE_SWITCH, &si.fullscreen, "fullscreen" },
+ { 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_STRING, &si.vsync_mode, "vsync_mode" },
+ { TYPE_SWITCH, &si.ask_on_escape, "ask_on_escape" },
+ { TYPE_SWITCH, &si.ask_on_escape_editor, "ask_on_escape_editor" },
+ { TYPE_SWITCH, &si.ask_on_game_over, "ask_on_game_over" },
+ { TYPE_SWITCH, &si.quick_switch, "quick_player_switch" },
+ { TYPE_SWITCH, &si.input_on_focus, "input_on_focus" },
+ { TYPE_SWITCH, &si.prefer_aga_graphics, "prefer_aga_graphics" },
+ { TYPE_SWITCH, &si.game_speed_extended, "game_speed_extended" },
+ { 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" },
+ { TYPE_SWITCH3,&si.override_level_graphics, "override_level_graphics" },
+ { TYPE_SWITCH3,&si.override_level_sounds, "override_level_sounds" },
+ { TYPE_SWITCH3,&si.override_level_music, "override_level_music" },
+ { TYPE_INTEGER,&si.volume_simple, "volume_simple" },
+ { TYPE_INTEGER,&si.volume_loops, "volume_loops" },
+ { TYPE_INTEGER,&si.volume_music, "volume_music" },
+ { TYPE_SWITCH, &si.network_mode, "network_mode" },
+ { TYPE_PLAYER, &si.network_player_nr, "network_player" },
+ { TYPE_STRING, &si.network_server_hostname, "network_server_hostname" },
+ { TYPE_STRING, &si.touch.control_type, "touch.control_type" },
+ { TYPE_INTEGER,&si.touch.move_distance, "touch.move_distance" },
+ { TYPE_INTEGER,&si.touch.drop_distance, "touch.drop_distance" },
+ { TYPE_INTEGER,&si.touch.transparency, "touch.transparency" },
+ { TYPE_INTEGER,&si.touch.draw_outlined, "touch.draw_outlined" },
+ { TYPE_INTEGER,&si.touch.draw_pressed, "touch.draw_pressed" },
+ { TYPE_INTEGER,&si.touch.grid_xsize[0], "touch.virtual_buttons.0.xsize" },
+ { TYPE_INTEGER,&si.touch.grid_ysize[0], "touch.virtual_buttons.0.ysize" },
+ { TYPE_INTEGER,&si.touch.grid_xsize[1], "touch.virtual_buttons.1.xsize" },
+ { TYPE_INTEGER,&si.touch.grid_ysize[1], "touch.virtual_buttons.1.ysize" },
+};
+
+static struct TokenInfo auto_setup_tokens[] =
+{
+ { TYPE_INTEGER,&sasi.editor_zoom_tilesize, "editor.zoom_tilesize" },
+};
+
+static struct TokenInfo editor_setup_tokens[] =
+{
+ { TYPE_SWITCH, &sei.el_classic, "editor.el_classic" },
+ { TYPE_SWITCH, &sei.el_custom, "editor.el_custom" },
+ { TYPE_SWITCH, &sei.el_user_defined, "editor.el_user_defined" },
+ { TYPE_SWITCH, &sei.el_dynamic, "editor.el_dynamic" },
+ { TYPE_SWITCH, &sei.el_headlines, "editor.el_headlines" },
+ { TYPE_SWITCH, &sei.show_element_token,"editor.show_element_token" },
+};
+
+static struct TokenInfo editor_cascade_setup_tokens[] =
+{
+ { TYPE_SWITCH, &seci.el_bd, "editor.cascade.el_bd" },
+ { TYPE_SWITCH, &seci.el_em, "editor.cascade.el_em" },
+ { TYPE_SWITCH, &seci.el_emc, "editor.cascade.el_emc" },
+ { TYPE_SWITCH, &seci.el_rnd, "editor.cascade.el_rnd" },
+ { TYPE_SWITCH, &seci.el_sb, "editor.cascade.el_sb" },
+ { TYPE_SWITCH, &seci.el_sp, "editor.cascade.el_sp" },
+ { TYPE_SWITCH, &seci.el_dc, "editor.cascade.el_dc" },
+ { TYPE_SWITCH, &seci.el_dx, "editor.cascade.el_dx" },
+ { TYPE_SWITCH, &seci.el_mm, "editor.cascade.el_mm" },
+ { TYPE_SWITCH, &seci.el_df, "editor.cascade.el_df" },
+ { TYPE_SWITCH, &seci.el_chars, "editor.cascade.el_chars" },
+ { TYPE_SWITCH, &seci.el_steel_chars, "editor.cascade.el_steel_chars" },
+ { TYPE_SWITCH, &seci.el_ce, "editor.cascade.el_ce" },
+ { TYPE_SWITCH, &seci.el_ge, "editor.cascade.el_ge" },
+ { TYPE_SWITCH, &seci.el_ref, "editor.cascade.el_ref" },
+ { TYPE_SWITCH, &seci.el_user, "editor.cascade.el_user" },
+ { TYPE_SWITCH, &seci.el_dynamic, "editor.cascade.el_dynamic" },
+};
+
+static struct TokenInfo shortcut_setup_tokens[] =
+{
+ { TYPE_KEY_X11, &ssi.save_game, "shortcut.save_game" },
+ { TYPE_KEY_X11, &ssi.load_game, "shortcut.load_game" },
+ { TYPE_KEY_X11, &ssi.toggle_pause, "shortcut.toggle_pause" },
+ { TYPE_KEY_X11, &ssi.focus_player[0], "shortcut.focus_player_1" },
+ { TYPE_KEY_X11, &ssi.focus_player[1], "shortcut.focus_player_2" },
+ { TYPE_KEY_X11, &ssi.focus_player[2], "shortcut.focus_player_3" },
+ { TYPE_KEY_X11, &ssi.focus_player[3], "shortcut.focus_player_4" },
+ { TYPE_KEY_X11, &ssi.focus_player_all,"shortcut.focus_player_all" },
+ { TYPE_KEY_X11, &ssi.tape_eject, "shortcut.tape_eject" },
+ { TYPE_KEY_X11, &ssi.tape_extra, "shortcut.tape_extra" },
+ { TYPE_KEY_X11, &ssi.tape_stop, "shortcut.tape_stop" },
+ { TYPE_KEY_X11, &ssi.tape_pause, "shortcut.tape_pause" },
+ { TYPE_KEY_X11, &ssi.tape_record, "shortcut.tape_record" },
+ { TYPE_KEY_X11, &ssi.tape_play, "shortcut.tape_play" },
+ { TYPE_KEY_X11, &ssi.sound_simple, "shortcut.sound_simple" },
+ { TYPE_KEY_X11, &ssi.sound_loops, "shortcut.sound_loops" },
+ { TYPE_KEY_X11, &ssi.sound_music, "shortcut.sound_music" },
+ { TYPE_KEY_X11, &ssi.snap_left, "shortcut.snap_left" },
+ { TYPE_KEY_X11, &ssi.snap_right, "shortcut.snap_right" },
+ { TYPE_KEY_X11, &ssi.snap_up, "shortcut.snap_up" },
+ { TYPE_KEY_X11, &ssi.snap_down, "shortcut.snap_down" },
+};
+
+static struct TokenInfo player_setup_tokens[] =
+{
+ { TYPE_BOOLEAN, &sii.use_joystick, ".use_joystick" },
+ { TYPE_STRING, &sii.joy.device_name, ".joy.device_name" },
+ { TYPE_INTEGER, &sii.joy.xleft, ".joy.xleft" },
+ { TYPE_INTEGER, &sii.joy.xmiddle, ".joy.xmiddle" },
+ { TYPE_INTEGER, &sii.joy.xright, ".joy.xright" },
+ { TYPE_INTEGER, &sii.joy.yupper, ".joy.yupper" },
+ { TYPE_INTEGER, &sii.joy.ymiddle, ".joy.ymiddle" },
+ { TYPE_INTEGER, &sii.joy.ylower, ".joy.ylower" },
+ { TYPE_INTEGER, &sii.joy.snap, ".joy.snap_field" },
+ { TYPE_INTEGER, &sii.joy.drop, ".joy.place_bomb" },
+ { TYPE_KEY_X11, &sii.key.left, ".key.move_left" },
+ { TYPE_KEY_X11, &sii.key.right, ".key.move_right" },
+ { TYPE_KEY_X11, &sii.key.up, ".key.move_up" },
+ { TYPE_KEY_X11, &sii.key.down, ".key.move_down" },
+ { TYPE_KEY_X11, &sii.key.snap, ".key.snap_field" },
+ { TYPE_KEY_X11, &sii.key.drop, ".key.place_bomb" },
+};
+
+static struct TokenInfo system_setup_tokens[] =
+{
+ { TYPE_STRING, &syi.sdl_videodriver, "system.sdl_videodriver" },
+ { TYPE_STRING, &syi.sdl_audiodriver, "system.sdl_audiodriver" },
+ { TYPE_INTEGER, &syi.audio_fragment_size,"system.audio_fragment_size" },
+};
+
+static struct TokenInfo internal_setup_tokens[] =
+{
+ { TYPE_STRING, &sxi.program_title, "program_title" },
+ { TYPE_STRING, &sxi.program_version, "program_version" },
+ { TYPE_STRING, &sxi.program_author, "program_author" },
+ { TYPE_STRING, &sxi.program_email, "program_email" },
+ { TYPE_STRING, &sxi.program_website, "program_website" },
+ { TYPE_STRING, &sxi.program_copyright, "program_copyright" },
+ { TYPE_STRING, &sxi.program_company, "program_company" },
+ { TYPE_STRING, &sxi.program_icon_file, "program_icon_file" },
+ { TYPE_STRING, &sxi.default_graphics_set, "default_graphics_set" },
+ { TYPE_STRING, &sxi.default_sounds_set, "default_sounds_set" },
+ { TYPE_STRING, &sxi.default_music_set, "default_music_set" },
+ { TYPE_STRING, &sxi.fallback_graphics_file, "fallback_graphics_file"},
+ { 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_BOOLEAN,&sxi.choose_from_top_leveldir, "choose_from_top_leveldir" },
+ { TYPE_BOOLEAN,&sxi.show_scaling_in_title, "show_scaling_in_title" },
+ { 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" },
+ { TYPE_BOOLEAN, &sdi.show_frames_per_second, "debug.show_frames_per_second" },
+};
+
+static struct TokenInfo options_setup_tokens[] =
+{
+ { TYPE_BOOLEAN, &soi.verbose, "options.verbose" },
+};
+
+static char *get_corrected_login_name(char *login_name)
+{
+ // needed because player name must be a fixed length string
+ char *login_name_new = checked_malloc(MAX_PLAYER_NAME_LEN + 1);
+
+ strncpy(login_name_new, login_name, MAX_PLAYER_NAME_LEN);
+ login_name_new[MAX_PLAYER_NAME_LEN] = '\0';
+
+ if (strlen(login_name) > MAX_PLAYER_NAME_LEN) // name has been cut
+ if (strchr(login_name_new, ' '))
+ *strchr(login_name_new, ' ') = '\0';
+
+ return login_name_new;
+}
+
+static void setSetupInfoToDefaults(struct SetupInfo *si)
+{
+ int i;
+
+ si->player_name = get_corrected_login_name(getLoginName());
+
+ si->sound = TRUE;
+ si->sound_loops = TRUE;
+ si->sound_music = TRUE;
+ si->sound_simple = TRUE;
+ si->toons = TRUE;
+ 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;
+ si->quick_doors = FALSE;
+ si->team_mode = FALSE;
+ si->handicap = TRUE;
+ si->skip_levels = TRUE;
+ si->increment_levels = TRUE;
+ si->auto_play_next_level = TRUE;
+ si->skip_scores_after_game = FALSE;
+ si->time_limit = TRUE;
+ si->fullscreen = FALSE;
+ 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->vsync_mode = getStringCopy(STR_VSYNC_MODE_DEFAULT);
+ si->ask_on_escape = TRUE;
+ si->ask_on_escape_editor = TRUE;
+ si->ask_on_game_over = TRUE;
+ si->quick_switch = FALSE;
+ si->input_on_focus = FALSE;
+ si->prefer_aga_graphics = TRUE;
+ si->game_speed_extended = FALSE;
+ 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);
+ si->music_set = getStringCopy(MUS_CLASSIC_SUBDIR);