X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=b3d18ba2d74fc7aacb116d508da1d5ee3f148125;hp=b55395f409dd85d0b97a5e468d7157d69aaf7d24;hb=25c22434b11938e230719d6f73df4ed7813570be;hpb=a765a89dce5dd3d870906dbe4580b62313117417 diff --git a/src/files.c b/src/files.c index b55395f4..b3d18ba2 100644 --- a/src/files.c +++ b/src/files.c @@ -3193,6 +3193,9 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (!setup.editor.use_template_for_new_levels) + return; + /* if level file not found, try to initialize level data from template */ filename = getGlobalLevelTemplateFilename(); @@ -7945,41 +7948,42 @@ void SaveScore(int nr) #define SETUP_TOKEN_TEAM_MODE 14 #define SETUP_TOKEN_HANDICAP 15 #define SETUP_TOKEN_SKIP_LEVELS 16 -#define SETUP_TOKEN_TIME_LIMIT 17 -#define SETUP_TOKEN_FULLSCREEN 18 -#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 -#define SETUP_TOKEN_INPUT_ON_FOCUS 25 -#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 26 -#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_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 +#define SETUP_TOKEN_INCREMENT_LEVELS 17 +#define SETUP_TOKEN_TIME_LIMIT 18 +#define SETUP_TOKEN_FULLSCREEN 19 +#define SETUP_TOKEN_WINDOW_SCALING_PERCENT 20 +#define SETUP_TOKEN_WINDOW_SCALING_QUALITY 21 +#define SETUP_TOKEN_SCREEN_RENDERING_MODE 22 +#define SETUP_TOKEN_ASK_ON_ESCAPE 23 +#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR 24 +#define SETUP_TOKEN_QUICK_SWITCH 25 +#define SETUP_TOKEN_INPUT_ON_FOCUS 26 +#define SETUP_TOKEN_PREFER_AGA_GRAPHICS 27 +#define SETUP_TOKEN_GAME_FRAME_DELAY 28 +#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS 29 +#define SETUP_TOKEN_SMALL_GAME_GRAPHICS 30 +#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS 31 +#define SETUP_TOKEN_GRAPHICS_SET 32 +#define SETUP_TOKEN_SOUNDS_SET 33 +#define SETUP_TOKEN_MUSIC_SET 34 +#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS 35 +#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS 36 +#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC 37 +#define SETUP_TOKEN_VOLUME_SIMPLE 38 +#define SETUP_TOKEN_VOLUME_LOOPS 39 +#define SETUP_TOKEN_VOLUME_MUSIC 40 +#define SETUP_TOKEN_TOUCH_CONTROL_TYPE 41 +#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 42 +#define SETUP_TOKEN_TOUCH_DROP_DISTANCE 43 + +#define NUM_GLOBAL_SETUP_TOKENS 44 /* editor setup */ -#define SETUP_TOKEN_EDITOR_EL_CHARS 0 -#define SETUP_TOKEN_EDITOR_EL_STEEL_CHARS 1 -#define SETUP_TOKEN_EDITOR_EL_CUSTOM 2 -#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED 3 -#define SETUP_TOKEN_EDITOR_EL_DYNAMIC 4 +#define SETUP_TOKEN_EDITOR_EL_CLASSIC 0 +#define SETUP_TOKEN_EDITOR_EL_CUSTOM 1 +#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED 2 +#define SETUP_TOKEN_EDITOR_EL_DYNAMIC 3 +#define SETUP_TOKEN_EDITOR_EL_HEADLINES 4 #define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN 5 #define NUM_EDITOR_SETUP_TOKENS 6 @@ -8137,6 +8141,7 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH, &si.team_mode, "team_mode" }, { TYPE_SWITCH, &si.handicap, "handicap" }, { TYPE_SWITCH, &si.skip_levels, "skip_levels" }, + { TYPE_SWITCH, &si.increment_levels, "increment_levels" }, { TYPE_SWITCH, &si.time_limit, "time_limit" }, { TYPE_SWITCH, &si.fullscreen, "fullscreen" }, { TYPE_INTEGER,&si.window_scaling_percent, "window_scaling_percent" }, @@ -8167,11 +8172,11 @@ static struct TokenInfo global_setup_tokens[] = static struct TokenInfo editor_setup_tokens[] = { - { TYPE_SWITCH, &sei.el_chars, "editor.el_chars" }, - { TYPE_SWITCH, &sei.el_steel_chars, "editor.el_steel_chars" }, + { TYPE_SWITCH, &sei.el_classic, "editor.el_classic" }, { TYPE_SWITCH, &sei.el_custom, "editor.el_custom" }, { TYPE_SWITCH, &sei.el_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" }, }; @@ -8335,6 +8340,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->team_mode = FALSE; si->handicap = TRUE; si->skip_levels = TRUE; + si->increment_levels = TRUE; si->time_limit = TRUE; si->fullscreen = FALSE; si->window_scaling_percent = STD_WINDOW_SCALING_PERCENT; @@ -8376,13 +8382,18 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->editor.el_dx_boulderdash = TRUE; si->editor.el_chars = TRUE; si->editor.el_steel_chars = TRUE; + + si->editor.el_classic = TRUE; si->editor.el_custom = TRUE; - si->editor.el_headlines = TRUE; - si->editor.el_user_defined = FALSE; - si->editor.el_dynamic = TRUE; + si->editor.el_user_defined = FALSE; + si->editor.el_dynamic = TRUE; + + si->editor.el_headlines = TRUE; - si->editor.show_element_token = FALSE; + si->editor.show_element_token = FALSE; + + si->editor.use_template_for_new_levels = TRUE; si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME; si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME; @@ -8679,6 +8690,55 @@ void LoadSetup_EditorCascade() free(filename); } +static void addGameControllerMappingToHash(SetupFileHash *mappings_hash, + char *mapping_line) +{ + char mapping_guid[MAX_LINE_LEN]; + char *mapping_start, *mapping_end; + + // get GUID from game controller mapping line: copy complete line + strncpy(mapping_guid, mapping_line, MAX_LINE_LEN - 1); + mapping_guid[MAX_LINE_LEN - 1] = '\0'; + + // get GUID from game controller mapping line: cut after GUID part + mapping_start = strchr(mapping_guid, ','); + if (mapping_start != NULL) + *mapping_start = '\0'; + + // cut newline from game controller mapping line + mapping_end = strchr(mapping_line, '\n'); + if (mapping_end != NULL) + *mapping_end = '\0'; + + // add mapping entry to game controller mappings hash + setHashEntry(mappings_hash, mapping_guid, mapping_line); +} + +static void LoadSetup_ReadGameControllerMappings(SetupFileHash *mappings_hash, + char *filename) +{ + FILE *file; + + if (!(file = fopen(filename, MODE_READ))) + { + Error(ERR_WARN, "cannot read game controller mappings file '%s'", filename); + + return; + } + + while (!feof(file)) + { + char line[MAX_LINE_LEN]; + + if (!fgets(line, MAX_LINE_LEN, file)) + break; + + addGameControllerMappingToHash(mappings_hash, line); + } + + fclose(file); +} + void SaveSetup() { char *filename = getSetupFilename(); @@ -8788,6 +8848,47 @@ void SaveSetup_EditorCascade() free(filename); } +static void SaveSetup_WriteGameControllerMappings(SetupFileHash *mappings_hash, + char *filename) +{ + FILE *file; + + if (!(file = fopen(filename, MODE_WRITE))) + { + Error(ERR_WARN, "cannot write game controller mappings file '%s'",filename); + + return; + } + + BEGIN_HASH_ITERATION(mappings_hash, itr) + { + fprintf(file, "%s\n", HASH_ITERATION_VALUE(itr)); + } + END_HASH_ITERATION(mappings_hash, itr) + + fclose(file); +} + +void SaveSetup_AddGameControllerMapping(char *mapping) +{ + char *filename = getPath2(getSetupDir(), GAMECONTROLLER_BASENAME); + SetupFileHash *mappings_hash = newSetupFileHash(); + + InitUserDataDirectory(); + + // load existing personal game controller mappings + LoadSetup_ReadGameControllerMappings(mappings_hash, filename); + + // add new mapping to personal game controller mappings + addGameControllerMappingToHash(mappings_hash, mapping); + + // save updated personal game controller mappings + SaveSetup_WriteGameControllerMappings(mappings_hash, filename); + + freeSetupFileHash(mappings_hash); + free(filename); +} + void LoadCustomElementDescriptions() { char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);