X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=d7f59a722369cc7e0e82bfa2d46ed293fe8527b8;hp=c0f256c73c27016f42c2af688f47f97cc0769111;hb=27ffbe2b057d39a86c905d95acea54056690bb20;hpb=cb586ba720ddae3c6d05ba1723b5bd4d58bc98bd diff --git a/src/files.c b/src/files.c index c0f256c7..d7f59a72 100644 --- a/src/files.c +++ b/src/files.c @@ -1765,14 +1765,19 @@ static void setLevelInfoToDefaults_Elements(struct LevelInfo *level) } static void setLevelInfoToDefaults(struct LevelInfo *level, - boolean level_info_only) + boolean level_info_only, + boolean reset_file_status) { setLevelInfoToDefaults_Level(level); if (!level_info_only) setLevelInfoToDefaults_Elements(level); - level->no_valid_file = FALSE; + if (reset_file_status) + { + level->no_valid_file = FALSE; + level->no_level_file = FALSE; + } level->changed = FALSE; } @@ -1861,13 +1866,14 @@ static void ActivateLevelTemplate() static char *getLevelFilenameFromBasename(char *basename) { - static char *filename = NULL; + static char *filename[2] = { NULL, NULL }; + int pos = (strEqual(basename, LEVELTEMPLATE_FILENAME) ? 0 : 1); - checked_free(filename); + checked_free(filename[pos]); - filename = getPath2(getCurrentLevelDir(), basename); + filename[pos] = getPath2(getCurrentLevelDir(), basename); - return filename; + return filename[pos]; } static int getFileTypeFromBasename(char *basename) @@ -1921,7 +1927,7 @@ static char *getSingleLevelBasenameExt(int nr, char *extension) static char basename[MAX_FILENAME_LEN]; if (nr < 0) - sprintf(basename, "template.%s", extension); + sprintf(basename, "%s", LEVELTEMPLATE_FILENAME); else sprintf(basename, "%03d.%s", nr, extension); @@ -2053,31 +2059,47 @@ static int getFiletypeFromID(char *filetype_id) return filetype; } -static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi) +char *getLocalLevelTemplateFilename() { - int nr = lfi->nr; + return getDefaultLevelFilename(-1); +} - /* special case: level number is negative => check for level template file */ - if (nr < 0) +char *getGlobalLevelTemplateFilename() +{ + /* global variable "leveldir_current" must be modified in the loop below */ + LevelDirTree *leveldir_current_last = leveldir_current; + char *filename = NULL; + + /* check for template level in path from current to topmost tree node */ + + while (leveldir_current != NULL) { - /* global variable "leveldir_current" must be modified in the loop below */ - LevelDirTree *leveldir_current_last = leveldir_current; + filename = getDefaultLevelFilename(-1); - /* check for template level in path from current to topmost tree node */ + if (fileExists(filename)) + break; - while (leveldir_current != NULL) - { - setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND, - "template.%s", LEVELFILE_EXTENSION); + leveldir_current = leveldir_current->node_parent; + } - if (fileExists(lfi->filename)) - break; + /* restore global variable "leveldir_current" modified in above loop */ + leveldir_current = leveldir_current_last; - leveldir_current = leveldir_current->node_parent; - } + return filename; +} + +static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi) +{ + int nr = lfi->nr; + + /* special case: level number is negative => check for level template file */ + if (nr < 0) + { + setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND, + getSingleLevelBasename(-1)); - /* restore global variable "leveldir_current" modified in above loop */ - leveldir_current = leveldir_current_last; + /* replace local level template filename with global template filename */ + lfi->filename = getGlobalLevelTemplateFilename(); /* no fallback if template file not existing */ return; @@ -3164,11 +3186,23 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, if (!(file = openFile(filename, MODE_READ))) { level->no_valid_file = TRUE; + level->no_level_file = TRUE; - if (!level_info_only) - Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + if (level_info_only) + return; - return; + Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename); + + /* if level file not found, try to initialize level data from template */ + filename = getGlobalLevelTemplateFilename(); + + if (!(file = openFile(filename, MODE_READ))) + return; + + /* default: for empty levels, use level template for custom elements */ + level->use_custom_template = TRUE; + + level->no_valid_file = FALSE; } getFileChunkBE(file, chunk_name, NULL); @@ -5858,7 +5892,7 @@ static void LoadLevelFromFileInfo(struct LevelInfo *level, boolean level_info_only) { /* always start with reliable default values */ - setLevelInfoToDefaults(level, level_info_only); + setLevelInfoToDefaults(level, level_info_only, TRUE); switch (level_file_info->type) { @@ -5891,11 +5925,7 @@ static void LoadLevelFromFileInfo(struct LevelInfo *level, /* if level file is invalid, restore level structure to default values */ if (level->no_valid_file) - { - setLevelInfoToDefaults(level, level_info_only); - - level->no_valid_file = TRUE; /* but keep "no valid file" flag */ - } + setLevelInfoToDefaults(level, level_info_only, FALSE); if (level->game_engine_type == GAME_ENGINE_TYPE_UNKNOWN) level->game_engine_type = GAME_ENGINE_TYPE_RND; @@ -7137,7 +7167,7 @@ void SaveLevel(int nr) void SaveLevelTemplate() { - char *filename = getDefaultLevelFilename(-1); + char *filename = getLocalLevelTemplateFilename(); SaveLevelFromFilename(&level, filename); } @@ -7163,7 +7193,7 @@ boolean SaveLevelChecked(int nr) void DumpLevel(struct LevelInfo *level) { - if (level->no_valid_file) + if (level->no_level_file || level->no_valid_file) { Error(ERR_WARN, "cannot dump -- no valid level file found"); @@ -7867,6 +7897,7 @@ void LoadScore(int nr) void SaveScore(int nr) { int i; + int permissions = (program.global_scores ? PERMS_PUBLIC : PERMS_PRIVATE); char *filename = getScoreFilename(nr); FILE *file; @@ -7885,7 +7916,7 @@ void SaveScore(int nr) fclose(file); - SetFilePermissions(filename, PERMS_PUBLIC); + SetFilePermissions(filename, permissions); } @@ -7943,25 +7974,14 @@ void SaveScore(int nr) #define NUM_GLOBAL_SETUP_TOKENS 43 /* editor setup */ -#define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 -#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE 1 -#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE_CLUB 2 -#define SETUP_TOKEN_EDITOR_EL_MORE 3 -#define SETUP_TOKEN_EDITOR_EL_SOKOBAN 4 -#define SETUP_TOKEN_EDITOR_EL_SUPAPLEX 5 -#define SETUP_TOKEN_EDITOR_EL_DIAMOND_CAVES 6 -#define SETUP_TOKEN_EDITOR_EL_DX_BOULDERDASH 7 -#define SETUP_TOKEN_EDITOR_EL_CHARS 8 -#define SETUP_TOKEN_EDITOR_EL_STEEL_CHARS 9 -#define SETUP_TOKEN_EDITOR_EL_CUSTOM 10 -#define SETUP_TOKEN_EDITOR_EL_HEADLINES 11 -#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED 12 -#define SETUP_TOKEN_EDITOR_EL_DYNAMIC 13 -#define SETUP_TOKEN_EDITOR_EL_BY_GAME 14 -#define SETUP_TOKEN_EDITOR_EL_BY_TYPE 15 -#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN 16 - -#define NUM_EDITOR_SETUP_TOKENS 17 +#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_SHOW_ELEMENT_TOKEN 5 + +#define NUM_EDITOR_SETUP_TOKENS 6 /* editor cascade setup */ #define SETUP_TOKEN_EDITOR_CASCADE_BD 0 @@ -8146,22 +8166,11 @@ static struct TokenInfo global_setup_tokens[] = static struct TokenInfo editor_setup_tokens[] = { - { TYPE_SWITCH, &sei.el_boulderdash, "editor.el_boulderdash" }, - { TYPE_SWITCH, &sei.el_emerald_mine, "editor.el_emerald_mine" }, - { TYPE_SWITCH, &sei.el_emerald_mine_club,"editor.el_emerald_mine_club"}, - { TYPE_SWITCH, &sei.el_more, "editor.el_more" }, - { TYPE_SWITCH, &sei.el_sokoban, "editor.el_sokoban" }, - { TYPE_SWITCH, &sei.el_supaplex, "editor.el_supaplex" }, - { TYPE_SWITCH, &sei.el_diamond_caves, "editor.el_diamond_caves" }, - { TYPE_SWITCH, &sei.el_dx_boulderdash,"editor.el_dx_boulderdash" }, { TYPE_SWITCH, &sei.el_chars, "editor.el_chars" }, { TYPE_SWITCH, &sei.el_steel_chars, "editor.el_steel_chars" }, { TYPE_SWITCH, &sei.el_custom, "editor.el_custom" }, - { TYPE_SWITCH, &sei.el_headlines, "editor.el_headlines" }, { TYPE_SWITCH, &sei.el_user_defined, "editor.el_user_defined" }, { TYPE_SWITCH, &sei.el_dynamic, "editor.el_dynamic" }, - { TYPE_SWITCH, &sei.el_by_game, "editor.el_by_game" }, - { TYPE_SWITCH, &sei.el_by_type, "editor.el_by_type" }, { TYPE_SWITCH, &sei.show_element_token,"editor.show_element_token" }, }; @@ -10065,7 +10074,7 @@ void ConvertLevels() Print("Level %03d: ", level_nr); LoadLevel(level_nr); - if (level.no_valid_file) + if (level.no_level_file || level.no_valid_file) { Print("(no level)\n"); continue; @@ -10209,6 +10218,8 @@ void CreateCustomElementImages(char *directory) SDLInitVideoDisplay(); + ReCreateBitmap(&backbuffer, video.width, video.height); + src_bitmap = LoadImage(src_filename); bitmap = CreateBitmap(TILEX * 16 * 2,