X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=29847d9649fbe9b3546a14120734378e8594f46e;hp=37864e0d6a274679d0c6710bfa34c7f922fd9303;hb=115ce6f2da1914d68b0fe0e5f9082973190dacdd;hpb=573c7e1b90b4c8cba0e5a1ce4095231095a2e5aa diff --git a/src/files.c b/src/files.c index 37864e0d..29847d96 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, @@ -1398,7 +1404,7 @@ static boolean check_special_flags(char *flag) return FALSE; } -static struct DateInfo getCurrentDate() +static struct DateInfo getCurrentDate(void) { time_t epoch_seconds = time(NULL); struct tm *now = localtime(&epoch_seconds); @@ -1421,7 +1427,7 @@ static void resetEventFlags(struct ElementChangeInfo *change) change->has_event[i] = FALSE; } -static void resetEventBits() +static void resetEventBits(void) { int i; @@ -1855,13 +1861,14 @@ 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); -static void ActivateLevelTemplate() +static void ActivateLevelTemplate(void) { int x, y; @@ -1914,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; @@ -1934,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) @@ -2088,8 +2097,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 +2115,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 +2125,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) @@ -2147,12 +2159,12 @@ static int getFiletypeFromID(char *filetype_id) return filetype; } -char *getLocalLevelTemplateFilename() +char *getLocalLevelTemplateFilename(void) { return getDefaultLevelFilename(-1); } -char *getGlobalLevelTemplateFilename() +char *getGlobalLevelTemplateFilename(void) { /* global variable "leveldir_current" must be modified in the loop below */ LevelDirTree *leveldir_current_last = leveldir_current; @@ -2187,7 +2199,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 +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 */ /* ------------------------------------------------------------------------- */ @@ -3934,7 +3957,7 @@ static void CopyNativeTape_RND_to_SP(struct LevelInfo *level) demo->is_available = TRUE; } -static void setTapeInfoToDefaults(); +static void setTapeInfoToDefaults(void); static void CopyNativeTape_SP_to_RND(struct LevelInfo *level) { @@ -6201,12 +6224,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; @@ -6377,6 +6401,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) /* 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) @@ -6526,7 +6554,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 +6566,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 +6598,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,10 +6606,18 @@ static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename) CopyNativeLevel_RND_to_Native(level); } -void LoadLevelTemplate(int nr) +static void LoadLevelTemplate_LoadAndInit(void) { - char *filename; + LoadLevelFromFileInfo(&level_template, &level_template.file_info, FALSE); + + LoadLevel_InitVersion(&level_template); + LoadLevel_InitElements(&level_template); + + ActivateLevelTemplate(); +} +void LoadLevelTemplate(int nr) +{ if (!fileExists(getGlobalLevelTemplateFilename())) { Error(ERR_WARN, "no level template found for this level"); @@ -6590,33 +6626,43 @@ void LoadLevelTemplate(int nr) } 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); - - ActivateLevelTemplate(); + LoadLevelTemplate_LoadAndInit(); } -void LoadLevel(int nr) +static void LoadNetworkLevelTemplate(struct NetworkLevelInfo *network_level) { - char *filename; + copyLevelFileInfo(&network_level->tmpl_info, &level_template.file_info); - setLevelFileInfo(&level.file_info, nr); - filename = level.file_info.filename; + LoadLevelTemplate_LoadAndInit(); +} +static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level) +{ 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, 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) +{ + SetLevelSetInfo(leveldir_current->identifier, nr); + + setLevelFileInfo(&level.file_info, nr); + + LoadLevel_LoadAndInit(NULL); } void LoadLevelInfoOnly(int nr) @@ -6626,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; @@ -7458,7 +7514,7 @@ void SaveLevel(int nr) SaveLevelFromFilename(&level, filename, FALSE); } -void SaveLevelTemplate() +void SaveLevelTemplate(void) { char *filename = getLocalLevelTemplateFilename(); @@ -7528,7 +7584,7 @@ void DumpLevel(struct LevelInfo *level) /* tape file functions */ /* ========================================================================= */ -static void setTapeInfoToDefaults() +static void setTapeInfoToDefaults(void) { int i; @@ -8242,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))) { @@ -9221,7 +9278,7 @@ void LoadSetupFromFilename(char *filename) } } -static void LoadSetup_SpecialPostProcessing() +static void LoadSetup_SpecialPostProcessing(void) { char *player_name_new; @@ -9242,7 +9299,7 @@ static void LoadSetup_SpecialPostProcessing() MIN(MAX(MIN_SCROLL_DELAY, setup.scroll_delay_value), MAX_SCROLL_DELAY); } -void LoadSetup() +void LoadSetup(void) { char *filename; @@ -9263,7 +9320,7 @@ void LoadSetup() LoadSetup_SpecialPostProcessing(); } -void LoadSetup_AutoSetup() +void LoadSetup_AutoSetup(void) { char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME); SetupFileHash *setup_file_hash = NULL; @@ -9283,7 +9340,7 @@ void LoadSetup_AutoSetup() free(filename); } -void LoadSetup_EditorCascade() +void LoadSetup_EditorCascade(void) { char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME); SetupFileHash *setup_file_hash = NULL; @@ -9352,7 +9409,7 @@ static void LoadSetup_ReadGameControllerMappings(SetupFileHash *mappings_hash, fclose(file); } -void SaveSetup() +void SaveSetup(void) { char *filename = getSetupFilename(); FILE *file; @@ -9465,7 +9522,7 @@ void SaveSetup() SetFilePermissions(filename, PERMS_PRIVATE); } -void SaveSetup_AutoSetup() +void SaveSetup_AutoSetup(void) { char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME); FILE *file; @@ -9493,7 +9550,7 @@ void SaveSetup_AutoSetup() free(filename); } -void SaveSetup_EditorCascade() +void SaveSetup_EditorCascade(void) { char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME); FILE *file; @@ -9562,7 +9619,7 @@ void SaveSetup_AddGameControllerMapping(char *mapping) free(filename); } -void LoadCustomElementDescriptions() +void LoadCustomElementDescriptions(void) { char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS); SetupFileHash *setup_file_hash; @@ -9624,7 +9681,7 @@ static int get_token_parameter_value(char *token, char *value_raw) return get_parameter_value(value_raw, suffix, TYPE_INTEGER); } -void InitMenuDesignSettings_Static() +void InitMenuDesignSettings_Static(void) { int i; @@ -9639,7 +9696,7 @@ void InitMenuDesignSettings_Static() } } -static void InitMenuDesignSettings_SpecialPreProcessing() +static void InitMenuDesignSettings_SpecialPreProcessing(void) { int i; @@ -9731,7 +9788,7 @@ static void InitMenuDesignSettings_SpecialPreProcessing() } } -static void InitMenuDesignSettings_SpecialPostProcessing() +static void InitMenuDesignSettings_SpecialPostProcessing(void) { static struct { @@ -9760,7 +9817,7 @@ static void InitMenuDesignSettings_SpecialPostProcessing() *game_buttons_xy[i].dst = *game_buttons_xy[i].src; } -static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics() +static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(void) { static struct { @@ -10194,7 +10251,7 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) freeSetupFileHash(setup_file_hash); } -void LoadMenuDesignSettings() +void LoadMenuDesignSettings(void) { char *filename_base = UNDEFINED_FILENAME, *filename_local; @@ -10218,7 +10275,7 @@ void LoadMenuDesignSettings() InitMenuDesignSettings_SpecialPostProcessing(); } -void LoadMenuDesignSettings_AfterGraphics() +void LoadMenuDesignSettings_AfterGraphics(void) { InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(); } @@ -10420,7 +10477,7 @@ static boolean sound_info_listed(struct MusicFileInfo *list, char *basename) return music_info_listed_ext(list, basename, TRUE); } -void LoadMusicInfo() +void LoadMusicInfo(void) { char *music_directory = getCustomMusicDirectory(); int num_music = getMusicListSize(); @@ -10582,7 +10639,7 @@ void print_unknown_token_end(int token_nr) Error(ERR_INFO_LINE, "-"); } -void LoadHelpAnimInfo() +void LoadHelpAnimInfo(void) { char *filename = getHelpAnimFilename(); SetupFileList *setup_file_list = NULL, *list; @@ -10792,7 +10849,7 @@ void LoadHelpAnimInfo() #endif } -void LoadHelpTextInfo() +void LoadHelpTextInfo(void) { char *filename = getHelpTextFilename(); int i; @@ -10834,7 +10891,7 @@ void LoadHelpTextInfo() #define MAX_NUM_CONVERT_LEVELS 1000 -void ConvertLevels() +void ConvertLevels(void) { static LevelDirTree *convert_leveldir = NULL; static int convert_level_nr = -1; @@ -10946,7 +11003,7 @@ void ConvertLevels() /* create and save images for use in level sketches (raw BMP format) */ /* ------------------------------------------------------------------------- */ -void CreateLevelSketchImages() +void CreateLevelSketchImages(void) { #if defined(TARGET_SDL) Bitmap *bitmap1;