X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=bb1ce49770b1e3b4a85995485ecb586cd958b0b6;hp=151c8079966f31384daa580d6a82119bb04267b6;hb=bb49e2b2a9bb4aefe76182be725e998bf9495976;hpb=951e6d0a5b07999e3c919b1c689c71c108e45411 diff --git a/src/files.c b/src/files.c index 151c8079..bb1ce497 100644 --- a/src/files.c +++ b/src/files.c @@ -1855,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); @@ -1934,14 +1935,13 @@ static void ActivateLevelTemplate() static char *getLevelFilenameFromBasename(char *basename) { - static char *filename[2] = { NULL, NULL }; - int pos = (strEqual(basename, LEVELTEMPLATE_FILENAME) ? 0 : 1); + static char *filename = NULL; - checked_free(filename[pos]); + checked_free(filename); - filename[pos] = getPath2(getCurrentLevelDir(), basename); + filename = getPath2(getCurrentLevelDir(), basename); - return filename[pos]; + return filename; } static int getFileTypeFromBasename(char *basename) @@ -2088,8 +2088,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 @@ -2105,8 +2106,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, @@ -2114,8 +2116,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) @@ -2187,7 +2190,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; @@ -2284,6 +2287,17 @@ static void setLevelFileInfo(struct LevelFileInfo *level_file_info, int nr) determineLevelFileInfo_Filetype(level_file_info); } +static void copyLevelFileInfo(struct LevelFileInfo *lfi_from, + struct LevelFileInfo *lfi_to) +{ + lfi_to->nr = lfi_from->nr; + lfi_to->type = lfi_from->type; + lfi_to->packed = lfi_from->packed; + + setString(&lfi_to->basename, lfi_from->basename); + setString(&lfi_to->filename, lfi_from->filename); +} + /* ------------------------------------------------------------------------- */ /* functions for loading R'n'D level */ /* ------------------------------------------------------------------------- */ @@ -6201,12 +6215,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; @@ -6526,7 +6541,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); @@ -6538,7 +6553,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; @@ -6570,7 +6585,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; @@ -6578,38 +6593,61 @@ static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename) CopyNativeLevel_RND_to_Native(level); } -void LoadLevelTemplate(int nr) +static void LoadLevelTemplate_LoadAndInit() { - char *filename; - - 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) +void LoadLevelTemplate(int nr) { - char *filename; + if (!fileExists(getGlobalLevelTemplateFilename())) + { + Error(ERR_WARN, "no level template found for this level"); - setLevelFileInfo(&level.file_info, nr); - filename = level.file_info.filename; + return; + } + + setLevelFileInfo(&level_template.file_info, nr); + + LoadLevelTemplate_LoadAndInit(); +} + +static void LoadLevelTemplateFromNetwork(struct LevelFileInfo *lfi_network_template) +{ + copyLevelFileInfo(lfi_network_template, &level_template.file_info); + + LoadLevelTemplate_LoadAndInit(); +} +static void LoadLevel_LoadAndInit(struct LevelFileInfo *lfi_network_template) +{ LoadLevelFromFileInfo(&level, &level.file_info, FALSE); if (level.use_custom_template) - LoadLevelTemplate(-1); + { + if (lfi_network_template != NULL) + LoadLevelTemplateFromNetwork(lfi_network_template); + else + 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 LoadLevel(int nr) +{ + setLevelFileInfo(&level.file_info, nr); + + LoadLevel_LoadAndInit(NULL); } void LoadLevelInfoOnly(int nr) @@ -6619,6 +6657,14 @@ void LoadLevelInfoOnly(int nr) LoadLevelFromFileInfo(&level, &level.file_info, TRUE); } +void LoadLevelFromNetwork(struct LevelFileInfo *lfi_network_level, + struct LevelFileInfo *lfi_network_template) +{ + copyLevelFileInfo(lfi_network_level, &level.file_info); + + LoadLevel_LoadAndInit(lfi_network_template); +} + static int SaveLevel_VERS(FILE *file, struct LevelInfo *level) { int chunk_size = 0;