From febee3f5a34ded1528286e643e2ebf9d2e66e9ba Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 6 Jun 2025 15:57:05 +0900 Subject: [PATCH] Refactor savefile path handling --- src/common.h | 9 --------- src/fileio.cpp | 16 ++++++++++++++-- src/fileio.h | 3 ++- src/generic/mako.cpp | 1 + src/resource.cpp | 5 +++-- src/sys/ags_text.cpp | 1 + src/sys/nact.cpp | 14 ++++++-------- src/sys/nact_sys3.cpp | 10 ++-------- 8 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/common.h b/src/common.h index ef9b0aa..661e4da 100644 --- a/src/common.h +++ b/src/common.h @@ -9,9 +9,7 @@ #define SYSTEM3_VERSION "1.6.1" -#include #include -#include #ifdef __EMSCRIPTEN__ #include @@ -33,13 +31,6 @@ typedef uint32_t uint32; [[noreturn]] void sys_error(const char* format, ...); void sys_warning(const char* format, ...); -#ifndef WIN32 - -#define _MAX_PATH PATH_MAX -#define sscanf_s sscanf - -#endif // !WIN32 - #ifdef _MSC_VER #define strcasecmp _stricmp #endif diff --git a/src/fileio.cpp b/src/fileio.cpp index 56dd157..f711c5b 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -20,6 +20,12 @@ std::string FILEIO::savedir = "."; namespace { +std::string savefile_name(int index) { + std::string name = "ASLEEP_A.DAT"; + name[7] += index - 1; + return name; +} + std::string FindFile(const std::string& dir, const char* filename) { std::string path = dir + "/" + filename; @@ -47,9 +53,9 @@ void FILEIO::set_savedir(const std::string& dir) savedir.pop_back(); } -int FILEIO::stat_save(const char* filename, struct stat* buf) +int FILEIO::stat_save(int index, struct stat* buf) { - return stat(FindFile(savedir, filename).c_str(), buf); + return stat(FindFile(savedir, savefile_name(index).c_str()).c_str(), buf); } FILEIO::~FILEIO(void) @@ -78,6 +84,12 @@ std::unique_ptr FILEIO::open(const char *file_name, int mode) return fp ? std::unique_ptr(new FILEIO(fp, mode)) : nullptr; } +//static +std::unique_ptr FILEIO::open_save(int index, int mode) +{ + return open(savefile_name(index).c_str(), mode | FILEIO_SAVEDATA); +} + std::string FILEIO::gets() { std::string s; diff --git a/src/fileio.h b/src/fileio.h index fb53e74..b561b94 100644 --- a/src/fileio.h +++ b/src/fileio.h @@ -30,8 +30,9 @@ public: ~FILEIO(); static void set_savedir(const std::string& dir); - static int stat_save(const char* filename, struct stat* buf); + static int stat_save(int index, struct stat* buf); static std::unique_ptr open(const char *file_name, int mode); + static std::unique_ptr open_save(int index, int mode); int seek(long offset, int whence) { return fseek(fp, offset, whence); } long tell() { return ftell(fp); } bool read(void* buffer, size_t size) { diff --git a/src/generic/mako.cpp b/src/generic/mako.cpp index 9f6504a..f4b2735 100644 --- a/src/generic/mako.cpp +++ b/src/generic/mako.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include diff --git a/src/resource.cpp b/src/resource.cpp index 100a711..adbe5af 100644 --- a/src/resource.cpp +++ b/src/resource.cpp @@ -1,3 +1,4 @@ +#include #ifdef _WIN32 #include #undef ERROR @@ -21,8 +22,8 @@ SDL_RWops* open_resource(const char* name, const char* type) { #else // On Android, read from APK assets. // On other platforms, read from a file under RESOURCE_PATH. - char path[_MAX_PATH]; - snprintf(path, _MAX_PATH, "%s%s/%s", RESOURCE_PATH, type, name); + char path[PATH_MAX]; + snprintf(path, PATH_MAX, "%s%s/%s", RESOURCE_PATH, type, name); return SDL_RWFromFile(path, "rb"); #endif } diff --git a/src/sys/ags_text.cpp b/src/sys/ags_text.cpp index 6f7413d..3bac3dc 100644 --- a/src/sys/ags_text.cpp +++ b/src/sys/ags_text.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include "ags.h" #include "nact.h" diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 8a3ac3e..e010b4d 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -20,6 +20,10 @@ #include "game_id.h" #include "debugger/debugger.h" +#ifndef WIN32 +#define sscanf_s sscanf +#endif + extern SDL_Window* g_window; // 初期化 @@ -533,10 +537,7 @@ void NACT::text_wait() bool NACT::load(int index) { - char file_name[_MAX_PATH]; - snprintf(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - - auto fio = FILEIO::open(file_name, FILEIO_READ_BINARY | FILEIO_SAVEDATA); + auto fio = FILEIO::open_save(index, FILEIO_READ_BINARY); if (!fio) return false; fio->seek(112, SEEK_SET); @@ -576,10 +577,7 @@ bool NACT::load(int index) bool NACT::save(int index, const char header[112]) { - char file_name[_MAX_PATH]; - snprintf(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - - auto fio = FILEIO::open(file_name, FILEIO_WRITE_BINARY | FILEIO_SAVEDATA); + auto fio = FILEIO::open_save(index, FILEIO_WRITE_BINARY); if (!fio) return false; diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index 71d81c4..2249643 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -494,10 +494,7 @@ void NACT_Sys3::cmd_l() RND = 0; } else if (101 <= index && index <= 126) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char file_name[_MAX_PATH]; - snprintf(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 101); - - auto fio = FILEIO::open(file_name, FILEIO_READ_BINARY | FILEIO_SAVEDATA); + auto fio = FILEIO::open_save(index - 100, FILEIO_READ_BINARY); if (fio) { fio->seek(112 + 16, SEEK_SET); RND = fio->getw(); @@ -1017,11 +1014,8 @@ void NACT_Sys3::cmd_y() break; case 239: if(1 <= param && param <= 26) { - char file_name[_MAX_PATH]; - snprintf(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + param - 1); - struct stat statbuf; - if (FILEIO::stat_save(file_name, &statbuf) != -1) { + if (FILEIO::stat_save(param, &statbuf) != -1) { struct tm *t = localtime(&statbuf.st_mtime); D01 = t->tm_year + 1900; D02 = t->tm_mon + 1;