X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=8d8f8aae9ce92700e95e162f7003688a12586081;hb=494b886d5c5041013ea361a12a07d7cd87551d52;hp=a502ec49026cd1baab8dc85ac4f267a8a1cd68c6;hpb=4b1b5a2a67227d3023ff6da4596be31eae8eaefc;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index a502ec49..8d8f8aae 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -456,6 +456,51 @@ char *getHomeDir() } +/* ------------------------------------------------------------------------- */ +/* path manipulation functions */ +/* ------------------------------------------------------------------------- */ + +static char *getLastPathSeparatorPtr(char *filename) +{ + char *last_separator = strrchr(filename, '/'); + +#if !defined(PLATFORM_UNIX) + if (last_separator == NULL) /* also try DOS/Windows variant */ + last_separator = strrchr(filename, '\\'); +#endif + + return last_separator; +} + +static char *getBaseNamePtr(char *filename) +{ + char *last_separator = getLastPathSeparatorPtr(filename); + + if (last_separator != NULL) + return last_separator + 1; /* separator found: strip base path */ + else + return filename; /* no separator found: filename has no path */ +} + +char *getBaseName(char *filename) +{ + return getStringCopy(getBaseNamePtr(filename)); +} + +char *getBasePath(char *filename) +{ + char *basepath = getStringCopy(filename); + char *last_separator = getLastPathSeparatorPtr(basepath); + + if (last_separator != NULL) + *last_separator = '\0'; /* separator found: strip basename */ + else + basepath = "."; /* no separator found: use current path */ + + return basepath; +} + + /* ------------------------------------------------------------------------- */ /* various string functions */ /* ------------------------------------------------------------------------- */ @@ -529,19 +574,26 @@ void setString(char **old_value, char *new_value) void GetOptions(char *argv[], void (*print_usage_function)(void)) { + char *ro_base_path = RO_BASE_PATH; + char *rw_base_path = RW_BASE_PATH; char **options_left = &argv[1]; + if (strcmp(ro_base_path, ".") == 0) + ro_base_path = program.command_basepath; + if (strcmp(rw_base_path, ".") == 0) + rw_base_path = program.command_basepath; + /* initialize global program options */ options.display_name = NULL; options.server_host = NULL; options.server_port = 0; - options.ro_base_directory = RO_BASE_PATH; - options.rw_base_directory = RW_BASE_PATH; - options.level_directory = RO_BASE_PATH "/" LEVELS_DIRECTORY; - options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY; - options.sounds_directory = RO_BASE_PATH "/" SOUNDS_DIRECTORY; - options.music_directory = RO_BASE_PATH "/" MUSIC_DIRECTORY; - options.docs_directory = RO_BASE_PATH "/" DOCS_DIRECTORY; + options.ro_base_directory = ro_base_path; + options.rw_base_directory = rw_base_path; + options.level_directory = getPath2(ro_base_path, LEVELS_DIRECTORY); + options.graphics_directory = getPath2(ro_base_path, GRAPHICS_DIRECTORY); + options.sounds_directory = getPath2(ro_base_path, SOUNDS_DIRECTORY); + options.music_directory = getPath2(ro_base_path, MUSIC_DIRECTORY); + options.docs_directory = getPath2(ro_base_path, DOCS_DIRECTORY); options.execute_command = NULL; options.serveronly = FALSE; options.network = FALSE; @@ -608,22 +660,17 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); /* this should be extended to separate options for ro and rw data */ - options.ro_base_directory = option_arg; - options.rw_base_directory = option_arg; + options.ro_base_directory = ro_base_path = option_arg; + options.rw_base_directory = rw_base_path = option_arg; if (option_arg == next_option) options_left++; /* adjust paths for sub-directories in base directory accordingly */ - options.level_directory = - getPath2(options.ro_base_directory, LEVELS_DIRECTORY); - options.graphics_directory = - getPath2(options.ro_base_directory, GRAPHICS_DIRECTORY); - options.sounds_directory = - getPath2(options.ro_base_directory, SOUNDS_DIRECTORY); - options.music_directory = - getPath2(options.ro_base_directory, MUSIC_DIRECTORY); - options.docs_directory = - getPath2(options.ro_base_directory, DOCS_DIRECTORY); + options.level_directory = getPath2(ro_base_path, LEVELS_DIRECTORY); + options.graphics_directory = getPath2(ro_base_path, GRAPHICS_DIRECTORY); + options.sounds_directory = getPath2(ro_base_path, SOUNDS_DIRECTORY); + options.music_directory = getPath2(ro_base_path, MUSIC_DIRECTORY); + options.docs_directory = getPath2(ro_base_path, DOCS_DIRECTORY); } else if (strncmp(option, "-levels", option_len) == 0) { @@ -1558,27 +1605,21 @@ boolean fileHasSuffix(char *basename, char *suffix) boolean FileIsGraphic(char *filename) { - char *basename = strrchr(filename, '/'); - - basename = (basename != NULL ? basename + 1 : filename); + char *basename = getBaseNamePtr(filename); return fileHasSuffix(basename, "pcx"); } boolean FileIsSound(char *filename) { - char *basename = strrchr(filename, '/'); - - basename = (basename != NULL ? basename + 1 : filename); + char *basename = getBaseNamePtr(filename); return fileHasSuffix(basename, "wav"); } boolean FileIsMusic(char *filename) { - char *basename = strrchr(filename, '/'); - - basename = (basename != NULL ? basename + 1 : filename); + char *basename = getBaseNamePtr(filename); if (FileIsSound(basename)) return TRUE; @@ -2081,6 +2122,10 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, boolean base_prefix_found = FALSE; boolean parameter_suffix_found = FALSE; +#if 0 + printf("::: examining '%s' -> '%s'\n", token, HASH_ITERATION_VALUE(itr)); +#endif + /* skip all parameter definitions (handled by read_token_parameters()) */ for (i = 0; i < num_suffix_list_entries && !parameter_suffix_found; i++) { @@ -2472,6 +2517,12 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename = file_list_entry->filename; char *filename = getCustomArtworkFilename(basename, artwork_info->type); +#if 0 + if (strcmp(file_list_entry->token, "background.DOOR") == 0) + printf("::: replaceArtworkListEntry: '%s' => '%s'\n", + basename, filename); +#endif + if (filename == NULL) { Error(ERR_WARN, "cannot find artwork file '%s'", basename); @@ -2532,6 +2583,11 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, return; } +#if 0 + if (strcmp(file_list_entry->token, "background.DOOR") == 0) + printf("::: replaceArtworkListEntry: LOAD IT'\n"); +#endif + #if 0 printf("::: %s: '%s'\n", init_text[artwork_info->type], basename); #endif @@ -2669,6 +2725,12 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename); #endif +#if 0 + if (strcmp(file_list_entry->token, "background.DOOR") == 0) + printf("::: -> '%s' -> '%s'\n", + file_list_entry->token, file_list_entry->filename); +#endif + if (strcmp(file_list_entry->filename, UNDEFINED_FILENAME) == 0) { deleteArtworkListEntry(artwork_info, listnode); @@ -2711,7 +2773,7 @@ static void LoadArtworkToList(struct ArtworkListInfo *artwork_info, #if 0 printf("loading artwork '%s' ... [%d]\n", - basename, getNumNodes(artwork_info->content_list)); + file_list_entry->filename, getNumNodes(artwork_info->content_list)); #endif #if 1 @@ -2775,7 +2837,7 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) for (i = 0; i < num_file_list_entries; i++) { #if 0 - if (strcmp(file_list[i].token, "background") == 0) + if (strcmp(file_list[i].token, "background.DOOR") == 0) printf("::: '%s' -> '%s'\n", file_list[i].token, file_list[i].filename); #endif @@ -2787,6 +2849,19 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) file_list[i].filename, i); #endif +#if 0 + if (strcmp(file_list[i].token, "background.DOOR") == 0) + { + Bitmap *bitmap = getBitmapFromImageID(i); + + printf("::: BITMAP: %08lx\n", bitmap); + +#if 0 + BlitBitmap(bitmap, window, 0, 0, 100, 280, 0, 0); +#endif + } +#endif + #if 0 /* !!! NEW ARTWORK FALLBACK CODE !!! NEARLY UNTESTED !!! */ if (artwork_info->artwork_list[i] == NULL &&