diff --git a/src/config.c b/src/config.c index d2ec11087f..11fdf54b97 100644 --- a/src/config.c +++ b/src/config.c @@ -222,11 +222,9 @@ void config_init() memcpy(&gGeneral_config, &gGeneral_config_default, sizeof(general_configuration_t)); if (strcmp(path, "") != 0){ - 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 (!osinterface_ensure_directory_exists(path)) { + config_error("Could not create config file (do you have write access to your documents folder?)"); + return; } sprintf(path, "%s%c%s", path, osinterface_get_path_separator(), "config.ini"); diff --git a/src/osinterface.c b/src/osinterface.c index fdc237d4ad..843b37f712 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -440,13 +440,34 @@ char* osinterface_get_orct2_homefolder() path[0] = '\0'; - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, path))) { // find home folder + 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 '\\'; diff --git a/src/osinterface.h b/src/osinterface.h index 50f78904a0..88576a980a 100644 --- a/src/osinterface.h +++ b/src/osinterface.h @@ -51,6 +51,10 @@ 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 475b09452c..42a0cd21c7 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -60,20 +60,24 @@ void screenshot_check() static int screenshot_get_next_path(char *path, char *extension) { - char *homePath = osinterface_get_orct2_homefolder(); + 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, "%s%cSCR%d%s", homePath, osinterface_get_path_separator(), 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(homePath); + free(screenshotPath); return -1; }