diff options
| -rw-r--r-- | CMakeLists.txt | 10 | ||||
| m--------- | libultraship | 0 | ||||
| -rw-r--r-- | src/port/Engine.cpp | 4 | ||||
| -rw-r--r-- | src/port/GameExtractor.cpp | 5 | ||||
| -rw-r--r-- | src/port/pak.cpp | 50 | ||||
| m--------- | torch | 0 |
6 files changed, 43 insertions, 26 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index b86e36ec2..66396af39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,9 +93,6 @@ set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) endif() -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/config.yml" "${CMAKE_BINARY_DIR}/config.yml") -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/yamls/" "${CMAKE_BINARY_DIR}/yamls/") - if (MSVC) set(CPP "${CMAKE_C_COMPILER}" "/EP") else() @@ -656,6 +653,13 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") endif() endif() +add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMENT "Copying asset yamls..." + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/config.yml" "$<TARGET_FILE_DIR:Spaghettify>/config.yml" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/yamls/" "$<TARGET_FILE_DIR:Spaghettify>/yamls/" +) + if(NOT CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") include(ExternalProject) ExternalProject_Add(TorchExternal diff --git a/libultraship b/libultraship -Subproject 5e33d3e7cd0396f847923cd6c471eaf324e9035 +Subproject 09dfab5fb2a9a047a6e268dc9db2daad9b2ce5f diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index 7deb0c5c9..2bebc766d 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -76,6 +76,8 @@ bool CreateDirectoryRecursive(std::string const& dirName, std::error_code& err) } GameEngine::GameEngine() { + // Initialize context properties early to recognize paths properly for non-portable builds + this->context = Ship::Context::CreateUninitializedInstance("Spaghetti Kart", "spaghettify", "spaghettify.cfg.json"); const std::string main_path = Ship::Context::GetPathRelativeToAppDirectory("mk64.o2r"); const std::string assets_path = Ship::Context::LocateFileAcrossAppDirs("spaghetti.o2r"); @@ -121,8 +123,6 @@ GameEngine::GameEngine() { } } - this->context = Ship::Context::CreateUninitializedInstance("Spaghetti Kart", "spaghettify", "spaghettify.cfg.json"); - this->context->InitConfiguration(); // without this line InitConsoleVariables fails at Config::Reload() this->context->InitConsoleVariables(); // without this line the controldeck constructor failes in // ShipDeviceIndexMappingManager::UpdateControllerNamesFromConfig() diff --git a/src/port/GameExtractor.cpp b/src/port/GameExtractor.cpp index 1fa9e80e8..9e942333d 100644 --- a/src/port/GameExtractor.cpp +++ b/src/port/GameExtractor.cpp @@ -56,7 +56,10 @@ std::optional<std::string> GameExtractor::ValidateChecksum() const { } bool GameExtractor::GenerateOTR() const { - Companion::Instance = new Companion(this->mGameData, ArchiveType::O2R, false); + const std::string assets_path = Ship::Context::GetAppBundlePath(); + const std::string game_path = Ship::Context::GetAppDirectoryPath(); + + Companion::Instance = new Companion(this->mGameData, ArchiveType::O2R, false, assets_path, game_path); try { Companion::Instance->Init(ExportType::Binary); diff --git a/src/port/pak.cpp b/src/port/pak.cpp index 69e0a242b..c549a9868 100644 --- a/src/port/pak.cpp +++ b/src/port/pak.cpp @@ -1,5 +1,6 @@ #include <filesystem> #include <fstream> +#include <format> #include <libultraship.h> #include <libultraship/libultra.h> @@ -15,10 +16,19 @@ typedef struct ControllerPak { FILE* file; } ControllerPak; +std::string Pfs_PakFile_GetPath(u8 file_no) { + return Ship::Context::GetPathRelativeToAppDirectory(std::format("controllerPak_file_{}.sav", file_no)); +} + +std::string Pfs_PakHeader_GetPath() { + return Ship::Context::GetPathRelativeToAppDirectory("controllerPak_header.sav"); +} + bool Pfs_PakHeader_Write(u32* file_size, u32* game_code, u16* company_code, u8* ext_name, u8* game_name, u8 fileIndex) { ControllerPak pak; - pak.header = fopen("controllerPak_header.sav", "w+b"); + std::string filename = Pfs_PakHeader_GetPath(); + pak.header = fopen(filename.c_str(), "w+b"); if (!pak.header) { return false; @@ -51,7 +61,8 @@ bool Pfs_PakHeader_Read(u32* file_size, u32* game_code, u16* company_code, char* u8 fileIndex) { ControllerPak pak; - pak.header = fopen("controllerPak_header.sav", "rb"); + std::string filename = Pfs_PakHeader_GetPath(); + pak.header = fopen(filename.c_str(), "rb"); if(!pak.header) { return false; @@ -91,12 +102,13 @@ extern "C" s32 osPfsInit(OSMesgQueue* queue, OSPfs* pfs, int channel) { pfs->status = PFS_INITIALIZED; ControllerPak pak; + std::string header_file = Pfs_PakHeader_GetPath(); - pak.header = fopen("controllerPak_header.sav", "rb"); + pak.header = fopen(header_file.c_str(), "rb"); // If a header file doesn't exist, create it. if(!pak.header) { - pak.header = fopen("controllerPak_header.sav", "w+b"); + pak.header = fopen(header_file.c_str(), "w+b"); if (!pak.header) { return PFS_ERR_INVALID; } @@ -108,8 +120,9 @@ extern "C" s32 osPfsInit(OSMesgQueue* queue, OSPfs* pfs, int channel) { extern "C" s32 osPfsFreeBlocks(OSPfs* pfs, s32* bytes_not_used) { ControllerPak pak; + std::string header_file = Pfs_PakHeader_GetPath(); - pak.header = fopen("controllerPak_header.sav", "rb"); + pak.header = fopen(header_file.c_str(), "rb"); if (!pak.header) { return PFS_ERR_INVALID; @@ -178,9 +191,8 @@ extern "C" s32 osPfsAllocateFile(OSPfs* pfs, u16 company_code, u32 game_code, u8 } /* Create empty file */ - char filename[100]; - sprintf(filename, "controllerPak_file_%d.sav", freeFileIndex); - pak.file = fopen(filename, "w+b"); + std::string filename = Pfs_PakFile_GetPath(freeFileIndex); + pak.file = fopen(filename.c_str(), "w+b"); if (!pak.file) { return PFS_ERR_INVALID; @@ -214,9 +226,8 @@ extern "C" s32 osPfsFileState(OSPfs* pfs, s32 file_no, OSPfsState* state) { // games call this function 16 times, once per file // fills the incoming state with the information inside the header of the pak. - char filename[100]; - sprintf(filename, "controllerPak_file_%d.sav", file_no); - FILE* file = fopen(filename, "rb"); + std::string filename = Pfs_PakFile_GetPath(file_no); + FILE* file = fopen(filename.c_str(), "rb"); if (file) { fclose(file); } else { @@ -275,10 +286,9 @@ extern "C" s32 osPfsFindFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* ga extern "C" s32 osPfsReadWriteFile(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in_bytes, u8* data_buffer) { ControllerPak pak; + std::string filename = Pfs_PakFile_GetPath(file_no); - char filename[100]; - sprintf(filename, "controllerPak_file_%d.sav", file_no); - pak.file = fopen(filename, flag == 0 ? "r+b" : "w+b"); + pak.file = fopen(filename.c_str(), flag == 0 ? "r+b" : "w+b"); if (!pak.file) { return PFS_ERR_INVALID; @@ -332,8 +342,8 @@ extern "C" s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* u32 file_size_ = 0; u32 game_code_ = 0; u16 company_code_ = 0; - char ext_name_[4] = { 0 }; - char game_name_[16] = { 0 }; + char ext_name_[EXT_NAME_SIZE] = { 0 }; + char game_name_[GAME_NAME_SIZE] = { 0 }; if (!Pfs_PakHeader_Read(&file_size_, &game_code_, &company_code_, ext_name_, game_name_, i)) { return PFS_ERR_INVALID; @@ -345,7 +355,8 @@ extern "C" s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* if ((game_code == game_code_) && (strcmp((const char*) game_name, (const char*) game_name_) == 0) && strcmp((const char*) ext_name, (const char*) ext_name_) == 0) { // File found - pak.header = fopen("controllerPak_header.sav", "w+b"); + std::string header_file = Pfs_PakHeader_GetPath(); + pak.header = fopen(header_file.c_str(), "w+b"); if(!pak.header) { return PFS_ERR_INVALID; @@ -365,10 +376,9 @@ extern "C" s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* free(zero_block); fclose(pak.header); - char filename[100]; - sprintf(filename, "controllerPak_file_%d.sav", i); - remove(filename); + std::string filename = Pfs_PakFile_GetPath(i); + remove(filename.c_str()); return PFS_NO_ERROR; } diff --git a/torch b/torch -Subproject 5773373b3620e4a6bc6c92fdc4690d66741c086 +Subproject cd92cc0f161c5e79e36f5dda0d0029edd3fc8d5 |
