From 49cb46f3a7fc1367d5a74247a767b9f3fd9d9265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Gr=C3=B6tzsch?= Date: Sun, 26 Feb 2023 05:09:41 +0100 Subject: [PATCH] Added documentation for Doorstep, added Doorstep, added build script for Release and Debug --- .gitignore | 6 +++++ Doorstop/.doorstop_version | 1 + Doorstop/doorstop_config.ini | 45 +++++++++++++++++++++++++++++++++++ Doorstop/winhttp.dll | Bin 0 -> 24576 bytes README.md | 2 +- SpaceWarp/StartupManager.cs | 19 +++++++++------ build_debug.ps1 | 7 ++++++ build_release.ps1 | 6 +++++ 8 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 Doorstop/.doorstop_version create mode 100644 Doorstop/doorstop_config.ini create mode 100644 Doorstop/winhttp.dll create mode 100644 build_debug.ps1 create mode 100644 build_release.ps1 diff --git a/.gitignore b/.gitignore index dfcfd56f..329202a5 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,9 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +# Build script folder +build/ + +# Idea folder +.idea \ No newline at end of file diff --git a/Doorstop/.doorstop_version b/Doorstop/.doorstop_version new file mode 100644 index 00000000..0c89fc92 --- /dev/null +++ b/Doorstop/.doorstop_version @@ -0,0 +1 @@ +4.0.0 \ No newline at end of file diff --git a/Doorstop/doorstop_config.ini b/Doorstop/doorstop_config.ini new file mode 100644 index 00000000..2bd6babd --- /dev/null +++ b/Doorstop/doorstop_config.ini @@ -0,0 +1,45 @@ +# General options for Unity Doorstop +[General] + +# Enable Doorstop? +enabled=true + +# Path to the assembly to load and execute +# NOTE: The entrypoint must be of format `static void Doorstop.Entrypoint.Start()` +target_assembly=SpaceWarp/Core/SpaceWarp.dll + +# If true, Unity's output log is redirected to \output_log.txt +redirect_output_log=false + +# If enabled, DOORSTOP_DISABLE env var value is ignored +# USE THIS ONLY WHEN ASKED TO OR YOU KNOW WHAT THIS MEANS +ignore_disable_switch=false + + +# Options specific to running under Unity Mono runtime +[UnityMono] + +# Overrides default Mono DLL search path +# Sometimes it is needed to instruct Mono to seek its assemblies from a different path +# (e.g. mscorlib is stripped in original game) +# This option causes Mono to seek mscorlib and core libraries from a different folder before Managed +# Original Managed folder is added as a secondary folder in the search path +dll_search_path_override= + +# If true, Mono debugger server will be enabled +debug_enabled=false + +# When debug_enabled is true, specifies the address to use for the debugger server +debug_address=127.0.0.1:10000 + +# If true and debug_enabled is true, Mono debugger server will suspend the game execution until a debugger is attached +debug_suspend=false + +# Options sepcific to running under Il2Cpp runtime +[Il2Cpp] + +# Path to coreclr.dll that contains the CoreCLR runtime +coreclr_path= + +# Path to the directory containing the managed core libraries for CoreCLR (mscorlib, System, etc.) +corlib_dir= diff --git a/Doorstop/winhttp.dll b/Doorstop/winhttp.dll new file mode 100644 index 0000000000000000000000000000000000000000..e9816fd7b6ea830d137b728a9780016424759e1a GIT binary patch literal 24576 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 + /// EntryPoint for Spacewarp, called from Doorstop + /// + public static void Start() + { SceneManager.sceneLoaded += OnSceneLoaded; - } + } static bool patched = false; - static void OnSceneLoaded(Scene unused1, LoadSceneMode unused2) { - + + /// + /// Add OnGameStarted as postfix to StartGame + /// + static void OnSceneLoaded(Scene unused1, LoadSceneMode unused2) + { if (!patched) { Harmony harmony = new Harmony("com.github.celisium.spacewarp-doorstop"); @@ -28,9 +35,7 @@ static void OnSceneLoaded(Scene unused1, LoadSceneMode unused2) { patched = true; } - } - } } diff --git a/build_debug.ps1 b/build_debug.ps1 new file mode 100644 index 00000000..c4eb8120 --- /dev/null +++ b/build_debug.ps1 @@ -0,0 +1,7 @@ +Remove-Item ./build -Recurse -Force +mkdir build/SpaceWarp/core +Copy-Item ./Doorstop/* ./build +dotnet build SpaceWarp/SpaceWarp.csproj -c Debug +Copy-Item ./SpaceWarp/bin/Debug/SpaceWarp.dll ./build/SpaceWarp/core +Copy-Item ./SpaceWarp/bin/Debug/SpaceWarp.pdb ./build/SpaceWarp/core +Copy-Item ./SpaceWarp/bin/Debug/0Harmony.dll ./build/SpaceWarp/core \ No newline at end of file diff --git a/build_release.ps1 b/build_release.ps1 new file mode 100644 index 00000000..8a4a467e --- /dev/null +++ b/build_release.ps1 @@ -0,0 +1,6 @@ +Remove-Item ./build -Recurse -Force +mkdir build/SpaceWarp/core +Copy-Item ./Doorstop/* ./build +dotnet build SpaceWarp/SpaceWarp.csproj -c Release +Copy-Item ./SpaceWarp/bin/Release/SpaceWarp.dll ./build/SpaceWarp/core +Copy-Item ./SpaceWarp/bin/Release/0Harmony.dll ./build/SpaceWarp/core \ No newline at end of file