X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=0cad9d8c4c0b087da76e21502c5c641c511158c1;hb=df4dc8e0755fb2d7f651ce31aff28bc51cc8034a;hp=8da478a3656126dc45d00570b53e3db3ee3562ea;hpb=711a4d7c7c5fae06245617ac494b25d216875224;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 8da478a3..0cad9d8c 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -47,8 +47,6 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] = #define TOKEN_VALUE_POSITION_DEFAULT 40 #define TOKEN_COMMENT_POSITION_DEFAULT 60 -#define MAX_COOKIE_LEN 256 - #define TREE_NODE_TYPE_DEFAULT 0 #define TREE_NODE_TYPE_PARENT 1 #define TREE_NODE_TYPE_GROUP 2 @@ -85,7 +83,7 @@ static void WarnUsingFallback(char *filename) { setHashEntry(missing_file_hash, filename, ""); - Warn("cannot find artwork file '%s' (using fallback)", filename); + Debug("setup", "cannot find artwork file '%s' (using fallback)", filename); } } @@ -516,7 +514,7 @@ char *getProgramMainDataPath(char *command_filename, char *base_path) set the current working directory to the program package directory) */ char *main_data_path = getBasePath(command_filename); -#if defined(PLATFORM_MACOSX) +#if defined(PLATFORM_MAC) if (strSuffix(main_data_path, MAC_APP_BINARY_SUBDIR)) { char *main_data_path_old = main_data_path; @@ -820,9 +818,34 @@ char *getHelpTextFilename(void) return filename; } -char *getLevelSetInfoFilename(void) +static char *getLevelSetInfoBasename(int nr) +{ + static char basename[32]; + + sprintf(basename, "levelset_%d.txt", nr + 1); + + return basename; +} + +char *getLevelSetInfoFilename(int nr) { + char *basename = getLevelSetInfoBasename(nr); + static char *info_subdir = NULL; static char *filename = NULL; + + if (info_subdir == NULL) + info_subdir = getPath2(DOCS_DIRECTORY, LEVELSET_INFO_DIRECTORY); + + checked_free(filename); + + // look for level set info file the current level set directory + filename = getPath3(getCurrentLevelDir(), info_subdir, basename); + if (fileExists(filename)) + return filename; + + if (nr > 0) + return NULL; + char *basenames[] = { "README", @@ -1326,9 +1349,9 @@ void InitTapeDirectory(char *level_subdir) { boolean new_tape_dir = !directoryExists(getTapeDir(level_subdir)); - createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE); - createDirectory(getTapeDir(NULL), "main tape", PERMS_PRIVATE); - createDirectory(getTapeDir(level_subdir), "level tape", PERMS_PRIVATE); + createDirectory(getUserGameDataDir(), "user data"); + createDirectory(getTapeDir(NULL), "main tape"); + createDirectory(getTapeDir(level_subdir), "level tape"); if (new_tape_dir) MarkTapeDirectoryUploadsAsComplete(level_subdir); @@ -1336,31 +1359,31 @@ void InitTapeDirectory(char *level_subdir) void InitScoreDirectory(char *level_subdir) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); - createDirectory(getScoreDir(NULL), "main score", PERMS_PRIVATE); - createDirectory(getScoreDir(level_subdir), "level score", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); + createDirectory(getScoreDir(NULL), "main score"); + createDirectory(getScoreDir(level_subdir), "level score"); } void InitScoreCacheDirectory(char *level_subdir) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); - createDirectory(getCacheDir(), "cache data", PERMS_PRIVATE); - createDirectory(getScoreCacheDir(NULL), "main score", PERMS_PRIVATE); - createDirectory(getScoreCacheDir(level_subdir), "level score", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); + createDirectory(getCacheDir(), "cache data"); + createDirectory(getScoreCacheDir(NULL), "main score"); + createDirectory(getScoreCacheDir(level_subdir), "level score"); } void InitScoreTapeDirectory(char *level_subdir, int nr) { InitScoreDirectory(level_subdir); - createDirectory(getScoreTapeDir(level_subdir, nr), "score tape", PERMS_PRIVATE); + createDirectory(getScoreTapeDir(level_subdir, nr), "score tape"); } void InitScoreCacheTapeDirectory(char *level_subdir, int nr) { InitScoreCacheDirectory(level_subdir); - createDirectory(getScoreCacheTapeDir(level_subdir, nr), "score tape", PERMS_PRIVATE); + createDirectory(getScoreCacheTapeDir(level_subdir, nr), "score tape"); } static void SaveUserLevelInfo(void); @@ -1369,12 +1392,15 @@ void InitUserLevelDirectory(char *level_subdir) { if (!directoryExists(getUserLevelDir(level_subdir))) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); - createDirectory(getUserLevelDir(NULL), "main user level", PERMS_PRIVATE); - createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); + createDirectory(getUserLevelDir(NULL), "main user level"); if (setup.internal.create_user_levelset) + { + createDirectory(getUserLevelDir(level_subdir), "user level"); + SaveUserLevelInfo(); + } } } @@ -1382,24 +1408,24 @@ void InitNetworkLevelDirectory(char *level_subdir) { if (!directoryExists(getNetworkLevelDir(level_subdir))) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); - createDirectory(getNetworkDir(), "network data", PERMS_PRIVATE); - createDirectory(getNetworkLevelDir(NULL), "main network level", PERMS_PRIVATE); - createDirectory(getNetworkLevelDir(level_subdir), "network level", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); + createDirectory(getNetworkDir(), "network data"); + createDirectory(getNetworkLevelDir(NULL), "main network level"); + createDirectory(getNetworkLevelDir(level_subdir), "network level"); } } void InitLevelSetupDirectory(char *level_subdir) { - createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE); - createDirectory(getLevelSetupDir(NULL), "main level setup", PERMS_PRIVATE); - createDirectory(getLevelSetupDir(level_subdir), "level setup", PERMS_PRIVATE); + createDirectory(getUserGameDataDir(), "user data"); + createDirectory(getLevelSetupDir(NULL), "main level setup"); + createDirectory(getLevelSetupDir(level_subdir), "level setup"); } static void InitCacheDirectory(void) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); - createDirectory(getCacheDir(), "cache data", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); + createDirectory(getCacheDir(), "cache data"); } @@ -1785,7 +1811,7 @@ void sortTreeInfo(TreeInfo **node_first) // some stuff from "files.c" // ============================================================================ -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) #ifndef S_IRGRP #define S_IRGRP S_IRUSR #endif @@ -1810,7 +1836,7 @@ void sortTreeInfo(TreeInfo **node_first) #ifndef S_ISGID #define S_ISGID 0 #endif -#endif // PLATFORM_WIN32 +#endif // PLATFORM_WINDOWS // file permissions for newly written files #define MODE_R_ALL (S_IRUSR | S_IRGRP | S_IROTH) @@ -1834,7 +1860,7 @@ char *getHomeDir(void) { static char *dir = NULL; -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) if (dir == NULL) { dir = checked_malloc(MAX_PATH + 1); @@ -1868,7 +1894,7 @@ char *getPersonalDataDir(void) { static char *personal_data_dir = NULL; -#if defined(PLATFORM_MACOSX) +#if defined(PLATFORM_MAC) if (personal_data_dir == NULL) personal_data_dir = getPath2(getHomeDir(), "Documents"); #else @@ -1922,7 +1948,7 @@ static mode_t posix_umask(mode_t mask) static int posix_mkdir(const char *pathname, mode_t mode) { -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) return mkdir(pathname); #else return mkdir(pathname, mode); @@ -1938,13 +1964,14 @@ static boolean posix_process_running_setgid(void) #endif } -void createDirectory(char *dir, char *text, int permission_class) +void createDirectory(char *dir, char *text) { if (directoryExists(dir)) return; // leave "other" permissions in umask untouched, but ensure group parts // of USERDATA_DIR_MODE are not masked + int permission_class = PERMS_PRIVATE; mode_t dir_mode = (permission_class == PERMS_PRIVATE ? DIR_PERMS_PRIVATE : DIR_PERMS_PUBLIC); mode_t last_umask = posix_umask(0); @@ -1973,17 +2000,17 @@ void createDirectory(char *dir, char *text, int permission_class) void InitMainUserDataDirectory(void) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); } void InitUserDataDirectory(void) { - createDirectory(getMainUserGameDataDir(), "main user data", PERMS_PRIVATE); + createDirectory(getMainUserGameDataDir(), "main user data"); if (user.nr != 0) { - createDirectory(getUserDir(-1), "users", PERMS_PRIVATE); - createDirectory(getUserDir(user.nr), "user data", PERMS_PRIVATE); + createDirectory(getUserDir(-1), "users"); + createDirectory(getUserDir(user.nr), "user data"); } } @@ -1999,21 +2026,6 @@ void SetFilePermissions(char *filename, int permission_class) chmod(filename, perms); } -char *getCookie(char *file_type) -{ - static char cookie[MAX_COOKIE_LEN + 1]; - - if (strlen(program.cookie_prefix) + 1 + - strlen(file_type) + strlen("_FILE_VERSION_x.x") > MAX_COOKIE_LEN) - return "[COOKIE ERROR]"; // should never happen - - sprintf(cookie, "%s_%s_FILE_VERSION_%d.%d", - program.cookie_prefix, file_type, - program.version_super, program.version_major); - - return cookie; -} - void fprintFileHeader(FILE *file, char *basename) { char *prefix = "# "; @@ -2726,10 +2738,11 @@ SetupFileHash *loadSetupFileHash(char *filename) #define LEVELINFO_TOKEN_EMPTY_LEVEL_NAME 27 #define LEVELINFO_TOKEN_FORCE_LEVEL_NAME 28 #define LEVELINFO_TOKEN_HANDICAP 29 -#define LEVELINFO_TOKEN_SKIP_LEVELS 30 -#define LEVELINFO_TOKEN_USE_EMC_TILES 31 +#define LEVELINFO_TOKEN_TIME_LIMIT 30 +#define LEVELINFO_TOKEN_SKIP_LEVELS 31 +#define LEVELINFO_TOKEN_USE_EMC_TILES 32 -#define NUM_LEVELINFO_TOKENS 32 +#define NUM_LEVELINFO_TOKENS 33 static LevelDirTree ldi; @@ -2766,6 +2779,7 @@ static struct TokenInfo levelinfo_tokens[] = { TYPE_STRING, &ldi.empty_level_name, "empty_level_name" }, { TYPE_BOOLEAN, &ldi.force_level_name, "force_level_name" }, { TYPE_BOOLEAN, &ldi.handicap, "handicap" }, + { TYPE_BOOLEAN, &ldi.time_limit, "time_limit" }, { TYPE_BOOLEAN, &ldi.skip_levels, "skip_levels" }, { TYPE_BOOLEAN, &ldi.use_emc_tiles, "use_emc_tiles" } }; @@ -2872,6 +2886,7 @@ static void setTreeInfoToDefaults(TreeInfo *ti, int type) ti->handicap_level = 0; ti->readonly = TRUE; ti->handicap = TRUE; + ti->time_limit = TRUE; ti->skip_levels = FALSE; ti->use_emc_tiles = FALSE; @@ -2957,6 +2972,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ti, TreeInfo *parent) ti->handicap_level = parent->handicap_level; ti->readonly = parent->readonly; ti->handicap = parent->handicap; + ti->time_limit = parent->time_limit; ti->skip_levels = parent->skip_levels; ti->use_emc_tiles = parent->use_emc_tiles; @@ -3029,6 +3045,7 @@ static TreeInfo *getTreeInfoCopy(TreeInfo *ti) ti_copy->user_defined = ti->user_defined; ti_copy->readonly = ti->readonly; ti_copy->handicap = ti->handicap; + ti_copy->time_limit = ti->time_limit; ti_copy->skip_levels = ti->skip_levels; ti_copy->use_emc_tiles = ti->use_emc_tiles; @@ -3889,9 +3906,13 @@ static void LoadLevelInfoFromLevelDir(TreeInfo **node_first, level_directory, "."); } - if (!valid_entry_found) + boolean valid_entry_expected = + (strEqual(level_directory, options.level_directory) || + setup.internal.create_user_levelset); + + if (valid_entry_expected && !valid_entry_found) Warn("cannot find any valid level series in directory '%s'", - level_directory); + level_directory); } boolean AdjustGraphicsForEMC(void) @@ -4642,7 +4663,7 @@ boolean CreateUserLevelSet(char *level_subdir, char *level_name, int i; // create user level sub-directory, if needed - createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE); + createDirectory(getUserLevelDir(level_subdir), "user level"); filename = getPath2(getUserLevelDir(level_subdir), LEVELINFO_FILENAME);