Reimplemented built-in generation

This commit is contained in:
KiritoDv 2025-01-15 15:50:57 -06:00
parent 5aac47e2fa
commit c02015fb05
8 changed files with 1924 additions and 61 deletions

View File

@ -18,6 +18,8 @@ set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use")
# Add a custom module path to locate additional CMake modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
set(YAML_CPP_STATIC_DEFINE ON)
add_compile_definitions(YAML_CPP_STATIC_DEFINE)
if (WIN32)
include(cmake/automate-vcpkg.cmake)
@ -27,6 +29,11 @@ vcpkg_bootstrap()
vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 glew glfw3 nlohmann-json tinyxml2 spdlog)
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()
@ -221,42 +228,23 @@ add_dependencies(${PROJECT_NAME} libultraship)
target_link_libraries(${PROJECT_NAME} PRIVATE libultraship)
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_compile_definitions(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:"
"_DEBUG;"
"_CRT_SECURE_NO_WARNINGS;"
"ENABLE_DX11;"
">"
"$<$<CONFIG:Release>:"
"NDEBUG"
">"
"INCLUDE_GAME_PRINTF;"
"UNICODE;"
"_UNICODE"
STORMLIB_NO_AUTO_LINK
"_CRT_SECURE_NO_WARNINGS;"
"_SILENCE_ALL_MS_EXT_DEPRECATION_WARNINGS;"
)
elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")
target_compile_definitions(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:"
"NOINCLUDE_GAME_PRINTF;"
"_DEBUG;"
"_CRT_SECURE_NO_WARNINGS;"
"ENABLE_OPENGL"
">"
"$<$<CONFIG:Release>:"
"NDEBUG;"
">"
"INCLUDE_GAME_PRINTF;"
"WIN32;"
"UNICODE;"
"_UNICODE"
STORMLIB_NO_AUTO_LINK
"_SILENCE_ALL_MS_EXT_DEPRECATION_WARNINGS;"
)
endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:"
"_DEBUG;"
"_CRT_SECURE_NO_WARNINGS;"
"ENABLE_DX11;"
">"
"$<$<CONFIG:Release>:"
"NDEBUG"
">"
"INCLUDE_GAME_PRINTF;"
"UNICODE;"
"_UNICODE;"
"_CRT_SECURE_NO_WARNINGS;"
"_SILENCE_ALL_MS_EXT_DEPRECATION_WARNINGS;"
)
add_compile_definitions(STORMLIB_NO_AUTO_LINK)
set(STORMLIB_NO_AUTO_LINK ON)
elseif (CMAKE_SYSTEM_NAME STREQUAL "CafeOS")
target_compile_definitions(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:"
@ -319,18 +307,24 @@ if(USE_NETWORKING)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_NETWORKING)
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
option(USE_STANDALONE "Build as a standalone executable" OFF)
option(BUILD_STORMLIB "Build with StormLib support" OFF)
option(BUILD_SM64 "Build with Super Mario 64 support" OFF)
option(BUILD_MK64 "Build with Mario Kart 64 support" OFF)
add_subdirectory(tools/Torch)
target_link_libraries(${PROJECT_NAME} PRIVATE torch "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch")
nx_generate_nacp(Lylat.nacp
nx_generate_nacp(${PROJECT_NAME}.nacp
NAME "${PROJECT_NAME}"
AUTHOR "${PROJECT_TEAM}"
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
)
nx_create_nro(${PROJECT_NAME}
NACP Lylat.nacp
NACP ${PROJECT_NAME}.nacp
)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.nro DESTINATION . COMPONENT ${PROJECT_NAME})
@ -530,20 +524,20 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
endif()
include(ExternalProject)
ExternalProject_Add(torch
PREFIX torch
ExternalProject_Add(TorchExternal
PREFIX TorchExternal
SOURCE_DIR ${CMAKE_SOURCE_DIR}/tools/Torch
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/Torch
)
ExternalProject_Get_Property(torch install_dir)
ExternalProject_Get_Property(TorchExternal install_dir)
if (MSVC)
set(TORCH_EXECUTABLE ${install_dir}/src/torch-build/$<CONFIGURATION>/torch)
set(TORCH_EXECUTABLE ${install_dir}/src/TorchExternal-build/$<CONFIGURATION>/torch)
else()
set(TORCH_EXECUTABLE ${install_dir}/src/torch-build/torch)
set(TORCH_EXECUTABLE ${install_dir}/src/TorchExternal-build/torch)
endif()
add_custom_target(
ExtractAssets
DEPENDS torch
DEPENDS TorchExternal
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${TORCH_EXECUTABLE} o2r baserom.z64
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/sf64.o2r" "${CMAKE_BINARY_DIR}/sf64.o2r"
@ -551,7 +545,7 @@ add_custom_target(
add_custom_target(
GeneratePortOTR
DEPENDS torch
DEPENDS TorchExternal
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${TORCH_EXECUTABLE} pack port starship.o2r o2r
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/starship.o2r" "${CMAKE_BINARY_DIR}/starship.o2r"

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,7 @@
#include "ui/ImguiUI.h"
#include "StringHelper.h"
#include "extractor/GameExtractor.h"
#include "libultraship/src/Context.h"
#include "resource/type/ResourceType.h"
#include "resource/importers/AnimFactory.h"
@ -47,7 +48,6 @@ namespace fs = std::filesystem;
extern "C" {
bool prevAltAssets = false;
float gInterpolationStep = 0.0f;
#include <sf64thread.h>
#include <macros.h>
#include "sf64audio_provisional.h"
@ -59,14 +59,24 @@ static GamePool MemoryPool = { .chunk = 1024 * 512, .cursor = 0, .length = 0, .m
GameEngine::GameEngine() {
std::vector<std::string> archiveFiles;
if (const std::string cube_path = Ship::Context::GetPathRelativeToAppDirectory("starship.o2r");
std::filesystem::exists(cube_path)) {
archiveFiles.push_back(cube_path);
const std::string main_path = Ship::Context::GetPathRelativeToAppDirectory("sf64.o2r");
const std::string assets_path = Ship::Context::GetPathRelativeToAppDirectory("starship.o2r");
#ifdef _WIN32
AllocConsole();
#endif
if (std::filesystem::exists(main_path)) {
archiveFiles.push_back(main_path);
} else {
GenAssetFile();
archiveFiles.push_back(main_path);
}
if (const std::string sm64_otr_path = Ship::Context::GetPathRelativeToAppDirectory("sf64.o2r");
std::filesystem::exists(sm64_otr_path)) {
archiveFiles.push_back(sm64_otr_path);
if (std::filesystem::exists(assets_path)) {
archiveFiles.push_back(assets_path);
}
if (const std::string patches_path = Ship::Context::GetPathRelativeToAppDirectory("mods");
!patches_path.empty() && std::filesystem::exists(patches_path)) {
if (std::filesystem::is_directory(patches_path)) {
@ -187,6 +197,23 @@ GameEngine::GameEngine() {
context->GetResourceManager()->SetAltAssetsEnabled(prevAltAssets);
}
void GameEngine::GenAssetFile() {
auto extractor = new GameExtractor();
if (!extractor->SelectGameFromUI()) {
ShowMessage("Extractor", "No game selected.");
return;
}
if (!extractor->ValidateChecksum()) {
ShowMessage("Extractor", "Invalid checksum.");
return;
}
if (!extractor->GenerateOTR()) {
ShowMessage("Extractor", "Failed to generate OTR.");
}
}
void GameEngine::Create() {
const auto instance = Instance = new GameEngine();
instance->AudioInit();
@ -421,6 +448,15 @@ uint32_t GameEngine::GetInterpolationFPS() {
CVarGetInteger("gInterpolationFPS", 60));
}
void GameEngine::ShowMessage(const char* title, const char* message) {
#if defined(__SWITCH__)
SPDLOG_ERROR(message);
#else
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, nullptr);
SPDLOG_ERROR(message);
#endif
}
extern "C" uint32_t GameEngine_GetSampleRate() {
auto player = Ship::Context::GetInstance()->GetAudio()->GetAudioPlayer();
if (player == nullptr) {

View File

@ -24,6 +24,7 @@ class GameEngine {
std::shared_ptr<Ship::Context> context;
GameEngine();
static void GenAssetFile();
static void Create();
void StartFrame() const;
static void HandleAudioThread();
@ -37,6 +38,7 @@ class GameEngine {
static void Destroy();
static void ProcessGfxCommands(Gfx* commands);
static uint32_t GetInterpolationFPS();
static void ShowMessage(const char* title, const char* message);
};
extern "C" void* GameEngine_Malloc(size_t size);

View File

@ -0,0 +1,51 @@
#include "GameExtractor.h"
#include <fstream>
#include "Context.h"
#include "spdlog/spdlog.h"
#include "portable-file-dialogs.h"
#include <port/Engine.h>
std::unordered_map<std::string, std::string> mGameList = {
{ "f7475fb11e7e6830f82883412638e8390791ab87", "Star Fox 64 (U) (V1.1) (Uncompressed)" },
{ "09f0d105f476b00efa5303a3ebc42e60a7753b7a", "Star Fox 64 (U) (V1.1)" }
};
bool GameExtractor::SelectGameFromUI() {
#if !defined(__IOS__) || !defined(__ANDROID__) || !defined(__SWITCH__)
auto selection = pfd::open_file("Select a file", ".", { "N64 Roms", "*.z64 *.n64 *.v64" }).result();
if (selection.empty()) {
return false;
}
this->mGamePath = selection[0];
#else
this->mGamePath = Ship::Context::GetPathRelativeToAppDirectory("baserom.us.rev1.z64");
#endif
std::ifstream file(this->mGamePath, std::ios::binary);
this->mGameData = std::vector<uint8_t>( std::istreambuf_iterator( file ), {} );
file.close();
return true;
}
std::optional<std::string> GameExtractor::ValidateChecksum() const {
const auto rom = new N64::Cartridge(this->mGameData);
rom->Initialize();
return mGameList[rom->GetHash()];
}
bool GameExtractor::GenerateOTR() const {
Companion::Instance = new Companion(this->mGameData, ArchiveType::O2R, false);
try {
Companion::Instance->Init(ExportType::Binary);
} catch (const std::exception& e) {
GameEngine::ShowMessage("Failed to generate OTR", e.what());
exit(1);
}
return true;
}

View File

@ -0,0 +1,17 @@
#pragma once
#include "Companion.h"
#include <filesystem>
#include <vector>
#include <cstdint>
class GameExtractor {
public:
static void GenAssetFile();
std::optional<std::string> ValidateChecksum() const;
bool SelectGameFromUI();
bool GenerateOTR() const;
private:
fs::path mGamePath;
std::vector<uint8_t> mGameData;
};

View File

@ -1,10 +1,3 @@
//
// UIWidgets.cpp
// soh
//
// Created by David Chavez on 25.08.22.
//
#include "UIWidgets.h"
#include "libultraship/src/Context.h"

@ -1 +1 @@
Subproject commit 82c4397160b42f0b2c9a51581335ee1a23907993
Subproject commit 53a3be31d9308a462e8af799ea30256a7f76a93e