diff --git a/licence.txt b/licence.txt index 20d40b6bce..94a9ed024d 100644 --- a/licence.txt +++ b/licence.txt @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/src/config.c b/src/config.c index 4415705b28..11fdf54b97 100644 --- a/src/config.c +++ b/src/config.c @@ -216,20 +216,19 @@ void config_save() */ void config_init() { - TCHAR path[MAX_PATH]; + char *path = osinterface_get_orct2_homefolder(); FILE* fp; memcpy(&gGeneral_config, &gGeneral_config_default, sizeof(general_configuration_t)); - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, path))) { // find home folder - strcat(path, "\\OpenRCT2"); - DWORD dwAttrib = GetFileAttributes(path); - if (dwAttrib == INVALID_FILE_ATTRIBUTES || !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) { // folder does not exist - if (!CreateDirectory(path, NULL)) { - config_error("Could not create config file (do you have write access to your documents folder?)"); - } + if (strcmp(path, "") != 0){ + if (!osinterface_ensure_directory_exists(path)) { + config_error("Could not create config file (do you have write access to your documents folder?)"); + return; } - strcat(path, "\\config.ini"); + + sprintf(path, "%s%c%s", path, osinterface_get_path_separator(), "config.ini"); + fp = fopen(path, "r"); if (!fp) { config_create_default(path); @@ -242,6 +241,8 @@ void config_init() fclose(fp); } + + free(path); } /** diff --git a/src/osinterface.c b/src/osinterface.c index 8117a31198..843b37f712 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -428,3 +428,47 @@ char* osinterface_open_directory_browser(char *title) { CoUninitialize(); return outPath; } + +char* osinterface_get_orct2_homefolder() +{ + char *path=NULL; + path = malloc(sizeof(char) * MAX_PATH); + if (path == NULL){ + osinterface_show_messagebox("Error allocating memory!"); + exit(EXIT_FAILURE); + } + + path[0] = '\0'; + + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, path))) + strcat(path, "\\OpenRCT2"); + + return path; +} + +char *osinterface_get_orct2_homesubfolder(const char *subFolder) +{ + char *path = osinterface_get_orct2_homefolder(); + strcat(path, "\\"); + strcat(path, subFolder); + return path; +} + +int osinterface_directory_exists(const char *path) +{ + DWORD dwAttrib = GetFileAttributes(path); + return dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY); +} + +int osinterface_ensure_directory_exists(const char *path) +{ + if (osinterface_directory_exists(path)) + return 1; + + return CreateDirectory(path, NULL); +} + +char osinterface_get_path_separator() +{ + return '\\'; +} \ No newline at end of file diff --git a/src/osinterface.h b/src/osinterface.h index 8360d3f1c4..88576a980a 100644 --- a/src/osinterface.h +++ b/src/osinterface.h @@ -50,4 +50,11 @@ int osinterface_open_common_file_dialog(int type, char *title, char *filename, c void osinterface_show_messagebox(char* message); char* osinterface_open_directory_browser(char *title); +char* osinterface_get_orct2_homefolder(); +char *osinterface_get_orct2_homesubfolder(const char *subFolder); +int osinterface_directory_exists(const char *path); +int osinterface_ensure_directory_exists(const char *path); + +char osinterface_get_path_separator(); + #endif diff --git a/src/screenshot.c b/src/screenshot.c index d557297a9e..42a0cd21c7 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -21,6 +21,7 @@ #include #include #include +#include "osinterface.h" #include "addresses.h" #include "config.h" #include "gfx.h" @@ -59,17 +60,25 @@ void screenshot_check() static int screenshot_get_next_path(char *path, char *extension) { + char *screenshotPath = osinterface_get_orct2_homesubfolder("screenshot"); + if (!osinterface_ensure_directory_exists(screenshotPath)) { + fprintf(stderr, "Unable to save screenshots in OpenRCT2 screenshot directory.\n"); + return -1; + } + int i; for (i = 1; i < 1000; i++) { RCT2_GLOBAL(0x013CE952, uint16) = i; // Glue together path and filename - sprintf(path, "%sSCR%d%s", RCT2_ADDRESS(RCT2_ADDRESS_APP_PATH_SLASH, char), i, extension); + sprintf(path, "%s%cSCR%d%s", screenshotPath, osinterface_get_path_separator(), i, extension); if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND) return i; } + free(screenshotPath); + return -1; }