X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=b590641afc20b05848461be6327ae59081e52da5;hp=c8cd45eade80078539e0b279bbc61aaadcfb272d;hb=759e0bea3ad909b5be8757aa7c2409fc1c52f493;hpb=2970e961cdf0ebb1774af7b603e4cacb4dadeda6 diff --git a/src/files.c b/src/files.c index c8cd45ea..b590641a 100644 --- a/src/files.c +++ b/src/files.c @@ -18,6 +18,7 @@ #include "files.h" #include "init.h" +#include "screens.h" #include "tools.h" #include "tape.h" #include "config.h" @@ -1854,8 +1855,9 @@ static void setFileInfoToDefaults(struct LevelFileInfo *level_file_info) level_file_info->nr = 0; level_file_info->type = LEVEL_FILE_TYPE_UNKNOWN; level_file_info->packed = FALSE; - level_file_info->basename = NULL; - level_file_info->filename = NULL; + + setString(&level_file_info->basename, NULL); + setString(&level_file_info->filename, NULL); } int getMappedElement_SB(int, boolean); @@ -2087,8 +2089,9 @@ static void setLevelFileInfo_SingleLevelFilename(struct LevelFileInfo *lfi, { lfi->type = type; lfi->packed = FALSE; - lfi->basename = getSingleLevelBasename(lfi->nr, lfi->type); - lfi->filename = getLevelFilenameFromBasename(lfi->basename); + + setString(&lfi->basename, getSingleLevelBasename(lfi->nr, lfi->type)); + setString(&lfi->filename, getLevelFilenameFromBasename(lfi->basename)); } #endif @@ -2104,8 +2107,9 @@ static void setLevelFileInfo_FormatLevelFilename(struct LevelFileInfo *lfi, lfi->type = type; lfi->packed = FALSE; - lfi->basename = basename; - lfi->filename = getLevelFilenameFromBasename(lfi->basename); + + setString(&lfi->basename, basename); + setString(&lfi->filename, getLevelFilenameFromBasename(lfi->basename)); } static void setLevelFileInfo_PackedLevelFilename(struct LevelFileInfo *lfi, @@ -2113,8 +2117,9 @@ static void setLevelFileInfo_PackedLevelFilename(struct LevelFileInfo *lfi, { lfi->type = type; lfi->packed = TRUE; - lfi->basename = getPackedLevelBasename(lfi->type); - lfi->filename = getLevelFilenameFromBasename(lfi->basename); + + setString(&lfi->basename, getPackedLevelBasename(lfi->type)); + setString(&lfi->filename, getLevelFilenameFromBasename(lfi->basename)); } static int getFiletypeFromID(char *filetype_id) @@ -2186,7 +2191,7 @@ static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi) getSingleLevelBasename(-1)); /* replace local level template filename with global template filename */ - lfi->filename = getGlobalLevelTemplateFilename(); + setString(&lfi->filename, getGlobalLevelTemplateFilename()); /* no fallback if template file not existing */ return; @@ -6200,12 +6205,13 @@ void LoadLevelFromFilename(struct LevelInfo *level, char *filename) level_file_info.nr = 0; /* unknown level number */ level_file_info.type = LEVEL_FILE_TYPE_RND; /* no others supported yet */ - level_file_info.filename = filename; + + setString(&level_file_info.filename, filename); LoadLevelFromFileInfo(level, &level_file_info, FALSE); } -static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) +static void LoadLevel_InitVersion(struct LevelInfo *level) { int i, j; @@ -6525,7 +6531,7 @@ static void LoadLevel_InitCustomElements(struct LevelInfo *level) } } -static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) +static void LoadLevel_InitElements(struct LevelInfo *level) { LoadLevel_InitStandardElements(level); @@ -6537,7 +6543,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) InitElementPropertiesGfxElement(); } -static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename) +static void LoadLevel_InitPlayfield(struct LevelInfo *level) { int x, y; @@ -6569,7 +6575,7 @@ static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename) SetBorderElement(); } -static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename) +static void LoadLevel_InitNativeEngines(struct LevelInfo *level) { struct LevelFileInfo *level_file_info = &level->file_info; @@ -6579,36 +6585,37 @@ static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename) void LoadLevelTemplate(int nr) { - char *filename; + if (!fileExists(getGlobalLevelTemplateFilename())) + { + Error(ERR_WARN, "no level template found for this level"); + + return; + } setLevelFileInfo(&level_template.file_info, nr); - filename = level_template.file_info.filename; LoadLevelFromFileInfo(&level_template, &level_template.file_info, FALSE); - LoadLevel_InitVersion(&level_template, filename); - LoadLevel_InitElements(&level_template, filename); + LoadLevel_InitVersion(&level_template); + LoadLevel_InitElements(&level_template); ActivateLevelTemplate(); } void LoadLevel(int nr) { - char *filename; - setLevelFileInfo(&level.file_info, nr); - filename = level.file_info.filename; LoadLevelFromFileInfo(&level, &level.file_info, FALSE); if (level.use_custom_template) LoadLevelTemplate(-1); - LoadLevel_InitVersion(&level, filename); - LoadLevel_InitElements(&level, filename); - LoadLevel_InitPlayfield(&level, filename); + LoadLevel_InitVersion(&level); + LoadLevel_InitElements(&level); + LoadLevel_InitPlayfield(&level); - LoadLevel_InitNativeEngines(&level, filename); + LoadLevel_InitNativeEngines(&level); } void LoadLevelInfoOnly(int nr) @@ -8260,193 +8267,234 @@ void SaveScore(int nr) #define TOKEN_STR_PLAYER_PREFIX "player_" /* global setup */ -#define SETUP_TOKEN_PLAYER_NAME 0 -#define SETUP_TOKEN_SOUND 1 -#define SETUP_TOKEN_SOUND_LOOPS 2 -#define SETUP_TOKEN_SOUND_MUSIC 3 -#define SETUP_TOKEN_SOUND_SIMPLE 4 -#define SETUP_TOKEN_TOONS 5 -#define SETUP_TOKEN_SCROLL_DELAY 6 -#define SETUP_TOKEN_SCROLL_DELAY_VALUE 7 -#define SETUP_TOKEN_ENGINE_SNAPSHOT_MODE 8 -#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 +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_ASK_ON_ESCAPE, + SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR, + SETUP_TOKEN_QUICK_SWITCH, + SETUP_TOKEN_INPUT_ON_FOCUS, + SETUP_TOKEN_PREFER_AGA_GRAPHICS, + 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_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 */ -#define SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE 0 +enum +{ + SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE = 0, -#define NUM_AUTO_SETUP_TOKENS 1 + NUM_AUTO_SETUP_TOKENS +}; /* editor setup */ -#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 +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, -#define NUM_EDITOR_SETUP_TOKENS 6 + NUM_EDITOR_SETUP_TOKENS +}; /* editor cascade setup */ -#define SETUP_TOKEN_EDITOR_CASCADE_BD 0 -#define SETUP_TOKEN_EDITOR_CASCADE_EM 1 -#define SETUP_TOKEN_EDITOR_CASCADE_EMC 2 -#define SETUP_TOKEN_EDITOR_CASCADE_RND 3 -#define SETUP_TOKEN_EDITOR_CASCADE_SB 4 -#define SETUP_TOKEN_EDITOR_CASCADE_SP 5 -#define SETUP_TOKEN_EDITOR_CASCADE_DC 6 -#define SETUP_TOKEN_EDITOR_CASCADE_DX 7 -#define SETUP_TOKEN_EDITOR_CASCADE_TEXT 8 -#define SETUP_TOKEN_EDITOR_CASCADE_STEELTEXT 9 -#define SETUP_TOKEN_EDITOR_CASCADE_CE 10 -#define SETUP_TOKEN_EDITOR_CASCADE_GE 11 -#define SETUP_TOKEN_EDITOR_CASCADE_REF 12 -#define SETUP_TOKEN_EDITOR_CASCADE_USER 13 -#define SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC 14 - -#define NUM_EDITOR_CASCADE_SETUP_TOKENS 15 +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 */ -#define SETUP_TOKEN_SHORTCUT_SAVE_GAME 0 -#define SETUP_TOKEN_SHORTCUT_LOAD_GAME 1 -#define SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE 2 -#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_1 3 -#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_2 4 -#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_3 5 -#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4 6 -#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL 7 -#define SETUP_TOKEN_SHORTCUT_TAPE_EJECT 8 -#define SETUP_TOKEN_SHORTCUT_TAPE_EXTRA 9 -#define SETUP_TOKEN_SHORTCUT_TAPE_STOP 10 -#define SETUP_TOKEN_SHORTCUT_TAPE_PAUSE 11 -#define SETUP_TOKEN_SHORTCUT_TAPE_RECORD 12 -#define SETUP_TOKEN_SHORTCUT_TAPE_PLAY 13 -#define SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE 14 -#define SETUP_TOKEN_SHORTCUT_SOUND_LOOPS 15 -#define SETUP_TOKEN_SHORTCUT_SOUND_MUSIC 16 -#define SETUP_TOKEN_SHORTCUT_SNAP_LEFT 17 -#define SETUP_TOKEN_SHORTCUT_SNAP_RIGHT 18 -#define SETUP_TOKEN_SHORTCUT_SNAP_UP 19 -#define SETUP_TOKEN_SHORTCUT_SNAP_DOWN 20 - -#define NUM_SHORTCUT_SETUP_TOKENS 21 +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 */ -#define SETUP_TOKEN_PLAYER_USE_JOYSTICK 0 -#define SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME 1 -#define SETUP_TOKEN_PLAYER_JOY_XLEFT 2 -#define SETUP_TOKEN_PLAYER_JOY_XMIDDLE 3 -#define SETUP_TOKEN_PLAYER_JOY_XRIGHT 4 -#define SETUP_TOKEN_PLAYER_JOY_YUPPER 5 -#define SETUP_TOKEN_PLAYER_JOY_YMIDDLE 6 -#define SETUP_TOKEN_PLAYER_JOY_YLOWER 7 -#define SETUP_TOKEN_PLAYER_JOY_SNAP 8 -#define SETUP_TOKEN_PLAYER_JOY_DROP 9 -#define SETUP_TOKEN_PLAYER_KEY_LEFT 10 -#define SETUP_TOKEN_PLAYER_KEY_RIGHT 11 -#define SETUP_TOKEN_PLAYER_KEY_UP 12 -#define SETUP_TOKEN_PLAYER_KEY_DOWN 13 -#define SETUP_TOKEN_PLAYER_KEY_SNAP 14 -#define SETUP_TOKEN_PLAYER_KEY_DROP 15 - -#define NUM_PLAYER_SETUP_TOKENS 16 +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 */ -#define SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER 0 -#define SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER 1 -#define SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE 2 +enum +{ + SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER = 0, + SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER, + SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE, -#define NUM_SYSTEM_SETUP_TOKENS 3 + NUM_SYSTEM_SETUP_TOKENS +}; /* internal setup */ -#define SETUP_TOKEN_INT_PROGRAM_TITLE 0 -#define SETUP_TOKEN_INT_PROGRAM_VERSION 1 -#define SETUP_TOKEN_INT_PROGRAM_AUTHOR 2 -#define SETUP_TOKEN_INT_PROGRAM_EMAIL 3 -#define SETUP_TOKEN_INT_PROGRAM_WEBSITE 4 -#define SETUP_TOKEN_INT_PROGRAM_COPYRIGHT 5 -#define SETUP_TOKEN_INT_PROGRAM_COMPANY 6 -#define SETUP_TOKEN_INT_PROGRAM_ICON_FILE 7 -#define SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET 8 -#define SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET 9 -#define SETUP_TOKEN_INT_DEFAULT_MUSIC_SET 10 -#define SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE 11 -#define SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE 12 -#define SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE 13 -#define SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES 14 -#define SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR 15 -#define SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE 16 -#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH 17 -#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT 18 - -#define NUM_INTERNAL_SETUP_TOKENS 19 +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 */ -#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 SETUP_TOKEN_DEBUG_SHOW_FRAMES_PER_SECOND 22 - -#define NUM_DEBUG_SETUP_TOKENS 23 +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 */ -#define SETUP_TOKEN_OPTIONS_VERBOSE 0 +enum +{ + SETUP_TOKEN_OPTIONS_VERBOSE = 0, -#define NUM_OPTIONS_SETUP_TOKENS 1 + NUM_OPTIONS_SETUP_TOKENS +}; static struct SetupInfo si; @@ -8480,6 +8528,8 @@ static struct TokenInfo global_setup_tokens[] = { 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" }, @@ -8503,9 +8553,18 @@ static struct TokenInfo global_setup_tokens[] = { 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.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[] = @@ -8689,6 +8748,8 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) 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; @@ -8716,9 +8777,64 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->volume_loops = 100; /* percent */ si->volume_music = 100; /* percent */ + si->network_mode = FALSE; + si->network_player_nr = 0; /* first player */ + si->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT); si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT; /* percent */ si->touch.drop_distance = TOUCH_DROP_DISTANCE_DEFAULT; /* percent */ + si->touch.transparency = TOUCH_TRANSPARENCY_DEFAULT; /* percent */ + si->touch.draw_outlined = TRUE; + si->touch.draw_pressed = TRUE; + + for (i = 0; i < 2; i++) + { + char *default_grid_button[6][2] = + { + { " ", " ^^ " }, + { " ", " ^^ " }, + { " ", "<< >>" }, + { " ", "<< >>" }, + { "111222", " vv " }, + { "111222", " vv " } + }; + int grid_xsize = DEFAULT_GRID_XSIZE(i); + int grid_ysize = DEFAULT_GRID_YSIZE(i); + int min_xsize = MIN(6, grid_xsize); + int min_ysize = MIN(6, grid_ysize); + int startx = grid_xsize - min_xsize; + int starty = grid_ysize - min_ysize; + int x, y; + + // virtual buttons grid can only be set to defaults if video is initialized + // (this will be repeated if virtual buttons are not loaded from setup file) + if (video.initialized) + { + si->touch.grid_xsize[i] = grid_xsize; + si->touch.grid_ysize[i] = grid_ysize; + } + else + { + si->touch.grid_xsize[i] = -1; + si->touch.grid_ysize[i] = -1; + } + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + si->touch.grid_button[i][x][y] = CHAR_GRID_BUTTON_NONE; + + for (x = 0; x < min_xsize; x++) + for (y = 0; y < min_ysize; y++) + si->touch.grid_button[i][x][starty + y] = + default_grid_button[y][0][x]; + + for (x = 0; x < min_xsize; x++) + for (y = 0; y < min_ysize; y++) + si->touch.grid_button[i][startx + x][starty + y] = + default_grid_button[y][1][x]; + } + + si->touch.grid_initialized = video.initialized; si->editor.el_boulderdash = TRUE; si->editor.el_emerald_mine = TRUE; @@ -8896,17 +9012,22 @@ static char *getHideSetupToken(void *setup_value) return hide_setup_token; } -static void setHideSetupEntry(void *setup_value_raw) +void setHideSetupEntry(void *setup_value) { - /* !!! DIRTY WORKAROUND; TO BE FIXED AFTER THE MM ENGINE RELEASE !!! */ - void *setup_value = setup_value_raw - (void *)&si + (void *)&setup; - char *hide_setup_token = getHideSetupToken(setup_value); if (setup_value != NULL) setHashEntry(hide_setup_hash, hide_setup_token, ""); } +static void setHideSetupEntryRaw(char *token_text, void *setup_value_raw) +{ + /* !!! DIRTY WORKAROUND; TO BE FIXED AFTER THE MM ENGINE RELEASE !!! */ + void *setup_value = setup_value_raw - (void *)&si + (void *)&setup; + + setHideSetupEntry(setup_value); +} + boolean hideSetupEntry(void *setup_value) { char *hide_setup_token = getHideSetupToken(setup_value); @@ -8927,7 +9048,7 @@ static void setSetupInfoFromTokenText(SetupFileHash *setup_file_hash, /* check if this setup option should be hidden in the setup menu */ if (token_hide_value != NULL && get_boolean_from_string(token_hide_value)) - setHideSetupEntry(token_info[token_nr].value); + setHideSetupEntryRaw(token_text, token_info[token_nr].value); } static void setSetupInfoFromTokenInfo(SetupFileHash *setup_file_hash, @@ -8954,6 +9075,45 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) setSetupInfoFromTokenInfo(setup_file_hash, global_setup_tokens, i); setup = si; + /* virtual buttons setup */ + setup.touch.grid_initialized = TRUE; + for (i = 0; i < 2; i++) + { + int grid_xsize = setup.touch.grid_xsize[i]; + int grid_ysize = setup.touch.grid_ysize[i]; + int x, y; + + // if virtual buttons are not loaded from setup file, repeat initializing + // virtual buttons grid with default values later when video is initialized + if (grid_xsize == -1 || + grid_ysize == -1) + { + setup.touch.grid_initialized = FALSE; + + continue; + } + + for (y = 0; y < grid_ysize; y++) + { + char token_string[MAX_LINE_LEN]; + + sprintf(token_string, "touch.virtual_buttons.%d.%02d", i, y); + + char *value_string = getHashEntry(setup_file_hash, token_string); + + if (value_string == NULL) + continue; + + for (x = 0; x < grid_xsize; x++) + { + char c = value_string[x]; + + setup.touch.grid_button[i][x][y] = + (c == '.' ? CHAR_GRID_BUTTON_NONE : c); + } + } + } + /* editor setup */ sei = setup.editor; for (i = 0; i < NUM_EDITOR_SETUP_TOKENS; i++) @@ -9008,6 +9168,8 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) for (i = 0; i < NUM_OPTIONS_SETUP_TOKENS; i++) setSetupInfoFromTokenInfo(setup_file_hash, options_setup_tokens, i); setup.options = soi; + + setHideRelatedSetupEntries(); } static void decodeSetupFileHash_AutoSetup(SetupFileHash *setup_file_hash) @@ -9213,12 +9375,44 @@ void SaveSetup() if (i == SETUP_TOKEN_PLAYER_NAME + 1 || i == SETUP_TOKEN_GRAPHICS_SET || i == SETUP_TOKEN_VOLUME_SIMPLE || - i == SETUP_TOKEN_TOUCH_CONTROL_TYPE) + 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) fprintf(file, "\n"); fprintf(file, "%s\n", getSetupLine(global_setup_tokens, "", i)); } + /* virtual buttons setup */ + for (i = 0; i < 2; i++) + { + int grid_xsize = setup.touch.grid_xsize[i]; + int grid_ysize = setup.touch.grid_ysize[i]; + int x, y; + + fprintf(file, "\n"); + + for (y = 0; y < grid_ysize; y++) + { + char token_string[MAX_LINE_LEN]; + char value_string[MAX_LINE_LEN]; + + sprintf(token_string, "touch.virtual_buttons.%d.%02d", i, y); + + for (x = 0; x < grid_xsize; x++) + { + char c = setup.touch.grid_button[i][x][y]; + + value_string[x] = (c == CHAR_GRID_BUTTON_NONE ? '.' : c); + } + + value_string[grid_xsize] = '\0'; + + fprintf(file, "%s\n", getFormattedSetupEntry(token_string, value_string)); + } + } + /* editor setup */ sei = setup.editor; fprintf(file, "\n");