From 8773739b9e8b329a0e5ed5a6433755bf2338492f Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:41:55 -0500 Subject: [PATCH 01/68] Add files via upload --- TsRandomizer.sln | 178 ++++++++++++++++------------------------------- 1 file changed, 60 insertions(+), 118 deletions(-) diff --git a/TsRandomizer.sln b/TsRandomizer.sln index e99f34b5..90587baa 100644 --- a/TsRandomizer.sln +++ b/TsRandomizer.sln @@ -1,118 +1,60 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31829.152 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TsRandomizer", "TsRandomizer\TsRandomizer.csproj", "{694E46C5-FD46-4CC8-8B71-D381E154CCF7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CD8103A2-141D-4AD0-B2FE-533D86875C9C}" - ProjectSection(SolutionItems) = preProject - ReadMe.md = ReadMe.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TsRandomizer.ItemTracker", "TsRandomizer.ItemTracker\TsRandomizer.ItemTracker.csproj", "{4D86B28B-95A2-4452-9BAA-C8E80F026101}" - ProjectSection(ProjectDependencies) = postProject - {694E46C5-FD46-4CC8-8B71-D381E154CCF7} = {694E46C5-FD46-4CC8-8B71-D381E154CCF7} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TsRandomizer.SeedGeneratah", "TsRandomizer.SeedGeneratah\TsRandomizer.SeedGeneratah.csproj", "{C30E617E-83DB-4C7C-9E45-0166C781A0A8}" - ProjectSection(ProjectDependencies) = postProject - {694E46C5-FD46-4CC8-8B71-D381E154CCF7} = {694E46C5-FD46-4CC8-8B71-D381E154CCF7} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug DRM Free (GoG)|Any CPU = Debug DRM Free (GoG)|Any CPU - Debug DRM Free (GoG)|x64 = Debug DRM Free (GoG)|x64 - Debug DRM Free (Humble)|Any CPU = Debug DRM Free (Humble)|Any CPU - Debug DRM Free (Humble)|x64 = Debug DRM Free (Humble)|x64 - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Release DRM Free (GoG)|Any CPU = Release DRM Free (GoG)|Any CPU - Release DRM Free (GoG)|x64 = Release DRM Free (GoG)|x64 - Release DRM Free (Humble)|Any CPU = Release DRM Free (Humble)|Any CPU - Release DRM Free (Humble)|x64 = Release DRM Free (Humble)|x64 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|x64.ActiveCfg = Debug DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|x64.Build.0 = Debug DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|Any CPU.ActiveCfg = Debug DRM Free|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|Any CPU.Build.0 = Debug DRM Free|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|x64.ActiveCfg = Debug DRM Free|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|x64.Build.0 = Debug DRM Free|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|x64.ActiveCfg = Debug|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|x64.Build.0 = Debug|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|x64.ActiveCfg = Release DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|x64.Build.0 = Release DRM Free (GoG)|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|Any CPU.ActiveCfg = Release|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|Any CPU.Build.0 = Release|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|x64.ActiveCfg = Release DRM Free|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|x64.Build.0 = Release DRM Free|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|Any CPU.Build.0 = Release|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|x64.ActiveCfg = Release|Any CPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|x64.Build.0 = Release|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|x64.ActiveCfg = Debug DRM Free (GoG)|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|x64.Build.0 = Debug DRM Free (GoG)|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|Any CPU.ActiveCfg = Debug|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|Any CPU.Build.0 = Debug|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|x64.ActiveCfg = Debug|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|x64.Build.0 = Debug|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|x64.ActiveCfg = Debug|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|x64.Build.0 = Debug|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|x64.ActiveCfg = Release DRM Free (GoG)|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|x64.Build.0 = Release DRM Free (GoG)|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|Any CPU.ActiveCfg = Release|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|Any CPU.Build.0 = Release|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|x64.ActiveCfg = Release|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|x64.Build.0 = Release|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|Any CPU.Build.0 = Release|Any CPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|x64.ActiveCfg = Release|x64 - {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|x64.Build.0 = Release|x64 - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|x64.ActiveCfg = Debug DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|x64.Build.0 = Debug DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|Any CPU.ActiveCfg = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|Any CPU.Build.0 = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|x64.ActiveCfg = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|x64.Build.0 = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|x64.ActiveCfg = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|x64.Build.0 = Debug|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|x64.ActiveCfg = Release DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|x64.Build.0 = Release DRM Free (GoG)|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|Any CPU.ActiveCfg = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|Any CPU.Build.0 = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|x64.ActiveCfg = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|x64.Build.0 = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|Any CPU.Build.0 = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|x64.ActiveCfg = Release|Any CPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|x64.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {5C37E60C-1A8D-4AE6-812F-A9C3301D87B9} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31829.152 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TsRandomizer", "TsRandomizer\TsRandomizer.csproj", "{694E46C5-FD46-4CC8-8B71-D381E154CCF7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CD8103A2-141D-4AD0-B2FE-533D86875C9C}" + ProjectSection(SolutionItems) = preProject + ReadMe.md = ReadMe.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug DRM Free (GoG)|Any CPU = Debug DRM Free (GoG)|Any CPU + Debug DRM Free (GoG)|x64 = Debug DRM Free (GoG)|x64 + Debug DRM Free (Humble)|Any CPU = Debug DRM Free (Humble)|Any CPU + Debug DRM Free (Humble)|x64 = Debug DRM Free (Humble)|x64 + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release DRM Free (GoG)|Any CPU = Release DRM Free (GoG)|Any CPU + Release DRM Free (GoG)|x64 = Release DRM Free (GoG)|x64 + Release DRM Free (Humble)|Any CPU = Release DRM Free (Humble)|Any CPU + Release DRM Free (Humble)|x64 = Release DRM Free (Humble)|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|x64.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (GoG)|x64.Build.0 = Debug DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|Any CPU.ActiveCfg = Debug DRM Free|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|Any CPU.Build.0 = Debug DRM Free|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|x64.ActiveCfg = Debug DRM Free|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug DRM Free (Humble)|x64.Build.0 = Debug DRM Free|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|x64.ActiveCfg = Debug|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Debug|x64.Build.0 = Debug|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|x64.ActiveCfg = Release DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (GoG)|x64.Build.0 = Release DRM Free (GoG)|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|Any CPU.ActiveCfg = Release|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|Any CPU.Build.0 = Release|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|x64.ActiveCfg = Release DRM Free|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release DRM Free (Humble)|x64.Build.0 = Release DRM Free|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|Any CPU.Build.0 = Release|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|x64.ActiveCfg = Release|Any CPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|x64.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5C37E60C-1A8D-4AE6-812F-A9C3301D87B9} + EndGlobalSection +EndGlobal From 6d4b486d393176ea32664e45623e4d4af55fe799 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:42:27 -0500 Subject: [PATCH 02/68] Add files via upload --- TsRandomizer/Program.cs | 6 +- TsRandomizer/TsRandomizer.csproj | 841 +++++++++++++++-------------- TsRandomizer/packages.config | 9 +- TsRandomizer/patchstackincrease.cs | 59 ++ TsRandomizer/patchtoasttimer.cs | 94 ++++ 5 files changed, 584 insertions(+), 425 deletions(-) create mode 100644 TsRandomizer/patchstackincrease.cs create mode 100644 TsRandomizer/patchtoasttimer.cs diff --git a/TsRandomizer/Program.cs b/TsRandomizer/Program.cs index 759cf633..56a5de2d 100644 --- a/TsRandomizer/Program.cs +++ b/TsRandomizer/Program.cs @@ -1,4 +1,5 @@ using System; +using HarmonyLib; namespace TsRandomizer { @@ -7,7 +8,10 @@ public static class Program [STAThread] public static int Main() { - WithExceptionLogging(() => { + WithExceptionLogging(() => { + + var harmony = new Harmony("com.tsrandomizer.mods"); + harmony.PatchAll(); var platformHelper = DummyPlatformHelper.CreateInstance(); new TimeSpinnerGame(platformHelper).Run(); diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index c9aad11f..7bdb500d 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -1,421 +1,422 @@ - - - - - Debug - AnyCPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7} - WinExe - TsRandomizer - TsRandomizer - v4.8 - 512 - true - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - - x86 - true - full - false - ..\..\TestVersions\SteamVerison\ - TRACE;DEBUG;NET40 - prompt - 4 - false - true - - - x86 - pdbonly - true - C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ - TRACE - prompt - 4 - false - true - - - - - - GunOrbLargeT.ico - - - true - ..\..\TestVersions\DRMFreeVersion\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - ..\..\TestVersions\DRMFreeVersion\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - true - ..\..\TestVersions\DRMFreeGoG\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - ..\..\TestVersions\DRMFreeGoG\ - TRACE - true - true - pdbonly - x86 - 7.3 - prompt - - - - ..\packages\Archipelago.Gifting.Net.0.4.3\lib\net452\Archipelago.Gifting.Net.dll - - - ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Archipelago.MultiClient.Net.dll - - - C:\Program Files (x86)\Steam\steamapps\common\Timespinner\FNA.dll - ~/.local/share/Steam/steamapps/common/Timespinner/FNA.dll - ..\..\..\TestVersions\DRMFreeVersion\FNA.dll - False - - - - ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Newtonsoft.Json.dll - - - - - False - - - ..\..\..\TestVersions\DRMFreeVersion\Timespinner.exe - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - + + + + + Debug + AnyCPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7} + WinExe + TsRandomizer + TsRandomizer + v4.8 + 512 + true + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + x86 + true + full + false + ..\..\TestVersions\SteamVerison\ + TRACE;DEBUG;NET40 + prompt + 4 + false + true + + + x86 + pdbonly + true + C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ + TRACE + prompt + 4 + false + true + + + + + + GunOrbLargeT.ico + + + true + ..\..\TestVersions\DRMFreeVersion\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + ..\..\TestVersions\DRMFreeVersion\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + true + ..\..\TestVersions\kairimod\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + ..\..\TestVersions\DRMFreeGoG\ + TRACE + true + true + pdbonly + x86 + 7.3 + prompt + + + + ..\packages\Lib.Harmony.2.4.2\lib\net48\0Harmony.dll + + + ..\packages\Archipelago.Gifting.Net.0.4.4\lib\net452\Archipelago.Gifting.Net.dll + + + ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Archipelago.MultiClient.Net.dll + + + ..\..\Timespinner rando modified\FNA.dll + + + + ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Newtonsoft.Json.dll + + + + + False + + + ..\..\Timespinner rando modified\Timespinner.exe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + \ No newline at end of file diff --git a/TsRandomizer/packages.config b/TsRandomizer/packages.config index 6cc40bbd..f990d3b3 100644 --- a/TsRandomizer/packages.config +++ b/TsRandomizer/packages.config @@ -1,5 +1,6 @@ - - - - + + + + + \ No newline at end of file diff --git a/TsRandomizer/patchstackincrease.cs b/TsRandomizer/patchstackincrease.cs new file mode 100644 index 00000000..855f5ef9 --- /dev/null +++ b/TsRandomizer/patchstackincrease.cs @@ -0,0 +1,59 @@ +using System; +using HarmonyLib; +using Timespinner.GameAbstractions.Inventory; +using System.Reflection; +using System.Collections.Generic; +namespace TsRandomizer +{ + [HarmonyPatch(typeof(InventoryUseItem))] + [HarmonyPatch(MethodType.Constructor)] + [HarmonyPatch(new[] { typeof(EInventoryUseItemType) })] + + + //increase stack limit in inventory + class StackCapPatch + { + static void Postfix(InventoryUseItem __instance, EInventoryUseItemType useItemType) + { + switch (useItemType) + { + case EInventoryUseItemType.MagicMarbles: + case EInventoryUseItemType.EssenceCrystal: + case EInventoryUseItemType.GoldRing: + case EInventoryUseItemType.GoldNecklace: + break; // leave at 99 + default: + __instance.StackCap = 99; + break; + } + } + } + + //Inscrease buying limit to match inventory size + [HarmonyPatch] + class ShopCapPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen"); + return AccessTools.Method(type, "GetAvailableQuantityByItem"); + } + + static IEnumerable Transpiler(IEnumerable instructions) + { + var codes = new List(instructions); + int replaced = 0; + + for (int i = 0; i < codes.Count; i++) + { + if (codes[i].LoadsConstant(9)) + { + codes[i].operand = 99; + replaced++; + } + } + + return codes; + } + } +} \ No newline at end of file diff --git a/TsRandomizer/patchtoasttimer.cs b/TsRandomizer/patchtoasttimer.cs new file mode 100644 index 00000000..032dc37f --- /dev/null +++ b/TsRandomizer/patchtoasttimer.cs @@ -0,0 +1,94 @@ +using Timespinner.GameAbstractions; +using Timespinner.Core; +using HarmonyLib; +using System.Reflection; + +namespace TsRandomizer +{ + [HarmonyPatch] + class ToastTimerPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + return AccessTools.Constructor(type, new[] { + typeof(SpriteSheet), + typeof(bool), + typeof(GCM), + typeof(float), + typeof(float), + typeof(float), + typeof(float) + }); + } + + static void Postfix(object __instance) + { + var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + + // zero out wait timer for all toasts + AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); + AccessTools.Field(baseType, "_totalDisplayTime").SetValue(__instance, + (float)AccessTools.Field(baseType, "_timeBeforeFlashing").GetValue(__instance) + + (float)AccessTools.Field(baseType, "_timeToFlash").GetValue(__instance) + + (float)AccessTools.Field(baseType, "_timeToFade").GetValue(__instance)); + } + } + + [HarmonyPatch] + class DoesWaitForInputPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + return AccessTools.Method(type, "set_DoesWaitForInputToFinish"); + } + + static bool Prefix() + { + return false; // fuckoff mr popup + } + } + //desperate struggle for movement + [HarmonyPatch] + class RelicOrbToastPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.RelicOrbGetToast"); + return AccessTools.Constructor(type, new[] { + typeof(SpriteSheet), + typeof(GCM), + AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ScriptAction"), + AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ControllerMapping") + }); + } + + static void Postfix(object __instance) + { + var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + AccessTools.Field(baseType, "_doesFreezeGameplay").SetValue(__instance, false); + AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); + AccessTools.Property(baseType.BaseType, "IsOverlayScreen").SetValue(__instance, true); + } + } + //just let me play already + [HarmonyPatch] + class CharacterLevelUpToastPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); + return AccessTools.Constructor(type, new[] { + typeof(SpriteSheet), + typeof(GCM) + }); + } + + static void Postfix(object __instance) + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); + AccessTools.Field(type, "_controlTimer").SetValue(__instance, 0.75f); + } + } +} \ No newline at end of file From 4c977b42875437ae81879076d91001bbaea581dd Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:45:46 -0500 Subject: [PATCH 03/68] Add files via upload --- TsRandomizer.csproj | 422 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 422 insertions(+) create mode 100644 TsRandomizer.csproj diff --git a/TsRandomizer.csproj b/TsRandomizer.csproj new file mode 100644 index 00000000..7bdb500d --- /dev/null +++ b/TsRandomizer.csproj @@ -0,0 +1,422 @@ + + + + + Debug + AnyCPU + {694E46C5-FD46-4CC8-8B71-D381E154CCF7} + WinExe + TsRandomizer + TsRandomizer + v4.8 + 512 + true + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + x86 + true + full + false + ..\..\TestVersions\SteamVerison\ + TRACE;DEBUG;NET40 + prompt + 4 + false + true + + + x86 + pdbonly + true + C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ + TRACE + prompt + 4 + false + true + + + + + + GunOrbLargeT.ico + + + true + ..\..\TestVersions\DRMFreeVersion\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + ..\..\TestVersions\DRMFreeVersion\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + true + ..\..\TestVersions\kairimod\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + ..\..\TestVersions\DRMFreeGoG\ + TRACE + true + true + pdbonly + x86 + 7.3 + prompt + + + + ..\packages\Lib.Harmony.2.4.2\lib\net48\0Harmony.dll + + + ..\packages\Archipelago.Gifting.Net.0.4.4\lib\net452\Archipelago.Gifting.Net.dll + + + ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Archipelago.MultiClient.Net.dll + + + ..\..\Timespinner rando modified\FNA.dll + + + + ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Newtonsoft.Json.dll + + + + + False + + + ..\..\Timespinner rando modified\Timespinner.exe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + \ No newline at end of file From 7e596fe1c5ffe7d379ebb5d873cee4ebe3208dc0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:48:51 -0500 Subject: [PATCH 04/68] Update TsRandomizer.csproj --- TsRandomizer.csproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TsRandomizer.csproj b/TsRandomizer.csproj index 7bdb500d..16a1ca48 100644 --- a/TsRandomizer.csproj +++ b/TsRandomizer.csproj @@ -79,7 +79,7 @@ true - ..\..\TestVersions\kairimod\ + ..\..\TestVersions\DRMFreeGoG\ DEBUG;TRACE full x86 @@ -419,4 +419,5 @@ - \ No newline at end of file + + From e0cefe787ffba65c8e4f23edd0448e3bb7b8ecc0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:50:27 -0500 Subject: [PATCH 05/68] Update ReadMe.md --- ReadMe.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index cb9eb1da..df58bf8d 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,6 @@ +#Modded from the original tsrandomizer +this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops + # General Timespinner Randomizer will randomize the location of items such as equipment, relics, familiars, stat boosts, use items. The logic makes sure that each game you play is beatable. From c42ffaa5721eee07b03c7581acb9178bd8eafc87 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:50:57 -0500 Subject: [PATCH 06/68] Update ReadMe.md --- ReadMe.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index df58bf8d..e07d0411 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,4 +1,5 @@ -#Modded from the original tsrandomizer +# Modded from the original timespinner randomizer + this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops # General From cdfe67616210eb4aa5aa1d9890120fa651ffbeb4 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:53:14 -0500 Subject: [PATCH 07/68] Add files via upload --- TsRandomizer/TsRandomizer.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 7bdb500d..11ee63dd 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -79,8 +79,8 @@ true - ..\..\TestVersions\kairimod\ - DEBUG;TRACE + ..\..\TestVersions\DRMFreeGoG\ + TRACE full x86 7.3 From fea06f443bf901ed9e0e9fafb058fa29dc15866d Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:57:04 -0500 Subject: [PATCH 08/68] Update ReadMe.md --- ReadMe.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReadMe.md b/ReadMe.md index e07d0411..c558ecb6 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,6 +1,7 @@ # Modded from the original timespinner randomizer this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops +Simply paste this release over a regular installation of TsRandomizer to apply the patches # General Timespinner Randomizer will randomize the location of items such as equipment, relics, familiars, stat boosts, use items. The logic makes sure that each game you play is beatable. From af5bab016c7f10707a912dd75b08c7c30aa270b8 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 05:57:13 -0500 Subject: [PATCH 09/68] Update ReadMe.md --- ReadMe.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReadMe.md b/ReadMe.md index c558ecb6..2a5b71ac 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,6 +1,7 @@ # Modded from the original timespinner randomizer this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops + Simply paste this release over a regular installation of TsRandomizer to apply the patches # General From 5e47288f8f0f28cefffc64612611e62df3c5e3c3 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 24 Feb 2026 07:09:39 -0500 Subject: [PATCH 10/68] Delete TsRandomizer.csproj --- TsRandomizer.csproj | 423 -------------------------------------------- 1 file changed, 423 deletions(-) delete mode 100644 TsRandomizer.csproj diff --git a/TsRandomizer.csproj b/TsRandomizer.csproj deleted file mode 100644 index 16a1ca48..00000000 --- a/TsRandomizer.csproj +++ /dev/null @@ -1,423 +0,0 @@ - - - - - Debug - AnyCPU - {694E46C5-FD46-4CC8-8B71-D381E154CCF7} - WinExe - TsRandomizer - TsRandomizer - v4.8 - 512 - true - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - - x86 - true - full - false - ..\..\TestVersions\SteamVerison\ - TRACE;DEBUG;NET40 - prompt - 4 - false - true - - - x86 - pdbonly - true - C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ - TRACE - prompt - 4 - false - true - - - - - - GunOrbLargeT.ico - - - true - ..\..\TestVersions\DRMFreeVersion\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - ..\..\TestVersions\DRMFreeVersion\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - true - ..\..\TestVersions\DRMFreeGoG\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - ..\..\TestVersions\DRMFreeGoG\ - TRACE - true - true - pdbonly - x86 - 7.3 - prompt - - - - ..\packages\Lib.Harmony.2.4.2\lib\net48\0Harmony.dll - - - ..\packages\Archipelago.Gifting.Net.0.4.4\lib\net452\Archipelago.Gifting.Net.dll - - - ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Archipelago.MultiClient.Net.dll - - - ..\..\Timespinner rando modified\FNA.dll - - - - ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Newtonsoft.Json.dll - - - - - False - - - ..\..\Timespinner rando modified\Timespinner.exe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - From 8c2d478a587d124503542b352438c85777a2d223 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:46:45 -0500 Subject: [PATCH 11/68] Add files via upload From a668feb42b89cac7e9bb07040fc31c52b2f85626 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:47:51 -0500 Subject: [PATCH 12/68] Add files via upload From 6a1b2ace7e79bc4faa438f53c9d2ca236413c83c Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:48:34 -0500 Subject: [PATCH 13/68] add patchdialogues and patchcutscenes.cs --- TsRandomizer/patchcutscenes.cs | 48 ++++++++++++++++++++++++++++++++++ TsRandomizer/patchdialogues.cs | 24 +++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 TsRandomizer/patchcutscenes.cs create mode 100644 TsRandomizer/patchdialogues.cs diff --git a/TsRandomizer/patchcutscenes.cs b/TsRandomizer/patchcutscenes.cs new file mode 100644 index 00000000..83fe3d6d --- /dev/null +++ b/TsRandomizer/patchcutscenes.cs @@ -0,0 +1,48 @@ +using HarmonyLib; +using System.Reflection; + +namespace TsRandomizer +{ + [HarmonyPatch] + class AutoSkipCutscenePatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); + return AccessTools.Method(type, "UpdateLevelRequests"); + } + + static void Postfix(object __instance) + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); + var level = AccessTools.Field(type, "_level").GetValue(__instance); + if (level == null) return; + + var levelType = AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.Level"); + bool isUnskippable = (bool)AccessTools.Property(levelType, "IsActiveScriptUnskippable").GetValue(level); + bool isDoingDeathCutscene = (bool)AccessTools.Property(levelType, "IsDoingPlayerDeathCutscene").GetValue(level); + bool isInputBlocked = (bool)AccessTools.Property(levelType, "IsPlayerInputBlocked").GetValue(level); + + if (isInputBlocked && !isUnskippable && !isDoingDeathCutscene) + { + AccessTools.Method(levelType, "SkipCutscene").Invoke(level, null); + AccessTools.Field(type, "_isShowingSkipCutscenePrompt").SetValue(__instance, false); + } + } + } + + [HarmonyPatch] + class CutsceneUnskippableWaitPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameObjects.BaseClasses.GameEvent"); + return AccessTools.Method(type, "AddUnskippableWaitScript"); + } + + static void Prefix(ref float waitTime) + { + waitTime *= 0.25f; + } + } +} \ No newline at end of file diff --git a/TsRandomizer/patchdialogues.cs b/TsRandomizer/patchdialogues.cs new file mode 100644 index 00000000..36bd5aaa --- /dev/null +++ b/TsRandomizer/patchdialogues.cs @@ -0,0 +1,24 @@ +using HarmonyLib; +using System.Reflection; + +namespace TsRandomizer +{ + [HarmonyPatch] + class DialogueAutoSkipPatch + { + static MethodBase TargetMethod() + { + return AccessTools.Method( + AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"), + "Update"); + } + + static void Prefix(object __instance) + { + var type = AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"); + AccessTools.Field(type, "_isAutoplay").SetValue(__instance, true); + AccessTools.Field(type, "_autoplayNextLineTimer").SetValue(__instance, 999f); + AccessTools.Field(type, "_isReadyForNextLine").SetValue(__instance, true); + } + } +} \ No newline at end of file From f0b90b4524824fa2bd0d7f992440fbc48b5369be Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:49:22 -0500 Subject: [PATCH 14/68] add patchdialogues and patchcutscenes --- TsRandomizer/TsRandomizer.csproj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 11ee63dd..50a1ddc3 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -79,7 +79,7 @@ true - ..\..\TestVersions\DRMFreeGoG\ + ..\..\TestVersions\DebugDRMFreeGoG\ TRACE full x86 @@ -88,10 +88,10 @@ MinimumRecommendedRules.ruleset - ..\..\TestVersions\DRMFreeGoG\ + ..\..\TestVersions\ReleaseDRMFreeGoG\ TRACE - true - true + false + false pdbonly x86 7.3 @@ -127,6 +127,8 @@ + + From 2edda3613cdaca86a5c04fde48f6393a48a4938c Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:19:42 -0500 Subject: [PATCH 15/68] added menu, cutscene skip --- ReadMe.md | 6 ----- TsRandomizer.sln | 52 ++++++++++++++++++++++++++++++++++++++++ our_QoL_mod_-_notes.png | Bin 0 -> 125102 bytes 3 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 our_QoL_mod_-_notes.png diff --git a/ReadMe.md b/ReadMe.md index 2a5b71ac..cb9eb1da 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,9 +1,3 @@ -# Modded from the original timespinner randomizer - -this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops - -Simply paste this release over a regular installation of TsRandomizer to apply the patches - # General Timespinner Randomizer will randomize the location of items such as equipment, relics, familiars, stat boosts, use items. The logic makes sure that each game you play is beatable. diff --git a/TsRandomizer.sln b/TsRandomizer.sln index 90587baa..0471c57a 100644 --- a/TsRandomizer.sln +++ b/TsRandomizer.sln @@ -10,6 +10,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ReadMe.md = ReadMe.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TsRandomizer.ItemTracker", "TsRandomizer.ItemTracker\TsRandomizer.ItemTracker.csproj", "{4D86B28B-95A2-4452-9BAA-C8E80F026101}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TsRandomizer.SeedGeneratah", "TsRandomizer.SeedGeneratah\TsRandomizer.SeedGeneratah.csproj", "{C30E617E-83DB-4C7C-9E45-0166C781A0A8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug DRM Free (GoG)|Any CPU = Debug DRM Free (GoG)|Any CPU @@ -50,6 +54,54 @@ Global {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|Any CPU.Build.0 = Release|Any CPU {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|x64.ActiveCfg = Release|Any CPU {694E46C5-FD46-4CC8-8B71-D381E154CCF7}.Release|x64.Build.0 = Release|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|x64.ActiveCfg = Debug DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (GoG)|x64.Build.0 = Debug DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|x64.ActiveCfg = Debug DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug DRM Free (Humble)|x64.Build.0 = Debug DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|x64.ActiveCfg = Debug|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Debug|x64.Build.0 = Debug|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|x64.ActiveCfg = Release DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (GoG)|x64.Build.0 = Release DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|x64.ActiveCfg = Release DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release DRM Free (Humble)|x64.Build.0 = Release DRM Free (GoG)|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|Any CPU.Build.0 = Release|Any CPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|x64.ActiveCfg = Release|x64 + {4D86B28B-95A2-4452-9BAA-C8E80F026101}.Release|x64.Build.0 = Release|x64 + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|x64.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (GoG)|x64.Build.0 = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|Any CPU.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|Any CPU.Build.0 = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|x64.ActiveCfg = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug DRM Free (Humble)|x64.Build.0 = Debug DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|x64.ActiveCfg = Debug|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Debug|x64.Build.0 = Debug|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|x64.ActiveCfg = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (GoG)|x64.Build.0 = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|Any CPU.ActiveCfg = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|Any CPU.Build.0 = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|x64.ActiveCfg = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release DRM Free (Humble)|x64.Build.0 = Release DRM Free (GoG)|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|Any CPU.Build.0 = Release|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|x64.ActiveCfg = Release|Any CPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/our_QoL_mod_-_notes.png b/our_QoL_mod_-_notes.png new file mode 100644 index 0000000000000000000000000000000000000000..9f26375546bfa26f22b88bd8fcfdad54f63768e9 GIT binary patch literal 125102 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 GgMh&E>0B~rwT)TqT~4}S#0vSt6@deuu1VkU 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 MvT8ClQs$rj2f85z_5c6? literal 0 HcmV?d00001 From 9d61281b8b3f4398f5adf41d9eb9fb98992ad65d Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:20:56 -0500 Subject: [PATCH 16/68] Delete TsRandomizer/patchcutscenes.cs --- TsRandomizer/patchcutscenes.cs | 48 ---------------------------------- 1 file changed, 48 deletions(-) delete mode 100644 TsRandomizer/patchcutscenes.cs diff --git a/TsRandomizer/patchcutscenes.cs b/TsRandomizer/patchcutscenes.cs deleted file mode 100644 index 83fe3d6d..00000000 --- a/TsRandomizer/patchcutscenes.cs +++ /dev/null @@ -1,48 +0,0 @@ -using HarmonyLib; -using System.Reflection; - -namespace TsRandomizer -{ - [HarmonyPatch] - class AutoSkipCutscenePatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); - return AccessTools.Method(type, "UpdateLevelRequests"); - } - - static void Postfix(object __instance) - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); - var level = AccessTools.Field(type, "_level").GetValue(__instance); - if (level == null) return; - - var levelType = AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.Level"); - bool isUnskippable = (bool)AccessTools.Property(levelType, "IsActiveScriptUnskippable").GetValue(level); - bool isDoingDeathCutscene = (bool)AccessTools.Property(levelType, "IsDoingPlayerDeathCutscene").GetValue(level); - bool isInputBlocked = (bool)AccessTools.Property(levelType, "IsPlayerInputBlocked").GetValue(level); - - if (isInputBlocked && !isUnskippable && !isDoingDeathCutscene) - { - AccessTools.Method(levelType, "SkipCutscene").Invoke(level, null); - AccessTools.Field(type, "_isShowingSkipCutscenePrompt").SetValue(__instance, false); - } - } - } - - [HarmonyPatch] - class CutsceneUnskippableWaitPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameObjects.BaseClasses.GameEvent"); - return AccessTools.Method(type, "AddUnskippableWaitScript"); - } - - static void Prefix(ref float waitTime) - { - waitTime *= 0.25f; - } - } -} \ No newline at end of file From a50103db081c63544d53537574df2beb78601c38 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:21:09 -0500 Subject: [PATCH 17/68] Delete TsRandomizer/patchdialogues.cs --- TsRandomizer/patchdialogues.cs | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 TsRandomizer/patchdialogues.cs diff --git a/TsRandomizer/patchdialogues.cs b/TsRandomizer/patchdialogues.cs deleted file mode 100644 index 36bd5aaa..00000000 --- a/TsRandomizer/patchdialogues.cs +++ /dev/null @@ -1,24 +0,0 @@ -using HarmonyLib; -using System.Reflection; - -namespace TsRandomizer -{ - [HarmonyPatch] - class DialogueAutoSkipPatch - { - static MethodBase TargetMethod() - { - return AccessTools.Method( - AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"), - "Update"); - } - - static void Prefix(object __instance) - { - var type = AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"); - AccessTools.Field(type, "_isAutoplay").SetValue(__instance, true); - AccessTools.Field(type, "_autoplayNextLineTimer").SetValue(__instance, 999f); - AccessTools.Field(type, "_isReadyForNextLine").SetValue(__instance, true); - } - } -} \ No newline at end of file From 636b4386d50160ff30d2a03d1bf7d13ea58c4144 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:21:18 -0500 Subject: [PATCH 18/68] Delete TsRandomizer/patchstackincrease.cs --- TsRandomizer/patchstackincrease.cs | 59 ------------------------------ 1 file changed, 59 deletions(-) delete mode 100644 TsRandomizer/patchstackincrease.cs diff --git a/TsRandomizer/patchstackincrease.cs b/TsRandomizer/patchstackincrease.cs deleted file mode 100644 index 855f5ef9..00000000 --- a/TsRandomizer/patchstackincrease.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using HarmonyLib; -using Timespinner.GameAbstractions.Inventory; -using System.Reflection; -using System.Collections.Generic; -namespace TsRandomizer -{ - [HarmonyPatch(typeof(InventoryUseItem))] - [HarmonyPatch(MethodType.Constructor)] - [HarmonyPatch(new[] { typeof(EInventoryUseItemType) })] - - - //increase stack limit in inventory - class StackCapPatch - { - static void Postfix(InventoryUseItem __instance, EInventoryUseItemType useItemType) - { - switch (useItemType) - { - case EInventoryUseItemType.MagicMarbles: - case EInventoryUseItemType.EssenceCrystal: - case EInventoryUseItemType.GoldRing: - case EInventoryUseItemType.GoldNecklace: - break; // leave at 99 - default: - __instance.StackCap = 99; - break; - } - } - } - - //Inscrease buying limit to match inventory size - [HarmonyPatch] - class ShopCapPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen"); - return AccessTools.Method(type, "GetAvailableQuantityByItem"); - } - - static IEnumerable Transpiler(IEnumerable instructions) - { - var codes = new List(instructions); - int replaced = 0; - - for (int i = 0; i < codes.Count; i++) - { - if (codes[i].LoadsConstant(9)) - { - codes[i].operand = 99; - replaced++; - } - } - - return codes; - } - } -} \ No newline at end of file From b7eda2d268dcaf9fb9921318f248bf2fbb753c6e Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:21:29 -0500 Subject: [PATCH 19/68] Delete TsRandomizer/patchtoasttimer.cs --- TsRandomizer/patchtoasttimer.cs | 94 --------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 TsRandomizer/patchtoasttimer.cs diff --git a/TsRandomizer/patchtoasttimer.cs b/TsRandomizer/patchtoasttimer.cs deleted file mode 100644 index 032dc37f..00000000 --- a/TsRandomizer/patchtoasttimer.cs +++ /dev/null @@ -1,94 +0,0 @@ -using Timespinner.GameAbstractions; -using Timespinner.Core; -using HarmonyLib; -using System.Reflection; - -namespace TsRandomizer -{ - [HarmonyPatch] - class ToastTimerPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - return AccessTools.Constructor(type, new[] { - typeof(SpriteSheet), - typeof(bool), - typeof(GCM), - typeof(float), - typeof(float), - typeof(float), - typeof(float) - }); - } - - static void Postfix(object __instance) - { - var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - - // zero out wait timer for all toasts - AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); - AccessTools.Field(baseType, "_totalDisplayTime").SetValue(__instance, - (float)AccessTools.Field(baseType, "_timeBeforeFlashing").GetValue(__instance) + - (float)AccessTools.Field(baseType, "_timeToFlash").GetValue(__instance) + - (float)AccessTools.Field(baseType, "_timeToFade").GetValue(__instance)); - } - } - - [HarmonyPatch] - class DoesWaitForInputPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - return AccessTools.Method(type, "set_DoesWaitForInputToFinish"); - } - - static bool Prefix() - { - return false; // fuckoff mr popup - } - } - //desperate struggle for movement - [HarmonyPatch] - class RelicOrbToastPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.RelicOrbGetToast"); - return AccessTools.Constructor(type, new[] { - typeof(SpriteSheet), - typeof(GCM), - AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ScriptAction"), - AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ControllerMapping") - }); - } - - static void Postfix(object __instance) - { - var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - AccessTools.Field(baseType, "_doesFreezeGameplay").SetValue(__instance, false); - AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); - AccessTools.Property(baseType.BaseType, "IsOverlayScreen").SetValue(__instance, true); - } - } - //just let me play already - [HarmonyPatch] - class CharacterLevelUpToastPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); - return AccessTools.Constructor(type, new[] { - typeof(SpriteSheet), - typeof(GCM) - }); - } - - static void Postfix(object __instance) - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); - AccessTools.Field(type, "_controlTimer").SetValue(__instance, 0.75f); - } - } -} \ No newline at end of file From e0b5cfb0a6d274bc36b8db2732b44e13afc0cbc0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:22:09 -0500 Subject: [PATCH 20/68] Add files via upload --- TsRandomizer/TsRandomizer.csproj | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 50a1ddc3..265cdd8d 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -107,8 +107,9 @@ ..\packages\Archipelago.MultiClient.Net.6.7.0\lib\net45\Archipelago.MultiClient.Net.dll - - ..\..\Timespinner rando modified\FNA.dll + + False + ..\..\TestVersions\DebugDRMFreeGoG\FNA.dll @@ -119,18 +120,22 @@ False - - ..\..\Timespinner rando modified\Timespinner.exe + + False + ..\..\TestVersions\DebugDRMFreeGoG\Timespinner.exe - - - - + + + + + + + From 013e70a0c2d41eeb2f0c42be8a46e35c3f27e1b8 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:23:26 -0500 Subject: [PATCH 21/68] Create oui --- TsRandomizer/TsRandomizer QoL/oui | 1 + 1 file changed, 1 insertion(+) create mode 100644 TsRandomizer/TsRandomizer QoL/oui diff --git a/TsRandomizer/TsRandomizer QoL/oui b/TsRandomizer/TsRandomizer QoL/oui new file mode 100644 index 00000000..7cfab5b0 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/oui @@ -0,0 +1 @@ +yes From 01b7d04eb4c510cda25df1d95f2a3e088a707920 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:24:09 -0500 Subject: [PATCH 22/68] Create yes --- TsRandomizer/TsRandomizer QoL/Menu/yes | 1 + 1 file changed, 1 insertion(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Menu/yes diff --git a/TsRandomizer/TsRandomizer QoL/Menu/yes b/TsRandomizer/TsRandomizer QoL/Menu/yes new file mode 100644 index 00000000..bd51bf63 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Menu/yes @@ -0,0 +1 @@ +oui From 0146f2cce570523489c939f197dd45d09e062463 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:24:28 -0500 Subject: [PATCH 23/68] Create oui --- TsRandomizer/TsRandomizer QoL/Patches/oui | 1 + 1 file changed, 1 insertion(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Patches/oui diff --git a/TsRandomizer/TsRandomizer QoL/Patches/oui b/TsRandomizer/TsRandomizer QoL/Patches/oui new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Patches/oui @@ -0,0 +1 @@ + From f91a873d89f2dfdca074e7aef56a935b2288384c Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:24:42 -0500 Subject: [PATCH 24/68] Create oui --- TsRandomizer/TsRandomizer QoL/Settings/oui | 1 + 1 file changed, 1 insertion(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Settings/oui diff --git a/TsRandomizer/TsRandomizer QoL/Settings/oui b/TsRandomizer/TsRandomizer QoL/Settings/oui new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Settings/oui @@ -0,0 +1 @@ + From fcda90361608a170616f239959885ddaafac1422 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:24:58 -0500 Subject: [PATCH 25/68] Delete TsRandomizer/TsRandomizer QoL/Settings/oui --- TsRandomizer/TsRandomizer QoL/Settings/oui | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/Settings/oui diff --git a/TsRandomizer/TsRandomizer QoL/Settings/oui b/TsRandomizer/TsRandomizer QoL/Settings/oui deleted file mode 100644 index 8b137891..00000000 --- a/TsRandomizer/TsRandomizer QoL/Settings/oui +++ /dev/null @@ -1 +0,0 @@ - From 26e38409cdd97f0ea1700fbddef6f886369389d4 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:25:05 -0500 Subject: [PATCH 26/68] Delete TsRandomizer/TsRandomizer QoL/oui --- TsRandomizer/TsRandomizer QoL/oui | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/oui diff --git a/TsRandomizer/TsRandomizer QoL/oui b/TsRandomizer/TsRandomizer QoL/oui deleted file mode 100644 index 7cfab5b0..00000000 --- a/TsRandomizer/TsRandomizer QoL/oui +++ /dev/null @@ -1 +0,0 @@ -yes From b2e83f655bcadf429e620fdfe6cecd40bec186f0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:25:18 -0500 Subject: [PATCH 27/68] Delete TsRandomizer/TsRandomizer QoL/Patches/oui --- TsRandomizer/TsRandomizer QoL/Patches/oui | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/Patches/oui diff --git a/TsRandomizer/TsRandomizer QoL/Patches/oui b/TsRandomizer/TsRandomizer QoL/Patches/oui deleted file mode 100644 index 8b137891..00000000 --- a/TsRandomizer/TsRandomizer QoL/Patches/oui +++ /dev/null @@ -1 +0,0 @@ - From 3b8d88aa0deb7ad80f54f5c47d28871896296d44 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:25:41 -0500 Subject: [PATCH 28/68] Create oui --- TsRandomizer/TsRandomizer QoL/Patches/oui | 1 + 1 file changed, 1 insertion(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Patches/oui diff --git a/TsRandomizer/TsRandomizer QoL/Patches/oui b/TsRandomizer/TsRandomizer QoL/Patches/oui new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Patches/oui @@ -0,0 +1 @@ + From 8d3e0580b70fc8309645a95ccf121e3ceed54af2 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:25:56 -0500 Subject: [PATCH 29/68] Create oui --- TsRandomizer/TsRandomizer QoL/Settings/oui | 1 + 1 file changed, 1 insertion(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Settings/oui diff --git a/TsRandomizer/TsRandomizer QoL/Settings/oui b/TsRandomizer/TsRandomizer QoL/Settings/oui new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Settings/oui @@ -0,0 +1 @@ + From 72411e636f8a8da115c28c51952c91777e0e6db3 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:26:19 -0500 Subject: [PATCH 30/68] Add files via upload --- .../TsRandomizer QoL/Menu/QoLMenuInjector.cs | 53 ++++++++ .../TsRandomizer QoL/Menu/QoLSettingsMenu.cs | 124 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs create mode 100644 TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs diff --git a/TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs b/TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs new file mode 100644 index 00000000..567ae91b --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections; +using System.Reflection; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Timespinner.GameAbstractions; +using Timespinner.GameStateManagement.ScreenManager; +using TsRandomizer.Extensions; +using TsRandomizer.Screens.Menu; + +namespace TsRandomizer +{ + [HarmonyPatch] + class QoLMenuInjector + { + static readonly Type OptionsMenuScreenType = + AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.OptionsMenuScreen"); + static readonly Type MainMenuEntryType = + AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); + + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.OptionsMenuScreen"); + return AccessTools.Method(type, "LoadContent"); + } + + static void Postfix(object __instance) + { + try + { + var screenManager = (ScreenManager)((GameScreen)__instance).ScreenManager; + var button = MenuEntry.Create("Randomizer QoL Settings", _ => OpenQoLMenu(screenManager)); + button.IsCenterAligned = false; + button.DoesDrawLargeShadow = false; + var primaryMenuCollection = ((object)__instance.AsDynamic()._primaryMenuCollection).AsDynamic(); + var buttons = (IList)primaryMenuCollection._entries; + buttons.Add(button.AsTimeSpinnerMenuEntry()); + primaryMenuCollection._entries = buttons.ToList(MainMenuEntryType); + } + catch + { + // ignored + } + } + + static void OpenQoLMenu(ScreenManager screenManager) + { + QoLSettingsMenu.IsQoLMenuPending = true; + var menu = QoLSettingsMenu.Create(screenManager); + screenManager.AddScreen(menu, PlayerIndex.One); + } + } +} \ No newline at end of file diff --git a/TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs b/TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs new file mode 100644 index 00000000..c5bfa1c2 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections; +using System.Reflection; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Timespinner.GameAbstractions; +using Timespinner.GameAbstractions.Saving; +using TsRandomizer.Extensions; +using TsRandomizer.Screens; +using TsRandomizer.Screens.Menu; +using GameScreen = Timespinner.GameStateManagement.ScreenManager.GameScreen; +using ScreenManager = Timespinner.GameStateManagement.ScreenManager.ScreenManager; + +namespace TsRandomizer +{ + public static class QoLSettingsMenu + { + static readonly Type JournalMenuType = + AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); + static readonly Type MenuEntryType = + AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); + + public static bool IsQoLMenuPending { get; set; } + + public static GameScreen Create(ScreenManager screenManager) + { + var gcm = (GCM)screenManager.AsDynamic().GCM; + gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); + + void OnExit() { } + + return (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); + } + } + + [HarmonyPatch] + class QoLSettingsMenuInitPatch + { + static readonly Type JournalMenuType = + AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); + static readonly Type MenuEntryType = + AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); + + static MethodBase TargetMethod() => + AccessTools.Method(typeof(GameSettingsScreen), "Initialize"); + + static void Postfix(object __instance) + { + if (!QoLSettingsMenu.IsQoLMenuPending) + return; + + QoLSettingsMenu.IsQoLMenuPending = false; + + try + { + BuildMenu(((Screen)__instance).GameScreen, 0); + } + catch + { + // ignored + } + } + + internal static void BuildMenu(GameScreen gameScreen, int selectedIndex) + { + var emptyList = new object[0].ToList(MenuEntryType); + + AccessTools.Field(JournalMenuType, "_menuTitle").SetValue(gameScreen, "QoL Menu"); + + void ClearCollection(string fieldName) + { + var col = AccessTools.Field(JournalMenuType, fieldName).GetValue(gameScreen); + AccessTools.Field(col.GetType(), "_entries").SetValue(col, emptyList); + } + + ClearCollection("_primaryMenuCollection"); + ClearCollection("_memoriesInventoryCollection"); + ClearCollection("_lettersInventoryCollection"); + ClearCollection("_filesInventoryCollection"); + ClearCollection("_questInventory"); + ClearCollection("_bestiaryInventory"); + ClearCollection("_featsInventory"); + + var menuList = new object[0].ToList(MenuEntryType); + + void AddEntry(string label, Action onSelect, string description) + { + int idx = ((IList)menuList).Count; + var entry = MenuEntry.Create(label, _ => { onSelect(); BuildMenu(gameScreen, idx); }); + entry.IsCenterAligned = false; + entry.DoesDrawLargeShadow = false; + entry.Description = description; + ((IList)menuList).Add(entry.AsTimeSpinnerMenuEntry()); + } + + AddEntry(GetCutsceneLabel(), () => { QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; QoLSettings.Save(); }, "Automatically skips cutscenes without any button press."); + AddEntry(GetDialogueLabel(), () => { QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; QoLSettings.Save(); }, "Dialogue boxes advance instantly without input."); + AddEntry(GetStackCapLabel(), () => { var steps = new[] { 9, 25, 50, 99 }; var idx2 = Array.IndexOf(steps, QoLSettings.Current.StackCap); QoLSettings.Current.StackCap = steps[(idx2 + 1) % steps.Length]; QoLSettings.Save(); }, "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."); + AddEntry(GetFastToastLabel(), () => { QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; QoLSettings.Save(); }, "Fast: toasts appear and disappear instantly. Vanilla: original timing."); + AddEntry(GetToastBlockLabel(), () => { QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; QoLSettings.Save(); }, "On: toasts freeze movement (vanilla). Off: toasts never block movement."); + + // Put entries in _questInventory (right panel) + var questCol = AccessTools.Field(JournalMenuType, "_questInventory").GetValue(gameScreen); + AccessTools.Field(questCol.GetType(), "_entries").SetValue(questCol, menuList); + AccessTools.Method(JournalMenuType, "ChangeMenuCollection").Invoke(gameScreen, new object[] { questCol, false }); + AccessTools.Method(questCol.GetType(), "SetSelectedIndex").Invoke(questCol, new object[] { selectedIndex }); + } + + static string GetCutsceneLabel() => + $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; + + static string GetDialogueLabel() => + $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; + + static string GetStackCapLabel() => + $"Stack Cap: {QoLSettings.Current.StackCap}"; + + static string GetFastToastLabel() => + $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; + + static string GetToastBlockLabel() => + $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; + } +} \ No newline at end of file From f5918526196c5f33ea8f33862af40d8446964c46 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:26:59 -0500 Subject: [PATCH 31/68] Add files via upload --- .../Patches/patchcutscenes.cs | 51 +++++++++ .../Patches/patchdialogues.cs | 26 +++++ .../Patches/patchstackincrease.cs | 55 ++++++++++ .../Patches/patchtoasttimer.cs | 103 ++++++++++++++++++ 4 files changed, 235 insertions(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs create mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs create mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs create mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs new file mode 100644 index 00000000..bb28fdd8 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs @@ -0,0 +1,51 @@ +using HarmonyLib; +using System.Reflection; + +namespace TsRandomizer +{ + [HarmonyPatch] + class AutoSkipCutscenePatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); + return AccessTools.Method(type, "UpdateLevelRequests"); + } + + static void Postfix(object __instance) + { + if (!QoLSettings.Current.AutoSkipCutscenes) return; + + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); + var level = AccessTools.Field(type, "_level").GetValue(__instance); + if (level == null) return; + + var levelType = AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.Level"); + bool isUnskippable = (bool)AccessTools.Property(levelType, "IsActiveScriptUnskippable").GetValue(level); + bool isDoingDeathCutscene = (bool)AccessTools.Property(levelType, "IsDoingPlayerDeathCutscene").GetValue(level); + bool isInputBlocked = (bool)AccessTools.Property(levelType, "IsPlayerInputBlocked").GetValue(level); + + if (isInputBlocked && !isUnskippable && !isDoingDeathCutscene) + { + AccessTools.Method(levelType, "SkipCutscene").Invoke(level, null); + AccessTools.Field(type, "_isShowingSkipCutscenePrompt").SetValue(__instance, false); + } + } + } + + [HarmonyPatch] + class CutsceneUnskippableWaitPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameObjects.BaseClasses.GameEvent"); + return AccessTools.Method(type, "AddUnskippableWaitScript"); + } + + static void Prefix(ref float waitTime) + { + if (!QoLSettings.Current.AutoSkipCutscenes) return; + waitTime *= 0.25f; + } + } +} diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs new file mode 100644 index 00000000..16bc666a --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs @@ -0,0 +1,26 @@ +using HarmonyLib; +using System.Reflection; + +namespace TsRandomizer +{ + [HarmonyPatch] + class DialogueAutoSkipPatch + { + static MethodBase TargetMethod() + { + return AccessTools.Method( + AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"), + "Update"); + } + + static void Prefix(object __instance) + { + if (!QoLSettings.Current.AutoSkipDialogue) return; + + var type = AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"); + AccessTools.Field(type, "_isAutoplay").SetValue(__instance, true); + AccessTools.Field(type, "_autoplayNextLineTimer").SetValue(__instance, 999f); + AccessTools.Field(type, "_isReadyForNextLine").SetValue(__instance, true); + } + } +} diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs new file mode 100644 index 00000000..045d45d0 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs @@ -0,0 +1,55 @@ +using HarmonyLib; +using Timespinner.GameAbstractions.Inventory; +using System.Reflection; +using System.Collections.Generic; + +namespace TsRandomizer +{ + // Increase stack limit in inventory + [HarmonyPatch(typeof(InventoryUseItem))] + [HarmonyPatch(MethodType.Constructor)] + [HarmonyPatch(new[] { typeof(EInventoryUseItemType) })] + class StackCapPatch + { + static void Postfix(InventoryUseItem __instance, EInventoryUseItemType useItemType) + { + int cap = QoLSettings.Current.StackCap; + + switch (useItemType) + { + case EInventoryUseItemType.MagicMarbles: + case EInventoryUseItemType.EssenceCrystal: + case EInventoryUseItemType.GoldRing: + case EInventoryUseItemType.GoldNecklace: + break; // leave vanilla + default: + __instance.StackCap = cap; + break; + } + } + } + + // Increase buying limit to match stack cap + [HarmonyPatch] + class ShopCapPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen"); + return AccessTools.Method(type, "GetAvailableQuantityByItem"); + } + + static IEnumerable Transpiler(IEnumerable instructions) + { + var codes = new List(instructions); + + for (int i = 0; i < codes.Count; i++) + { + if (codes[i].LoadsConstant(9)) + codes[i].operand = QoLSettings.Current.StackCap; + } + + return codes; + } + } +} diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs new file mode 100644 index 00000000..45f57e8f --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs @@ -0,0 +1,103 @@ +using Timespinner.GameAbstractions; +using Timespinner.Core; +using HarmonyLib; +using System.Reflection; + +namespace TsRandomizer +{ + [HarmonyPatch] + class ToastTimerPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + return AccessTools.Constructor(type, new[] { + typeof(SpriteSheet), + typeof(bool), + typeof(GCM), + typeof(float), + typeof(float), + typeof(float), + typeof(float) + }); + } + + static void Postfix(object __instance) + { + if (!QoLSettings.Current.FastToastPopups) return; + + var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); + AccessTools.Field(baseType, "_totalDisplayTime").SetValue(__instance, + (float)AccessTools.Field(baseType, "_timeBeforeFlashing").GetValue(__instance) + + (float)AccessTools.Field(baseType, "_timeToFlash").GetValue(__instance) + + (float)AccessTools.Field(baseType, "_timeToFade").GetValue(__instance)); + } + } + + [HarmonyPatch] + class DoesWaitForInputPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + return AccessTools.Method(type, "set_DoesWaitForInputToFinish"); + } + + static bool Prefix() + { + return false; // fuckoff mr popup + } + } + + [HarmonyPatch] + class RelicOrbToastPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.RelicOrbGetToast"); + return AccessTools.Constructor(type, new[] { + typeof(SpriteSheet), + typeof(GCM), + AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ScriptAction"), + AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ControllerMapping") + }); + } + + static void Postfix(object __instance) + { + var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + + if (!QoLSettings.Current.ToastsBlockMovement) + { + AccessTools.Field(baseType, "_doesFreezeGameplay").SetValue(__instance, false); + AccessTools.Property(baseType.BaseType, "IsOverlayScreen").SetValue(__instance, true); + } + + if (QoLSettings.Current.FastToastPopups) + AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); + } + } + + [HarmonyPatch] + class CharacterLevelUpToastPatch + { + static MethodBase TargetMethod() + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); + return AccessTools.Constructor(type, new[] { + typeof(SpriteSheet), + typeof(GCM) + }); + } + + static void Postfix(object __instance) + { + if (!QoLSettings.Current.ToastsBlockMovement) + { + var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); + AccessTools.Field(type, "_controlTimer").SetValue(__instance, 0.75f); + } + } + } +} From adf7d31a9ed996a845583af2f4543529426af028 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:27:30 -0500 Subject: [PATCH 32/68] Add files via upload --- .../TsRandomizer QoL/Settings/QoLSettings.cs | 59 ++++++ .../Settings/QoLSettingsMenu.cs | 194 ++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs create mode 100644 TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs diff --git a/TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs b/TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs new file mode 100644 index 00000000..53be3d89 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; +using Newtonsoft.Json; + +namespace TsRandomizer +{ + public class QoLSettingsData + { + public bool AutoSkipCutscenes { get; set; } = true; + public bool AutoSkipDialogue { get; set; } = true; + public int StackCap { get; set; } = 99; + public bool FastToastPopups { get; set; } = true; + public bool ToastsBlockMovement { get; set; } = false; + } + + public static class QoLSettings + { + static readonly string SettingsPath = Path.Combine( + AppDomain.CurrentDomain.BaseDirectory, "qol-settings.json"); + + public static QoLSettingsData Current { get; private set; } = Load(); + + public static QoLSettingsData Load() + { + try + { + if (File.Exists(SettingsPath)) + { + var json = File.ReadAllText(SettingsPath); + Current = JsonConvert.DeserializeObject(json) ?? new QoLSettingsData(); + } + else + { + Current = new QoLSettingsData(); + Save(); + } + } + catch + { + Current = new QoLSettingsData(); + } + + return Current; + } + + public static void Save() + { + try + { + var json = JsonConvert.SerializeObject(Current, Formatting.Indented); + File.WriteAllText(SettingsPath, json); + } + catch + { + // ignored + } + } + } +} diff --git a/TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs b/TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs new file mode 100644 index 00000000..bd767e57 --- /dev/null +++ b/TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs @@ -0,0 +1,194 @@ +using System; +using System.Collections; +using System.Reflection; +using HarmonyLib; +using Microsoft.Xna.Framework; +using Timespinner.GameAbstractions; +using Timespinner.GameAbstractions.Saving; +using Timespinner.GameStateManagement.ScreenManager; +using TsRandomizer.Extensions; +using TsRandomizer.Screens.Menu; + +namespace TsRandomizer +{ + public static class QoLSettingsMenu + { + static readonly Type JournalMenuType = + AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); + static readonly Type MenuEntryType = + AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); + + public static object PendingScreenInstance { get; set; } + + public static GameScreen Create(ScreenManager screenManager) + { + var gcm = (GCM)screenManager.AsDynamic().GCM; + gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); + + void OnExit() { } + + var screen = (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); + PendingScreenInstance = screen; + return screen; + } + } + + [HarmonyPatch] + class QoLSettingsMenuInitPatch + { + static readonly Type JournalMenuType = + AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); + static readonly Type MenuEntryType = + AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); + + static MethodBase TargetMethod() => + AccessTools.Method(JournalMenuType, "LoadContent"); + + static void Postfix(object __instance) + { + if (QoLSettingsMenu.PendingScreenInstance != __instance) + return; + + QoLSettingsMenu.PendingScreenInstance = null; + + try + { + var d = __instance.AsDynamic(); + + d._menuTitle = "TsRandomizer QoL"; + + // Clear all collections + var emptyList = new object[0].ToList(MenuEntryType); + ((object)d._memoriesInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._lettersInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._filesInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._questInventory).AsDynamic()._entries = emptyList; + ((object)d._bestiaryInventory).AsDynamic()._entries = emptyList; + ((object)d._featsInventory).AsDynamic()._entries = emptyList; + + // Build main menu entries + var menuList = new object[0].ToList(MenuEntryType); + + // Auto Skip Cutscenes toggle + var cutsceneEntry = MenuEntry.Create( + GetCutsceneLabel(), + _ => ToggleCutscenes(__instance)); + cutsceneEntry.IsCenterAligned = false; + cutsceneEntry.DoesDrawLargeShadow = false; + cutsceneEntry.Description = "Automatically skips cutscenes without any button press."; + menuList.Add(cutsceneEntry.AsTimeSpinnerMenuEntry()); + + // Auto Skip Dialogue toggle + var dialogueEntry = MenuEntry.Create( + GetDialogueLabel(), + _ => ToggleDialogue(__instance)); + dialogueEntry.IsCenterAligned = false; + dialogueEntry.DoesDrawLargeShadow = false; + dialogueEntry.Description = "Dialogue boxes advance instantly without input."; + menuList.Add(dialogueEntry.AsTimeSpinnerMenuEntry()); + + // Stack Cap + var stackEntry = MenuEntry.Create( + GetStackCapLabel(), + _ => CycleStackCap(__instance)); + stackEntry.IsCenterAligned = false; + stackEntry.DoesDrawLargeShadow = false; + stackEntry.Description = "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."; + menuList.Add(stackEntry.AsTimeSpinnerMenuEntry()); + + // Toast Popup Speed toggle + var fastToastEntry = MenuEntry.Create( + GetFastToastLabel(), + _ => ToggleFastToasts(__instance)); + fastToastEntry.IsCenterAligned = false; + fastToastEntry.DoesDrawLargeShadow = false; + fastToastEntry.Description = "Fast: toasts appear and disappear instantly. Vanilla: original timing."; + menuList.Add(fastToastEntry.AsTimeSpinnerMenuEntry()); + + // Toasts Block Movement toggle + var toastBlockEntry = MenuEntry.Create( + GetToastBlockLabel(), + _ => ToggleToastBlock(__instance)); + toastBlockEntry.IsCenterAligned = false; + toastBlockEntry.DoesDrawLargeShadow = false; + toastBlockEntry.Description = "On: toasts freeze movement (vanilla). Off: toasts never block movement."; + menuList.Add(toastBlockEntry.AsTimeSpinnerMenuEntry()); + + ((object)d._primaryMenuCollection).AsDynamic()._entries = menuList; + ((object)d._selectedMenuCollection).AsDynamic().SetSelectedIndex(0); + } + catch + { + // ignored + } + } + + static string GetCutsceneLabel() => + $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; + + static string GetDialogueLabel() => + $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; + + static string GetStackCapLabel() => + $"Stack Cap: {QoLSettings.Current.StackCap}"; + + static string GetFastToastLabel() => + $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; + + static string GetToastBlockLabel() => + $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; + + static void ToggleCutscenes(object __instance) + { + QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; + QoLSettings.Save(); + RefreshEntry(__instance, 0, GetCutsceneLabel()); + } + + static void ToggleDialogue(object __instance) + { + QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; + QoLSettings.Save(); + RefreshEntry(__instance, 1, GetDialogueLabel()); + } + + static void CycleStackCap(object __instance) + { + var steps = new[] { 9, 25, 50, 99 }; + var current = QoLSettings.Current.StackCap; + var idx = Array.IndexOf(steps, current); + QoLSettings.Current.StackCap = steps[(idx + 1) % steps.Length]; + QoLSettings.Save(); + RefreshEntry(__instance, 2, GetStackCapLabel()); + } + + static void ToggleFastToasts(object __instance) + { + QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; + QoLSettings.Save(); + RefreshEntry(__instance, 3, GetFastToastLabel()); + } + + static void ToggleToastBlock(object __instance) + { + QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; + QoLSettings.Save(); + RefreshEntry(__instance, 4, GetToastBlockLabel()); + } + + static void RefreshEntry(object __instance, int index, string newLabel) + { + try + { + var d = __instance.AsDynamic(); + var entries = (IList)((object)d._primaryMenuCollection).AsDynamic()._entries; + if (index < entries.Count) + new MenuEntry(entries[index]).Text = newLabel; + } + catch + { + // ignored + } + } + } +} From 73bf5656132065412aa796cfa4143814226adfa0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:29:18 -0500 Subject: [PATCH 33/68] Add files via upload --- ReadMe.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index cb9eb1da..2a5b71ac 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,9 @@ +# Modded from the original timespinner randomizer + +this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops + +Simply paste this release over a regular installation of TsRandomizer to apply the patches + # General Timespinner Randomizer will randomize the location of items such as equipment, relics, familiars, stat boosts, use items. The logic makes sure that each game you play is beatable. From 44228ef160f8cdcb059d42af84fc19f7da881431 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:35:26 -0500 Subject: [PATCH 34/68] Update ReadMe.md --- ReadMe.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 2a5b71ac..ee2a95ed 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,8 +1,19 @@ # Modded from the original timespinner randomizer -this version prevents the game from locking player movement on levelups and item collections, it also increase max stack size and purchase limit to 99 in shops +This Modded Tsrandomizer has an extra options menu for a few Quality of life settings: +-Auto Skip Cutscenes +-Auto Skip Dialogues +-Change item stack cap (9, 25, 50, 99) +-Toast Popup Speed options (Fast, Vanilla) +-Toasts Block Movement (On, Off) + +this is intended to make gameplay smoother for players who know Timespinner by heart and don't want control taken away from them every time they obtain an orb #LetMePlayDamnIt + +stack cap is intended to make other players in large multiworlds feel like their 70th Berry Pick-mi up matters + + +image -Simply paste this release over a regular installation of TsRandomizer to apply the patches # General Timespinner Randomizer will randomize the location of items such as equipment, relics, familiars, stat boosts, use items. The logic makes sure that each game you play is beatable. From 24cd772923f2192c18147737c57b653fd6c5d82f Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:36:51 -0500 Subject: [PATCH 35/68] Update ReadMe.md --- ReadMe.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index ee2a95ed..c0ebcb3a 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -7,10 +7,10 @@ This Modded Tsrandomizer has an extra options menu for a few Quality of life set -Toast Popup Speed options (Fast, Vanilla) -Toasts Block Movement (On, Off) -this is intended to make gameplay smoother for players who know Timespinner by heart and don't want control taken away from them every time they obtain an orb #LetMePlayDamnIt - -stack cap is intended to make other players in large multiworlds feel like their 70th Berry Pick-mi up matters +stack cap is intended to make other players in large multiworlds feel like their 70th Berry Pick-mi up matters. +this QoL Mod is intended to make gameplay smoother for players who know Timespinner by heart and don't want control taken away from them every time they obtain an orb #LetMePlayDamnIt +You can find the menu in the options menu image From 2d560ba9770daff811393d200eaddd5ab0e05520 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:37:12 -0500 Subject: [PATCH 36/68] Update ReadMe.md --- ReadMe.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index c0ebcb3a..14d0171e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,10 +1,15 @@ # Modded from the original timespinner randomizer This Modded Tsrandomizer has an extra options menu for a few Quality of life settings: + -Auto Skip Cutscenes + -Auto Skip Dialogues + -Change item stack cap (9, 25, 50, 99) + -Toast Popup Speed options (Fast, Vanilla) + -Toasts Block Movement (On, Off) stack cap is intended to make other players in large multiworlds feel like their 70th Berry Pick-mi up matters. From 85079346922602aad335fc8d756c35ceb11cf714 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:37:26 -0500 Subject: [PATCH 37/68] Update ReadMe.md --- ReadMe.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReadMe.md b/ReadMe.md index 14d0171e..e8838eaa 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -13,6 +13,7 @@ This Modded Tsrandomizer has an extra options menu for a few Quality of life set -Toasts Block Movement (On, Off) stack cap is intended to make other players in large multiworlds feel like their 70th Berry Pick-mi up matters. + this QoL Mod is intended to make gameplay smoother for players who know Timespinner by heart and don't want control taken away from them every time they obtain an orb #LetMePlayDamnIt You can find the menu in the options menu From 8dcfcc709044d6b027231a6f66d884425bd2041e Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 00:47:51 -0500 Subject: [PATCH 38/68] Update ReadMe.md --- ReadMe.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index e8838eaa..6be2d184 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -2,9 +2,7 @@ This Modded Tsrandomizer has an extra options menu for a few Quality of life settings: --Auto Skip Cutscenes - --Auto Skip Dialogues +-Auto Skip Cutscenes and dialogue instantly -Change item stack cap (9, 25, 50, 99) From b88ccf91b00ff2327471bef244a678cc71a565c4 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:38:44 -0500 Subject: [PATCH 39/68] bugfix fixed bug that made cutscene skip also skip regular dialogue --- .../Patches/patchcutscenes.cs | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs index bb28fdd8..e2990b6d 100644 --- a/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs +++ b/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs @@ -1,5 +1,7 @@ +using System.Collections; using HarmonyLib; using System.Reflection; +using Microsoft.Xna.Framework; namespace TsRandomizer { @@ -25,12 +27,40 @@ static void Postfix(object __instance) bool isDoingDeathCutscene = (bool)AccessTools.Property(levelType, "IsDoingPlayerDeathCutscene").GetValue(level); bool isInputBlocked = (bool)AccessTools.Property(levelType, "IsPlayerInputBlocked").GetValue(level); - if (isInputBlocked && !isUnskippable && !isDoingDeathCutscene) + if (isInputBlocked && !isUnskippable && !isDoingDeathCutscene && IsRealCutsceneActive(level, levelType)) { AccessTools.Method(levelType, "SkipCutscene").Invoke(level, null); AccessTools.Field(type, "_isShowingSkipCutscenePrompt").SetValue(__instance, false); } } + + static bool IsRealCutsceneActive(object level, System.Type levelType) + { + try + { + var activeScripts = (IList)AccessTools.Field(levelType, "_activeScripts").GetValue(level); + var scriptActionType = AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ScriptAction"); + var scriptTypeProp = AccessTools.Property(scriptActionType, "ScriptType"); + var argumentsProp = AccessTools.Property(scriptActionType, "Arguments"); + var cutsceneStartValue = System.Enum.Parse( + AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.EScriptType"), "CutsceneStart"); + + foreach (var script in activeScripts) + { + if (script == null) continue; + var scriptType = scriptTypeProp.GetValue(script, null); + if (!scriptType.Equals(cutsceneStartValue)) continue; + var arguments = (Vector4)argumentsProp.GetValue(script, null); + if (arguments.X >= 1f) return true; + } + + return false; + } + catch + { + return false; + } + } } [HarmonyPatch] @@ -48,4 +78,4 @@ static void Prefix(ref float waitTime) waitTime *= 0.25f; } } -} +} \ No newline at end of file From 0d774c9a84935506533930ec268ce86652236b07 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:48:43 -0500 Subject: [PATCH 40/68] Delete TsRandomizer/TsRandomizer QoL/Patches/oui --- TsRandomizer/TsRandomizer QoL/Patches/oui | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/Patches/oui diff --git a/TsRandomizer/TsRandomizer QoL/Patches/oui b/TsRandomizer/TsRandomizer QoL/Patches/oui deleted file mode 100644 index 8b137891..00000000 --- a/TsRandomizer/TsRandomizer QoL/Patches/oui +++ /dev/null @@ -1 +0,0 @@ - From 562fca44a402034bd7a1be21d00d148eeb3da98a Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:48:54 -0500 Subject: [PATCH 41/68] Delete TsRandomizer/TsRandomizer QoL/Menu/yes --- TsRandomizer/TsRandomizer QoL/Menu/yes | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/Menu/yes diff --git a/TsRandomizer/TsRandomizer QoL/Menu/yes b/TsRandomizer/TsRandomizer QoL/Menu/yes deleted file mode 100644 index bd51bf63..00000000 --- a/TsRandomizer/TsRandomizer QoL/Menu/yes +++ /dev/null @@ -1 +0,0 @@ -oui From 4c6ad1534852be7dc89bcd117078a77dd3490214 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:49:06 -0500 Subject: [PATCH 42/68] Delete TsRandomizer/TsRandomizer QoL/Settings/oui --- TsRandomizer/TsRandomizer QoL/Settings/oui | 1 - 1 file changed, 1 deletion(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/Settings/oui diff --git a/TsRandomizer/TsRandomizer QoL/Settings/oui b/TsRandomizer/TsRandomizer QoL/Settings/oui deleted file mode 100644 index 8b137891..00000000 --- a/TsRandomizer/TsRandomizer QoL/Settings/oui +++ /dev/null @@ -1 +0,0 @@ - From 74fa72da31ec2850323b499d28bb98f1baca15ab Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:52:55 -0500 Subject: [PATCH 43/68] Add files via upload --- .../TsRandomizer.SeedGeneratah.csproj | 144 +++++++++--------- 1 file changed, 70 insertions(+), 74 deletions(-) diff --git a/TsRandomizer.SeedGeneratah/TsRandomizer.SeedGeneratah.csproj b/TsRandomizer.SeedGeneratah/TsRandomizer.SeedGeneratah.csproj index 91c94d1e..fb586415 100644 --- a/TsRandomizer.SeedGeneratah/TsRandomizer.SeedGeneratah.csproj +++ b/TsRandomizer.SeedGeneratah/TsRandomizer.SeedGeneratah.csproj @@ -1,75 +1,71 @@ - - - - - Debug - AnyCPU - {C30E617E-83DB-4C7C-9E45-0166C781A0A8} - Exe - TsRandomizerSeedGeneratah - TsRandomizerSeedGeneratah - v4.0 - 512 - true - Client - - - x86 - true - full - false - C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ - TRACE - prompt - 4 - - - true - bin\Debug DRM Free %28GoG%29\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - - - bin\Release DRM Free %28GoG%29\ - TRACE - true - pdbonly - x86 - 7.3 - prompt - - - - - False - ..\..\TestVersions\SteamVersion\Timespinner.exe - False - - - False - ..\..\TestVersions\SteamVerison\TsRandomizer.exe - False - - - - - - - - - - - + + + + + Debug + AnyCPU + {C30E617E-83DB-4C7C-9E45-0166C781A0A8} + Exe + TsRandomizerSeedGeneratah + TsRandomizerSeedGeneratah + v4.0 + 512 + true + Client + + + x86 + true + full + false + C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ + TRACE + prompt + 4 + + + true + bin\Debug DRM Free %28GoG%29\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + + + bin\Release DRM Free %28GoG%29\ + TRACE + true + pdbonly + x86 + 7.3 + prompt + + + + + ..\..\TestVersions\DebugDRMFreeGoG\Timespinner.exe + + + ..\..\TestVersions\DebugDRMFreeGoG\TsRandomizer.exe + + + + + + + + + + + \ No newline at end of file From 4fc8e5dbf492bca48749d12b723a76715c58165b Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:53:12 -0500 Subject: [PATCH 44/68] Add files via upload --- .../TsRandomizer.ItemTracker.csproj | 261 +++++++++--------- 1 file changed, 128 insertions(+), 133 deletions(-) diff --git a/TsRandomizer.ItemTracker/TsRandomizer.ItemTracker.csproj b/TsRandomizer.ItemTracker/TsRandomizer.ItemTracker.csproj index 6981e697..5433c113 100644 --- a/TsRandomizer.ItemTracker/TsRandomizer.ItemTracker.csproj +++ b/TsRandomizer.ItemTracker/TsRandomizer.ItemTracker.csproj @@ -1,134 +1,129 @@ - - - - - Debug - AnyCPU - {4D86B28B-95A2-4452-9BAA-C8E80F026101} - WinExe - TsRandomizerItemTracker - TsRandomizerItemTracker - v4.8 - 512 - true - - - - x86 - true - full - false - ..\..\TestVersions\DRMFreeVersion\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ - TRACE - prompt - 4 - - - true - - - - - - EyeOrbLargeT.ico - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug DRM Free %28GoG%29\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - - - true - bin\x64\Debug DRM Free %28GoG%29\ - DEBUG;TRACE - full - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release DRM Free %28GoG%29\ - TRACE - true - pdbonly - x86 - 7.3 - prompt - - - bin\x64\Release DRM Free %28GoG%29\ - TRACE - true - pdbonly - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - - False - C:\Program Files (x86)\Steam\steamapps\common\Timespinner\FNA.dll - False - - - - - - - False - C:\Program Files (x86)\Steam\steamapps\common\Timespinner\Timespinner.exe - False - - - False - ..\..\TestVersions\SteamVerison\TsRandomizer.exe - - - - - - - - - - - - - - - - + + + + + Debug + AnyCPU + {4D86B28B-95A2-4452-9BAA-C8E80F026101} + WinExe + TsRandomizerItemTracker + TsRandomizerItemTracker + v4.8 + 512 + true + + + + x86 + true + full + false + ..\..\TestVersions\DRMFreeVersion\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + C:\Program Files %28x86%29\Steam\steamapps\common\Timespinner\ + TRACE + prompt + 4 + + + true + + + + + + EyeOrbLargeT.ico + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + + + true + bin\Debug DRM Free %28GoG%29\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + + + true + bin\x64\Debug DRM Free %28GoG%29\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + bin\Release DRM Free %28GoG%29\ + TRACE + true + pdbonly + x86 + 7.3 + prompt + + + bin\x64\Release DRM Free %28GoG%29\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + + ..\..\TestVersions\DebugDRMFreeGoG\FNA.dll + + + + + + + ..\..\TestVersions\DebugDRMFreeGoG\Timespinner.exe + + + ..\..\TestVersions\DebugDRMFreeGoG\TsRandomizer.exe + + + + + + + + + + + + + + + + \ No newline at end of file From 0c4f07e0f9ccf7f17e111588c8be73b25512806e Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 12:05:25 -0500 Subject: [PATCH 45/68] bugfix fixed a bug where dialogues arent instantly skipped --- TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs index 16bc666a..19d30c18 100644 --- a/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs +++ b/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs @@ -18,9 +18,7 @@ static void Prefix(object __instance) if (!QoLSettings.Current.AutoSkipDialogue) return; var type = AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"); - AccessTools.Field(type, "_isAutoplay").SetValue(__instance, true); - AccessTools.Field(type, "_autoplayNextLineTimer").SetValue(__instance, 999f); - AccessTools.Field(type, "_isReadyForNextLine").SetValue(__instance, true); + AccessTools.Method(type, "FinishDialogue").Invoke(__instance, null); } } -} +} \ No newline at end of file From c7dda9980fc15ab11a00eace3977feca685ddc38 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Thu, 26 Feb 2026 12:06:35 -0500 Subject: [PATCH 46/68] bugfix fixed description about stackcap to warn the player that a restart is required to apply this patch From 6dafa5aaf032e14791a51722990a3933941026f0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:44:19 -0500 Subject: [PATCH 47/68] Delete TsRandomizer/TsRandomizer QoL directory --- .../TsRandomizer QoL/Menu/QoLMenuInjector.cs | 53 ----- .../TsRandomizer QoL/Menu/QoLSettingsMenu.cs | 124 ----------- .../Patches/patchcutscenes.cs | 81 -------- .../Patches/patchdialogues.cs | 24 --- .../Patches/patchstackincrease.cs | 55 ----- .../Patches/patchtoasttimer.cs | 103 ---------- .../TsRandomizer QoL/Settings/QoLSettings.cs | 59 ------ .../Settings/QoLSettingsMenu.cs | 194 ------------------ 8 files changed, 693 deletions(-) delete mode 100644 TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs delete mode 100644 TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs diff --git a/TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs b/TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs deleted file mode 100644 index 567ae91b..00000000 --- a/TsRandomizer/TsRandomizer QoL/Menu/QoLMenuInjector.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using HarmonyLib; -using Microsoft.Xna.Framework; -using Timespinner.GameAbstractions; -using Timespinner.GameStateManagement.ScreenManager; -using TsRandomizer.Extensions; -using TsRandomizer.Screens.Menu; - -namespace TsRandomizer -{ - [HarmonyPatch] - class QoLMenuInjector - { - static readonly Type OptionsMenuScreenType = - AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.OptionsMenuScreen"); - static readonly Type MainMenuEntryType = - AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); - - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.OptionsMenuScreen"); - return AccessTools.Method(type, "LoadContent"); - } - - static void Postfix(object __instance) - { - try - { - var screenManager = (ScreenManager)((GameScreen)__instance).ScreenManager; - var button = MenuEntry.Create("Randomizer QoL Settings", _ => OpenQoLMenu(screenManager)); - button.IsCenterAligned = false; - button.DoesDrawLargeShadow = false; - var primaryMenuCollection = ((object)__instance.AsDynamic()._primaryMenuCollection).AsDynamic(); - var buttons = (IList)primaryMenuCollection._entries; - buttons.Add(button.AsTimeSpinnerMenuEntry()); - primaryMenuCollection._entries = buttons.ToList(MainMenuEntryType); - } - catch - { - // ignored - } - } - - static void OpenQoLMenu(ScreenManager screenManager) - { - QoLSettingsMenu.IsQoLMenuPending = true; - var menu = QoLSettingsMenu.Create(screenManager); - screenManager.AddScreen(menu, PlayerIndex.One); - } - } -} \ No newline at end of file diff --git a/TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs b/TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs deleted file mode 100644 index c5bfa1c2..00000000 --- a/TsRandomizer/TsRandomizer QoL/Menu/QoLSettingsMenu.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using HarmonyLib; -using Microsoft.Xna.Framework; -using Timespinner.GameAbstractions; -using Timespinner.GameAbstractions.Saving; -using TsRandomizer.Extensions; -using TsRandomizer.Screens; -using TsRandomizer.Screens.Menu; -using GameScreen = Timespinner.GameStateManagement.ScreenManager.GameScreen; -using ScreenManager = Timespinner.GameStateManagement.ScreenManager.ScreenManager; - -namespace TsRandomizer -{ - public static class QoLSettingsMenu - { - static readonly Type JournalMenuType = - AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); - static readonly Type MenuEntryType = - AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); - - public static bool IsQoLMenuPending { get; set; } - - public static GameScreen Create(ScreenManager screenManager) - { - var gcm = (GCM)screenManager.AsDynamic().GCM; - gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); - - void OnExit() { } - - return (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); - } - } - - [HarmonyPatch] - class QoLSettingsMenuInitPatch - { - static readonly Type JournalMenuType = - AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); - static readonly Type MenuEntryType = - AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); - - static MethodBase TargetMethod() => - AccessTools.Method(typeof(GameSettingsScreen), "Initialize"); - - static void Postfix(object __instance) - { - if (!QoLSettingsMenu.IsQoLMenuPending) - return; - - QoLSettingsMenu.IsQoLMenuPending = false; - - try - { - BuildMenu(((Screen)__instance).GameScreen, 0); - } - catch - { - // ignored - } - } - - internal static void BuildMenu(GameScreen gameScreen, int selectedIndex) - { - var emptyList = new object[0].ToList(MenuEntryType); - - AccessTools.Field(JournalMenuType, "_menuTitle").SetValue(gameScreen, "QoL Menu"); - - void ClearCollection(string fieldName) - { - var col = AccessTools.Field(JournalMenuType, fieldName).GetValue(gameScreen); - AccessTools.Field(col.GetType(), "_entries").SetValue(col, emptyList); - } - - ClearCollection("_primaryMenuCollection"); - ClearCollection("_memoriesInventoryCollection"); - ClearCollection("_lettersInventoryCollection"); - ClearCollection("_filesInventoryCollection"); - ClearCollection("_questInventory"); - ClearCollection("_bestiaryInventory"); - ClearCollection("_featsInventory"); - - var menuList = new object[0].ToList(MenuEntryType); - - void AddEntry(string label, Action onSelect, string description) - { - int idx = ((IList)menuList).Count; - var entry = MenuEntry.Create(label, _ => { onSelect(); BuildMenu(gameScreen, idx); }); - entry.IsCenterAligned = false; - entry.DoesDrawLargeShadow = false; - entry.Description = description; - ((IList)menuList).Add(entry.AsTimeSpinnerMenuEntry()); - } - - AddEntry(GetCutsceneLabel(), () => { QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; QoLSettings.Save(); }, "Automatically skips cutscenes without any button press."); - AddEntry(GetDialogueLabel(), () => { QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; QoLSettings.Save(); }, "Dialogue boxes advance instantly without input."); - AddEntry(GetStackCapLabel(), () => { var steps = new[] { 9, 25, 50, 99 }; var idx2 = Array.IndexOf(steps, QoLSettings.Current.StackCap); QoLSettings.Current.StackCap = steps[(idx2 + 1) % steps.Length]; QoLSettings.Save(); }, "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."); - AddEntry(GetFastToastLabel(), () => { QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; QoLSettings.Save(); }, "Fast: toasts appear and disappear instantly. Vanilla: original timing."); - AddEntry(GetToastBlockLabel(), () => { QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; QoLSettings.Save(); }, "On: toasts freeze movement (vanilla). Off: toasts never block movement."); - - // Put entries in _questInventory (right panel) - var questCol = AccessTools.Field(JournalMenuType, "_questInventory").GetValue(gameScreen); - AccessTools.Field(questCol.GetType(), "_entries").SetValue(questCol, menuList); - AccessTools.Method(JournalMenuType, "ChangeMenuCollection").Invoke(gameScreen, new object[] { questCol, false }); - AccessTools.Method(questCol.GetType(), "SetSelectedIndex").Invoke(questCol, new object[] { selectedIndex }); - } - - static string GetCutsceneLabel() => - $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; - - static string GetDialogueLabel() => - $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; - - static string GetStackCapLabel() => - $"Stack Cap: {QoLSettings.Current.StackCap}"; - - static string GetFastToastLabel() => - $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; - - static string GetToastBlockLabel() => - $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; - } -} \ No newline at end of file diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs deleted file mode 100644 index e2990b6d..00000000 --- a/TsRandomizer/TsRandomizer QoL/Patches/patchcutscenes.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Collections; -using HarmonyLib; -using System.Reflection; -using Microsoft.Xna.Framework; - -namespace TsRandomizer -{ - [HarmonyPatch] - class AutoSkipCutscenePatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); - return AccessTools.Method(type, "UpdateLevelRequests"); - } - - static void Postfix(object __instance) - { - if (!QoLSettings.Current.AutoSkipCutscenes) return; - - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); - var level = AccessTools.Field(type, "_level").GetValue(__instance); - if (level == null) return; - - var levelType = AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.Level"); - bool isUnskippable = (bool)AccessTools.Property(levelType, "IsActiveScriptUnskippable").GetValue(level); - bool isDoingDeathCutscene = (bool)AccessTools.Property(levelType, "IsDoingPlayerDeathCutscene").GetValue(level); - bool isInputBlocked = (bool)AccessTools.Property(levelType, "IsPlayerInputBlocked").GetValue(level); - - if (isInputBlocked && !isUnskippable && !isDoingDeathCutscene && IsRealCutsceneActive(level, levelType)) - { - AccessTools.Method(levelType, "SkipCutscene").Invoke(level, null); - AccessTools.Field(type, "_isShowingSkipCutscenePrompt").SetValue(__instance, false); - } - } - - static bool IsRealCutsceneActive(object level, System.Type levelType) - { - try - { - var activeScripts = (IList)AccessTools.Field(levelType, "_activeScripts").GetValue(level); - var scriptActionType = AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ScriptAction"); - var scriptTypeProp = AccessTools.Property(scriptActionType, "ScriptType"); - var argumentsProp = AccessTools.Property(scriptActionType, "Arguments"); - var cutsceneStartValue = System.Enum.Parse( - AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.EScriptType"), "CutsceneStart"); - - foreach (var script in activeScripts) - { - if (script == null) continue; - var scriptType = scriptTypeProp.GetValue(script, null); - if (!scriptType.Equals(cutsceneStartValue)) continue; - var arguments = (Vector4)argumentsProp.GetValue(script, null); - if (arguments.X >= 1f) return true; - } - - return false; - } - catch - { - return false; - } - } - } - - [HarmonyPatch] - class CutsceneUnskippableWaitPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameObjects.BaseClasses.GameEvent"); - return AccessTools.Method(type, "AddUnskippableWaitScript"); - } - - static void Prefix(ref float waitTime) - { - if (!QoLSettings.Current.AutoSkipCutscenes) return; - waitTime *= 0.25f; - } - } -} \ No newline at end of file diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs deleted file mode 100644 index 19d30c18..00000000 --- a/TsRandomizer/TsRandomizer QoL/Patches/patchdialogues.cs +++ /dev/null @@ -1,24 +0,0 @@ -using HarmonyLib; -using System.Reflection; - -namespace TsRandomizer -{ - [HarmonyPatch] - class DialogueAutoSkipPatch - { - static MethodBase TargetMethod() - { - return AccessTools.Method( - AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"), - "Update"); - } - - static void Prefix(object __instance) - { - if (!QoLSettings.Current.AutoSkipDialogue) return; - - var type = AccessTools.TypeByName("Timespinner.GameAbstractions.HUD.DialogueBox"); - AccessTools.Method(type, "FinishDialogue").Invoke(__instance, null); - } - } -} \ No newline at end of file diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs deleted file mode 100644 index 045d45d0..00000000 --- a/TsRandomizer/TsRandomizer QoL/Patches/patchstackincrease.cs +++ /dev/null @@ -1,55 +0,0 @@ -using HarmonyLib; -using Timespinner.GameAbstractions.Inventory; -using System.Reflection; -using System.Collections.Generic; - -namespace TsRandomizer -{ - // Increase stack limit in inventory - [HarmonyPatch(typeof(InventoryUseItem))] - [HarmonyPatch(MethodType.Constructor)] - [HarmonyPatch(new[] { typeof(EInventoryUseItemType) })] - class StackCapPatch - { - static void Postfix(InventoryUseItem __instance, EInventoryUseItemType useItemType) - { - int cap = QoLSettings.Current.StackCap; - - switch (useItemType) - { - case EInventoryUseItemType.MagicMarbles: - case EInventoryUseItemType.EssenceCrystal: - case EInventoryUseItemType.GoldRing: - case EInventoryUseItemType.GoldNecklace: - break; // leave vanilla - default: - __instance.StackCap = cap; - break; - } - } - } - - // Increase buying limit to match stack cap - [HarmonyPatch] - class ShopCapPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen"); - return AccessTools.Method(type, "GetAvailableQuantityByItem"); - } - - static IEnumerable Transpiler(IEnumerable instructions) - { - var codes = new List(instructions); - - for (int i = 0; i < codes.Count; i++) - { - if (codes[i].LoadsConstant(9)) - codes[i].operand = QoLSettings.Current.StackCap; - } - - return codes; - } - } -} diff --git a/TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs b/TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs deleted file mode 100644 index 45f57e8f..00000000 --- a/TsRandomizer/TsRandomizer QoL/Patches/patchtoasttimer.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Timespinner.GameAbstractions; -using Timespinner.Core; -using HarmonyLib; -using System.Reflection; - -namespace TsRandomizer -{ - [HarmonyPatch] - class ToastTimerPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - return AccessTools.Constructor(type, new[] { - typeof(SpriteSheet), - typeof(bool), - typeof(GCM), - typeof(float), - typeof(float), - typeof(float), - typeof(float) - }); - } - - static void Postfix(object __instance) - { - if (!QoLSettings.Current.FastToastPopups) return; - - var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); - AccessTools.Field(baseType, "_totalDisplayTime").SetValue(__instance, - (float)AccessTools.Field(baseType, "_timeBeforeFlashing").GetValue(__instance) + - (float)AccessTools.Field(baseType, "_timeToFlash").GetValue(__instance) + - (float)AccessTools.Field(baseType, "_timeToFade").GetValue(__instance)); - } - } - - [HarmonyPatch] - class DoesWaitForInputPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - return AccessTools.Method(type, "set_DoesWaitForInputToFinish"); - } - - static bool Prefix() - { - return false; // fuckoff mr popup - } - } - - [HarmonyPatch] - class RelicOrbToastPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.RelicOrbGetToast"); - return AccessTools.Constructor(type, new[] { - typeof(SpriteSheet), - typeof(GCM), - AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ScriptAction"), - AccessTools.TypeByName("Timespinner.GameAbstractions.Gameplay.ControllerMapping") - }); - } - - static void Postfix(object __instance) - { - var baseType = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); - - if (!QoLSettings.Current.ToastsBlockMovement) - { - AccessTools.Field(baseType, "_doesFreezeGameplay").SetValue(__instance, false); - AccessTools.Property(baseType.BaseType, "IsOverlayScreen").SetValue(__instance, true); - } - - if (QoLSettings.Current.FastToastPopups) - AccessTools.Field(baseType, "_timeToWait").SetValue(__instance, 0f); - } - } - - [HarmonyPatch] - class CharacterLevelUpToastPatch - { - static MethodBase TargetMethod() - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); - return AccessTools.Constructor(type, new[] { - typeof(SpriteSheet), - typeof(GCM) - }); - } - - static void Postfix(object __instance) - { - if (!QoLSettings.Current.ToastsBlockMovement) - { - var type = AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"); - AccessTools.Field(type, "_controlTimer").SetValue(__instance, 0.75f); - } - } - } -} diff --git a/TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs b/TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs deleted file mode 100644 index 53be3d89..00000000 --- a/TsRandomizer/TsRandomizer QoL/Settings/QoLSettings.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.IO; -using Newtonsoft.Json; - -namespace TsRandomizer -{ - public class QoLSettingsData - { - public bool AutoSkipCutscenes { get; set; } = true; - public bool AutoSkipDialogue { get; set; } = true; - public int StackCap { get; set; } = 99; - public bool FastToastPopups { get; set; } = true; - public bool ToastsBlockMovement { get; set; } = false; - } - - public static class QoLSettings - { - static readonly string SettingsPath = Path.Combine( - AppDomain.CurrentDomain.BaseDirectory, "qol-settings.json"); - - public static QoLSettingsData Current { get; private set; } = Load(); - - public static QoLSettingsData Load() - { - try - { - if (File.Exists(SettingsPath)) - { - var json = File.ReadAllText(SettingsPath); - Current = JsonConvert.DeserializeObject(json) ?? new QoLSettingsData(); - } - else - { - Current = new QoLSettingsData(); - Save(); - } - } - catch - { - Current = new QoLSettingsData(); - } - - return Current; - } - - public static void Save() - { - try - { - var json = JsonConvert.SerializeObject(Current, Formatting.Indented); - File.WriteAllText(SettingsPath, json); - } - catch - { - // ignored - } - } - } -} diff --git a/TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs b/TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs deleted file mode 100644 index bd767e57..00000000 --- a/TsRandomizer/TsRandomizer QoL/Settings/QoLSettingsMenu.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using HarmonyLib; -using Microsoft.Xna.Framework; -using Timespinner.GameAbstractions; -using Timespinner.GameAbstractions.Saving; -using Timespinner.GameStateManagement.ScreenManager; -using TsRandomizer.Extensions; -using TsRandomizer.Screens.Menu; - -namespace TsRandomizer -{ - public static class QoLSettingsMenu - { - static readonly Type JournalMenuType = - AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); - static readonly Type MenuEntryType = - AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); - - public static object PendingScreenInstance { get; set; } - - public static GameScreen Create(ScreenManager screenManager) - { - var gcm = (GCM)screenManager.AsDynamic().GCM; - gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); - - void OnExit() { } - - var screen = (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); - PendingScreenInstance = screen; - return screen; - } - } - - [HarmonyPatch] - class QoLSettingsMenuInitPatch - { - static readonly Type JournalMenuType = - AccessTools.TypeByName("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); - static readonly Type MenuEntryType = - AccessTools.TypeByName("Timespinner.GameStateManagement.MenuEntry"); - - static MethodBase TargetMethod() => - AccessTools.Method(JournalMenuType, "LoadContent"); - - static void Postfix(object __instance) - { - if (QoLSettingsMenu.PendingScreenInstance != __instance) - return; - - QoLSettingsMenu.PendingScreenInstance = null; - - try - { - var d = __instance.AsDynamic(); - - d._menuTitle = "TsRandomizer QoL"; - - // Clear all collections - var emptyList = new object[0].ToList(MenuEntryType); - ((object)d._memoriesInventoryCollection).AsDynamic()._entries = emptyList; - ((object)d._lettersInventoryCollection).AsDynamic()._entries = emptyList; - ((object)d._filesInventoryCollection).AsDynamic()._entries = emptyList; - ((object)d._questInventory).AsDynamic()._entries = emptyList; - ((object)d._bestiaryInventory).AsDynamic()._entries = emptyList; - ((object)d._featsInventory).AsDynamic()._entries = emptyList; - - // Build main menu entries - var menuList = new object[0].ToList(MenuEntryType); - - // Auto Skip Cutscenes toggle - var cutsceneEntry = MenuEntry.Create( - GetCutsceneLabel(), - _ => ToggleCutscenes(__instance)); - cutsceneEntry.IsCenterAligned = false; - cutsceneEntry.DoesDrawLargeShadow = false; - cutsceneEntry.Description = "Automatically skips cutscenes without any button press."; - menuList.Add(cutsceneEntry.AsTimeSpinnerMenuEntry()); - - // Auto Skip Dialogue toggle - var dialogueEntry = MenuEntry.Create( - GetDialogueLabel(), - _ => ToggleDialogue(__instance)); - dialogueEntry.IsCenterAligned = false; - dialogueEntry.DoesDrawLargeShadow = false; - dialogueEntry.Description = "Dialogue boxes advance instantly without input."; - menuList.Add(dialogueEntry.AsTimeSpinnerMenuEntry()); - - // Stack Cap - var stackEntry = MenuEntry.Create( - GetStackCapLabel(), - _ => CycleStackCap(__instance)); - stackEntry.IsCenterAligned = false; - stackEntry.DoesDrawLargeShadow = false; - stackEntry.Description = "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."; - menuList.Add(stackEntry.AsTimeSpinnerMenuEntry()); - - // Toast Popup Speed toggle - var fastToastEntry = MenuEntry.Create( - GetFastToastLabel(), - _ => ToggleFastToasts(__instance)); - fastToastEntry.IsCenterAligned = false; - fastToastEntry.DoesDrawLargeShadow = false; - fastToastEntry.Description = "Fast: toasts appear and disappear instantly. Vanilla: original timing."; - menuList.Add(fastToastEntry.AsTimeSpinnerMenuEntry()); - - // Toasts Block Movement toggle - var toastBlockEntry = MenuEntry.Create( - GetToastBlockLabel(), - _ => ToggleToastBlock(__instance)); - toastBlockEntry.IsCenterAligned = false; - toastBlockEntry.DoesDrawLargeShadow = false; - toastBlockEntry.Description = "On: toasts freeze movement (vanilla). Off: toasts never block movement."; - menuList.Add(toastBlockEntry.AsTimeSpinnerMenuEntry()); - - ((object)d._primaryMenuCollection).AsDynamic()._entries = menuList; - ((object)d._selectedMenuCollection).AsDynamic().SetSelectedIndex(0); - } - catch - { - // ignored - } - } - - static string GetCutsceneLabel() => - $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; - - static string GetDialogueLabel() => - $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; - - static string GetStackCapLabel() => - $"Stack Cap: {QoLSettings.Current.StackCap}"; - - static string GetFastToastLabel() => - $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; - - static string GetToastBlockLabel() => - $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; - - static void ToggleCutscenes(object __instance) - { - QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; - QoLSettings.Save(); - RefreshEntry(__instance, 0, GetCutsceneLabel()); - } - - static void ToggleDialogue(object __instance) - { - QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; - QoLSettings.Save(); - RefreshEntry(__instance, 1, GetDialogueLabel()); - } - - static void CycleStackCap(object __instance) - { - var steps = new[] { 9, 25, 50, 99 }; - var current = QoLSettings.Current.StackCap; - var idx = Array.IndexOf(steps, current); - QoLSettings.Current.StackCap = steps[(idx + 1) % steps.Length]; - QoLSettings.Save(); - RefreshEntry(__instance, 2, GetStackCapLabel()); - } - - static void ToggleFastToasts(object __instance) - { - QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; - QoLSettings.Save(); - RefreshEntry(__instance, 3, GetFastToastLabel()); - } - - static void ToggleToastBlock(object __instance) - { - QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; - QoLSettings.Save(); - RefreshEntry(__instance, 4, GetToastBlockLabel()); - } - - static void RefreshEntry(object __instance, int index, string newLabel) - { - try - { - var d = __instance.AsDynamic(); - var entries = (IList)((object)d._primaryMenuCollection).AsDynamic()._entries; - if (index < entries.Count) - new MenuEntry(entries[index]).Text = newLabel; - } - catch - { - // ignored - } - } - } -} From 458d8d125ca602f612450669ca6e0e4c6388cca0 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:45:13 -0500 Subject: [PATCH 48/68] Adding QoL patches without harmony --- TsRandomizer/Program.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/TsRandomizer/Program.cs b/TsRandomizer/Program.cs index 56a5de2d..972dd427 100644 --- a/TsRandomizer/Program.cs +++ b/TsRandomizer/Program.cs @@ -1,5 +1,5 @@ using System; -using HarmonyLib; + namespace TsRandomizer { @@ -10,8 +10,7 @@ public static int Main() { WithExceptionLogging(() => { - var harmony = new Harmony("com.tsrandomizer.mods"); - harmony.PatchAll(); + var platformHelper = DummyPlatformHelper.CreateInstance(); new TimeSpinnerGame(platformHelper).Run(); From bf379e703e853b97cc19f4faa0c739fde250e4e4 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:46:33 -0500 Subject: [PATCH 49/68] Adding QoL patches without harmony --- TsRandomizer/Settings/QoLSettings.cs | 59 ++++++++++++++++ TsRandomizer/Settings/QoLSettingsMenu.cs | 87 ++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 TsRandomizer/Settings/QoLSettings.cs create mode 100644 TsRandomizer/Settings/QoLSettingsMenu.cs diff --git a/TsRandomizer/Settings/QoLSettings.cs b/TsRandomizer/Settings/QoLSettings.cs new file mode 100644 index 00000000..53be3d89 --- /dev/null +++ b/TsRandomizer/Settings/QoLSettings.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; +using Newtonsoft.Json; + +namespace TsRandomizer +{ + public class QoLSettingsData + { + public bool AutoSkipCutscenes { get; set; } = true; + public bool AutoSkipDialogue { get; set; } = true; + public int StackCap { get; set; } = 99; + public bool FastToastPopups { get; set; } = true; + public bool ToastsBlockMovement { get; set; } = false; + } + + public static class QoLSettings + { + static readonly string SettingsPath = Path.Combine( + AppDomain.CurrentDomain.BaseDirectory, "qol-settings.json"); + + public static QoLSettingsData Current { get; private set; } = Load(); + + public static QoLSettingsData Load() + { + try + { + if (File.Exists(SettingsPath)) + { + var json = File.ReadAllText(SettingsPath); + Current = JsonConvert.DeserializeObject(json) ?? new QoLSettingsData(); + } + else + { + Current = new QoLSettingsData(); + Save(); + } + } + catch + { + Current = new QoLSettingsData(); + } + + return Current; + } + + public static void Save() + { + try + { + var json = JsonConvert.SerializeObject(Current, Formatting.Indented); + File.WriteAllText(SettingsPath, json); + } + catch + { + // ignored + } + } + } +} diff --git a/TsRandomizer/Settings/QoLSettingsMenu.cs b/TsRandomizer/Settings/QoLSettingsMenu.cs new file mode 100644 index 00000000..9f7b2bfd --- /dev/null +++ b/TsRandomizer/Settings/QoLSettingsMenu.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections; +using Microsoft.Xna.Framework; +using Timespinner.GameAbstractions; +using Timespinner.GameAbstractions.Saving; +using TsRandomizer.Extensions; +using TsRandomizer.Screens.Menu; +using TsRandomizer.IntermediateObjects; +using ScreenManager = Timespinner.GameStateManagement.ScreenManager.ScreenManager; +using GameScreen = Timespinner.GameStateManagement.ScreenManager.GameScreen; + +namespace TsRandomizer.Screens +{ + public static class QoLSettingsMenu + { + static readonly Type JournalMenuType = + TimeSpinnerType.Get("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); + static readonly Type MenuEntryType = + TimeSpinnerType.Get("Timespinner.GameStateManagement.MenuEntry"); + + public static bool IsQoLMenuPending { get; set; } + + internal static GameScreen Create(ScreenManager screenManager) + { + GCM gcm = screenManager.AsDynamic().GCM; + gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); + + void OnExit() { } + + return (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); + } + + public static void BuildMenu(GameScreen gameScreen, int selectedIndex) + { + var d = gameScreen.AsDynamic(); + var emptyList = new object[0].ToList(MenuEntryType); + + d._menuTitle = "QoL Menu"; + + ((object)d._primaryMenuCollection).AsDynamic()._entries = emptyList; + ((object)d._memoriesInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._lettersInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._filesInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._questInventory).AsDynamic()._entries = emptyList; + ((object)d._bestiaryInventory).AsDynamic()._entries = emptyList; + ((object)d._featsInventory).AsDynamic()._entries = emptyList; + + var menuList = new object[0].ToList(MenuEntryType); + + void AddEntry(string label, Action onSelect, string description) + { + int idx = ((IList)menuList).Count; + var entry = MenuEntry.Create(label, _ => { onSelect(); BuildMenu(gameScreen, idx); }); + entry.IsCenterAligned = false; + entry.DoesDrawLargeShadow = false; + entry.Description = description; + ((IList)menuList).Add(entry.AsTimeSpinnerMenuEntry()); + } + + AddEntry(GetCutsceneLabel(), () => { QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; QoLSettings.Save(); }, "Automatically skips cutscenes without any button press."); + AddEntry(GetDialogueLabel(), () => { QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; QoLSettings.Save(); }, "Dialogue boxes advance instantly without input."); + AddEntry(GetStackCapLabel(), () => { var steps = new[] { 9, 25, 50, 99 }; var idx2 = Array.IndexOf(steps, QoLSettings.Current.StackCap); QoLSettings.Current.StackCap = steps[(idx2 + 1) % steps.Length]; QoLSettings.Save(); }, "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."); + AddEntry(GetFastToastLabel(), () => { QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; QoLSettings.Save(); }, "Fast: toasts appear and disappear instantly. Vanilla: original timing."); + AddEntry(GetToastBlockLabel(), () => { QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; QoLSettings.Save(); }, "On: toasts freeze movement (vanilla). Off: toasts never block movement."); + + var questCol = ((object)d._questInventory); + questCol.AsDynamic()._entries = menuList; + d.ChangeMenuCollection(questCol, false); + ((object)d._selectedMenuCollection).AsDynamic().SetSelectedIndex(selectedIndex); + } + + static string GetCutsceneLabel() => + $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; + + static string GetDialogueLabel() => + $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; + + static string GetStackCapLabel() => + $"Stack Cap: {QoLSettings.Current.StackCap}"; + + static string GetFastToastLabel() => + $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; + + static string GetToastBlockLabel() => + $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; + } +} \ No newline at end of file From 479b0c32ef3c19196b4c083ff16ca4eab6dada31 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:47:16 -0500 Subject: [PATCH 50/68] Adding QoL patches without harmony --- TsRandomizer/Screens/GameSettingsScreen.cs | 64 +++++++++++++--------- TsRandomizer/Screens/GameplayScreen.cs | 56 ++++++++++++++++--- TsRandomizer/Screens/OptionsMenuScreen.cs | 14 ++++- TsRandomizer/Screens/ShopMenuScreen.cs | 35 ++++++++---- 4 files changed, 120 insertions(+), 49 deletions(-) diff --git a/TsRandomizer/Screens/GameSettingsScreen.cs b/TsRandomizer/Screens/GameSettingsScreen.cs index 0ce2ecc5..ebc05844 100644 --- a/TsRandomizer/Screens/GameSettingsScreen.cs +++ b/TsRandomizer/Screens/GameSettingsScreen.cs @@ -14,8 +14,8 @@ namespace TsRandomizer.Screens { - [TimeSpinnerType("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen")] - // ReSharper disable once UnusedMember.Global + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen")] + // ReSharper disable once UnusedMember.Global class GameSettingsScreen : Screen { static readonly Type MenuEntryType = @@ -25,6 +25,7 @@ class GameSettingsScreen : Screen readonly SeedSelectionMenuScreen seedSelectionScreen; readonly OptionsMenuScreen optionsMenuScreen; + readonly bool isQoLMenu; GameSave save; SettingCollection settings; @@ -37,6 +38,12 @@ public override void Initialize(ItemLocationMap itemLocationMap, GCM gameContent { gcm = gameContentManager; + if (isQoLMenu) + { + QoLSettingsMenu.BuildMenu(GameScreen, 0); + return; + } + var gameplayScreen = ScreenManager.FirstOrDefault(); save = gameplayScreen?.Save; @@ -49,9 +56,9 @@ public override void Initialize(ItemLocationMap itemLocationMap, GCM gameContent Dynamic._menuTitle = "Randomizer Settings"; ResetMenu(); } - else - { - // Journal is being used as a journal, replace Feats and Quests with Objectives and Statistics + else + { + // Journal is being used as a journal, replace Feats and Quests with Objectives and Statistics SetStatistics(itemLocationMap); SetObjectives(); } @@ -66,8 +73,8 @@ public override void Unload() gcm.UpdateMinimapColors(settings); if (IsInGame) - { - var gameplayScreen = ScreenManager.FirstOrDefault(); + { + var gameplayScreen = ScreenManager.FirstOrDefault(); if (gameplayScreen != null) SpriteManager.ReloadCustomSprites(gameplayScreen.Level, gcm, settings); } @@ -78,8 +85,8 @@ public override void Unload() } } catch - { - // ignored + { + // ignored } } @@ -87,6 +94,8 @@ public GameSettingsScreen(ScreenManager screenManager, GameScreen passwordMenuSc { seedSelectionScreen = screenManager.FirstOrDefault(); optionsMenuScreen = screenManager.FirstOrDefault(); + isQoLMenu = QoLSettingsMenu.IsQoLMenuPending; + QoLSettingsMenu.IsQoLMenuPending = false; } public static GameScreen Create(ScreenManager screenManager) @@ -121,8 +130,8 @@ object CreateDefaultsMenu(GameSettingCategoryInfo[] menusToClear, bool isSubmenu } void OnDefaultsSelected(GameSettingCategoryInfo[] menusToClear, bool isSubmenu) - { - // Clear the root menu + { + // Clear the root menu if (!IsInGame && !isSubmenu) { settings = new SettingCollection(); @@ -135,7 +144,7 @@ void OnDefaultsSelected(GameSettingCategoryInfo[] menusToClear, bool isSubmenu) { var setting = settingsFunc(settings); - if(IsInGame && !setting.CanBeChangedInGame) + if (IsInGame && !setting.CanBeChangedInGame) continue; setting.SetDefault(); @@ -198,7 +207,7 @@ void CreateMenuForCategory(GameSettingCategoryInfo category) foreach (var settingFunc in category.SettingsPerCategory) submenu.Add(CreateMenuForSetting(settingFunc(settings)).AsTimeSpinnerMenuEntry()); - submenu.Add(CreateDefaultsMenu(new [] { category }, true)); + submenu.Add(CreateDefaultsMenu(new[] { category }, true)); Dynamic.ChangeMenuCollection(collection, true); ((object)Dynamic._selectedMenuCollection).AsDynamic().SetSelectedIndex(0); @@ -206,20 +215,22 @@ void CreateMenuForCategory(GameSettingCategoryInfo category) object FetchCollection(string submenu) { - dynamic collection; - // Multiple submenus can share the same inventory collection - // as the in-use collection is cleared before use. + dynamic collection; + // Multiple submenus can share the same inventory collection + // as the in-use collection is cleared before use. + switch (submenu) - { - // Currently using quest layout for most, other layouts may be useful for other menus - // Leaving as switch to easily add new menus as Memories, Letters, Files, Quests, Bestiary, Feats + { + // Currently using quest layout for most, other layouts may be useful for other menus + // Leaving as switch to easily add new menus as Memories, Letters, Files, Quests, Bestiary, Feats /* // TODO: Sprites needs a functional way to write a FeatsMenuEntry before we can properly preview sprites // and use this layout case "Sprites": collection = Dynamic._featsInventory; break; - */ + */ + default: collection = ((object)Dynamic._questInventory).AsDynamic(); break; @@ -266,6 +277,7 @@ void ToggleSetting(GameSetting setting) setting.UpdateMenuEntry(menuEntry); } + void SetStatistics(ItemLocationMap itemLocationMap) { var gameplayScreen = ScreenManager.FirstOrDefault(); @@ -303,14 +315,14 @@ void SetObjectives() menuEntry.AsDynamic().Text = "Goal: Dad Percent"; menuEntry.AsDynamic().Description = "Clear the boss fight at the top of Emperor's Tower."; } - menuEntry.AsDynamic()._isUnlocked = save.GetSaveBool("TsRandoGoalCleared"); - - // Remove all extra feat entries - // Currently bonus objectives are not available, only goals + menuEntry.AsDynamic()._isUnlocked = save.GetSaveBool("TsRandoGoalCleared"); + + // Remove all extra feat entries + // Currently bonus objectives are not available, only goals + var bonusTaskCount = 0; while (((IList)selectedMenu.Entries).Count > bonusTaskCount + 1) ((IList)selectedMenu.Entries).RemoveAt(bonusTaskCount + 1); - } } -} +} \ No newline at end of file diff --git a/TsRandomizer/Screens/GameplayScreen.cs b/TsRandomizer/Screens/GameplayScreen.cs index 4229474b..c8d3487f 100644 --- a/TsRandomizer/Screens/GameplayScreen.cs +++ b/TsRandomizer/Screens/GameplayScreen.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Reflection; using Archipelago.MultiClient.Net.Enums; using Microsoft.Xna.Framework; @@ -22,8 +23,8 @@ namespace TsRandomizer.Screens { - [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen")] - // ReSharper disable once UnusedMember.Global + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen")] + // ReSharper disable once UnusedMember.Global class GameplayScreen : Screen { static readonly MethodInfo LoadingScreenLoadMethod = TimeSpinnerType @@ -113,8 +114,8 @@ public override void Initialize(ItemLocationMap _, GCM gameContentManager) BestiaryManager.RefreshBossSaveFlags(Level); if (Seed.Options.Archipelago) - HandleArchipelago(settings); - + HandleArchipelago(settings); + #if DEBUG saveFile.DataKeyBools["TS_INSTAGIB"] = true; @@ -187,12 +188,50 @@ public override void Update(GameTime gameTime, InputState input) UpdateGenericScripts(Level); + if (QoLSettings.Current.AutoSkipCutscenes) + TrySkipCutscene(); + + if (QoLSettings.Current.AutoSkipDialogue) + TrySkipDialogue(); + #if DEBUG TimespinnerAfterDark(input); #endif HandleCurrentGifts(); } + void TrySkipCutscene() + { + var level = Level; + if (level == null) return; + + var levelDynamic = LevelReflected; + if (!(bool)levelDynamic.IsPlayerInputBlocked) return; + if ((bool)levelDynamic.IsActiveScriptUnskippable) return; + if ((bool)levelDynamic.IsDoingPlayerDeathCutscene) return; + + var activeScripts = (IList)levelDynamic._activeScripts; + foreach (var script in activeScripts) + { + var s = script.AsDynamic(); + if (s.ScriptType.ToString() == "CutsceneStart" && (float)s.Arguments.X >= 1f) + { + levelDynamic.SkipCutscene(); + Dynamic._isShowingSkipCutscenePrompt = false; + return; + } + } + } + + void TrySkipDialogue() + { + var dialogueBox = (object)Dynamic._currentDialogue; + if (dialogueBox == null) return; + var d = dialogueBox.AsDynamic(); + if ((bool)d.IsFinished) return; + d.FinishDialogue(); + } + void UpdateGenericScripts(Level level) { if (hpCap <= level.MainHero.MaxHP) @@ -271,7 +310,7 @@ void DrawReceivedGifts(SpriteBatch spriteBatch, SpriteFont menuFont) } void DrawRoomId(SpriteBatch spriteBatch, SpriteFont menuFont) - { + { #if DEBUG if (ItemLocations == null) return; @@ -287,7 +326,6 @@ void DrawRoomId(SpriteBatch spriteBatch, SpriteFont menuFont) #endif } - public void HideItemPickupBar() => ((object)Dynamic._itemGetBanner).AsDynamic()._displayTimer = 3f; public void ChangeItemPickupBar(string name) => ((object)Dynamic._itemGetBanner).AsDynamic()._itemName = name; @@ -301,8 +339,8 @@ public void ShowItemPickupBar(string name) itemBanner.ItemCategory = EInventoryCategoryType.UseItem; itemBanner._itemName = name; itemBanner._displayTimer = 0f; - } - + } + #if DEBUG void TimespinnerAfterDark(InputState input) { @@ -317,4 +355,4 @@ void TimespinnerAfterDark(InputState input) } #endif } -} +} \ No newline at end of file diff --git a/TsRandomizer/Screens/OptionsMenuScreen.cs b/TsRandomizer/Screens/OptionsMenuScreen.cs index 76d9c0a4..caff442a 100644 --- a/TsRandomizer/Screens/OptionsMenuScreen.cs +++ b/TsRandomizer/Screens/OptionsMenuScreen.cs @@ -10,8 +10,8 @@ namespace TsRandomizer.Screens { - [TimeSpinnerType("Timespinner.GameStateManagement.Screens.PauseMenu.OptionsMenuScreen")] - // ReSharper disable once UnusedMember.Global + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.PauseMenu.OptionsMenuScreen")] + // ReSharper disable once UnusedMember.Global class OptionsMenuScreen : Screen { static readonly Type MainMenuEntryType = TimeSpinnerType.Get("Timespinner.GameStateManagement.MenuEntry"); @@ -23,6 +23,7 @@ public OptionsMenuScreen(ScreenManager screenManager, GameScreen gameScreen) : b public override void Initialize(ItemLocationMap itemLocationMap, GCM gameContentManager) { AddSettingButton(MenuEntry.Create("Randomizer Settings", OpenSettingsMenu)); + AddSettingButton(MenuEntry.Create("Randomizer QoL Settings", OpenQoLSettingsMenu)); } void AddSettingButton(MenuEntry settingButton) @@ -42,5 +43,12 @@ void OpenSettingsMenu(PlayerIndex playerIndex) ScreenManager.AddScreen(gameSettingsMenu, playerIndex); } + + void OpenQoLSettingsMenu(PlayerIndex playerIndex) + { + QoLSettingsMenu.IsQoLMenuPending = true; + var qolMenu = QoLSettingsMenu.Create(ScreenManager); + ScreenManager.AddScreen(qolMenu, playerIndex); + } } -} +} \ No newline at end of file diff --git a/TsRandomizer/Screens/ShopMenuScreen.cs b/TsRandomizer/Screens/ShopMenuScreen.cs index b81890b7..48d2f9a5 100644 --- a/TsRandomizer/Screens/ShopMenuScreen.cs +++ b/TsRandomizer/Screens/ShopMenuScreen.cs @@ -8,17 +8,19 @@ namespace TsRandomizer.Screens { - [TimeSpinnerType("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen")] - // ReSharper disable once UnusedMember.Global + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen")] + // ReSharper disable once UnusedMember.Global class ShopMenuScreen : Screen { public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(screenManager, screen) { - var gameSettings = ((GameSave)Dynamic._saveFile).GetSettings(); - - // Menu count varies on relics/items/equipment etc. being in inventory - // Last menu is always helper functions that don't have an _items - // but aren't otherwise distinguishable + var gameSettings = ((GameSave)Dynamic._saveFile).GetSettings(); + + // Menu count varies on relics/items/equipment etc. being in inventory + // Last menu is always helper functions that don't have an _items + // but aren't otherwise distinguishable + + foreach (var i in Enumerable.Range(0, ((IList)Dynamic._subMenuCollections).Count - 1)) { var shopMenu = ((IList)Dynamic._subMenuCollections)[i].AsDynamic(); @@ -32,17 +34,28 @@ public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(scr item.IsSellable = false; dynamicShopMenuEntry.ShopPrice = -1; } - + int currentPrice = dynamicShopMenuEntry.ShopPrice; if (currentPrice == 0) - { - // Set a price for "priceless" items + { + // Set a price for "priceless" items + dynamicShopMenuEntry.ShopPrice = 2000; currentPrice = dynamicShopMenuEntry.ShopPrice; } dynamicShopMenuEntry.ShopPrice = (int)(currentPrice * gameSettings.ShopMultiplier.Value); + + if (item is InventoryUseItem useItem) + { + var type = useItem.UseItemType; + if (type != EInventoryUseItemType.MagicMarbles + && type != EInventoryUseItemType.EssenceCrystal + && type != EInventoryUseItemType.GoldRing + && type != EInventoryUseItemType.GoldNecklace) + useItem.StackCap = QoLSettings.Current.StackCap; + } } } } } -} +} \ No newline at end of file From 78f7e62e5350ffd785d75628ba2a6c4a96e176d3 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:48:12 -0500 Subject: [PATCH 51/68] Adding QoL patches without harmony --- TsRandomizer/LevelObjects/ItemManipulator.cs | 35 +++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/TsRandomizer/LevelObjects/ItemManipulator.cs b/TsRandomizer/LevelObjects/ItemManipulator.cs index 4792976b..6c9e92d1 100644 --- a/TsRandomizer/LevelObjects/ItemManipulator.cs +++ b/TsRandomizer/LevelObjects/ItemManipulator.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Linq; using Timespinner.GameAbstractions.Gameplay; +using Timespinner.GameAbstractions.Inventory; +using Timespinner.GameAbstractions.Saving; using Timespinner.GameObjects.BaseClasses; using TsRandomizer.Extensions; using TsRandomizer.IntermediateObjects; @@ -32,7 +34,7 @@ abstract class ItemManipulator : LevelObject public readonly ItemInfo ItemInfo; public readonly ItemLocation ItemLocation; - protected ItemManipulator(Mobile typedObject, GameplayScreen gameplayScreen, ItemLocation itemLocation) + protected ItemManipulator(Mobile typedObject, GameplayScreen gameplayScreen, ItemLocation itemLocation) : base(typedObject, gameplayScreen) { ItemInfo = itemLocation?.ItemInfo; @@ -46,6 +48,8 @@ protected void AwardContainedItem() if (ItemInfo.Identifier.LootType == LootType.ConstRelic) LevelReflected.UnlockRelic(ItemInfo.Identifier.Relic); + ApplyStackCap(Level.GameSave); + OnItemPickup(); } @@ -60,6 +64,27 @@ protected void OnItemPickup() public static void Initialize(ItemLocationMap itemLocations) => itemLocationMap = itemLocations; + public static void ApplyStackCap(GameSave save) + { + int cap = QoLSettings.Current.StackCap; + var inventory = save.Inventory.UseItemInventory.Inventory; + + foreach (var kvp in inventory) + { + var item = kvp.Value; + + // Leave special currency items at vanilla cap + var type = (EInventoryUseItemType)kvp.Key; + if (type == EInventoryUseItemType.MagicMarbles + || type == EInventoryUseItemType.EssenceCrystal + || type == EInventoryUseItemType.GoldRing + || type == EInventoryUseItemType.GoldNecklace) + continue; + + item.StackCap = cap; + } + } + public static ItemManipulator GenerateShadowObject( Type levelObjectType, Mobile obj, GameplayScreen gameplayScreen, ItemLocationMap itemLocations) { @@ -67,8 +92,8 @@ public static ItemManipulator GenerateShadowObject( var itemLocation = itemLocations[itemKey]; if (itemLocation == null) - { - //Console.Out.WriteLine($"UnmappedItem: {itemKey}"); + { + //Console.Out.WriteLine($"UnmappedItem: {itemKey}"); return null; } @@ -80,7 +105,7 @@ protected void ShowItemAwardPopup() if (ItemInfo is CustomItem customItem) GameplayScreen.ShowItemPickupBar(customItem.Name); else if (ItemInfo is ProgressiveItemInfo progressiveItem) - Level.ShowItemAwardPopup(progressiveItem.PreviousItem.Identifier); //since this script runs delayed, the item will already have updated + Level.ShowItemAwardPopup(progressiveItem.PreviousItem.Identifier); //since this script runs delayed, the item will already have updated else Level.ShowItemAwardPopup(ItemInfo.Identifier); } @@ -100,4 +125,4 @@ protected void UpdateRelicOrbGetToastToItem() reflectedScript.Arguments = ScriptActionQueueExtensions.ReplacedArguments; } } -} +} \ No newline at end of file From 761eefe1e1919a486d4c63e6a82873abec1985a5 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:49:03 -0500 Subject: [PATCH 52/68] Adding QoL patches without harmony From 7e20fd405fdb502e7681f4f649e5ed8d7fc09920 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:24:07 -0500 Subject: [PATCH 53/68] Adding QoL patches without harmony --- TsRandomizer/Screens/ScreenManager.cs | 102 ++++++++++++++++++++------ 1 file changed, 78 insertions(+), 24 deletions(-) diff --git a/TsRandomizer/Screens/ScreenManager.cs b/TsRandomizer/Screens/ScreenManager.cs index dffc950f..f6819b0a 100644 --- a/TsRandomizer/Screens/ScreenManager.cs +++ b/TsRandomizer/Screens/ScreenManager.cs @@ -19,20 +19,57 @@ class ScreenManager : Timespinner.GameStateManagement.ScreenManager.ScreenManage { static readonly Type GamePlayScreenType = TimeSpinnerType.Get("Timespinner.GameStateManagement.Screens.InGame.GameplayScreen"); + static readonly Type BaseToastPopupType = + TimeSpinnerType.Get("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"); + + static readonly System.Reflection.FieldInfo FreezeField = + BaseToastPopupType.GetField("_doesFreezeGameplay", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.FieldInfo TimeToWaitField = + BaseToastPopupType.GetField("_timeToWait", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.FieldInfo TotalDisplayField = + BaseToastPopupType.GetField("_totalDisplayTime", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.FieldInfo TimeBeforeFlashingField = + BaseToastPopupType.GetField("_timeBeforeFlashing", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.FieldInfo TimeToFlashField = + BaseToastPopupType.GetField("_timeToFlash", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.FieldInfo TimeToFadeField = + BaseToastPopupType.GetField("_timeToFade", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.PropertyInfo IsOverlayProp = + BaseToastPopupType.BaseType?.GetProperty("IsOverlayScreen", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.PropertyInfo WaitForInputProp = + BaseToastPopupType.GetProperty("DoesWaitForInputToFinish", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.PropertyInfo HasReceivedInputProp = + BaseToastPopupType.GetProperty("HasReceivedInputToClose", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + static readonly string LevelUpToastTypeName = + "Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"; + static readonly System.Reflection.FieldInfo ControlTimerField = + TimeSpinnerType.Get(LevelUpToastTypeName) + .GetField("_controlTimer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + // Only patch toasts that relate to item/level pickups. + // AreaTitleToast (room name on screen transition) must be left alone. + static readonly HashSet PatchableToastTypeNames = new HashSet + { + "Timespinner.GameStateManagement.Screens.InGame.Toasts.RelicOrbGetToast", + "Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast", + "Timespinner.GameStateManagement.Screens.InGame.Toasts.OrbLevelUpToast", + "Timespinner.GameStateManagement.Screens.InGame.Toasts.StatMaxUpToast", + "Timespinner.GameStateManagement.Screens.InGame.Toasts.QuestCompleteToast", + }; readonly LookupDictionary hookedScreens = new LookupDictionary(s => s.GameScreen); readonly List foundScreens = new List(20); + readonly HashSet toastScreensPatched = new HashSet(); ItemLocationMap itemLocationMap; public readonly dynamic Dynamic; - public GCM GameContentManager => Dynamic.GCM; - + public static Log Log; public static GameConsole Console; - public static bool IsConsoleOpen; public ScreenManager(TimespinnerGame game, PlatformHelper platformHelper) : base(game, platformHelper) @@ -43,34 +80,29 @@ public ScreenManager(TimespinnerGame game, PlatformHelper platformHelper) : base protected override void LoadContent() { base.LoadContent(); - GameContentManager.LatinFont.DefaultCharacter = '?'; - Log = new Log(); Console = new GameConsole(this, GameContentManager); - Console.AddCommand(new ConnectCommand(this)); } public override void Update(GameTime gameTime) { var input = (InputState)Dynamic._input; - DetectNewScreens(); UpdateScreens(gameTime, input); - Overlay.UpdateAll(gameTime, input, Jukebox); - if (input.IsNewKeyPress(Keys.OemTilde)) ToggleConsole(); - - base.Update(gameTime); + base.Update(gameTime); + // Apply AFTER base.Update so we overwrite whatever the toast's own + // Update just set — otherwise we lose the race every frame. + ForceToastSettings(); } public void ToggleConsole() { IsConsoleOpen = !IsConsoleOpen; - if (IsConsoleOpen) AddScreen(Console, null); else @@ -80,42 +112,65 @@ public void ToggleConsole() public override void Draw(GameTime gameTime) { base.Draw(gameTime); - DrawGameplayScreens(); - Overlay.DrawAll(SpriteBatch, new Rectangle(0, 0, ScreenSize.X, ScreenSize.Y), GameContentManager); } void DetectNewScreens() { foundScreens.Clear(); - foreach (var screen in GetScreens()) { if (hookedScreens.Contains(screen)) { foundScreens.Add(screen); - if (screen.GetType() == GamePlayScreenType) itemLocationMap = ((GameplayScreen)hookedScreens[screen]).ItemLocations; - continue; } - - if(!Screen.RegisteredTypes.TryGetValue(screen.GetType(), out var handlerType)) + if (!Screen.RegisteredTypes.TryGetValue(screen.GetType(), out var handlerType)) continue; - var screenHandler = (Screen)Activator.CreateInstance(handlerType, this, screen); hookedScreens.Add(screenHandler); foundScreens.Add(screen); - screenHandler.Initialize(itemLocationMap, GameContentManager); } - if (foundScreens.Count != hookedScreens.Count) hookedScreens.Filter(foundScreens, s => s.Unload()); } + void ForceToastSettings() + { + foreach (var screen in GetScreens()) + if (BaseToastPopupType.IsInstanceOfType(screen) + && PatchableToastTypeNames.Contains(screen.GetType().FullName)) + ApplyToastSettings(screen); + } + + static void ApplyToastSettings(GameScreen screen) + { + if (QoLSettings.Current.FastToastPopups) + { + TimeToWaitField.SetValue(screen, 0f); + WaitForInputProp?.SetValue(screen, false); + HasReceivedInputProp?.SetValue(screen, true); + + float before = (float)TimeBeforeFlashingField.GetValue(screen); + float flash = (float)TimeToFlashField.GetValue(screen); + float fade = (float)TimeToFadeField.GetValue(screen); + TotalDisplayField.SetValue(screen, before + flash + fade); + } + + if (!QoLSettings.Current.ToastsBlockMovement) + { + FreezeField.SetValue(screen, false); + IsOverlayProp?.SetValue(screen, true); + + if (screen.GetType().FullName == LevelUpToastTypeName) + ControlTimerField?.SetValue(screen, 0.75f); + } + } + void UpdateScreens(GameTime gameTime, InputState input) { foreach (var screen in hookedScreens) @@ -135,7 +190,6 @@ public void CopyScreensFrom(Timespinner.GameStateManagement.ScreenManager.Screen } public T FirstOrDefault() where T : Screen => (T)hookedScreens.FirstOrDefault(s => s.GetType() == typeof(T)); - public GameScreen FirstOrDefaultTimespinnerOfType(Type type) => ((List)Dynamic._screens).FirstOrDefault(s => s.GetType() == type); } -} +} \ No newline at end of file From 626e85f82bd00b534f81d886011b871617a55da6 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:26:33 -0500 Subject: [PATCH 54/68] Delete our_QoL_mod_-_notes.png --- our_QoL_mod_-_notes.png | Bin 125102 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 our_QoL_mod_-_notes.png diff --git a/our_QoL_mod_-_notes.png b/our_QoL_mod_-_notes.png deleted file mode 100644 index 9f26375546bfa26f22b88bd8fcfdad54f63768e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125102 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 GgMh&E>0B~rwT)TqT~4}S#0vSt6@deuu1VkU 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 MvT8ClQs$rj2f85z_5c6? From cc7e02c92bc8dc7e823c0ce008ba91967d74f297 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:29:34 -0500 Subject: [PATCH 55/68] Delete TsRandomizer/Settings/QoLSettingsMenu.cs1 --- TsRandomizer/Settings/QoLSettingsMenu.cs | 87 ------------------------ 1 file changed, 87 deletions(-) delete mode 100644 TsRandomizer/Settings/QoLSettingsMenu.cs diff --git a/TsRandomizer/Settings/QoLSettingsMenu.cs b/TsRandomizer/Settings/QoLSettingsMenu.cs deleted file mode 100644 index 9f7b2bfd..00000000 --- a/TsRandomizer/Settings/QoLSettingsMenu.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections; -using Microsoft.Xna.Framework; -using Timespinner.GameAbstractions; -using Timespinner.GameAbstractions.Saving; -using TsRandomizer.Extensions; -using TsRandomizer.Screens.Menu; -using TsRandomizer.IntermediateObjects; -using ScreenManager = Timespinner.GameStateManagement.ScreenManager.ScreenManager; -using GameScreen = Timespinner.GameStateManagement.ScreenManager.GameScreen; - -namespace TsRandomizer.Screens -{ - public static class QoLSettingsMenu - { - static readonly Type JournalMenuType = - TimeSpinnerType.Get("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); - static readonly Type MenuEntryType = - TimeSpinnerType.Get("Timespinner.GameStateManagement.MenuEntry"); - - public static bool IsQoLMenuPending { get; set; } - - internal static GameScreen Create(ScreenManager screenManager) - { - GCM gcm = screenManager.AsDynamic().GCM; - gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); - - void OnExit() { } - - return (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); - } - - public static void BuildMenu(GameScreen gameScreen, int selectedIndex) - { - var d = gameScreen.AsDynamic(); - var emptyList = new object[0].ToList(MenuEntryType); - - d._menuTitle = "QoL Menu"; - - ((object)d._primaryMenuCollection).AsDynamic()._entries = emptyList; - ((object)d._memoriesInventoryCollection).AsDynamic()._entries = emptyList; - ((object)d._lettersInventoryCollection).AsDynamic()._entries = emptyList; - ((object)d._filesInventoryCollection).AsDynamic()._entries = emptyList; - ((object)d._questInventory).AsDynamic()._entries = emptyList; - ((object)d._bestiaryInventory).AsDynamic()._entries = emptyList; - ((object)d._featsInventory).AsDynamic()._entries = emptyList; - - var menuList = new object[0].ToList(MenuEntryType); - - void AddEntry(string label, Action onSelect, string description) - { - int idx = ((IList)menuList).Count; - var entry = MenuEntry.Create(label, _ => { onSelect(); BuildMenu(gameScreen, idx); }); - entry.IsCenterAligned = false; - entry.DoesDrawLargeShadow = false; - entry.Description = description; - ((IList)menuList).Add(entry.AsTimeSpinnerMenuEntry()); - } - - AddEntry(GetCutsceneLabel(), () => { QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; QoLSettings.Save(); }, "Automatically skips cutscenes without any button press."); - AddEntry(GetDialogueLabel(), () => { QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; QoLSettings.Save(); }, "Dialogue boxes advance instantly without input."); - AddEntry(GetStackCapLabel(), () => { var steps = new[] { 9, 25, 50, 99 }; var idx2 = Array.IndexOf(steps, QoLSettings.Current.StackCap); QoLSettings.Current.StackCap = steps[(idx2 + 1) % steps.Length]; QoLSettings.Save(); }, "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."); - AddEntry(GetFastToastLabel(), () => { QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; QoLSettings.Save(); }, "Fast: toasts appear and disappear instantly. Vanilla: original timing."); - AddEntry(GetToastBlockLabel(), () => { QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; QoLSettings.Save(); }, "On: toasts freeze movement (vanilla). Off: toasts never block movement."); - - var questCol = ((object)d._questInventory); - questCol.AsDynamic()._entries = menuList; - d.ChangeMenuCollection(questCol, false); - ((object)d._selectedMenuCollection).AsDynamic().SetSelectedIndex(selectedIndex); - } - - static string GetCutsceneLabel() => - $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; - - static string GetDialogueLabel() => - $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; - - static string GetStackCapLabel() => - $"Stack Cap: {QoLSettings.Current.StackCap}"; - - static string GetFastToastLabel() => - $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; - - static string GetToastBlockLabel() => - $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; - } -} \ No newline at end of file From a5591514a295095b1bef5845a19aa2d3214fec6a Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:30:01 -0500 Subject: [PATCH 56/68] Adding QoL patches without harmony --- TsRandomizer/Screens/Menu/QoLSettingsMenu.cs | 87 ++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 TsRandomizer/Screens/Menu/QoLSettingsMenu.cs diff --git a/TsRandomizer/Screens/Menu/QoLSettingsMenu.cs b/TsRandomizer/Screens/Menu/QoLSettingsMenu.cs new file mode 100644 index 00000000..9f7b2bfd --- /dev/null +++ b/TsRandomizer/Screens/Menu/QoLSettingsMenu.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections; +using Microsoft.Xna.Framework; +using Timespinner.GameAbstractions; +using Timespinner.GameAbstractions.Saving; +using TsRandomizer.Extensions; +using TsRandomizer.Screens.Menu; +using TsRandomizer.IntermediateObjects; +using ScreenManager = Timespinner.GameStateManagement.ScreenManager.ScreenManager; +using GameScreen = Timespinner.GameStateManagement.ScreenManager.GameScreen; + +namespace TsRandomizer.Screens +{ + public static class QoLSettingsMenu + { + static readonly Type JournalMenuType = + TimeSpinnerType.Get("Timespinner.GameStateManagement.Screens.PauseMenu.JournalMenuScreen"); + static readonly Type MenuEntryType = + TimeSpinnerType.Get("Timespinner.GameStateManagement.MenuEntry"); + + public static bool IsQoLMenuPending { get; set; } + + internal static GameScreen Create(ScreenManager screenManager) + { + GCM gcm = screenManager.AsDynamic().GCM; + gcm.LoadAllResources(screenManager.AsDynamic().GeneralContentManager, screenManager.GraphicsDevice); + + void OnExit() { } + + return (GameScreen)Activator.CreateInstance(JournalMenuType, GameSave.DemoSave, gcm, (Action)OnExit); + } + + public static void BuildMenu(GameScreen gameScreen, int selectedIndex) + { + var d = gameScreen.AsDynamic(); + var emptyList = new object[0].ToList(MenuEntryType); + + d._menuTitle = "QoL Menu"; + + ((object)d._primaryMenuCollection).AsDynamic()._entries = emptyList; + ((object)d._memoriesInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._lettersInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._filesInventoryCollection).AsDynamic()._entries = emptyList; + ((object)d._questInventory).AsDynamic()._entries = emptyList; + ((object)d._bestiaryInventory).AsDynamic()._entries = emptyList; + ((object)d._featsInventory).AsDynamic()._entries = emptyList; + + var menuList = new object[0].ToList(MenuEntryType); + + void AddEntry(string label, Action onSelect, string description) + { + int idx = ((IList)menuList).Count; + var entry = MenuEntry.Create(label, _ => { onSelect(); BuildMenu(gameScreen, idx); }); + entry.IsCenterAligned = false; + entry.DoesDrawLargeShadow = false; + entry.Description = description; + ((IList)menuList).Add(entry.AsTimeSpinnerMenuEntry()); + } + + AddEntry(GetCutsceneLabel(), () => { QoLSettings.Current.AutoSkipCutscenes = !QoLSettings.Current.AutoSkipCutscenes; QoLSettings.Save(); }, "Automatically skips cutscenes without any button press."); + AddEntry(GetDialogueLabel(), () => { QoLSettings.Current.AutoSkipDialogue = !QoLSettings.Current.AutoSkipDialogue; QoLSettings.Save(); }, "Dialogue boxes advance instantly without input."); + AddEntry(GetStackCapLabel(), () => { var steps = new[] { 9, 25, 50, 99 }; var idx2 = Array.IndexOf(steps, QoLSettings.Current.StackCap); QoLSettings.Current.StackCap = steps[(idx2 + 1) % steps.Length]; QoLSettings.Save(); }, "Maximum stack size for consumable items. Click to cycle: 9, 25, 50, 99. Shop cap mirrors this value (restart required for shop to apply)."); + AddEntry(GetFastToastLabel(), () => { QoLSettings.Current.FastToastPopups = !QoLSettings.Current.FastToastPopups; QoLSettings.Save(); }, "Fast: toasts appear and disappear instantly. Vanilla: original timing."); + AddEntry(GetToastBlockLabel(), () => { QoLSettings.Current.ToastsBlockMovement = !QoLSettings.Current.ToastsBlockMovement; QoLSettings.Save(); }, "On: toasts freeze movement (vanilla). Off: toasts never block movement."); + + var questCol = ((object)d._questInventory); + questCol.AsDynamic()._entries = menuList; + d.ChangeMenuCollection(questCol, false); + ((object)d._selectedMenuCollection).AsDynamic().SetSelectedIndex(selectedIndex); + } + + static string GetCutsceneLabel() => + $"Auto Skip Cutscenes: {(QoLSettings.Current.AutoSkipCutscenes ? "On" : "Off")}"; + + static string GetDialogueLabel() => + $"Auto Skip Dialogue: {(QoLSettings.Current.AutoSkipDialogue ? "On" : "Off")}"; + + static string GetStackCapLabel() => + $"Stack Cap: {QoLSettings.Current.StackCap}"; + + static string GetFastToastLabel() => + $"Toast Popup Speed: {(QoLSettings.Current.FastToastPopups ? "Fast" : "Vanilla")}"; + + static string GetToastBlockLabel() => + $"Toasts Block Movement: {(QoLSettings.Current.ToastsBlockMovement ? "On" : "Off")}"; + } +} \ No newline at end of file From 287572393a6c46a4e2110b35f05a0b48cb882676 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:30:40 -0500 Subject: [PATCH 57/68] Adding QoL patches without harmony From c00e5c5589146e17841ed5c112a4228a2cb1170d Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:31:11 -0500 Subject: [PATCH 58/68] Adding QoL patches without harmony --- TsRandomizer/TsRandomizer.csproj | 15 ++++----------- TsRandomizer/TsRandomizer.csproj.user | 6 ++++++ 2 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 TsRandomizer/TsRandomizer.csproj.user diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 265cdd8d..16f8e0ae 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -98,9 +98,6 @@ prompt - - ..\packages\Lib.Harmony.2.4.2\lib\net48\0Harmony.dll - ..\packages\Archipelago.Gifting.Net.0.4.4\lib\net452\Archipelago.Gifting.Net.dll @@ -129,13 +126,10 @@ - - - - - - - + + + + @@ -304,7 +298,6 @@ - diff --git a/TsRandomizer/TsRandomizer.csproj.user b/TsRandomizer/TsRandomizer.csproj.user new file mode 100644 index 00000000..ca342d1e --- /dev/null +++ b/TsRandomizer/TsRandomizer.csproj.user @@ -0,0 +1,6 @@ + + + + ShowAllFiles + + \ No newline at end of file From a4ec1fe169d57e5832ceebf94f57db80e90fec8b Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:32:05 -0500 Subject: [PATCH 59/68] Adding QoL patches without harmony --- TsRandomizer/TsRandomizer.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 16f8e0ae..23f74900 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -129,7 +129,7 @@ - + From 6eb1f2b03072f33dadd1ffb633e40cdc9554c315 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:34:00 -0500 Subject: [PATCH 60/68] Adding QoL patches without harmony --- TsRandomizer/Screens/ToastPopupScreen.cs | 102 +++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 TsRandomizer/Screens/ToastPopupScreen.cs diff --git a/TsRandomizer/Screens/ToastPopupScreen.cs b/TsRandomizer/Screens/ToastPopupScreen.cs new file mode 100644 index 00000000..2aa1065d --- /dev/null +++ b/TsRandomizer/Screens/ToastPopupScreen.cs @@ -0,0 +1,102 @@ +using Microsoft.Xna.Framework; +using Timespinner.GameAbstractions; +using Timespinner.GameStateManagement.ScreenManager; +using TsRandomizer.IntermediateObjects; +using TsRandomizer.Randomisation; + +namespace TsRandomizer.Screens +{ + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup")] + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.Toasts.RelicOrbGetToast")] + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast")] + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.Toasts.OrbLevelUpToast")] + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.Toasts.StatMaxUpToast")] + [TimeSpinnerType("Timespinner.GameStateManagement.Screens.InGame.Toasts.QuestCompleteToast")] + // ReSharper disable once UnusedMember.Global + class ToastPopupScreen : Screen + { + static readonly string BaseToastTypeName = + "Timespinner.GameStateManagement.Screens.InGame.BaseToastPopup"; + static readonly string LevelUpToastTypeName = + "Timespinner.GameStateManagement.Screens.InGame.Toasts.CharacterLevelUpToast"; + + // Cached via reflection once, reused across all toast instances + static System.Reflection.FieldInfo _freezeField; + static System.Reflection.FieldInfo _timeToWaitField; + static System.Reflection.FieldInfo _totalDisplayField; + static System.Reflection.FieldInfo _timeBeforeFlashingField; + static System.Reflection.FieldInfo _timeToFlashField; + static System.Reflection.FieldInfo _timeToFadeField; + static System.Reflection.PropertyInfo _isOverlayProp; + static System.Reflection.PropertyInfo _waitForInputProp; + static System.Reflection.PropertyInfo _hasReceivedInputProp; + static System.Reflection.FieldInfo _controlTimerField; + + bool _isLevelUpToast; + + public ToastPopupScreen(ScreenManager screenManager, GameScreen gameScreen) + : base(screenManager, gameScreen) + { + } + + public override void Initialize(ItemLocationMap itemLocationMap, GCM gameContentManager) + { + _isLevelUpToast = GameScreen.GetType().FullName == LevelUpToastTypeName; + + var flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance; + var publicFlags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance; + + if (_freezeField == null) + { + var baseType = TimeSpinnerType.Get(BaseToastTypeName); + var levelUpType = TimeSpinnerType.Get(LevelUpToastTypeName); + + _freezeField = baseType.GetField("_doesFreezeGameplay", flags); + _timeToWaitField = baseType.GetField("_timeToWait", flags); + _totalDisplayField = baseType.GetField("_totalDisplayTime", flags); + _timeBeforeFlashingField = baseType.GetField("_timeBeforeFlashing", flags); + _timeToFlashField = baseType.GetField("_timeToFlash", flags); + _timeToFadeField = baseType.GetField("_timeToFade", flags); + _isOverlayProp = GameScreen.GetType().BaseType?.GetProperty("IsOverlayScreen", publicFlags); + _waitForInputProp = baseType.GetProperty("DoesWaitForInputToFinish", publicFlags); + _hasReceivedInputProp = baseType.GetProperty("HasReceivedInputToClose", publicFlags); + _controlTimerField = levelUpType.GetField("_controlTimer", flags); + } + + // FastToastPopups: collapse the wait phase to zero so the toast flies through + if (QoLSettings.Current.FastToastPopups) + { + _timeToWaitField.SetValue(GameScreen, 0f); + + float before = (float)_timeBeforeFlashingField.GetValue(GameScreen); + float flash = (float)_timeToFlashField.GetValue(GameScreen); + float fade = (float)_timeToFadeField.GetValue(GameScreen); + _totalDisplayField.SetValue(GameScreen, before + flash + fade); + } + + // ToastsBlockMovement: control whether the toast freezes gameplay + if (!QoLSettings.Current.ToastsBlockMovement) + { + _freezeField.SetValue(GameScreen, false); + _isOverlayProp?.SetValue(GameScreen, true); + + // CharacterLevelUpToast has its own _controlTimer that stalls input + if (_isLevelUpToast) + _controlTimerField?.SetValue(GameScreen, 0.75f); + } + } + + public override void Update(GameTime gameTime, InputState input) + { + // FastToastPopups suppresses the button-press requirement. + // The original Harmony patch blocked set_DoesWaitForInputToFinish globally + // on all toasts. We replicate that by overriding every frame, since + // RelicOrbGetToast sets it back to true during its own update/script handling. + if (QoLSettings.Current.FastToastPopups) + { + _waitForInputProp?.SetValue(GameScreen, false); + _hasReceivedInputProp?.SetValue(GameScreen, true); + } + } + } +} \ No newline at end of file From a384e9518547727f1bd00af27452438a650ab018 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Sat, 28 Feb 2026 12:15:00 -0500 Subject: [PATCH 61/68] bugfix fixed a bug where stackcap was not applied properly --- TsRandomizer/Screens/GameplayScreen.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TsRandomizer/Screens/GameplayScreen.cs b/TsRandomizer/Screens/GameplayScreen.cs index c8d3487f..b8a6f53c 100644 --- a/TsRandomizer/Screens/GameplayScreen.cs +++ b/TsRandomizer/Screens/GameplayScreen.cs @@ -105,6 +105,7 @@ public override void Initialize(ItemLocationMap _, GCM gameContentManager) ItemTrackerUplink.UpdateState(ItemTrackerState.FromItemLocationMap(ItemLocations)); ItemManipulator.Initialize(ItemLocations); + ItemManipulator.ApplyStackCap(Level.GameSave); if (settings.DamageRando.Value != "Off") OrbDamageManager.PopulateOrbLookups(Level.GameSave, settings.DamageRando.Value, settings.DamageRandoOverrides.Value); @@ -193,6 +194,8 @@ public override void Update(GameTime gameTime, InputState input) if (QoLSettings.Current.AutoSkipDialogue) TrySkipDialogue(); + if (QoLSettings.Current.StackCap != 9) + ItemManipulator.ApplyStackCap(Level.GameSave); #if DEBUG TimespinnerAfterDark(input); From 552a328e8d936444da0810ddcd41911c6ea72039 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:04:06 -0500 Subject: [PATCH 62/68] bugfix fix for accounting for stack cap in shops and being able to buy more items than the vanilla amount --- TsRandomizer/Screens/ShopMenuScreen.cs | 75 ++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/TsRandomizer/Screens/ShopMenuScreen.cs b/TsRandomizer/Screens/ShopMenuScreen.cs index 48d2f9a5..987ce598 100644 --- a/TsRandomizer/Screens/ShopMenuScreen.cs +++ b/TsRandomizer/Screens/ShopMenuScreen.cs @@ -1,5 +1,8 @@ using System.Collections; using System.Linq; +using System.Reflection; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; using Timespinner.GameAbstractions.Inventory; using Timespinner.GameAbstractions.Saving; using Timespinner.GameStateManagement.ScreenManager; @@ -12,6 +15,14 @@ namespace TsRandomizer.Screens // ReSharper disable once UnusedMember.Global class ShopMenuScreen : Screen { + static readonly MethodInfo GetSelectedCategoryMethod = TimeSpinnerType + .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen") + .GetMethod("GetSelectedCategory", BindingFlags.NonPublic | BindingFlags.Instance); + + static readonly MethodInfo GetSelectedShopEntryMethod = TimeSpinnerType + .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuEntryCollection") + .GetMethod("GetSelectedShopEntry", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(screenManager, screen) { var gameSettings = ((GameSave)Dynamic._saveFile).GetSettings(); @@ -19,27 +30,22 @@ public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(scr // Menu count varies on relics/items/equipment etc. being in inventory // Last menu is always helper functions that don't have an _items // but aren't otherwise distinguishable - - foreach (var i in Enumerable.Range(0, ((IList)Dynamic._subMenuCollections).Count - 1)) { var shopMenu = ((IList)Dynamic._subMenuCollections)[i].AsDynamic(); foreach (var shopMenuEntry in shopMenu._items) { var dynamicShopMenuEntry = ((object)shopMenuEntry).AsDynamic(); - var item = (InventoryItem)dynamicShopMenuEntry.Item; if (item.NameKey == "inv_use_MagicMarbles") { item.IsSellable = false; dynamicShopMenuEntry.ShopPrice = -1; } - int currentPrice = dynamicShopMenuEntry.ShopPrice; if (currentPrice == 0) { // Set a price for "priceless" items - dynamicShopMenuEntry.ShopPrice = 2000; currentPrice = dynamicShopMenuEntry.ShopPrice; } @@ -57,5 +63,64 @@ public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(scr } } } + + public override void Update(GameTime gameTime, InputState input) + { + int cap = QoLSettings.Current.StackCap; + if (cap <= 9) return; + + bool isBuying = (bool)Dynamic._isBuying; + if (!isBuying) return; + + // Use only IsNew checks — held state would increment every frame + bool rightPressed = input.IsNewButtonPress(Buttons.DPadRight) + || input.IsNewButtonPress(Buttons.LeftThumbstickRight) + || input.IsNewButtonPress(Buttons.RightThumbstickRight) + || input.IsNewKeyPress(Keys.Right); + + bool leftPressed = input.IsNewButtonPress(Buttons.DPadLeft) + || input.IsNewButtonPress(Buttons.LeftThumbstickLeft) + || input.IsNewButtonPress(Buttons.RightThumbstickLeft) + || input.IsNewKeyPress(Keys.Left); + + if (!rightPressed && !leftPressed) return; + + var selectedCategory = GetSelectedCategoryMethod?.Invoke(GameScreen, null); + if (selectedCategory == null) return; + + var selectedEntry = GetSelectedShopEntryMethod?.Invoke(selectedCategory, null); + if (selectedEntry == null) return; + + var entryDynamic = ((object)selectedEntry).AsDynamic(); + var item = (InventoryItem)entryDynamic.Item; + if (!(item is InventoryUseItem useItem2)) return; + + var type2 = useItem2.UseItemType; + if (type2 == EInventoryUseItemType.MagicMarbles + || type2 == EInventoryUseItemType.EssenceCrystal + || type2 == EInventoryUseItemType.GoldRing + || type2 == EInventoryUseItemType.GoldNecklace) + return; + + var save = (GameSave)Dynamic._saveFile; + int currentCount = save.Inventory.UseItemInventory.Inventory.ContainsKey(item.Key) + ? save.Inventory.UseItemInventory.Inventory[item.Key].Count + : 0; + + int maxCanBuy = cap - currentCount; + if (maxCanBuy <= 0) return; + + int currentQty = (int)entryDynamic.QuanityToBuy; + // Vanilla cap is 9 total, so vanilla allows buying up to (9 - currentCount) + int vanillaCap = 9 - currentCount; + + // Only act when we are already at or above the vanilla cap, + // so below that the vanilla input handling works as normal. + if (rightPressed && currentQty >= vanillaCap && currentQty < maxCanBuy) + entryDynamic.QuanityToBuy = currentQty + 1; + + if (leftPressed && currentQty > vanillaCap) + entryDynamic.QuanityToBuy = currentQty - 1; + } } } \ No newline at end of file From afc350796d030ca58fa71724bcd4897531172975 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:14:17 -0500 Subject: [PATCH 63/68] Update ShopMenuScreen.cs fixed an issue where the player could go in the negatives when browsing the shop menu --- TsRandomizer/Screens/ShopMenuScreen.cs | 217 +++++++++++++------------ 1 file changed, 109 insertions(+), 108 deletions(-) diff --git a/TsRandomizer/Screens/ShopMenuScreen.cs b/TsRandomizer/Screens/ShopMenuScreen.cs index 987ce598..68948c99 100644 --- a/TsRandomizer/Screens/ShopMenuScreen.cs +++ b/TsRandomizer/Screens/ShopMenuScreen.cs @@ -1,126 +1,127 @@ -using System.Collections; -using System.Linq; -using System.Reflection; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Input; -using Timespinner.GameAbstractions.Inventory; -using Timespinner.GameAbstractions.Saving; -using Timespinner.GameStateManagement.ScreenManager; -using TsRandomizer.Extensions; -using TsRandomizer.IntermediateObjects; - -namespace TsRandomizer.Screens -{ +using System.Collections; +using System.Linq; +using System.Reflection; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; +using Timespinner.GameAbstractions.Inventory; +using Timespinner.GameAbstractions.Saving; +using Timespinner.GameStateManagement.ScreenManager; +using TsRandomizer.Extensions; +using TsRandomizer.IntermediateObjects; + +namespace TsRandomizer.Screens +{ [TimeSpinnerType("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen")] // ReSharper disable once UnusedMember.Global - class ShopMenuScreen : Screen - { - static readonly MethodInfo GetSelectedCategoryMethod = TimeSpinnerType - .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen") - .GetMethod("GetSelectedCategory", BindingFlags.NonPublic | BindingFlags.Instance); - - static readonly MethodInfo GetSelectedShopEntryMethod = TimeSpinnerType - .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuEntryCollection") - .GetMethod("GetSelectedShopEntry", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - - public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(screenManager, screen) - { + class ShopMenuScreen : Screen + { + static readonly MethodInfo GetSelectedCategoryMethod = TimeSpinnerType + .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen") + .GetMethod("GetSelectedCategory", BindingFlags.NonPublic | BindingFlags.Instance); + + static readonly MethodInfo GetSelectedShopEntryMethod = TimeSpinnerType + .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuEntryCollection") + .GetMethod("GetSelectedShopEntry", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + + public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(screenManager, screen) + { var gameSettings = ((GameSave)Dynamic._saveFile).GetSettings(); // Menu count varies on relics/items/equipment etc. being in inventory // Last menu is always helper functions that don't have an _items // but aren't otherwise distinguishable - foreach (var i in Enumerable.Range(0, ((IList)Dynamic._subMenuCollections).Count - 1)) - { - var shopMenu = ((IList)Dynamic._subMenuCollections)[i].AsDynamic(); - foreach (var shopMenuEntry in shopMenu._items) - { - var dynamicShopMenuEntry = ((object)shopMenuEntry).AsDynamic(); - var item = (InventoryItem)dynamicShopMenuEntry.Item; - if (item.NameKey == "inv_use_MagicMarbles") - { - item.IsSellable = false; - dynamicShopMenuEntry.ShopPrice = -1; - } - int currentPrice = dynamicShopMenuEntry.ShopPrice; - if (currentPrice == 0) + foreach (var i in Enumerable.Range(0, ((IList)Dynamic._subMenuCollections).Count - 1)) + { + var shopMenu = ((IList)Dynamic._subMenuCollections)[i].AsDynamic(); + foreach (var shopMenuEntry in shopMenu._items) + { + var dynamicShopMenuEntry = ((object)shopMenuEntry).AsDynamic(); + var item = (InventoryItem)dynamicShopMenuEntry.Item; + if (item.NameKey == "inv_use_MagicMarbles") + { + item.IsSellable = false; + dynamicShopMenuEntry.ShopPrice = -1; + } + int currentPrice = dynamicShopMenuEntry.ShopPrice; + if (currentPrice == 0) { // Set a price for "priceless" items - dynamicShopMenuEntry.ShopPrice = 2000; - currentPrice = dynamicShopMenuEntry.ShopPrice; - } - dynamicShopMenuEntry.ShopPrice = (int)(currentPrice * gameSettings.ShopMultiplier.Value); - - if (item is InventoryUseItem useItem) - { - var type = useItem.UseItemType; - if (type != EInventoryUseItemType.MagicMarbles - && type != EInventoryUseItemType.EssenceCrystal - && type != EInventoryUseItemType.GoldRing - && type != EInventoryUseItemType.GoldNecklace) - useItem.StackCap = QoLSettings.Current.StackCap; - } - } - } - } - - public override void Update(GameTime gameTime, InputState input) - { - int cap = QoLSettings.Current.StackCap; - if (cap <= 9) return; - - bool isBuying = (bool)Dynamic._isBuying; + dynamicShopMenuEntry.ShopPrice = 2000; + currentPrice = dynamicShopMenuEntry.ShopPrice; + } + dynamicShopMenuEntry.ShopPrice = (int)(currentPrice * gameSettings.ShopMultiplier.Value); + + if (item is InventoryUseItem useItem) + { + var type = useItem.UseItemType; + if (type != EInventoryUseItemType.MagicMarbles + && type != EInventoryUseItemType.EssenceCrystal + && type != EInventoryUseItemType.GoldRing + && type != EInventoryUseItemType.GoldNecklace) + useItem.StackCap = QoLSettings.Current.StackCap; + } + } + } + } + + public override void Update(GameTime gameTime, InputState input) + { + int cap = QoLSettings.Current.StackCap; + if (cap <= 9) return; + + bool isBuying = (bool)Dynamic._isBuying; if (!isBuying) return; // Use only IsNew checks — held state would increment every frame - bool rightPressed = input.IsNewButtonPress(Buttons.DPadRight) - || input.IsNewButtonPress(Buttons.LeftThumbstickRight) - || input.IsNewButtonPress(Buttons.RightThumbstickRight) - || input.IsNewKeyPress(Keys.Right); - - bool leftPressed = input.IsNewButtonPress(Buttons.DPadLeft) - || input.IsNewButtonPress(Buttons.LeftThumbstickLeft) - || input.IsNewButtonPress(Buttons.RightThumbstickLeft) - || input.IsNewKeyPress(Keys.Left); - - if (!rightPressed && !leftPressed) return; - - var selectedCategory = GetSelectedCategoryMethod?.Invoke(GameScreen, null); - if (selectedCategory == null) return; - - var selectedEntry = GetSelectedShopEntryMethod?.Invoke(selectedCategory, null); - if (selectedEntry == null) return; - - var entryDynamic = ((object)selectedEntry).AsDynamic(); - var item = (InventoryItem)entryDynamic.Item; - if (!(item is InventoryUseItem useItem2)) return; - - var type2 = useItem2.UseItemType; - if (type2 == EInventoryUseItemType.MagicMarbles - || type2 == EInventoryUseItemType.EssenceCrystal - || type2 == EInventoryUseItemType.GoldRing - || type2 == EInventoryUseItemType.GoldNecklace) - return; - - var save = (GameSave)Dynamic._saveFile; - int currentCount = save.Inventory.UseItemInventory.Inventory.ContainsKey(item.Key) - ? save.Inventory.UseItemInventory.Inventory[item.Key].Count - : 0; - - int maxCanBuy = cap - currentCount; - if (maxCanBuy <= 0) return; - + bool rightPressed = input.IsNewButtonPress(Buttons.DPadRight) + || input.IsNewButtonPress(Buttons.LeftThumbstickRight) + || input.IsNewButtonPress(Buttons.RightThumbstickRight) + || input.IsNewKeyPress(Keys.Right); + + bool leftPressed = input.IsNewButtonPress(Buttons.DPadLeft) + || input.IsNewButtonPress(Buttons.LeftThumbstickLeft) + || input.IsNewButtonPress(Buttons.RightThumbstickLeft) + || input.IsNewKeyPress(Keys.Left); + + if (!rightPressed && !leftPressed) return; + + var selectedCategory = GetSelectedCategoryMethod?.Invoke(GameScreen, null); + if (selectedCategory == null) return; + + var selectedEntry = GetSelectedShopEntryMethod?.Invoke(selectedCategory, null); + if (selectedEntry == null) return; + + var entryDynamic = ((object)selectedEntry).AsDynamic(); + var item = (InventoryItem)entryDynamic.Item; + if (!(item is InventoryUseItem useItem2)) return; + + var type2 = useItem2.UseItemType; + if (type2 == EInventoryUseItemType.MagicMarbles + || type2 == EInventoryUseItemType.EssenceCrystal + || type2 == EInventoryUseItemType.GoldRing + || type2 == EInventoryUseItemType.GoldNecklace) + return; + + var save = (GameSave)Dynamic._saveFile; + int currentCount = save.Inventory.UseItemInventory.Inventory.ContainsKey(item.Key) + ? save.Inventory.UseItemInventory.Inventory[item.Key].Count + : 0; + + int maxCanBuy = cap - currentCount; + if (maxCanBuy <= 0) return; + int currentQty = (int)entryDynamic.QuanityToBuy; // Vanilla cap is 9 total, so vanilla allows buying up to (9 - currentCount) int vanillaCap = 9 - currentCount; // Only act when we are already at or above the vanilla cap, // so below that the vanilla input handling works as normal. - if (rightPressed && currentQty >= vanillaCap && currentQty < maxCanBuy) - entryDynamic.QuanityToBuy = currentQty + 1; - - if (leftPressed && currentQty > vanillaCap) - entryDynamic.QuanityToBuy = currentQty - 1; - } - } -} \ No newline at end of file + + if (rightPressed && currentQty >= vanillaCap && currentQty < maxCanBuy) + entryDynamic.QuanityToBuy = currentQty + 1; + + if (leftPressed && currentQty > vanillaCap && currentQty != 1) + entryDynamic.QuanityToBuy = currentQty - 1; + } + } +} From 6046b67d9b3c18d0b19292c1e83e73c071dc8e4e Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 3 Mar 2026 13:16:55 -0500 Subject: [PATCH 64/68] added reference added reference to harmonylib --- TsRandomizer/TsRandomizer.csproj | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 23f74900..7d9f823e 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -1,4 +1,4 @@ - + @@ -98,6 +98,10 @@ prompt + + False + ..\..\TsRandomizer-QoL-Patches-TsRandomizer-QoL-no-harmony- test\packages\Lib.Harmony.2.4.2\lib\net48\0Harmony.dll + ..\packages\Archipelago.Gifting.Net.0.4.4\lib\net452\Archipelago.Gifting.Net.dll @@ -126,6 +130,7 @@ + @@ -419,4 +424,4 @@ - \ No newline at end of file + From f9af031705072b2dabbaa0d1ddb4afc9f62feb51 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 3 Mar 2026 13:18:45 -0500 Subject: [PATCH 65/68] Update TsRandomizer.csproj --- TsRandomizer/TsRandomizer.csproj | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 7d9f823e..51c446c0 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -80,7 +80,7 @@ true ..\..\TestVersions\DebugDRMFreeGoG\ - TRACE + DEBUG;TRACE full x86 7.3 @@ -98,10 +98,6 @@ prompt - - False - ..\..\TsRandomizer-QoL-Patches-TsRandomizer-QoL-no-harmony- test\packages\Lib.Harmony.2.4.2\lib\net48\0Harmony.dll - ..\packages\Archipelago.Gifting.Net.0.4.4\lib\net452\Archipelago.Gifting.Net.dll @@ -130,7 +126,6 @@ - From 2e56d39d1e5e699e1534e3d87260a992f74f6ae5 Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:22:54 -0500 Subject: [PATCH 66/68] Fix added a way for the player to hold the right instead of having to press each time to increment purchase count past stack cap --- TsRandomizer/Program.cs | 74 ++++++++++++------------- TsRandomizer/Screens/ShopMenuScreen.cs | 76 ++++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 42 deletions(-) diff --git a/TsRandomizer/Program.cs b/TsRandomizer/Program.cs index 972dd427..8133a402 100644 --- a/TsRandomizer/Program.cs +++ b/TsRandomizer/Program.cs @@ -1,39 +1,39 @@ -using System; - - -namespace TsRandomizer -{ - public static class Program - { - [STAThread] - public static int Main() - { +using System; + + +namespace TsRandomizer +{ + public static class Program + { + [STAThread] + public static int Main() + { WithExceptionLogging(() => { - - var platformHelper = DummyPlatformHelper.CreateInstance(); - - new TimeSpinnerGame(platformHelper).Run(); - }); - - Environment.Exit(0); - return 0; - } - - static void WithExceptionLogging(Action action) - { -#if DEBUG - action(); -#else - try - { - action(); - } - catch (Exception e) - { - ExceptionLogger.LogException(e); - } -#endif - } - } -} + + var platformHelper = DummyPlatformHelper.CreateInstance(); + + new TimeSpinnerGame(platformHelper).Run(); + }); + + Environment.Exit(0); + return 0; + } + + static void WithExceptionLogging(Action action) + { +#if DEBUG + action(); +#else + try + { + action(); + } + catch (Exception e) + { + ExceptionLogger.LogException(e); + } +#endif + } + } +} diff --git a/TsRandomizer/Screens/ShopMenuScreen.cs b/TsRandomizer/Screens/ShopMenuScreen.cs index 68948c99..8a5040ab 100644 --- a/TsRandomizer/Screens/ShopMenuScreen.cs +++ b/TsRandomizer/Screens/ShopMenuScreen.cs @@ -23,6 +23,18 @@ class ShopMenuScreen : Screen .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuEntryCollection") .GetMethod("GetSelectedShopEntry", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + static readonly MethodInfo ChangeDescriptionMethod = TimeSpinnerType + .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen") + .GetMethod("ChangeDescription", BindingFlags.NonPublic | BindingFlags.Instance); + + // Timers for held-button repeat on quantity adjustment + float _rightHeldTime; + float _leftHeldTime; + const float HoldDelay = 0.4f; + const float HoldRepeat = 0.1f; + float _rightLastRepeat; + float _leftLastRepeat; + public ShopMenuScreen(ScreenManager screenManager, GameScreen screen) : base(screenManager, screen) { var gameSettings = ((GameSave)Dynamic._saveFile).GetSettings(); @@ -72,17 +84,68 @@ public override void Update(GameTime gameTime, InputState input) bool isBuying = (bool)Dynamic._isBuying; if (!isBuying) return; - // Use only IsNew checks — held state would increment every frame - bool rightPressed = input.IsNewButtonPress(Buttons.DPadRight) + float dt = (float)gameTime.ElapsedGameTime.TotalSeconds; + + // Detect raw held state for repeat logic + bool rightHeld = false; + bool leftHeld = false; + for (int i = 0; i < input.CurrentGamePadStates.Length; i++) + { + rightHeld |= input.CurrentGamePadStates[i].IsButtonDown(Buttons.DPadRight) + || input.CurrentGamePadStates[i].IsButtonDown(Buttons.LeftThumbstickRight) + || input.CurrentGamePadStates[i].IsButtonDown(Buttons.RightThumbstickRight); + leftHeld |= input.CurrentGamePadStates[i].IsButtonDown(Buttons.DPadLeft) + || input.CurrentGamePadStates[i].IsButtonDown(Buttons.LeftThumbstickLeft) + || input.CurrentGamePadStates[i].IsButtonDown(Buttons.RightThumbstickLeft); + } + for (int i = 0; i < input.CurrentKeyboardStates.Length; i++) + { + rightHeld |= input.CurrentKeyboardStates[i].IsKeyDown(Keys.Right); + leftHeld |= input.CurrentKeyboardStates[i].IsKeyDown(Keys.Left); + } + + bool rightNew = input.IsNewButtonPress(Buttons.DPadRight) || input.IsNewButtonPress(Buttons.LeftThumbstickRight) || input.IsNewButtonPress(Buttons.RightThumbstickRight) || input.IsNewKeyPress(Keys.Right); - bool leftPressed = input.IsNewButtonPress(Buttons.DPadLeft) + bool leftNew = input.IsNewButtonPress(Buttons.DPadLeft) || input.IsNewButtonPress(Buttons.LeftThumbstickLeft) || input.IsNewButtonPress(Buttons.RightThumbstickLeft) || input.IsNewKeyPress(Keys.Left); + // Update hold timers + if (rightHeld) + { + _rightHeldTime += dt; + if (rightNew) _rightLastRepeat = 0f; + } + else + { + _rightHeldTime = 0f; + _rightLastRepeat = 0f; + } + + if (leftHeld) + { + _leftHeldTime += dt; + if (leftNew) _leftLastRepeat = 0f; + } + else + { + _leftHeldTime = 0f; + _leftLastRepeat = 0f; + } + + // Fire on initial press or after hold delay with repeat interval + bool rightPressed = rightNew + || (rightHeld && _rightHeldTime >= HoldDelay && _rightHeldTime - _rightLastRepeat >= HoldRepeat); + bool leftPressed = leftNew + || (leftHeld && _leftHeldTime >= HoldDelay && _leftHeldTime - _leftLastRepeat >= HoldRepeat); + + if (rightPressed && _rightHeldTime >= HoldDelay) _rightLastRepeat = _rightHeldTime; + if (leftPressed && _leftHeldTime >= HoldDelay) _leftLastRepeat = _leftHeldTime; + if (!rightPressed && !leftPressed) return; var selectedCategory = GetSelectedCategoryMethod?.Invoke(GameScreen, null); @@ -116,12 +179,15 @@ public override void Update(GameTime gameTime, InputState input) // Only act when we are already at or above the vanilla cap, // so below that the vanilla input handling works as normal. - if (rightPressed && currentQty >= vanillaCap && currentQty < maxCanBuy) entryDynamic.QuanityToBuy = currentQty + 1; if (leftPressed && currentQty > vanillaCap && currentQty != 1) entryDynamic.QuanityToBuy = currentQty - 1; + + // Show a message if the player tries to confirm but holds 9 or more + if (input.IsNewPressConfirm(null) && currentCount >= 9) + Dynamic.ChangeDescription("Vanilla purchase limit reached - you need to hold fewer than 9 to buy more.", 0); } } -} +} \ No newline at end of file From 594d6c4ebe53618ead5efd754029905e8d14a00d Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:58:42 -0500 Subject: [PATCH 67/68] fix added an error message when the player tries to purchase more items while holding more than 9 --- TsRandomizer/Screens/Screen.cs | 2 + TsRandomizer/Screens/ScreenManager.cs | 6 ++- TsRandomizer/Screens/ShopMenuScreen.cs | 59 +++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/TsRandomizer/Screens/Screen.cs b/TsRandomizer/Screens/Screen.cs index 12e3d109..db2d8ad2 100644 --- a/TsRandomizer/Screens/Screen.cs +++ b/TsRandomizer/Screens/Screen.cs @@ -75,6 +75,8 @@ public virtual void Update(GameTime gameTime, InputState input) { } + + public virtual void HandleInput(InputState input) { } public virtual void Draw(SpriteBatch spriteBatch, SpriteFont menuFont) { } diff --git a/TsRandomizer/Screens/ScreenManager.cs b/TsRandomizer/Screens/ScreenManager.cs index f6819b0a..643ec5b5 100644 --- a/TsRandomizer/Screens/ScreenManager.cs +++ b/TsRandomizer/Screens/ScreenManager.cs @@ -172,8 +172,10 @@ static void ApplyToastSettings(GameScreen screen) } void UpdateScreens(GameTime gameTime, InputState input) - { - foreach (var screen in hookedScreens) + { + foreach (var screen in hookedScreens) + screen.HandleInput(input); + foreach (var screen in hookedScreens) screen.Update(gameTime, input); } diff --git a/TsRandomizer/Screens/ShopMenuScreen.cs b/TsRandomizer/Screens/ShopMenuScreen.cs index 8a5040ab..ccdf6073 100644 --- a/TsRandomizer/Screens/ShopMenuScreen.cs +++ b/TsRandomizer/Screens/ShopMenuScreen.cs @@ -8,6 +8,7 @@ using Timespinner.GameStateManagement.ScreenManager; using TsRandomizer.Extensions; using TsRandomizer.IntermediateObjects; +using System; namespace TsRandomizer.Screens { @@ -23,9 +24,11 @@ class ShopMenuScreen : Screen .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuEntryCollection") .GetMethod("GetSelectedShopEntry", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - static readonly MethodInfo ChangeDescriptionMethod = TimeSpinnerType - .Get("Timespinner.GameStateManagement.Screens.Shop.ShopMenuScreen") - .GetMethod("ChangeDescription", BindingFlags.NonPublic | BindingFlags.Instance); + static readonly Type MenuDescriptionType = TimeSpinnerType + .Get("Timespinner.GameStateManagement.Screens.BaseClasses.Menu.MenuDescription"); + + static readonly Type EInventoryItemIconType = TimeSpinnerType + .Get("Timespinner.GameAbstractions.Inventory.EInventoryItemIcon"); // Timers for held-button repeat on quantity adjustment float _rightHeldTime; @@ -184,10 +187,54 @@ public override void Update(GameTime gameTime, InputState input) if (leftPressed && currentQty > vanillaCap && currentQty != 1) entryDynamic.QuanityToBuy = currentQty - 1; + } + + public override void HandleInput(InputState input) + { + int cap = QoLSettings.Current.StackCap; + if (cap <= 9) return; - // Show a message if the player tries to confirm but holds 9 or more - if (input.IsNewPressConfirm(null) && currentCount >= 9) - Dynamic.ChangeDescription("Vanilla purchase limit reached - you need to hold fewer than 9 to buy more.", 0); + bool isBuying = (bool)Dynamic._isBuying; + if (!isBuying) return; + + if (!input.IsNewPressConfirm(null)) return; + + var selectedCategory = GetSelectedCategoryMethod?.Invoke(GameScreen, null); + if (selectedCategory == null) return; + + var selectedEntry = GetSelectedShopEntryMethod?.Invoke(selectedCategory, null); + if (selectedEntry == null) return; + + var entryDynamic = ((object)selectedEntry).AsDynamic(); + var item = (InventoryItem)entryDynamic.Item; + if (!(item is InventoryUseItem)) return; + + var save = (GameSave)Dynamic._saveFile; + int currentCount = save.Inventory.UseItemInventory.Inventory.ContainsKey(item.Key) + ? save.Inventory.UseItemInventory.Inventory[item.Key].Count + : 0; + + if (currentCount < 9) return; + + // Player holds 9+ and tries to confirm - show message immediately in HandleInput phase + Dynamic.PlayErrorSound(); + var noneIcon = Enum.ToObject(EInventoryItemIconType, 0); + var ctor = MenuDescriptionType.GetConstructors( + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + if (ctor.Length > 0) + { + var menuDesc = ctor[0].Invoke(new object[] + { + "Vanilla cap reached - hold fewer than 9 to buy more. (We cannot fix this, sorry!)", + (object)Dynamic.DescriptionFont, + noneIcon, + (object)Dynamic.GCM.SpMenuIcons, + (object)Dynamic.GCM.SpUIButtons, + (bool)Dynamic.IsDescriptionCentered, + (object)Dynamic.DescriptionControllerMapping + }); + Dynamic.CurrentDescription = menuDesc; + } } } } \ No newline at end of file From 17100665baa651ee940f83800e5e5e2e186892bd Mon Sep 17 00:00:00 2001 From: waze3174 <31178121+waze3174@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:04:14 -0500 Subject: [PATCH 68/68] Update TsRandomizer.csproj --- TsRandomizer/TsRandomizer.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TsRandomizer/TsRandomizer.csproj b/TsRandomizer/TsRandomizer.csproj index 51c446c0..23f74900 100644 --- a/TsRandomizer/TsRandomizer.csproj +++ b/TsRandomizer/TsRandomizer.csproj @@ -1,4 +1,4 @@ - + @@ -80,7 +80,7 @@ true ..\..\TestVersions\DebugDRMFreeGoG\ - DEBUG;TRACE + TRACE full x86 7.3 @@ -419,4 +419,4 @@ - + \ No newline at end of file