diff --git a/CMakeLists.txt b/CMakeLists.txt index 95e07b00d..d95644030 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,11 +49,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() -if(NOT EXISTS ${CMAKE_BINARY_DIR}/config.yml) - 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}/assets/" "${CMAKE_BINARY_DIR}/assets/") -endif() - if (MSVC) set(CPP "${CMAKE_C_COMPILER}" "/EP") else() @@ -602,6 +597,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" "$/config.yml" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/assets/" "$/assets/" +) + if(NOT CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") include(ExternalProject) ExternalProject_Add(TorchExternal @@ -670,4 +672,4 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") endif() set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/configure-packaging.cmake) -include(cmake/packaging.cmake) \ No newline at end of file +include(cmake/packaging.cmake) diff --git a/libultraship b/libultraship index 45c4f8d6c..09dfab5fb 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 45c4f8d6c19c6176f5e0918917c655ea09ecc212 +Subproject commit 09dfab5fb2a9a047a6e268dc9db2daad9b2ce5f0 diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index d2bee9ecf..bc0ccb1f7 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -63,6 +63,9 @@ std::vector MemoryPool; GameEngine* GameEngine::Instance; GameEngine::GameEngine() { + // Initialize context properties early to recognize paths properly for non-portable builds + this->context = Ship::Context::CreateUninitializedInstance("Starship", "ship", "starship.cfg.json"); + #ifdef __SWITCH__ Ship::Switch::Init(Ship::PreInitPhase); Ship::Switch::Init(Ship::PostInitPhase); @@ -70,21 +73,12 @@ GameEngine::GameEngine() { std::vector archiveFiles; const std::string main_path = Ship::Context::GetPathRelativeToAppDirectory("sf64.o2r"); -#ifdef __linux__ - const std::string assets_path = Ship::Context::GetPathRelativeToAppBundle("starship.o2r"); -#else - const std::string assets_path = Ship::Context::GetPathRelativeToAppDirectory("starship.o2r"); -#endif - + const std::string assets_path = Ship::Context::LocateFileAcrossAppDirs("starship.o2r"); #ifdef _WIN32 AllocConsole(); #endif - if (!fs::exists("mods")) { - fs::create_directories("mods"); - } - if (std::filesystem::exists(main_path)) { archiveFiles.push_back(main_path); } else { @@ -111,7 +105,11 @@ GameEngine::GameEngine() { } if (const std::string patches_path = Ship::Context::GetPathRelativeToAppDirectory("mods"); - !patches_path.empty() && std::filesystem::exists(patches_path)) { + !patches_path.empty()) { + if (!std::filesystem::exists(patches_path)) { + std::filesystem::create_directories(patches_path); + } + if (std::filesystem::is_directory(patches_path)) { for (const auto& p : std::filesystem::recursive_directory_iterator(patches_path)) { const auto ext = p.path().extension().string(); @@ -127,8 +125,6 @@ GameEngine::GameEngine() { } } - this->context = Ship::Context::CreateUninitializedInstance("Starship", "ship", "starship.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() @@ -849,4 +845,4 @@ extern "C" void GameEngine_Free(void* ptr) { break; } } -} \ No newline at end of file +} diff --git a/src/port/extractor/GameExtractor.cpp b/src/port/extractor/GameExtractor.cpp index f8392bc8b..d75ab3c3a 100644 --- a/src/port/extractor/GameExtractor.cpp +++ b/src/port/extractor/GameExtractor.cpp @@ -54,7 +54,10 @@ std::optional 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); @@ -63,4 +66,4 @@ bool GameExtractor::GenerateOTR() const { } return true; -} \ No newline at end of file +} diff --git a/src/port/ui/UIWidgets.cpp b/src/port/ui/UIWidgets.cpp index 00f6499b5..1aa98ec15 100644 --- a/src/port/ui/UIWidgets.cpp +++ b/src/port/ui/UIWidgets.cpp @@ -1,3 +1,4 @@ +#define NOMINMAX // prevent defining min/max macros on windows #include "UIWidgets.h" #include "libultraship/src/Context.h" diff --git a/tools/Torch b/tools/Torch index f75facb20..cd92cc0f1 160000 --- a/tools/Torch +++ b/tools/Torch @@ -1 +1 @@ -Subproject commit f75facb20883570ed091e8ae733ec0539f606e57 +Subproject commit cd92cc0f161c5e79e36f5dda0d0029edd3fc8d50