X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=6432523e41ce5c5755a6e385c28abd30995b5aee;hp=2116630707fc7bcb423a8cf51a4844a52cadc638;hb=1c9456dab9709209a2462afe72c65373a1294de5;hpb=6c16bea069f29f30b85f060ce0fe032242967f1a diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 21166307..6432523e 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -696,37 +696,6 @@ char *getBasePath(char *filename) return basepath; } -static char *getProgramMainDataPath(char *command_filename) -{ - char *main_data_path = getBasePath(command_filename); - -#if defined(PLATFORM_MACOSX) - if (strSuffix(main_data_path, MAC_APP_BINARY_SUBDIR)) - { - char *main_data_path_old = main_data_path; - - // cut relative path to Mac OS X application binary directory from path - main_data_path[strlen(main_data_path) - - strlen(MAC_APP_BINARY_SUBDIR)] = '\0'; - - // cut trailing path separator from path (but not if path is root directory) - if (strSuffix(main_data_path, "/") && !strEqual(main_data_path, "/")) - main_data_path[strlen(main_data_path) - 1] = '\0'; - - // replace empty path with current directory - if (strEqual(main_data_path, "")) - main_data_path = "."; - - // add relative path to Mac OS X application resources directory to path - main_data_path = getPath2(main_data_path, MAC_APP_FILES_SUBDIR); - - free(main_data_path_old); - } -#endif - - return main_data_path; -} - /* ------------------------------------------------------------------------- */ /* various string functions */ @@ -940,8 +909,8 @@ void GetOptions(int argc, char *argv[], void (*print_usage_function)(void), void (*print_version_function)(void)) { - char *ro_base_path = RO_BASE_PATH; - char *rw_base_path = RW_BASE_PATH; + char *ro_base_path = getProgramMainDataPath(argv[0], RO_BASE_PATH); + char *rw_base_path = getProgramMainDataPath(argv[0], RW_BASE_PATH); char **argvplus = checked_calloc((argc + 1) * sizeof(char **)); char **options_left = &argvplus[1]; @@ -949,16 +918,6 @@ void GetOptions(int argc, char *argv[], while (argc--) argvplus[argc] = argv[argc]; - /* if the program is configured to start from current directory (default), - determine program package directory from program binary (some versions - of KDE/Konqueror and Mac OS X (especially "Mavericks") apparently do not - set the current working directory to the program package directory) */ - - if (strEqual(ro_base_path, ".")) - ro_base_path = getProgramMainDataPath(argv[0]); - if (strEqual(rw_base_path, ".")) - rw_base_path = getProgramMainDataPath(argv[0]); - /* initialize global program options */ options.server_host = NULL; options.server_port = 0; @@ -1483,28 +1442,28 @@ int putFileChunk(FILE *file, char *chunk_name, int chunk_size, int getFileVersion(File *file) { + int version_super = getByteFromFile(file); int version_major = getByteFromFile(file); int version_minor = getByteFromFile(file); int version_patch = getByteFromFile(file); - int version_build = getByteFromFile(file); - return VERSION_IDENT(version_major, version_minor, version_patch, - version_build); + return VERSION_IDENT(version_super, version_major, version_minor, + version_patch); } int putFileVersion(FILE *file, int version) { if (file != NULL) { + int version_super = VERSION_SUPER(version); int version_major = VERSION_MAJOR(version); int version_minor = VERSION_MINOR(version); int version_patch = VERSION_PATCH(version); - int version_build = VERSION_BUILD(version); + fputc(version_super, file); fputc(version_major, file); fputc(version_minor, file); fputc(version_patch, file); - fputc(version_build, file); } return 4; @@ -2176,6 +2135,8 @@ void dumpList(ListNode *node_first) /* functions for file handling */ /* ------------------------------------------------------------------------- */ +#define MAX_BUFFER_SIZE 4096 + File *openFile(char *filename, char *mode) { File *file = checked_calloc(sizeof(File)); @@ -2258,6 +2219,11 @@ size_t readFile(File *file, void *buffer, size_t item_size, size_t num_items) return fread(buffer, item_size, num_items, file->file); } +size_t writeFile(File *file, void *buffer, size_t item_size, size_t num_items) +{ + return fwrite(buffer, item_size, num_items, file->file); +} + int seekFile(File *file, long offset, int whence) { #if defined(PLATFORM_ANDROID) @@ -2327,6 +2293,36 @@ char *getStringFromFile(File *file, char *line, int size) return fgets(line, size, file->file); } +int copyFile(char *filename_from, char *filename_to) +{ + File *file_from, *file_to; + + if ((file_from = openFile(filename_from, MODE_READ)) == NULL) + { + return -1; + } + + if ((file_to = openFile(filename_to, MODE_WRITE)) == NULL) + { + closeFile(file_from); + + return -1; + } + + while (!checkEndOfFile(file_from)) + { + byte buffer[MAX_BUFFER_SIZE]; + size_t bytes_read = readFile(file_from, buffer, 1, MAX_BUFFER_SIZE); + + writeFile(file_to, buffer, 1, bytes_read); + } + + closeFile(file_from); + closeFile(file_to); + + return 0; +} + /* ------------------------------------------------------------------------- */ /* functions for directory handling */ @@ -2810,6 +2806,33 @@ int get_anim_parameter_value(char *s) return result; } +int get_anim_action_parameter_value(char *token) +{ + int result = getImageIDFromToken(token); + + if (result == -1) + { + char *gfx_token = getStringCat2("gfx.", token); + + result = getImageIDFromToken(gfx_token); + + checked_free(gfx_token); + } + + if (result == -1) + { + Key key = getKeyFromX11KeyName(token); + + if (key != KSYM_UNDEFINED) + result = -(int)key; + } + + if (result == -1) + result = ANIM_EVENT_ACTION_NONE; + + return result; +} + int get_parameter_value(char *value_raw, char *suffix, int type) { char *value = getStringToLower(value_raw); @@ -2891,6 +2914,11 @@ int get_parameter_value(char *value_raw, char *suffix, int type) // add optional "click:anim_X" or "click:anim_X.part_X" parameter result |= get_anim_parameter_value(value); } + else if (strEqual(suffix, ".init_event_action") || + strEqual(suffix, ".anim_event_action")) + { + result = get_anim_action_parameter_value(value_raw); + } else if (strEqual(suffix, ".class")) { result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE : @@ -2908,6 +2936,12 @@ int get_parameter_value(char *value_raw, char *suffix, int type) if (string_has_parameter(value, "reverse")) result |= STYLE_REVERSE; + + if (string_has_parameter(value, "passthrough_clicks")) + result |= STYLE_PASSTHROUGH; + + if (string_has_parameter(value, "multiple_actions")) + result |= STYLE_MULTIPLE_ACTIONS; } else if (strEqual(suffix, ".fade_mode")) {