X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=eb9d37e304878de634d0df8f435989f73d730d3d;hb=41831f337ebfff25c7138785efe20af5c2b0a2a8;hp=b590641afc20b05848461be6327ae59081e52da5;hpb=759e0bea3ad909b5be8757aa7c2409fc1c52f493;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index b590641a..eb9d37e3 100644 --- a/src/files.c +++ b/src/files.c @@ -251,6 +251,12 @@ static struct LevelFileConfigInfo chunk_config_INFO[] = &li.auto_count_gems, FALSE }, + { + -1, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(11), + &li.solved_by_one_player, FALSE + }, + { -1, -1, -1, -1, @@ -1915,6 +1921,9 @@ static void ActivateLevelTemplate() /* overwrite all individual level settings from template level settings */ level = level_template; + /* restore level file info */ + level.file_info = level_backup.file_info; + /* restore playfield size */ level.fieldx = level_backup.fieldx; level.fieldy = level_backup.fieldy; @@ -1935,14 +1944,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) @@ -2288,6 +2296,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 */ /* ------------------------------------------------------------------------- */ @@ -6382,6 +6401,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level) /* EM style elements always chain-exploded in R'n'D engine before 3.2.6 */ if (level->game_version < VERSION_IDENT(3,2,6,0)) level->em_explodes_by_fire = TRUE; + + /* levels were solved by the first player entering an exit up to 4.1.0.0 */ + if (level->game_version <= VERSION_IDENT(4,1,0,0)) + level->solved_by_one_player = TRUE; } static void LoadLevel_InitStandardElements(struct LevelInfo *level) @@ -6583,6 +6606,16 @@ static void LoadLevel_InitNativeEngines(struct LevelInfo *level) CopyNativeLevel_RND_to_Native(level); } +static void LoadLevelTemplate_LoadAndInit() +{ + LoadLevelFromFileInfo(&level_template, &level_template.file_info, FALSE); + + LoadLevel_InitVersion(&level_template); + LoadLevel_InitElements(&level_template); + + ActivateLevelTemplate(); +} + void LoadLevelTemplate(int nr) { if (!fileExists(getGlobalLevelTemplateFilename())) @@ -6594,22 +6627,27 @@ void LoadLevelTemplate(int nr) setLevelFileInfo(&level_template.file_info, nr); - LoadLevelFromFileInfo(&level_template, &level_template.file_info, FALSE); + LoadLevelTemplate_LoadAndInit(); +} - LoadLevel_InitVersion(&level_template); - LoadLevel_InitElements(&level_template); +static void LoadNetworkLevelTemplate(struct NetworkLevelInfo *network_level) +{ + copyLevelFileInfo(&network_level->tmpl_info, &level_template.file_info); - ActivateLevelTemplate(); + LoadLevelTemplate_LoadAndInit(); } -void LoadLevel(int nr) +static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level) { - setLevelFileInfo(&level.file_info, nr); - LoadLevelFromFileInfo(&level, &level.file_info, FALSE); if (level.use_custom_template) - LoadLevelTemplate(-1); + { + if (network_level != NULL) + LoadNetworkLevelTemplate(network_level); + else + LoadLevelTemplate(-1); + } LoadLevel_InitVersion(&level); LoadLevel_InitElements(&level); @@ -6618,6 +6656,15 @@ void LoadLevel(int nr) LoadLevel_InitNativeEngines(&level); } +void LoadLevel(int nr) +{ + SetLevelSetInfo(leveldir_current->identifier, nr); + + setLevelFileInfo(&level.file_info, nr); + + LoadLevel_LoadAndInit(NULL); +} + void LoadLevelInfoOnly(int nr) { setLevelFileInfo(&level.file_info, nr); @@ -6625,6 +6672,16 @@ void LoadLevelInfoOnly(int nr) LoadLevelFromFileInfo(&level, &level.file_info, TRUE); } +void LoadNetworkLevel(struct NetworkLevelInfo *network_level) +{ + SetLevelSetInfo(network_level->leveldir_identifier, + network_level->file_info.nr); + + copyLevelFileInfo(&network_level->file_info, &level.file_info); + + LoadLevel_LoadAndInit(network_level); +} + static int SaveLevel_VERS(FILE *file, struct LevelInfo *level) { int chunk_size = 0; @@ -8241,7 +8298,8 @@ void SaveScore(int nr) char *filename = getScoreFilename(nr); FILE *file; - InitScoreDirectory(leveldir_current->subdir); + /* used instead of "leveldir_current->subdir" (for network games) */ + InitScoreDirectory(levelset.identifier); if (!(file = fopen(filename, MODE_WRITE))) {