From f03c408aa74fa13d3316378b4ab673bc3f3b0787 Mon Sep 17 00:00:00 2001 From: Esther Date: Mon, 6 Jul 2026 12:04:36 +0100 Subject: [PATCH] Fix various bugs and crashes --- Component.cs | 16 +- Components/LiveSplit.SonicFrontiers.dll | Bin 236544 -> 236544 bytes .../update.LiveSplit.SonicFrontiers.xml | 8 + Game/GameMemory.cs | 2011 ++++++++--------- JHelper.ProcessMemory | 2 +- LiveSplit.SonicFrontiers.csproj | 2 +- LiveSplit.SonicFrontiers.sln | 7 +- Logic.cs | 262 +-- Properties/AssemblyInfo.cs | 4 +- 9 files changed, 1130 insertions(+), 1182 deletions(-) diff --git a/Component.cs b/Component.cs index b6e7c6d..9d16917 100644 --- a/Component.cs +++ b/Component.cs @@ -1,7 +1,10 @@ using LiveSplit.Model; +using LiveSplit.Options; +using LiveSplit.SonicFrontiers; using LiveSplit.UI; using LiveSplit.UI.Components; -using LiveSplit.SonicFrontiers; +using System; +using System.IO; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; @@ -20,8 +23,15 @@ public SonicFrontiersComponent(LiveSplitState state) { AutosplitterLogic(state, cancelToken.Token); } - catch { } - }); + catch (OperationCanceledException e) { + File.WriteAllText("LiveSplit.SonicFrontiers.ErrorLog.txt", "Cancelled intentionally\n" + e.StackTrace + "\n" + e.Message); + Log.Error("Something broke :(\n" + e.StackTrace + "\n" + e.Message); + } + catch (Exception e) { + File.WriteAllText("LiveSplit.SonicFrontiers.ErrorLog.txt", "Something broke :(\n" + e.StackTrace + "\n" + e.Message); + Log.Error("Something broke :(\n" + e.StackTrace + "\n" + e.Message); + } + }); if (state.CurrentTimingMethod == TimingMethod.RealTime) AskGameTime(state); diff --git a/Components/LiveSplit.SonicFrontiers.dll b/Components/LiveSplit.SonicFrontiers.dll index d72a64a21efdeccc1c69eda061fef11aeee976f5..a86d3ea0772030be55c7594258ed743f474cc093 100644 GIT binary patch literal 236544 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

b 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 + + + + + + Various bugfixes + + diff --git a/Game/GameMemory.cs b/Game/GameMemory.cs index 408152f..a6cf723 100644 --- a/Game/GameMemory.cs +++ b/Game/GameMemory.cs @@ -9,6 +9,7 @@ using LiveSplit.SonicFrontiers.GameEngine; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Diagnostics.Eventing.Reader; using System.Drawing.Printing; using System.Linq; @@ -17,1066 +18,1006 @@ namespace LiveSplit.SonicFrontiers; -partial class Memory -{ - ///

- /// Simple counter used for lazily update the watchers - /// - protected MemStateTracker StateTracker { get; } = new(); - - /// - /// The version of the game. - /// - public GameVersion GameVersion { get; } - - /// - /// The Hedgehog engine instance used for interacting with the game engine. - /// - private HedgehogEngine2 Engine { get; } - - /// - /// Watches the status of the HSM (Hierarchical State Machine). - /// - public LazyWatcher HsmStatus { get; } - - public LazyWatcher IGT { get; } - public TimeSpan AccumulatedIGT { get; set; } = default; - - public bool HasStarted11Story { get; set; } = false; - /// - /// Watches the level ID in the game. - /// - public LazyWatcher LevelID { get; } - - // Final boss stuff - public LazyWatcher EndQTECount { get; } - private readonly LazyWatcher QTEStatus; - private bool IsInEndQTE = false; - - // Another end boss stuff - public LazyWatcher AnotherQTECount { get; } - private bool IsInAnotherBoss = false; - private bool IsFightingRifleBeast = false; - - - // Stage completion flags - public LazyWatcher StoryModeCyberSpaceCompletionFlag { get; } - - - /// - /// Watches the current game mode - /// - public LazyWatcher GameMode { get; } - - //Player Info Updater Watcher - public LazyWatcher HasPlayerInformationUpdater { get; } - - private bool IsInTutorial = false; - - public LazyWatcher PlayerInstance { get; } - // Story flags - private StoryFlags Flags; - public Dictionary> SplitBools { get; } - public List AlreadyTriggeredBools { get; } = new List(); - - // Boss Rush - public LazyWatcher BossRushAct { get; } - - // Music Notes - public LazyWatcher MusicNotes; - - /// - /// Constructor initializing game engine, version, and various game state watchers. - /// - /// The current game process. - public Memory(ProcessMemory process, LiveSplitState liveSplitState) - { - Engine = new HedgehogEngine2(process); - StateTracker.OnTick = () => Engine.Update(process); - - // Determine the game version based on module memory size. - // Mostly unused in the autosplitter, might be needed in the future. - GameVersion = process.MainModule.ModuleMemorySize switch - { - 0x162C8000 => GameVersion.v1_01, - 0x1661B000 => GameVersion.v1_10, - 0x1622F000 => GameVersion.v1_20, - 0x16418000 => GameVersion.v1_30, - 0x16204000 => GameVersion.v1_42, - _ => GameVersion.Unknown, - }; - - // Initialize LazyWatchers for observing game data - HsmStatus = new LazyWatcher(StateTracker, [string.Empty, string.Empty, string.Empty, string.Empty], [string.Empty, string.Empty, string.Empty, string.Empty], (current, old) => - { - int no_of_details; - IntPtr addr; - - using (ArrayRental buf = new(stackalloc byte[0x10])) - { - // Check for valid game mode and read status from memory - if (!Engine.GetExtension("GameModeHsmExtension", out IntPtr instance) - || !process.ReadArray(instance + 0x38, buf.Span)) - { - // Return the current status if read fails - for (int i = 0; i < 4; i++) - old[i] = current[i]; - - return old; - } - - // Determine the number of details to read (max 4) - no_of_details = buf.Span[8]; - if (no_of_details > 128) - no_of_details = 0; - else if (no_of_details > 4) - no_of_details = 4; - - unsafe - { - fixed (byte* ptr = buf.Span) - addr = (IntPtr)(*(long*)ptr); - } - } - - using (ArrayRental details = new(stackalloc long[no_of_details])) - { - // Read the details from memory - if (!process.ReadArray(addr, details.Span)) - { - // Return the current status if read fails - for (int i = 0; i < 4; i++) - old[i] = current[i]; - - return old; - } - - // Look up each detail and store it in the return array - for (int i = 0; i < no_of_details; i++) - { - if (Engine.RTTI.Lookup((IntPtr)details.Span[i], out string value)) - old[i] = value; - } - } - - for (int i = no_of_details; i < 4; i++) - old[i] = string.Empty; - - return old; - }); - - LevelID = new LazyWatcher(StateTracker, SonicFrontiers.LevelID.MainMenu, (current, _) => - { - if (Engine.GameMode == "GameModeTitle") - return SonicFrontiers.LevelID.MainMenu; - - if (!Engine.GetService("LevelInfo", out IntPtr pLevelInfo) - || !process.Read(pLevelInfo, out LevelInfo levelInfo) - || !process.Read(levelInfo.stageData.Value, out StageData stageData) - || !process.ReadString(stageData.Name.Value, 6, JHelper.Common.ProcessInterop.API.StringType.ASCII, out string id)) - return current; - - return id switch - { - "w6d01" => SonicFrontiers.LevelID.w1_1, // 1-1 - "w8d01" => SonicFrontiers.LevelID.w1_2, // 1-2 - "w9d04" => SonicFrontiers.LevelID.w1_3, // 1-3 - "w6d02" => SonicFrontiers.LevelID.w1_4, // 1-4 - "w7d04" => SonicFrontiers.LevelID.w1_5, // 1-5 - "w6d06" => SonicFrontiers.LevelID.w1_6, // 1-6 - "w9d06" => SonicFrontiers.LevelID.w1_7, // 1-7 - "w6d05" => SonicFrontiers.LevelID.w2_1, // 2-1 - "w8d03" => SonicFrontiers.LevelID.w2_2, // 2-2 - "w7d02" => SonicFrontiers.LevelID.w2_3, // 2-3 - "w7d06" => SonicFrontiers.LevelID.w2_4, // 2-4 - "w8d04" => SonicFrontiers.LevelID.w2_5, // 2-5 - "w6d03" => SonicFrontiers.LevelID.w2_6, // 2-6 - "w8d05" => SonicFrontiers.LevelID.w2_7, // 2-7 - "w6d04" => SonicFrontiers.LevelID.w3_1, // 3-1 - "w6d08" => SonicFrontiers.LevelID.w3_2, // 3-2 - "w8d02" => SonicFrontiers.LevelID.w3_3, // 3-3 - "w6d09" => SonicFrontiers.LevelID.w3_4, // 3-4 - "w6d07" => SonicFrontiers.LevelID.w3_5, // 3-5 - "w8d06" => SonicFrontiers.LevelID.w3_6, // 3-6 - "w7d03" => SonicFrontiers.LevelID.w3_7, // 3-7 - "w7d08" => SonicFrontiers.LevelID.w4_1, // 4-1 - "w9d02" => SonicFrontiers.LevelID.w4_2, // 4-2 - "w7d01" => SonicFrontiers.LevelID.w4_3, // 4-3 - "w9d03" => SonicFrontiers.LevelID.w4_4, // 4-4 - "w6d10" => SonicFrontiers.LevelID.w4_5, // 4-5 - "w7d07" => SonicFrontiers.LevelID.w4_6, // 4-6 - "w9d05" => SonicFrontiers.LevelID.w4_7, // 4-7 - "w7d05" => SonicFrontiers.LevelID.w4_8, // 4-8 - "w9d07" => SonicFrontiers.LevelID.w4_9, // 4-9 - "w6d21" => SonicFrontiers.LevelID.w4_A, // 4-A - "w6d22" => SonicFrontiers.LevelID.w4_B, // 4-B - "w6d23" => SonicFrontiers.LevelID.w4_C, // 4-C - "w7d21" => SonicFrontiers.LevelID.w4_D, // 4-D - "w7d22" => SonicFrontiers.LevelID.w4_E, // 4-E - "w7d23" => SonicFrontiers.LevelID.w4_F, // 4-F - "w9d21" => SonicFrontiers.LevelID.w4_G, // 4-G - "w9d22" => SonicFrontiers.LevelID.w4_H, // 4-H - "w9d23" => SonicFrontiers.LevelID.w4_I, // 4-I - "w1r03" => SonicFrontiers.LevelID.Island_Kronos, // Kronos Island - "w2r01" => SonicFrontiers.LevelID.Island_Ares, // Ares Island - "w3r01" => SonicFrontiers.LevelID.Island_Chaos, // Chaos Island - "w1r05" => SonicFrontiers.LevelID.Island_Rhea, // Rhea Island - "w1r04" => SonicFrontiers.LevelID.Island_Ouranos, // Ouranos Island - "w1r06" => SonicFrontiers.LevelID.Island_Another_Ouranos, //Another Story Ouranos - "w1f01" => SonicFrontiers.LevelID.Fishing, // Fishing - "w0r01" => SonicFrontiers.LevelID.MainMenu, // Main Menu - "w5r01" => SonicFrontiers.LevelID.Boss_TheEnd, // The End (boss) - "w5t01" => SonicFrontiers.LevelID.Tutorial, // Tutorial stage - "w1b01" => SonicFrontiers.LevelID.Island_Kronos_BossRush, - "w2b01" => SonicFrontiers.LevelID.Island_Ares_BossRush, - "w3b01" => SonicFrontiers.LevelID.Island_Chaos_BossRush, - "w1b02" => SonicFrontiers.LevelID.Island_Ouranos_BossRush, - "w1h01" => SonicFrontiers.LevelID.Hacking_01, // Chaos hacking - "w1h02" => SonicFrontiers.LevelID.Hacking_02, // Ouranos bridge hacking - "w1h03" => SonicFrontiers.LevelID.Hacking_03, // Ouranos pyramid hacking - _ => current, - }; - }); - - GameMode = new LazyWatcher(StateTracker, SonicFrontiers.GameMode.Story, (current, _) => - { - if (liveSplitState.CurrentPhase == TimerPhase.NotRunning) - { - if (HsmStatus.Current[1] == "ArcadeMode" || Engine.ApplicationSequenceExtensionFlags0.BitCheck(0)) - return SonicFrontiers.GameMode.Arcade; - else if (HsmStatus.Current[1] == "CyberMode" || Engine.ApplicationSequenceExtensionFlags0.BitCheck(7) || (Engine.ApplicationSequenceExtensionFlags1 & 0b1111) != 0) //kronos,ares,chaos,ouranos,all = bits 7, (next byte) 0,1,2,3 - return SonicFrontiers.GameMode.CyberspaceChallenge; - else if (HsmStatus.Current[1] == "BattleMode" || LevelID.Current == SonicFrontiers.LevelID.Island_Kronos_BossRush || LevelID.Current == SonicFrontiers.LevelID.Island_Ares_BossRush || LevelID.Current == SonicFrontiers.LevelID.Island_Chaos_BossRush || LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos_BossRush) - return SonicFrontiers.GameMode.BossRush; - else - return SonicFrontiers.GameMode.Story; - } - return current; - }); - - IGT = new LazyWatcher(StateTracker, TimeSpan.Zero, (_, _) => - { - if (Engine.GetExtension("GameModeStageTimeExtension", out IntPtr stageTimeExtension)) - { - float igt = process.Read(stageTimeExtension + 0x34) - Engine.IGTSubtraction; - if (igt < 0) - { - Log.Info(Engine.IGTSubtraction.ToString()); - Log.Info(BitConverter.ToInt32(BitConverter.GetBytes(Engine.IGTSubtraction), 0).ToString("X8")); - igt = 0; - } - return TimeSpan.FromSeconds(Math.Truncate(igt * 100) / 100); - } - else if (Engine.GetExtension("GameModeBattleRushExtension", out IntPtr battleRushExtension)) - { - float igt = process.Read(battleRushExtension + 0x38); - return TimeSpan.FromSeconds(Math.Truncate(igt * 100) / 100); - } - else - { - return TimeSpan.Zero; - } - }); - - MusicNotes = new LazyWatcher(StateTracker, [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], (_, old) => - { - old[0] = Flags._AD2; - old[1] = Flags._AD3; - old[2] = Flags._AD4; - old[3] = Flags._AD5; - old[4] = Flags._AD6; - old[5] = Flags._AD7; - old[6] = Flags._AD8; - old[7] = Flags._AD9; - - return old; - }); - - StoryModeCyberSpaceCompletionFlag = new LazyWatcher(StateTracker, false, (current, old) => GameMode.Current == SonicFrontiers.GameMode.Story && LevelID.Current <= SonicFrontiers.LevelID.w4_I && (HsmStatus.Current[1] == "Result" || old)); - - QTEStatus = new LazyWatcher(StateTracker, QTEResolveStatus.NotCompleted, (_, _) => - { - if (!IsInEndQTE || !Engine.GetObject("EventQTEInput", out IntPtr qte) || !process.Read(qte + 0x254, out var status)) - return QTEResolveStatus.NotCompleted; - else - return status; - }); - - EndQTECount = new LazyWatcher(StateTracker, 0, (current, old) => - { - if (LevelID.Current != SonicFrontiers.LevelID.Boss_TheEnd) - return 0; - if (QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Failed) - return 0; - if (current == 3 && !IsInEndQTE) - return 0; - if (current > 3) - return 0; - - if (IsInEndQTE && QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Completed) - return (byte)(current + 1); - else - return current; - }); - - AnotherQTECount = new LazyWatcher(StateTracker, 0, (current, _) => - { - if (!IsInAnotherBoss) - return 0; - if (QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Failed) - return 0; - if (current == 2 && !IsInAnotherBoss) - return 0; - if (current > 2) - return 0; - - if (IsInAnotherBoss && QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Completed) - return (byte)(current + 1); - else - return current; - - }); - - PlayerInstance = new LazyWatcher(StateTracker, IntPtr.Zero, (current, _) => - { - IntPtr instance = IntPtr.Zero; - if (Engine.GetObject("Sonic", out instance)) - { - return instance; - } else if (Engine.GetObject("PlayerTails", out instance) || Engine.GetObject("PlayerKnuckles", out instance) || Engine.GetObject("PlayerAmy", out instance)) - { - return instance; - } - - return IntPtr.Zero; - }); - HasPlayerInformationUpdater = new LazyWatcher(StateTracker, false, (_, _) => - { - if(PlayerInstance.Current == IntPtr.Zero) - { - return false; - } - return playerHasComponentName(process, "GOCPlayerInformationUpdater"); - }); - - // Split bools - SplitBools = new Dictionary> - { +partial class Memory { + /// + /// Simple counter used for lazily update the watchers + /// + protected MemStateTracker StateTracker { get; } = new(); + + /// + /// The version of the game. + /// + public GameVersion GameVersion { get; } + + /// + /// The Hedgehog engine instance used for interacting with the game engine. + /// + private HedgehogEngine2 Engine { get; } + + /// + /// Watches the status of the HSM (Hierarchical State Machine). + /// + public LazyWatcher HsmStatus { get; } + + public LazyWatcher IGT { get; } + public TimeSpan AccumulatedIGT { get; set; } = default; + + public bool HasStarted11Story { get; set; } = false; + /// + /// Watches the level ID in the game. + /// + public LazyWatcher LevelID { get; } + + // Final boss stuff + public LazyWatcher EndQTECount { get; } + private readonly LazyWatcher QTEStatus; + private bool IsInEndQTE = false; + + // Another end boss stuff + public LazyWatcher AnotherQTECount { get; } + private bool IsInAnotherBoss = false; + private bool IsFightingRifleBeast = false; + + + // Stage completion flags + public LazyWatcher StoryModeCyberSpaceCompletionFlag { get; } + + + /// + /// Watches the current game mode + /// + public LazyWatcher GameMode { get; } + + //Player Info Updater Watcher + public LazyWatcher HasPlayerInformationUpdater { get; } + + private bool IsInTutorial = false; + + public LazyWatcher PlayerInstance { get; } + + public LazyWatcher GamePaused { get; } + + private bool shouldPlay; + // Story flags + private StoryFlags Flags; + public Dictionary> SplitBools { get; } + public List AlreadyTriggeredBools { get; } = new List(); + + // Boss Rush + public LazyWatcher BossRushAct { get; } + + // Music Notes + public LazyWatcher MusicNotes; + + /// + /// Constructor initializing game engine, version, and various game state watchers. + /// + /// The current game process. + public Memory(ProcessMemory process, LiveSplitState liveSplitState) { + Engine = new HedgehogEngine2(process); + StateTracker.OnTick = () => Engine.Update(process); + + // Determine the game version based on module memory size. + // Mostly unused in the autosplitter, might be needed in the future. + GameVersion = process.MainModule.ModuleMemorySize switch { + 0x162C8000 => GameVersion.v1_01, + 0x1661B000 => GameVersion.v1_10, + 0x1622F000 => GameVersion.v1_20, + 0x16418000 => GameVersion.v1_30, + 0x16204000 => GameVersion.v1_42, + _ => GameVersion.Unknown, + }; + + // Initialize LazyWatchers for observing game data + HsmStatus = new LazyWatcher(StateTracker, [string.Empty, string.Empty, string.Empty, string.Empty], [string.Empty, string.Empty, string.Empty, string.Empty], (current, old) => { + int no_of_details; + IntPtr addr; + + using (ArrayRental buf = new(stackalloc byte[0x10])) { + // Check for valid game mode and read status from memory + if (!Engine.GetExtension("GameModeHsmExtension", out IntPtr instance) + || !process.ReadArray(instance + 0x38, buf.Span)) { + // Return the current status if read fails + for (int i = 0; i < 4; i++) + old[i] = current[i]; + + return old; + } + + // Determine the number of details to read (max 4) + no_of_details = buf.Span[8]; + if (no_of_details > 128) + no_of_details = 0; + else if (no_of_details > 4) + no_of_details = 4; + + unsafe { + fixed (byte* ptr = buf.Span) + addr = (IntPtr)(*(long*)ptr); + } + } + + using (ArrayRental details = new(stackalloc long[no_of_details])) { + // Read the details from memory + if (!process.ReadArray(addr, details.Span)) { + // Return the current status if read fails + for (int i = 0; i < 4; i++) + old[i] = current[i]; + + return old; + } + + // Look up each detail and store it in the return array + for (int i = 0; i < no_of_details; i++) { + if (Engine.RTTI.Lookup((IntPtr)details.Span[i], out string value)) + old[i] = value; + } + } + + for (int i = no_of_details; i < 4; i++) + old[i] = string.Empty; + + return old; + }); + + LevelID = new LazyWatcher(StateTracker, SonicFrontiers.LevelID.MainMenu, (current, _) => { + if (Engine.GameMode == "GameModeTitle") + return SonicFrontiers.LevelID.MainMenu; + + if (!Engine.GetService("LevelInfo", out IntPtr pLevelInfo) + || !process.Read(pLevelInfo, out LevelInfo levelInfo) + || !process.Read(levelInfo.stageData.Value, out StageData stageData) + || !process.ReadString(stageData.Name.Value, 6, JHelper.Common.ProcessInterop.API.StringType.ASCII, out string id)) + return current; + + return id switch { + "w6d01" => SonicFrontiers.LevelID.w1_1, // 1-1 + "w8d01" => SonicFrontiers.LevelID.w1_2, // 1-2 + "w9d04" => SonicFrontiers.LevelID.w1_3, // 1-3 + "w6d02" => SonicFrontiers.LevelID.w1_4, // 1-4 + "w7d04" => SonicFrontiers.LevelID.w1_5, // 1-5 + "w6d06" => SonicFrontiers.LevelID.w1_6, // 1-6 + "w9d06" => SonicFrontiers.LevelID.w1_7, // 1-7 + "w6d05" => SonicFrontiers.LevelID.w2_1, // 2-1 + "w8d03" => SonicFrontiers.LevelID.w2_2, // 2-2 + "w7d02" => SonicFrontiers.LevelID.w2_3, // 2-3 + "w7d06" => SonicFrontiers.LevelID.w2_4, // 2-4 + "w8d04" => SonicFrontiers.LevelID.w2_5, // 2-5 + "w6d03" => SonicFrontiers.LevelID.w2_6, // 2-6 + "w8d05" => SonicFrontiers.LevelID.w2_7, // 2-7 + "w6d04" => SonicFrontiers.LevelID.w3_1, // 3-1 + "w6d08" => SonicFrontiers.LevelID.w3_2, // 3-2 + "w8d02" => SonicFrontiers.LevelID.w3_3, // 3-3 + "w6d09" => SonicFrontiers.LevelID.w3_4, // 3-4 + "w6d07" => SonicFrontiers.LevelID.w3_5, // 3-5 + "w8d06" => SonicFrontiers.LevelID.w3_6, // 3-6 + "w7d03" => SonicFrontiers.LevelID.w3_7, // 3-7 + "w7d08" => SonicFrontiers.LevelID.w4_1, // 4-1 + "w9d02" => SonicFrontiers.LevelID.w4_2, // 4-2 + "w7d01" => SonicFrontiers.LevelID.w4_3, // 4-3 + "w9d03" => SonicFrontiers.LevelID.w4_4, // 4-4 + "w6d10" => SonicFrontiers.LevelID.w4_5, // 4-5 + "w7d07" => SonicFrontiers.LevelID.w4_6, // 4-6 + "w9d05" => SonicFrontiers.LevelID.w4_7, // 4-7 + "w7d05" => SonicFrontiers.LevelID.w4_8, // 4-8 + "w9d07" => SonicFrontiers.LevelID.w4_9, // 4-9 + "w6d21" => SonicFrontiers.LevelID.w4_A, // 4-A + "w6d22" => SonicFrontiers.LevelID.w4_B, // 4-B + "w6d23" => SonicFrontiers.LevelID.w4_C, // 4-C + "w7d21" => SonicFrontiers.LevelID.w4_D, // 4-D + "w7d22" => SonicFrontiers.LevelID.w4_E, // 4-E + "w7d23" => SonicFrontiers.LevelID.w4_F, // 4-F + "w9d21" => SonicFrontiers.LevelID.w4_G, // 4-G + "w9d22" => SonicFrontiers.LevelID.w4_H, // 4-H + "w9d23" => SonicFrontiers.LevelID.w4_I, // 4-I + "w1r03" => SonicFrontiers.LevelID.Island_Kronos, // Kronos Island + "w2r01" => SonicFrontiers.LevelID.Island_Ares, // Ares Island + "w3r01" => SonicFrontiers.LevelID.Island_Chaos, // Chaos Island + "w1r05" => SonicFrontiers.LevelID.Island_Rhea, // Rhea Island + "w1r04" => SonicFrontiers.LevelID.Island_Ouranos, // Ouranos Island + "w1r06" => SonicFrontiers.LevelID.Island_Another_Ouranos, //Another Story Ouranos + "w1f01" => SonicFrontiers.LevelID.Fishing, // Fishing + "w0r01" => SonicFrontiers.LevelID.MainMenu, // Main Menu + "w5r01" => SonicFrontiers.LevelID.Boss_TheEnd, // The End (boss) + "w5t01" => SonicFrontiers.LevelID.Tutorial, // Tutorial stage + "w1b01" => SonicFrontiers.LevelID.Island_Kronos_BossRush, + "w2b01" => SonicFrontiers.LevelID.Island_Ares_BossRush, + "w3b01" => SonicFrontiers.LevelID.Island_Chaos_BossRush, + "w1b02" => SonicFrontiers.LevelID.Island_Ouranos_BossRush, + "w1h01" => SonicFrontiers.LevelID.Hacking_01, // Chaos hacking + "w1h02" => SonicFrontiers.LevelID.Hacking_02, // Ouranos bridge hacking + "w1h03" => SonicFrontiers.LevelID.Hacking_03, // Ouranos pyramid hacking + _ => current, + }; + }); + + GameMode = new LazyWatcher(StateTracker, SonicFrontiers.GameMode.Story, (current, _) => { + if (liveSplitState.CurrentPhase == TimerPhase.NotRunning) { + if (HsmStatus.Current[1] == "ArcadeMode" || Engine.ApplicationSequenceExtensionFlags0.BitCheck(0)) + return SonicFrontiers.GameMode.Arcade; + else if (HsmStatus.Current[1] == "CyberMode" || Engine.ApplicationSequenceExtensionFlags0.BitCheck(7) || (Engine.ApplicationSequenceExtensionFlags1 & 0b1111) != 0) //kronos,ares,chaos,ouranos,all = bits 7, (next byte) 0,1,2,3 + return SonicFrontiers.GameMode.CyberspaceChallenge; + else if (HsmStatus.Current[1] == "BattleMode" || LevelID.Current == SonicFrontiers.LevelID.Island_Kronos_BossRush || LevelID.Current == SonicFrontiers.LevelID.Island_Ares_BossRush || LevelID.Current == SonicFrontiers.LevelID.Island_Chaos_BossRush || LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos_BossRush) + return SonicFrontiers.GameMode.BossRush; + else + return SonicFrontiers.GameMode.Story; + } + return current; + }); + + IGT = new LazyWatcher(StateTracker, TimeSpan.Zero, (_, _) => { + if (Engine.GetExtension("GameModeStageTimeExtension", out IntPtr stageTimeExtension)) { + float igt = process.Read(stageTimeExtension + 0x34) - Engine.IGTSubtraction; + if (igt < 0) { + Log.Info(Engine.IGTSubtraction.ToString()); + Log.Info(BitConverter.ToInt32(BitConverter.GetBytes(Engine.IGTSubtraction), 0).ToString("X8")); + igt = 0; + } + return TimeSpan.FromSeconds(Math.Truncate(igt * 100) / 100); + } + else if (Engine.GetExtension("GameModeBattleRushExtension", out IntPtr battleRushExtension)) { + float igt = process.Read(battleRushExtension + 0x38); + return TimeSpan.FromSeconds(Math.Truncate(igt * 100) / 100); + } + else { + return TimeSpan.Zero; + } + }); + + MusicNotes = new LazyWatcher(StateTracker, [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], (_, old) => { + old[0] = Flags._AD2; + old[1] = Flags._AD3; + old[2] = Flags._AD4; + old[3] = Flags._AD5; + old[4] = Flags._AD6; + old[5] = Flags._AD7; + old[6] = Flags._AD8; + old[7] = Flags._AD9; + + return old; + }); + + StoryModeCyberSpaceCompletionFlag = new LazyWatcher(StateTracker, false, (current, old) => GameMode.Current == SonicFrontiers.GameMode.Story && LevelID.Current <= SonicFrontiers.LevelID.w4_I && (HsmStatus.Current[1] == "Result" || old)); + + QTEStatus = new LazyWatcher(StateTracker, QTEResolveStatus.NotCompleted, (_, _) => { + if (!IsInEndQTE || !Engine.GetObject("EventQTEInput", out IntPtr qte) || !process.Read(qte + 0x254, out var status)) + return QTEResolveStatus.NotCompleted; + else + return status; + }); + + EndQTECount = new LazyWatcher(StateTracker, 0, (current, old) => { + if (LevelID.Current != SonicFrontiers.LevelID.Boss_TheEnd) + return 0; + if (QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Failed) + return 0; + if (current == 3 && !IsInEndQTE) + return 0; + if (current > 3) + return 0; + + if (IsInEndQTE && QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Completed) + return (byte)(current + 1); + else + return current; + }); + + AnotherQTECount = new LazyWatcher(StateTracker, 0, (current, _) => { + if (!IsInAnotherBoss) + return 0; + if (QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Failed) + return 0; + if (current == 2 && !IsInAnotherBoss) + return 0; + if (current > 2) + return 0; + + if (IsInAnotherBoss && QTEStatus.Changed && QTEStatus.Current == QTEResolveStatus.Completed) + return (byte)(current + 1); + else + return current; + + }); + + PlayerInstance = new LazyWatcher(StateTracker, IntPtr.Zero, (current, _) => { + IntPtr instance = IntPtr.Zero; + if (Engine.GetObject("Sonic", out instance)) { + return instance; + } + else if (Engine.GetObject("PlayerTails", out instance) || Engine.GetObject("PlayerKnuckles", out instance) || Engine.GetObject("PlayerAmy", out instance)) { + return instance; + } + + return IntPtr.Zero; + }); + + HasPlayerInformationUpdater = new LazyWatcher(StateTracker, false, (_, _) => { + if (PlayerInstance.Current == IntPtr.Zero) { + return false; + } + return playerHasComponentName(process, "GOCPlayerInformationUpdater"); + }); + + // Split bools + SplitBools = new Dictionary> + { //Another Story { "Amy_First", new LazyWatcher(StateTracker, false, (_, _) => Flags.Amy_First)}, - { "Amy_Second", new LazyWatcher(StateTracker, false, (_, _) => Flags.Amy_Second)}, - { "Knuckles_First", new LazyWatcher(StateTracker, false, (_, _) => Flags.Knuckles_First)}, - { "Knuckles_Second", new LazyWatcher(StateTracker, false, (_, _) => Flags.Knuckles_Second)}, - { "Tails_First", new LazyWatcher(StateTracker, false, (_, _) => Flags.Tails_First)}, - { "Tails_Second", new LazyWatcher(StateTracker, false, (_, _) => Flags.Tails_Second)}, - { "Sonic_Tower1", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower1)}, - { "Sonic_Tower2", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower2)}, - { "Sonic_Tower3", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower3)}, - { "Sonic_Tower4", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower4)}, - { "Sonic_MasterTrial", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_MasterTrial)}, + { "Amy_Second", new LazyWatcher(StateTracker, false, (_, _) => Flags.Amy_Second)}, + { "Knuckles_First", new LazyWatcher(StateTracker, false, (_, _) => Flags.Knuckles_First)}, + { "Knuckles_Second", new LazyWatcher(StateTracker, false, (_, _) => Flags.Knuckles_Second)}, + { "Tails_First", new LazyWatcher(StateTracker, false, (_, _) => Flags.Tails_First)}, + { "Tails_Second", new LazyWatcher(StateTracker, false, (_, _) => Flags.Tails_Second)}, + { "Sonic_Tower1", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower1)}, + { "Sonic_Tower2", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower2)}, + { "Sonic_Tower3", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower3)}, + { "Sonic_Tower4", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_Tower4)}, + { "Sonic_MasterTrial", new LazyWatcher(StateTracker, false, (_, _) => Flags.Sonic_MasterTrial)}, //Skills (Manual Unlocks) { "Skill_Cyloop", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_Cyloop) }, - { "Skill_PhantomRush", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_PhantomRush) }, - { "Skill_AirTrick", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_AirTrick) }, - { "Skill_StompAttack", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_StompAttack) }, - { "Skill_QuickCyloop", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_QuickCyloop) }, - { "Skill_SonicBoom", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_SonicBoom) }, - { "Skill_WildRush", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_WildRush) }, - { "Skill_LoopKick", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_LoopKick) }, - { "Skill_HomingShot", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_HomingShot) }, - { "Skill_AutoCombo", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_AutoCombo) }, - { "Skill_SpinSlash", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_SpinSlash) }, - { "Skill_RecoverySmash", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_RecoverySmash) }, + { "Skill_PhantomRush", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_PhantomRush) }, + { "Skill_AirTrick", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_AirTrick) }, + { "Skill_StompAttack", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_StompAttack) }, + { "Skill_QuickCyloop", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_QuickCyloop) }, + { "Skill_SonicBoom", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_SonicBoom) }, + { "Skill_WildRush", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_WildRush) }, + { "Skill_LoopKick", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_LoopKick) }, + { "Skill_HomingShot", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_HomingShot) }, + { "Skill_AutoCombo", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_AutoCombo) }, + { "Skill_SpinSlash", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_SpinSlash) }, + { "Skill_RecoverySmash", new LazyWatcher(StateTracker, false, (_, _) => Flags.Skill_RecoverySmash) }, // Kronos { "Kronos_Ninja", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Ninja) }, - { "Kronos_Door", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Door) }, - { "Kronos_Amy", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Amy) }, - { "Kronos_GigantosFirst", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_GigantosFirst) }, - { "Kronos_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_GreenCE) }, - { "Kronos_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_CyanCE) }, - { "Kronos_Tombstones", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Tombstones) }, - { "Kronos_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_BlueCE) }, - { "Kronos_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_RedCE) }, - { "Kronos_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_YellowCE) }, - { "Kronos_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_WhiteCE) }, - { "Kronos_GigantosStart", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Kronos && ScanBossHsm(process, "Giant0", "WalkingBase")) }, - { "Kronos_SuperSonic", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Kronos && ScanBossHsm(process, "Giant0", "BattlePhaseParent")) }, - { "Island_Kronos_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Kronos && LevelID.Current == SonicFrontiers.LevelID.Island_Ares) }, - { "Island_Kronos_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Kronos) }, + { "Kronos_Door", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Door) }, + { "Kronos_Amy", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Amy) }, + { "Kronos_GigantosFirst", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_GigantosFirst) }, + { "Kronos_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_GreenCE) }, + { "Kronos_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_CyanCE) }, + { "Kronos_Tombstones", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_Tombstones) }, + { "Kronos_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_BlueCE) }, + { "Kronos_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_RedCE) }, + { "Kronos_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_YellowCE) }, + { "Kronos_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Kronos_WhiteCE) }, + { "Kronos_GigantosStart", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Kronos && ScanBossHsm(process, "Giant0", "WalkingBase")) }, + { "Kronos_SuperSonic", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Kronos && ScanBossHsm(process, "Giant0", "BattlePhaseParent")) }, + { "Island_Kronos_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Kronos && LevelID.Current == SonicFrontiers.LevelID.Island_Ares) }, + { "Island_Kronos_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Kronos) }, // Ares { "Ares_Knuckles", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_Knuckles) }, - { "Ares_WyvernFirst", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_WyvernFirst) }, - { "Ares_Water", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_Water) }, + { "Ares_WyvernFirst", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_WyvernFirst) }, + { "Ares_Water", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_Water) }, // { "Ares_KocoRoundup", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_KocoRoundup }, { "Ares_Crane", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_Crane) }, - { "Ares_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_GreenCE) }, - { "Ares_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_CyanCE) }, - { "Ares_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_BlueCE) }, - { "Ares_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_RedCE) }, - { "Ares_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_YellowCE) }, - { "Ares_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_WhiteCE) }, - { "Ares_WyvernStart", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Ares && ScanBossHsm(process, "Dragon0", "PatrolTop")) }, - { "Ares_WyvernRun", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Ares && ScanBossHsm(process, "Dragon0", "EventRise")) }, - { "Ares_SuperSonic", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Ares && ScanBossHsm(process, "Dragon0", "BattleTop")) }, - { "Island_Ares_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Ares && LevelID.Current == SonicFrontiers.LevelID.Island_Chaos) }, - { "Island_Ares_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Ares) }, + { "Ares_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_GreenCE) }, + { "Ares_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_CyanCE) }, + { "Ares_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_BlueCE) }, + { "Ares_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_RedCE) }, + { "Ares_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_YellowCE) }, + { "Ares_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ares_WhiteCE) }, + { "Ares_WyvernStart", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Ares && ScanBossHsm(process, "Dragon0", "PatrolTop")) }, + { "Ares_WyvernRun", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Ares && ScanBossHsm(process, "Dragon0", "EventRise")) }, + { "Ares_SuperSonic", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Ares && ScanBossHsm(process, "Dragon0", "BattleTop")) }, + { "Island_Ares_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Ares && LevelID.Current == SonicFrontiers.LevelID.Island_Chaos) }, + { "Island_Ares_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Ares) }, // Chaos { "Chaos_Tails", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_Tails) }, - { "Chaos_KnightFirst", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_KnightFirst) }, - { "Chaos_Hacking", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_Hacking) }, - { "Chaos_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_GreenCE) }, - { "Chaos_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_CyanCE) }, - { "Chaos_PinballStart", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_PinballStart) }, - { "Chaos_PinballEnd", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_PinballEnd)}, - { "Chaos_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_BlueCE) }, - { "Chaos_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_RedCE) }, - { "Chaos_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_YellowCE) }, - { "Chaos_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_WhiteCE) }, - { "Chaos_KnightStart", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_KnightStart) }, - { "Chaos_SuperSonic", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Chaos && ScanBossHsm(process, "Knight0", "Battle1Top")) }, - { "Island_Chaos_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Chaos && LevelID.Current == SonicFrontiers.LevelID.Island_Rhea) }, - { "Island_Chaos_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Chaos) }, + { "Chaos_KnightFirst", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_KnightFirst) }, + { "Chaos_Hacking", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_Hacking) }, + { "Chaos_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_GreenCE) }, + { "Chaos_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_CyanCE) }, + { "Chaos_PinballStart", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_PinballStart) }, + { "Chaos_PinballEnd", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_PinballEnd)}, + { "Chaos_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_BlueCE) }, + { "Chaos_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_RedCE) }, + { "Chaos_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_YellowCE) }, + { "Chaos_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_WhiteCE) }, + { "Chaos_KnightStart", new LazyWatcher(StateTracker, false, (_, _) => Flags.Chaos_KnightStart) }, + { "Chaos_SuperSonic", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Current == SonicFrontiers.LevelID.Island_Chaos && ScanBossHsm(process, "Knight0", "Battle1Top")) }, + { "Island_Chaos_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Chaos && LevelID.Current == SonicFrontiers.LevelID.Island_Rhea) }, + { "Island_Chaos_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Chaos) }, // Rhea { "Rhea_Tower1", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower1) }, - { "Rhea_Tower2", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower2) }, - { "Rhea_Tower3", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower3) }, - { "Rhea_Tower4", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower4) }, - { "Rhea_Tower5", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower5) }, - { "Rhea_Tower6", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower6) }, - { "Island_Rhea_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Rhea && LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos) }, + { "Rhea_Tower2", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower2) }, + { "Rhea_Tower3", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower3) }, + { "Rhea_Tower4", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower4) }, + { "Rhea_Tower5", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower5) }, + { "Rhea_Tower6", new LazyWatcher(StateTracker, false, (_, _) => Flags.Rhea_Tower6) }, + { "Island_Rhea_story", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Rhea && LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos) }, // Ouranos { "Ouranos_Bridge", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_Bridge) }, - { "Ouranos_SupremeDefeated",new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos && LevelID.Current == SonicFrontiers.LevelID.Boss_TheEnd) }, - { "Ouranos_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_BlueCE) }, - { "Ouranos_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_RedCE) }, - { "Ouranos_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_GreenCE) }, - { "Ouranos_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_YellowCE) }, - { "Ouranos_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_CyanCE) }, + { "Ouranos_SupremeDefeated",new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos && LevelID.Current == SonicFrontiers.LevelID.Boss_TheEnd) }, + { "Ouranos_BlueCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_BlueCE) }, + { "Ouranos_RedCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_RedCE) }, + { "Ouranos_GreenCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_GreenCE) }, + { "Ouranos_YellowCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_YellowCE) }, + { "Ouranos_CyanCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_CyanCE) }, //{ "Ouranos_WhiteCE", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_WhiteCE) }, { "Ouranos_FinalDoor", new LazyWatcher(StateTracker, false, (_, _) => Flags.Ouranos_FinalDoor) }, - { "Island_Ouranos_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos) } - }; - - BossRushAct = new LazyWatcher(StateTracker, SonicFrontiers.BossRushAct.None, (_, _) => - { - - var levelid = LevelID.Current; - if (levelid != SonicFrontiers.LevelID.Island_Kronos_BossRush && levelid != SonicFrontiers.LevelID.Island_Ares_BossRush && levelid != SonicFrontiers.LevelID.Island_Chaos_BossRush && levelid != SonicFrontiers.LevelID.Island_Ouranos_BossRush) - return SonicFrontiers.BossRushAct.None; - - if (!Engine.GetExtension("BattleRushExtension", out IntPtr battleRushExt) - || !process.Read(battleRushExt + 0x2C, out byte phase)) - return SonicFrontiers.BossRushAct.None; - - return levelid switch - { - SonicFrontiers.LevelID.Island_Kronos_BossRush => phase switch - { - 0 => SonicFrontiers.BossRushAct.b1_1, - 1 => SonicFrontiers.BossRushAct.b1_2, - 2 => SonicFrontiers.BossRushAct.b1_3, - 3 => SonicFrontiers.BossRushAct.b1_4, - 4 => SonicFrontiers.BossRushAct.b1_5, - 5 => SonicFrontiers.BossRushAct.b1_6, - 6 => SonicFrontiers.BossRushAct.b1_7, - 7 => SonicFrontiers.BossRushAct.b1_8, - 8 => SonicFrontiers.BossRushAct.b1_9, - 9 => SonicFrontiers.BossRushAct.b1_10, - _ => SonicFrontiers.BossRushAct.None, - }, - SonicFrontiers.LevelID.Island_Ares_BossRush => phase switch - { - 0 => SonicFrontiers.BossRushAct.b2_1, - 1 => SonicFrontiers.BossRushAct.b2_2, - 2 => SonicFrontiers.BossRushAct.b2_3, - 3 => SonicFrontiers.BossRushAct.b2_4, - 4 => SonicFrontiers.BossRushAct.b2_5, - 5 => SonicFrontiers.BossRushAct.b2_6, - 6 => SonicFrontiers.BossRushAct.b2_7, - 7 => SonicFrontiers.BossRushAct.b2_8, - 8 => SonicFrontiers.BossRushAct.b2_9, - 9 => SonicFrontiers.BossRushAct.b2_10, - _ => SonicFrontiers.BossRushAct.None, - }, - SonicFrontiers.LevelID.Island_Chaos_BossRush => phase switch - { - 0 => SonicFrontiers.BossRushAct.b3_1, - 1 => SonicFrontiers.BossRushAct.b3_2, - 2 => SonicFrontiers.BossRushAct.b3_3, - 3 => SonicFrontiers.BossRushAct.b3_4, - 4 => SonicFrontiers.BossRushAct.b3_5, - 5 => SonicFrontiers.BossRushAct.b3_6, - 6 => SonicFrontiers.BossRushAct.b3_7, - 7 => SonicFrontiers.BossRushAct.b3_8, - 8 => SonicFrontiers.BossRushAct.b3_9, - _ => SonicFrontiers.BossRushAct.None, - }, - SonicFrontiers.LevelID.Island_Ouranos_BossRush => phase switch - { - 0 => SonicFrontiers.BossRushAct.b4_1, - 1 => SonicFrontiers.BossRushAct.b4_2, - 2 => SonicFrontiers.BossRushAct.b4_3, - 3 => SonicFrontiers.BossRushAct.b4_4, - 4 => SonicFrontiers.BossRushAct.b4_5, - 5 => SonicFrontiers.BossRushAct.b4_6, - 6 => SonicFrontiers.BossRushAct.b4_7, - 7 => SonicFrontiers.BossRushAct.b4_8, - 8 => SonicFrontiers.BossRushAct.b4_9, - 9 => SonicFrontiers.BossRushAct.b4_10, - 10 => SonicFrontiers.BossRushAct.b4_11, - _ => SonicFrontiers.BossRushAct.None, - }, - _ => SonicFrontiers.BossRushAct.None, - }; - }); - } - - internal void Update(ProcessMemory process, Settings settings, LiveSplitState state) - { - ApplyHWNDpatch(process, settings); - StateTracker.Tick(); - - if (Engine.GetService("SaveManager", out IntPtr pSaveManager) - && process.Read(pSaveManager, out SaveManager saveManager) - && process.ReadPointer(saveManager.saveInterface.Value + 0x98, out IntPtr element) - && process.ReadPointer(element, out IntPtr userElement)) - { - using (ArrayRental flags = new ArrayRental(1)) - { - var span = flags.Span; - if (process.ReadArray(userElement, span)) - Flags = span[0]; - } - } - if(SplitBools.Values.Any(b => b.Changed)) - { - var changedKeys = SplitBools.Keys.Where(k => SplitBools[k].Changed); - foreach (var ck in changedKeys) - { - Log.Info(ck + " :" + SplitBools[ck].Current.ToString()); - } - } - - - - StoryModeCyberSpaceCompletionFlag.Update(); - IsInTutorial = LevelID.Current == SonicFrontiers.LevelID.Tutorial; - - - // I'm not happy I use 3 different variables to define the behaviour in the final QTE, but heh, it works - IsInEndQTE = LevelID.Current == SonicFrontiers.LevelID.Boss_TheEnd && Engine.GetObject("EventQTEInput", out _); - IsInAnotherBoss = IsFightingRifleBeast && Engine.GetObject("EventQTEInput", out _); - - - - - // If the timer is not running (eg. a run has been reset) these variables need to be reset - if (state.CurrentPhase == TimerPhase.NotRunning) - { - if (AccumulatedIGT != TimeSpan.Zero) - AccumulatedIGT = TimeSpan.Zero; - - if (AlreadyTriggeredBools.Count > 0) - AlreadyTriggeredBools.Clear(); - if (!HasStarted11Story) - { - HasStarted11Story = true; - } - } - if (GameMode.Current != SonicFrontiers.GameMode.Story) - { - // When exiting a stage, or whenever the IGT resets, this will keep track of the time you accumulated so far - if (IGT.Current == TimeSpan.Zero && IGT.Old != TimeSpan.Zero) - AccumulatedIGT += IGT.Old; - } else - { - if (state.CurrentPhase == TimerPhase.Running || state.CurrentPhase == TimerPhase.Paused) { - - if (!HasStarted11Story) - { - if(LevelID.Changed && LevelID.Current == SonicFrontiers.LevelID.w1_1) - { - Log.Info($"{LevelID.Old} => {LevelID.Current}"); - HasStarted11Story = true; - } - } - } - } - } - - /// - /// Applies or removes the game patch to control focus behavior. - /// - /// The current process memory instance. - /// The settings specifying whether to apply the patch. - private void ApplyHWNDpatch(ProcessMemory process, Settings settings) - { - IntPtr address = Engine.HWndAddress; - bool setting = settings.WFocus; - - if (process.Read(address, out byte val)) - { - // If the game is unpatched and we want the patch to be applied - if (val == 0x74 && setting) - process.Write(Engine.HWndAddress, 0xEB); // Apply patch - - // If the game is patched and we want the patch to be removed - else if (val == 0xEB && !setting) - process.Write(Engine.HWndAddress, 0x74); // Remove patch - } - } - - /// - /// Determines if the game is currently loading. - /// - /// True if the game is loading; otherwise, false. - internal bool? IsLoading(Settings settings) - { - //all these modes use IGT only - if (GameMode.Current == SonicFrontiers.GameMode.Arcade || GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge || GameMode.Current == SonicFrontiers.GameMode.BossRush) - { - return null; - } - - if (!Engine.GetExtension("GameModeHsmExtension", out _)) { - - return true; - } - if (!settings.IslandILStart && !HasStarted11Story) - { - return true; - } - if (LevelID.Current != SonicFrontiers.LevelID.MainMenu && Engine.GameMode == "GameModeLoad") - { - - return true; - } - if (IsInTutorial && (LevelID.Current <= SonicFrontiers.LevelID.w4_9 || LevelID.Current == SonicFrontiers.LevelID.Fishing)) - { - return true; - } - //fix for cyberspace taking randomly longer to finish in >=1.20 - if (LevelID.Current != SonicFrontiers.LevelID.MainMenu && (GameVersion == GameVersion.Unknown || GameVersion == GameVersion.v1_10) && HsmStatus.Current[1] == "Finish") - { - return true; - } - if ((Engine.GameMode != "GameModeTitle")) { - if (!HasPlayerInformationUpdater.Current) - { - return true; - } - } - - return false; - - } - - internal bool Start(Settings settings) - { - if (HsmStatus.Current[1] == "Quit" && HsmStatus.Old[1] == "NewGameMenu") - { - HasStarted11Story = false; - return settings.StoryStart; - } - else if(settings.ArcadeStart && GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge) - { - return LevelID.Changed && LevelID.Old == SonicFrontiers.LevelID.MainMenu; - } - else if(settings.BossRushStart && GameMode.Current == SonicFrontiers.GameMode.BossRush) - { - return LevelID.Changed && LevelID.Old == SonicFrontiers.LevelID.MainMenu; - } - else if(LevelID.Current == SonicFrontiers.LevelID.Island_Another_Ouranos && - LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) - { - return true; - } - else if(settings.IslandILStart && LevelID.Old == SonicFrontiers.LevelID.MainMenu && (LevelID.Current == SonicFrontiers.LevelID.Island_Ares || LevelID.Current == SonicFrontiers.LevelID.Island_Chaos || LevelID.Current == SonicFrontiers.LevelID.Island_Rhea || LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos)) - { - AlreadyTriggeredBools.Add("Island_Kronos_story"); - return true; - } - return false; - } - - internal bool Split(Settings settings) - { - if (GameMode.Current == SonicFrontiers.GameMode.Arcade || GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge) - { - if (!CheckArcadeSplit(LevelID.Old, settings)) - { - return false; - } - if (LevelID.Old == SonicFrontiers.LevelID.w4_9 && settings.w4_9_arcade_soon) - { - return HsmStatus.Changed && HsmStatus.Current[1] == "Finish"; - } - return HsmStatus.Changed && HsmStatus.Old[1] == "Result"; - } - - if (GameMode.Current == SonicFrontiers.GameMode.BossRush) - { - return BossRushAct.Old switch - { - SonicFrontiers.BossRushAct.b1_1 => settings.Boss1_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_2, - SonicFrontiers.BossRushAct.b1_2 => settings.Boss1_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_3, - SonicFrontiers.BossRushAct.b1_3 => settings.Boss1_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_4, - SonicFrontiers.BossRushAct.b1_4 => settings.Boss1_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_5, - SonicFrontiers.BossRushAct.b1_5 => settings.Boss1_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_6, - SonicFrontiers.BossRushAct.b1_6 => settings.Boss1_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_7, - SonicFrontiers.BossRushAct.b1_7 => settings.Boss1_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_8, - SonicFrontiers.BossRushAct.b1_8 => settings.Boss1_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_9, - SonicFrontiers.BossRushAct.b1_9 => settings.Boss1_9 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_10, - SonicFrontiers.BossRushAct.b1_10 => settings.Boss1_10 && ((IGT.Old > IGT.Current && IGT.Current == TimeSpan.Zero)), // || (Status.Changed && Status.Current == Status.StageResult)), - SonicFrontiers.BossRushAct.b2_1 => settings.Boss2_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_2, - SonicFrontiers.BossRushAct.b2_2 => settings.Boss2_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_3, - SonicFrontiers.BossRushAct.b2_3 => settings.Boss2_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_4, - SonicFrontiers.BossRushAct.b2_4 => settings.Boss2_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_5, - SonicFrontiers.BossRushAct.b2_5 => settings.Boss2_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_6, - SonicFrontiers.BossRushAct.b2_6 => settings.Boss2_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_7, - SonicFrontiers.BossRushAct.b2_7 => settings.Boss2_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_8, - SonicFrontiers.BossRushAct.b2_8 => settings.Boss2_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_9, - SonicFrontiers.BossRushAct.b2_9 => settings.Boss2_9 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_10, - SonicFrontiers.BossRushAct.b2_10 => settings.Boss2_10 && (IGT.Old > IGT.Current && IGT.Current == TimeSpan.Zero), // || (Status.Changed && Status.Current == Status.StageResult)), - SonicFrontiers.BossRushAct.b3_1 => settings.Boss3_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_2, - SonicFrontiers.BossRushAct.b3_2 => settings.Boss3_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_3, - SonicFrontiers.BossRushAct.b3_3 => settings.Boss3_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_4, - SonicFrontiers.BossRushAct.b3_4 => settings.Boss3_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_5, - SonicFrontiers.BossRushAct.b3_5 => settings.Boss3_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_6, - SonicFrontiers.BossRushAct.b3_6 => settings.Boss3_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_7, - SonicFrontiers.BossRushAct.b3_7 => settings.Boss3_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_8, - SonicFrontiers.BossRushAct.b3_8 => settings.Boss3_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_9, - SonicFrontiers.BossRushAct.b3_9 => settings.Boss3_9 && (IGT.Old > IGT.Current && IGT.Current == TimeSpan.Zero), // || (Status.Changed && Status.Current == Status.StageResult)), - SonicFrontiers.BossRushAct.b4_1 => settings.Boss4_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_2, - SonicFrontiers.BossRushAct.b4_2 => settings.Boss4_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_3, - SonicFrontiers.BossRushAct.b4_3 => settings.Boss4_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_4, - SonicFrontiers.BossRushAct.b4_4 => settings.Boss4_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_5, - SonicFrontiers.BossRushAct.b4_5 => settings.Boss4_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_6, - SonicFrontiers.BossRushAct.b4_6 => settings.Boss4_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_7, - SonicFrontiers.BossRushAct.b4_7 => settings.Boss4_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_8, - SonicFrontiers.BossRushAct.b4_8 => settings.Boss4_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_9, - SonicFrontiers.BossRushAct.b4_9 => settings.Boss4_9 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_10, - SonicFrontiers.BossRushAct.b4_10 => settings.Boss4_10 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_11, - SonicFrontiers.BossRushAct.b4_11 => settings.Boss4_11 && HsmStatus.Changed && HsmStatus.Current[1] == "StageResult", - _ => false - }; - } - - //Story Mode - - foreach (var flag in SplitBools.Where(b => !AlreadyTriggeredBools.Contains(b.Key))) - { - - if (CheckBoolSplit(flag.Key, settings) && !flag.Value.Old && flag.Value.Current) - { - - Log.Info("SPLIT ON " + flag.Key); - return true; - } - } - - //Music Notes - if (settings.MusicNoteAny && MusicNotes.Changed && MusicNotes.Old != null) - { - return true; - } - if (MusicNotes.Old == null) - { - Log.Warning("musicnotes old is null"); - } - - //Island Swap - if (settings.IslandSwapSplit && LevelID.Current == SonicFrontiers.LevelID.Island_Kronos) - { - - if (LevelID.Old == SonicFrontiers.LevelID.Island_Ares || LevelID.Old == SonicFrontiers.LevelID.Island_Chaos || LevelID.Old == SonicFrontiers.LevelID.Island_Rhea || LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) - { - return true; - } - } - - //Enter Cyberspace Stage - if (settings.EnterCyberspaceSplit && (LevelID.Current < SonicFrontiers.LevelID.Island_Kronos || LevelID.Current == SonicFrontiers.LevelID.Fishing)) - { - if (LevelID.Old == SonicFrontiers.LevelID.Island_Ares || LevelID.Old == SonicFrontiers.LevelID.Island_Chaos || LevelID.Old == SonicFrontiers.LevelID.Island_Another_Ouranos || LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) - { - return true; - } - } - - //Start Hacking - if((settings.Chaos_HackingStart && LevelID.Current == SonicFrontiers.LevelID.Hacking_01 && LevelID.Old == SonicFrontiers.LevelID.Island_Chaos) - || (settings.Ouranos_FirstHackingStart && LevelID.Current == SonicFrontiers.LevelID.Hacking_02 && LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) - || (settings.Ouranos_SecondHackingStart && LevelID.Current == SonicFrontiers.LevelID.Hacking_03 && LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos)){ - return true; - } - - - - //Cyberspace within story mode - return CheckStorySplit(LevelID.Old, settings) && StoryModeCyberSpaceCompletionFlag.Old && !StoryModeCyberSpaceCompletionFlag.Current; - } - private bool CheckArcadeSplit(LevelID input, Settings settings) => input switch - { - SonicFrontiers.LevelID.w1_1 => settings.w1_1_arcade, - SonicFrontiers.LevelID.w1_2 => settings.w1_2_arcade, - SonicFrontiers.LevelID.w1_3 => settings.w1_3_arcade, - SonicFrontiers.LevelID.w1_4 => settings.w1_4_arcade, - SonicFrontiers.LevelID.w1_5 => settings.w1_5_arcade, - SonicFrontiers.LevelID.w1_6 => settings.w1_6_arcade, - SonicFrontiers.LevelID.w1_7 => settings.w1_7_arcade, - SonicFrontiers.LevelID.w2_1 => settings.w2_1_arcade, - SonicFrontiers.LevelID.w2_2 => settings.w2_2_arcade, - SonicFrontiers.LevelID.w2_3 => settings.w2_3_arcade, - SonicFrontiers.LevelID.w2_4 => settings.w2_4_arcade, - SonicFrontiers.LevelID.w2_5 => settings.w2_5_arcade, - SonicFrontiers.LevelID.w2_6 => settings.w2_6_arcade, - SonicFrontiers.LevelID.w2_7 => settings.w2_7_arcade, - SonicFrontiers.LevelID.w3_1 => settings.w3_1_arcade, - SonicFrontiers.LevelID.w3_2 => settings.w3_2_arcade, - SonicFrontiers.LevelID.w3_3 => settings.w3_3_arcade, - SonicFrontiers.LevelID.w3_4 => settings.w3_4_arcade, - SonicFrontiers.LevelID.w3_5 => settings.w3_5_arcade, - SonicFrontiers.LevelID.w3_6 => settings.w3_6_arcade, - SonicFrontiers.LevelID.w3_7 => settings.w3_7_arcade, - SonicFrontiers.LevelID.w4_1 => settings.w4_1_arcade, - SonicFrontiers.LevelID.w4_2 => settings.w4_2_arcade, - SonicFrontiers.LevelID.w4_3 => settings.w4_3_arcade, - SonicFrontiers.LevelID.w4_4 => settings.w4_4_arcade, - SonicFrontiers.LevelID.w4_5 => settings.w4_5_arcade, - SonicFrontiers.LevelID.w4_6 => settings.w4_6_arcade, - SonicFrontiers.LevelID.w4_7 => settings.w4_7_arcade, - SonicFrontiers.LevelID.w4_8 => settings.w4_8_arcade, - SonicFrontiers.LevelID.w4_9 => settings.w4_9_arcade, - _ => false, - }; - - private bool CheckStorySplit(LevelID input, Settings settings) => input switch - { - SonicFrontiers.LevelID.w1_1 => settings.w1_1_story, - SonicFrontiers.LevelID.w1_2 => settings.w1_2_story, - SonicFrontiers.LevelID.w1_3 => settings.w1_3_story, - SonicFrontiers.LevelID.w1_4 => settings.w1_4_story, - SonicFrontiers.LevelID.w1_5 => settings.w1_5_story, - SonicFrontiers.LevelID.w1_6 => settings.w1_6_story, - SonicFrontiers.LevelID.w1_7 => settings.w1_7_story, - SonicFrontiers.LevelID.w2_1 => settings.w2_1_story, - SonicFrontiers.LevelID.w2_2 => settings.w2_2_story, - SonicFrontiers.LevelID.w2_3 => settings.w2_3_story, - SonicFrontiers.LevelID.w2_4 => settings.w2_4_story, - SonicFrontiers.LevelID.w2_5 => settings.w2_5_story, - SonicFrontiers.LevelID.w2_6 => settings.w2_6_story, - SonicFrontiers.LevelID.w2_7 => settings.w2_7_story, - SonicFrontiers.LevelID.w3_1 => settings.w3_1_story, - SonicFrontiers.LevelID.w3_2 => settings.w3_2_story, - SonicFrontiers.LevelID.w3_3 => settings.w3_3_story, - SonicFrontiers.LevelID.w3_4 => settings.w3_4_story, - SonicFrontiers.LevelID.w3_5 => settings.w3_5_story, - SonicFrontiers.LevelID.w3_6 => settings.w3_6_story, - SonicFrontiers.LevelID.w3_7 => settings.w3_7_story, - SonicFrontiers.LevelID.w4_1 => settings.w4_1_story, - SonicFrontiers.LevelID.w4_2 => settings.w4_2_story, - SonicFrontiers.LevelID.w4_3 => settings.w4_3_story, - SonicFrontiers.LevelID.w4_4 => settings.w4_4_story, - SonicFrontiers.LevelID.w4_5 => settings.w4_5_story, - SonicFrontiers.LevelID.w4_6 => settings.w4_6_story, - SonicFrontiers.LevelID.w4_7 => settings.w4_7_story, - SonicFrontiers.LevelID.w4_8 => settings.w4_8_story, - SonicFrontiers.LevelID.w4_9 => settings.w4_9_story, - SonicFrontiers.LevelID.w4_A => settings.w4_A_story, - SonicFrontiers.LevelID.w4_B => settings.w4_B_story, - SonicFrontiers.LevelID.w4_C => settings.w4_C_story, - SonicFrontiers.LevelID.w4_D => settings.w4_D_story, - SonicFrontiers.LevelID.w4_E => settings.w4_E_story, - SonicFrontiers.LevelID.w4_F => settings.w4_F_story, - SonicFrontiers.LevelID.w4_G => settings.w4_G_story, - SonicFrontiers.LevelID.w4_H => settings.w4_H_story, - SonicFrontiers.LevelID.w4_I => settings.w4_I_story, - _ => false, - }; - - private bool CheckBoolSplit(string key, Settings settings) => key switch - { - "Amy_First" => settings.Amy_First, - "Knuckles_First" => settings.Knuckles_First, - "Tails_First" => settings.Tails_First, - "Amy_Second" => settings.Amy_Second, - "Knuckles_Second" => settings.Knuckles_Second, - "Tails_Second" => settings.Tails_Second, - "Sonic_MasterTrial" => settings.Sonic_MasterTrial, - "Sonic_Tower1" => settings.Sonic_Tower1, - "Sonic_Tower2" => settings.Sonic_Tower2, - "Sonic_Tower3" => settings.Sonic_Tower3, - "Sonic_Tower4" => settings.Sonic_Tower4, - "Skill_Cyloop" => settings.Skill_Cyloop, - "Skill_PhantomRush" => settings.Skill_PhantomRush, - "Skill_AirTrick" => settings.Skill_AirTrick, - "Skill_StompAttack" => settings.Skill_StompAttack, - "Skill_QuickCyloop" => settings.Skill_QuickCyloop, - "Skill_SonicBoom" => settings.Skill_SonicBoom, - "Skill_WildRush" => settings.Skill_WildRush, - "Skill_LoopKick" => settings.Skill_LoopKick, - "Skill_HomingShot" => settings.Skill_HomingShot, - "Skill_AutoCombo" => settings.Skill_AutoCombo, - "Skill_SpinSlash" => settings.Skill_SpinSlash, - "Skill_RecoverySmash" => settings.Skill_RecoverySmash, - "Kronos_Ninja" => settings.Kronos_Ninja, - "Kronos_Door" => settings.Kronos_Door, - "Kronos_Amy" => settings.Kronos_Amy, - "Kronos_GigantosFirst" => settings.Kronos_GigantosFirst, - "Kronos_GreenCE" => settings.Kronos_GreenCE, - "Kronos_CyanCE" => settings.Kronos_CyanCE, - "Kronos_Tombstones" => settings.Kronos_Tombstones, - "Kronos_BlueCE" => settings.Kronos_BlueCE, - "Kronos_RedCE" => settings.Kronos_RedCE, - "Kronos_YellowCE" => settings.Kronos_YellowCE, - "Kronos_WhiteCE" => settings.Kronos_WhiteCE, - "Kronos_GigantosStart" => settings.Kronos_GigantosStart, - "Kronos_SuperSonic" => settings.Kronos_SuperSonic, - "Island_Kronos_story" => settings.Island_Kronos_story, - "Island_Kronos_fishing" => settings.Island_Kronos_fishing, - "Ares_Knuckles" => settings.Ares_Knuckles, - "Ares_WyvernFirst" => settings.Ares_WyvernFirst, - "Ares_Water" => settings.Ares_Water, - // "Ares_KocoRoundup" => settings.Ares_KocoRoundup, - "Ares_Crane" => settings.Ares_Crane, - "Ares_GreenCE" => settings.Ares_GreenCE, - "Ares_CyanCE" => settings.Ares_CyanCE, - "Ares_BlueCE" => settings.Ares_BlueCE, - "Ares_RedCE" => settings.Ares_RedCE, - "Ares_YellowCE" => settings.Ares_YellowCE, - "Ares_WhiteCE" => settings.Ares_WhiteCE, - "Ares_WyvernStart" => settings.Ares_WyvernStart, - "Ares_WyvernRun" => settings.Ares_WyvernRun, - "Ares_SuperSonic" => settings.Ares_SuperSonic, - "Island_Ares_story" => settings.Island_Ares_story, - "Island_Ares_fishing" => settings.Island_Ares_fishing, - "Chaos_Tails" => settings.Chaos_Tails, - "Chaos_KnightFirst" => settings.Chaos_KnightFirst, - "Chaos_Hacking" => settings.Chaos_Hacking, - "Chaos_GreenCE" => settings.Chaos_GreenCE, - "Chaos_CyanCE" => settings.Chaos_CyanCE, - "Chaos_PinballStart" => settings.Chaos_PinballStart, - "Chaos_PinballEnd" => settings.Chaos_PinballEnd, - "Chaos_BlueCE" => settings.Chaos_BlueCE, - "Chaos_RedCE" => settings.Chaos_RedCE, - "Chaos_YellowCE" => settings.Chaos_YellowCE, - "Chaos_WhiteCE" => settings.Chaos_WhiteCE, - "Chaos_KnightStart" => settings.Chaos_KnightStart, - "Chaos_SuperSonic" => settings.Chaos_SuperSonic, - "Island_Chaos_story" => settings.Island_Chaos_story, - "Island_Chaos_fishing" => settings.Island_Chaos_fishing, - "Rhea_Tower1" => settings.Rhea_Tower1, - "Rhea_Tower2" => settings.Rhea_Tower2, - "Rhea_Tower3" => settings.Rhea_Tower3, - "Rhea_Tower4" => settings.Rhea_Tower4, - "Rhea_Tower5" => settings.Rhea_Tower5, - "Rhea_Tower6" => settings.Rhea_Tower6, - "Island_Rhea_story" => settings.Island_Rhea_story, - "Ouranos_FirstHackingStart" => settings.Ouranos_FirstHackingStart, - "Ouranos_Bridge" => settings.Ouranos_Bridge, - "Ouranos_SupremeDefeated" => settings.Ouranos_SupremeDefeated, - "Ouranos_BlueCE" => settings.Ouranos_BlueCE, - "Ouranos_RedCE" => settings.Ouranos_RedCE, - "Ouranos_GreenCE" => settings.Ouranos_GreenCE, - "Ouranos_YellowCE" => settings.Ouranos_YellowCE, - "Ouranos_CyanCE" => settings.Ouranos_CyanCE, - //"Ouranos_WhiteCE" => settings.Ouranos_WhiteCE, - "Island_Ouranos_fishing" => settings.Island_Ouranos_fishing, - "Ouranos_SecondHackingStart" => settings.Ouranos_SecondHackingStart, - "Ouranos_FinalDoor" => settings.Ouranos_FinalDoor, - _ => false, - }; - - internal bool Reset(Settings settings) - { - return HsmStatus.Current[1] == "Quit" && HsmStatus.Old[1] == "NewGameMenu" && settings.AutoReset; - } - - private bool ScanBossHsm(ProcessMemory process, string bossName, string bossMove) - { - if (!Engine.GetObject(bossName, out IntPtr boss) || !process.Read(boss, out Boss bossData)) - { - return false; - } - using (ArrayRental> buf = new(bossData.noOfElements)) - { - if (!process.ReadArray(bossData.array.Value, buf.Span)) - return false; - var val = ""; - - foreach (var entry in buf.Span) - { - if (!process.Read(entry.Value, out BossHsm bossHsm) - || !process.ReadPointer(bossHsm.statik.Value, out IntPtr name) - || !process.ReadString(name, 127, StringType.ASCII, out val) - || val != "GOCHsm2") - { - continue; - } - - using (ArrayRental> newBuf = new(bossHsm.noOfElements)) - { - if (!process.ReadArray(bossHsm.array.Value, newBuf.Span)) - return false; - foreach (var element in newBuf.Span) - { - - if (Engine.RTTI.Lookup(element.Value, out val) && val == bossMove) { - - return true; - } - - } - } - } - } - - return false; - } - - private bool playerHasComponentName(ProcessMemory process, string componentName) - { - if (!process.Read(PlayerInstance.Current, out PlayerCharacter playerCharacter)) - { - return false; - } - using (ArrayRental> buf = new(playerCharacter.noOfElements)) - { - if (!process.ReadArray(playerCharacter.GOCArray.Value, buf.Span)) - return false; - string name = "N/A"; - foreach (var entry in buf.Span) - { - if (!process.Read(entry.Value + 0x48, out IntPtr GOCPtr) - || !process.ReadPointer(GOCPtr, out IntPtr namePtr) - || !process.ReadString(namePtr, 127, StringType.ASCII, out name) - || name != componentName) - { - continue; - } - return true; - } - } - - return false; - } - - /// - /// This function is essentially equivalent of the init descriptor in script-based autosplitters. - /// Everything you want to be executed when the game gets hooked needs to be put here. - /// The main purpose of this function is to perform sigscanning and get memory addresses and offsets - /// needed by the autosplitter. - /// - - /* + { "Island_Ouranos_fishing", new LazyWatcher(StateTracker, false, (_, _) => LevelID.Old == SonicFrontiers.LevelID.Fishing && LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos) } + }; + + BossRushAct = new LazyWatcher(StateTracker, SonicFrontiers.BossRushAct.None, (_, _) => { + + var levelid = LevelID.Current; + if (levelid != SonicFrontiers.LevelID.Island_Kronos_BossRush && levelid != SonicFrontiers.LevelID.Island_Ares_BossRush && levelid != SonicFrontiers.LevelID.Island_Chaos_BossRush && levelid != SonicFrontiers.LevelID.Island_Ouranos_BossRush) + return SonicFrontiers.BossRushAct.None; + + if (!Engine.GetExtension("BattleRushExtension", out IntPtr battleRushExt) + || !process.Read(battleRushExt + 0x2C, out byte phase)) + return SonicFrontiers.BossRushAct.None; + + return levelid switch { + SonicFrontiers.LevelID.Island_Kronos_BossRush => phase switch { + 0 => SonicFrontiers.BossRushAct.b1_1, + 1 => SonicFrontiers.BossRushAct.b1_2, + 2 => SonicFrontiers.BossRushAct.b1_3, + 3 => SonicFrontiers.BossRushAct.b1_4, + 4 => SonicFrontiers.BossRushAct.b1_5, + 5 => SonicFrontiers.BossRushAct.b1_6, + 6 => SonicFrontiers.BossRushAct.b1_7, + 7 => SonicFrontiers.BossRushAct.b1_8, + 8 => SonicFrontiers.BossRushAct.b1_9, + 9 => SonicFrontiers.BossRushAct.b1_10, + _ => SonicFrontiers.BossRushAct.None, + }, + SonicFrontiers.LevelID.Island_Ares_BossRush => phase switch { + 0 => SonicFrontiers.BossRushAct.b2_1, + 1 => SonicFrontiers.BossRushAct.b2_2, + 2 => SonicFrontiers.BossRushAct.b2_3, + 3 => SonicFrontiers.BossRushAct.b2_4, + 4 => SonicFrontiers.BossRushAct.b2_5, + 5 => SonicFrontiers.BossRushAct.b2_6, + 6 => SonicFrontiers.BossRushAct.b2_7, + 7 => SonicFrontiers.BossRushAct.b2_8, + 8 => SonicFrontiers.BossRushAct.b2_9, + 9 => SonicFrontiers.BossRushAct.b2_10, + _ => SonicFrontiers.BossRushAct.None, + }, + SonicFrontiers.LevelID.Island_Chaos_BossRush => phase switch { + 0 => SonicFrontiers.BossRushAct.b3_1, + 1 => SonicFrontiers.BossRushAct.b3_2, + 2 => SonicFrontiers.BossRushAct.b3_3, + 3 => SonicFrontiers.BossRushAct.b3_4, + 4 => SonicFrontiers.BossRushAct.b3_5, + 5 => SonicFrontiers.BossRushAct.b3_6, + 6 => SonicFrontiers.BossRushAct.b3_7, + 7 => SonicFrontiers.BossRushAct.b3_8, + 8 => SonicFrontiers.BossRushAct.b3_9, + _ => SonicFrontiers.BossRushAct.None, + }, + SonicFrontiers.LevelID.Island_Ouranos_BossRush => phase switch { + 0 => SonicFrontiers.BossRushAct.b4_1, + 1 => SonicFrontiers.BossRushAct.b4_2, + 2 => SonicFrontiers.BossRushAct.b4_3, + 3 => SonicFrontiers.BossRushAct.b4_4, + 4 => SonicFrontiers.BossRushAct.b4_5, + 5 => SonicFrontiers.BossRushAct.b4_6, + 6 => SonicFrontiers.BossRushAct.b4_7, + 7 => SonicFrontiers.BossRushAct.b4_8, + 8 => SonicFrontiers.BossRushAct.b4_9, + 9 => SonicFrontiers.BossRushAct.b4_10, + 10 => SonicFrontiers.BossRushAct.b4_11, + _ => SonicFrontiers.BossRushAct.None, + }, + _ => SonicFrontiers.BossRushAct.None, + }; + }); + } + + internal void Update(ProcessMemory process, Settings settings, LiveSplitState state) { + + ApplyHWNDpatch(process, settings); + StateTracker.Tick(); + + if (Engine.GetService("SaveManager", out IntPtr pSaveManager) + && process.Read(pSaveManager, out SaveManager saveManager) + && process.ReadPointer(saveManager.saveInterface.Value + 0x98, out IntPtr element) + && process.ReadPointer(element, out IntPtr userElement)) { + using (ArrayRental flags = new ArrayRental(1)) { + var span = flags.Span; + if (process.ReadArray(userElement, span)) + Flags = span[0]; + } + } + + + + StoryModeCyberSpaceCompletionFlag.Update(); + IsInTutorial = LevelID.Current == SonicFrontiers.LevelID.Tutorial; + + + // I'm not happy I use 3 different variables to define the behaviour in the final QTE, but heh, it works + IsInEndQTE = LevelID.Current == SonicFrontiers.LevelID.Boss_TheEnd && Engine.GetObject("EventQTEInput", out _); + IsInAnotherBoss = IsFightingRifleBeast && Engine.GetObject("EventQTEInput", out _); + + + + + // If the timer is not running (eg. a run has been reset) these variables need to be reset + if (state.CurrentPhase == TimerPhase.NotRunning) { + if (AccumulatedIGT != TimeSpan.Zero) + AccumulatedIGT = TimeSpan.Zero; + + if (AlreadyTriggeredBools.Count > 0) + AlreadyTriggeredBools.Clear(); + if (!HasStarted11Story) { + HasStarted11Story = true; + } + } + if (GameMode.Current != SonicFrontiers.GameMode.Story) { + // When exiting a stage, or whenever the IGT resets, this will keep track of the time you accumulated so far + if (IGT.Current == TimeSpan.Zero && IGT.Old != TimeSpan.Zero) + AccumulatedIGT += IGT.Old; + } + else { + if (state.CurrentPhase == TimerPhase.Running || state.CurrentPhase == TimerPhase.Paused) { + + if (!HasStarted11Story) { + if (LevelID.Changed && LevelID.Current == SonicFrontiers.LevelID.w1_1) { + Log.Info($"{LevelID.Old} => {LevelID.Current}"); + HasStarted11Story = true; + } + } + } + } + } + + /// + /// Applies or removes the game patch to control focus behavior. + /// + /// The current process memory instance. + /// The settings specifying whether to apply the patch. + private void ApplyHWNDpatch(ProcessMemory process, Settings settings) { + IntPtr address = Engine.HWndAddress; + bool setting = settings.WFocus; + + if (process.Read(address, out byte val)) { + // If the game is unpatched and we want the patch to be applied + if (val == 0x74 && setting) + process.Write(Engine.HWndAddress, 0xEB); // Apply patch + + // If the game is patched and we want the patch to be removed + else if (val == 0xEB && !setting) + process.Write(Engine.HWndAddress, 0x74); // Remove patch + } + } + + /// + /// Determines if the game is currently loading. + /// + /// True if the game is loading; otherwise, false. + internal bool? IsLoading(Settings settings) { + //all these modes use IGT only + if (GameMode.Current == SonicFrontiers.GameMode.Arcade || GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge || GameMode.Current == SonicFrontiers.GameMode.BossRush) { + return null; + } + + if (!Engine.GetExtension("GameModeHsmExtension", out _)) { + + return true; + } + if (!settings.IslandILStart && !HasStarted11Story) { + return true; + } + if (LevelID.Current != SonicFrontiers.LevelID.MainMenu && Engine.GameMode == "GameModeLoad") { + + return true; + } + if (IsInTutorial && (LevelID.Current <= SonicFrontiers.LevelID.w4_9 || LevelID.Current == SonicFrontiers.LevelID.Fishing)) { + return true; + } + //fix for cyberspace taking randomly longer to finish in >=1.20 + if (LevelID.Current != SonicFrontiers.LevelID.MainMenu && (GameVersion == GameVersion.Unknown || GameVersion == GameVersion.v1_10) && HsmStatus.Current[1] == "Finish") { + return true; + } + if ((Engine.GameMode != "GameModeTitle")) { + if (!HasPlayerInformationUpdater.Current && !(LevelID.Current == SonicFrontiers.LevelID.Fishing || LevelID.Current == SonicFrontiers.LevelID.Hacking_01 || LevelID.Current == SonicFrontiers.LevelID.Hacking_02 || LevelID.Current == SonicFrontiers.LevelID.Hacking_03 || LevelID.Current == SonicFrontiers.LevelID.Boss_TheEnd)) { + return true; + } + } + + return false; + + } + + internal bool Start(Settings settings) { + if (HsmStatus.Current[1] == "Quit" && HsmStatus.Old[1] == "NewGameMenu") { + HasStarted11Story = false; + return settings.StoryStart; + } + else if (settings.ArcadeStart && GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge) { + return LevelID.Changed && LevelID.Old == SonicFrontiers.LevelID.MainMenu; + } + else if (settings.BossRushStart && GameMode.Current == SonicFrontiers.GameMode.BossRush) { + return LevelID.Changed && LevelID.Old == SonicFrontiers.LevelID.MainMenu; + } + else if (LevelID.Current == SonicFrontiers.LevelID.Island_Another_Ouranos && + LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) { + return true; + } + else if (settings.IslandILStart && LevelID.Old == SonicFrontiers.LevelID.MainMenu && (LevelID.Current == SonicFrontiers.LevelID.Island_Ares || LevelID.Current == SonicFrontiers.LevelID.Island_Chaos || LevelID.Current == SonicFrontiers.LevelID.Island_Rhea || LevelID.Current == SonicFrontiers.LevelID.Island_Ouranos)) { + AlreadyTriggeredBools.Add("Island_Kronos_story"); + return true; + } + return false; + } + + internal bool Split(Settings settings) { + if (GameMode.Current == SonicFrontiers.GameMode.Arcade || GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge) { + if (!CheckArcadeSplit(LevelID.Old, settings)) { + return false; + } + if (LevelID.Old == SonicFrontiers.LevelID.w4_9 && settings.w4_9_arcade_soon) { + return HsmStatus.Changed && HsmStatus.Current[1] == "Finish"; + } + return HsmStatus.Changed && HsmStatus.Old[1] == "Result"; + } + + if (GameMode.Current == SonicFrontiers.GameMode.BossRush) { + return BossRushAct.Old switch { + SonicFrontiers.BossRushAct.b1_1 => settings.Boss1_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_2, + SonicFrontiers.BossRushAct.b1_2 => settings.Boss1_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_3, + SonicFrontiers.BossRushAct.b1_3 => settings.Boss1_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_4, + SonicFrontiers.BossRushAct.b1_4 => settings.Boss1_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_5, + SonicFrontiers.BossRushAct.b1_5 => settings.Boss1_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_6, + SonicFrontiers.BossRushAct.b1_6 => settings.Boss1_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_7, + SonicFrontiers.BossRushAct.b1_7 => settings.Boss1_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_8, + SonicFrontiers.BossRushAct.b1_8 => settings.Boss1_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_9, + SonicFrontiers.BossRushAct.b1_9 => settings.Boss1_9 && BossRushAct.Current == SonicFrontiers.BossRushAct.b1_10, + SonicFrontiers.BossRushAct.b1_10 => settings.Boss1_10 && ((IGT.Old > IGT.Current && IGT.Current == TimeSpan.Zero)), // || (Status.Changed && Status.Current == Status.StageResult)), + SonicFrontiers.BossRushAct.b2_1 => settings.Boss2_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_2, + SonicFrontiers.BossRushAct.b2_2 => settings.Boss2_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_3, + SonicFrontiers.BossRushAct.b2_3 => settings.Boss2_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_4, + SonicFrontiers.BossRushAct.b2_4 => settings.Boss2_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_5, + SonicFrontiers.BossRushAct.b2_5 => settings.Boss2_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_6, + SonicFrontiers.BossRushAct.b2_6 => settings.Boss2_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_7, + SonicFrontiers.BossRushAct.b2_7 => settings.Boss2_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_8, + SonicFrontiers.BossRushAct.b2_8 => settings.Boss2_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_9, + SonicFrontiers.BossRushAct.b2_9 => settings.Boss2_9 && BossRushAct.Current == SonicFrontiers.BossRushAct.b2_10, + SonicFrontiers.BossRushAct.b2_10 => settings.Boss2_10 && (IGT.Old > IGT.Current && IGT.Current == TimeSpan.Zero), // || (Status.Changed && Status.Current == Status.StageResult)), + SonicFrontiers.BossRushAct.b3_1 => settings.Boss3_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_2, + SonicFrontiers.BossRushAct.b3_2 => settings.Boss3_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_3, + SonicFrontiers.BossRushAct.b3_3 => settings.Boss3_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_4, + SonicFrontiers.BossRushAct.b3_4 => settings.Boss3_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_5, + SonicFrontiers.BossRushAct.b3_5 => settings.Boss3_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_6, + SonicFrontiers.BossRushAct.b3_6 => settings.Boss3_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_7, + SonicFrontiers.BossRushAct.b3_7 => settings.Boss3_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_8, + SonicFrontiers.BossRushAct.b3_8 => settings.Boss3_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b3_9, + SonicFrontiers.BossRushAct.b3_9 => settings.Boss3_9 && (IGT.Old > IGT.Current && IGT.Current == TimeSpan.Zero), // || (Status.Changed && Status.Current == Status.StageResult)), + SonicFrontiers.BossRushAct.b4_1 => settings.Boss4_1 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_2, + SonicFrontiers.BossRushAct.b4_2 => settings.Boss4_2 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_3, + SonicFrontiers.BossRushAct.b4_3 => settings.Boss4_3 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_4, + SonicFrontiers.BossRushAct.b4_4 => settings.Boss4_4 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_5, + SonicFrontiers.BossRushAct.b4_5 => settings.Boss4_5 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_6, + SonicFrontiers.BossRushAct.b4_6 => settings.Boss4_6 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_7, + SonicFrontiers.BossRushAct.b4_7 => settings.Boss4_7 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_8, + SonicFrontiers.BossRushAct.b4_8 => settings.Boss4_8 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_9, + SonicFrontiers.BossRushAct.b4_9 => settings.Boss4_9 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_10, + SonicFrontiers.BossRushAct.b4_10 => settings.Boss4_10 && BossRushAct.Current == SonicFrontiers.BossRushAct.b4_11, + SonicFrontiers.BossRushAct.b4_11 => settings.Boss4_11 && HsmStatus.Changed && HsmStatus.Current[1] == "StageResult", + _ => false + }; + } + + //Story Mode + List flagsToSplitOn = new(); + foreach (var flag in SplitBools.Where(b => !AlreadyTriggeredBools.Contains(b.Key))) { + if (CheckBoolSplit(flag.Key, settings) && !flag.Value.Old && flag.Value.Current) { + AlreadyTriggeredBools.Add(flag.Key); + flagsToSplitOn.Add(flag.Key); + Log.Info("SPLIT ON " + flag.Key); + } + } + //Double split protection + if (flagsToSplitOn.Count == 1) { + return true; + } + + //Music Notes + if (settings.MusicNoteAny && MusicNotes.Changed && MusicNotes.Old != null) { + return true; + } + if (MusicNotes.Old == null) { + Log.Warning("musicnotes old is null"); + } + + //Island Swap + if (settings.IslandSwapSplit && LevelID.Current == SonicFrontiers.LevelID.Island_Kronos) { + + if (LevelID.Old == SonicFrontiers.LevelID.Island_Ares || LevelID.Old == SonicFrontiers.LevelID.Island_Chaos || LevelID.Old == SonicFrontiers.LevelID.Island_Rhea || LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) { + return true; + } + } + + //Enter Cyberspace Stage + if (settings.EnterCyberspaceSplit && (LevelID.Current < SonicFrontiers.LevelID.Island_Kronos || LevelID.Current == SonicFrontiers.LevelID.Fishing)) { + if (LevelID.Old == SonicFrontiers.LevelID.Island_Ares || LevelID.Old == SonicFrontiers.LevelID.Island_Chaos || LevelID.Old == SonicFrontiers.LevelID.Island_Another_Ouranos || LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) { + return true; + } + } + + //Start Hacking + if ((settings.Chaos_HackingStart && LevelID.Current == SonicFrontiers.LevelID.Hacking_01 && LevelID.Old == SonicFrontiers.LevelID.Island_Chaos) + || (settings.Ouranos_FirstHackingStart && LevelID.Current == SonicFrontiers.LevelID.Hacking_02 && LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos) + || (settings.Ouranos_SecondHackingStart && LevelID.Current == SonicFrontiers.LevelID.Hacking_03 && LevelID.Old == SonicFrontiers.LevelID.Island_Ouranos)) { + return true; + } + + // Final boss split + if (settings.FinalBoss && LevelID.Current == SonicFrontiers.LevelID.Boss_TheEnd && EndQTECount.Old == 3 && EndQTECount.Current == 0) + return true; + + //Another Final Boss Split + if (LevelID.Current == SonicFrontiers.LevelID.Island_Another_Ouranos && AnotherQTECount.Old == 2 && + AnotherQTECount.Current == 0) { + return true; + } + + //Cyberspace within story mode + return CheckStorySplit(LevelID.Old, settings) && StoryModeCyberSpaceCompletionFlag.Old && !StoryModeCyberSpaceCompletionFlag.Current; + } + + public TimeSpan? GameTime() { + if (GameMode.Current == SonicFrontiers.GameMode.Arcade || GameMode.Current == SonicFrontiers.GameMode.CyberspaceChallenge || GameMode.Current == SonicFrontiers.GameMode.BossRush) + return IGT.Current + AccumulatedIGT; + else return null; + } + private bool CheckArcadeSplit(LevelID input, Settings settings) => input switch { + SonicFrontiers.LevelID.w1_1 => settings.w1_1_arcade, + SonicFrontiers.LevelID.w1_2 => settings.w1_2_arcade, + SonicFrontiers.LevelID.w1_3 => settings.w1_3_arcade, + SonicFrontiers.LevelID.w1_4 => settings.w1_4_arcade, + SonicFrontiers.LevelID.w1_5 => settings.w1_5_arcade, + SonicFrontiers.LevelID.w1_6 => settings.w1_6_arcade, + SonicFrontiers.LevelID.w1_7 => settings.w1_7_arcade, + SonicFrontiers.LevelID.w2_1 => settings.w2_1_arcade, + SonicFrontiers.LevelID.w2_2 => settings.w2_2_arcade, + SonicFrontiers.LevelID.w2_3 => settings.w2_3_arcade, + SonicFrontiers.LevelID.w2_4 => settings.w2_4_arcade, + SonicFrontiers.LevelID.w2_5 => settings.w2_5_arcade, + SonicFrontiers.LevelID.w2_6 => settings.w2_6_arcade, + SonicFrontiers.LevelID.w2_7 => settings.w2_7_arcade, + SonicFrontiers.LevelID.w3_1 => settings.w3_1_arcade, + SonicFrontiers.LevelID.w3_2 => settings.w3_2_arcade, + SonicFrontiers.LevelID.w3_3 => settings.w3_3_arcade, + SonicFrontiers.LevelID.w3_4 => settings.w3_4_arcade, + SonicFrontiers.LevelID.w3_5 => settings.w3_5_arcade, + SonicFrontiers.LevelID.w3_6 => settings.w3_6_arcade, + SonicFrontiers.LevelID.w3_7 => settings.w3_7_arcade, + SonicFrontiers.LevelID.w4_1 => settings.w4_1_arcade, + SonicFrontiers.LevelID.w4_2 => settings.w4_2_arcade, + SonicFrontiers.LevelID.w4_3 => settings.w4_3_arcade, + SonicFrontiers.LevelID.w4_4 => settings.w4_4_arcade, + SonicFrontiers.LevelID.w4_5 => settings.w4_5_arcade, + SonicFrontiers.LevelID.w4_6 => settings.w4_6_arcade, + SonicFrontiers.LevelID.w4_7 => settings.w4_7_arcade, + SonicFrontiers.LevelID.w4_8 => settings.w4_8_arcade, + SonicFrontiers.LevelID.w4_9 => settings.w4_9_arcade, + _ => false, + }; + + private bool CheckStorySplit(LevelID input, Settings settings) => input switch { + SonicFrontiers.LevelID.w1_1 => settings.w1_1_story, + SonicFrontiers.LevelID.w1_2 => settings.w1_2_story, + SonicFrontiers.LevelID.w1_3 => settings.w1_3_story, + SonicFrontiers.LevelID.w1_4 => settings.w1_4_story, + SonicFrontiers.LevelID.w1_5 => settings.w1_5_story, + SonicFrontiers.LevelID.w1_6 => settings.w1_6_story, + SonicFrontiers.LevelID.w1_7 => settings.w1_7_story, + SonicFrontiers.LevelID.w2_1 => settings.w2_1_story, + SonicFrontiers.LevelID.w2_2 => settings.w2_2_story, + SonicFrontiers.LevelID.w2_3 => settings.w2_3_story, + SonicFrontiers.LevelID.w2_4 => settings.w2_4_story, + SonicFrontiers.LevelID.w2_5 => settings.w2_5_story, + SonicFrontiers.LevelID.w2_6 => settings.w2_6_story, + SonicFrontiers.LevelID.w2_7 => settings.w2_7_story, + SonicFrontiers.LevelID.w3_1 => settings.w3_1_story, + SonicFrontiers.LevelID.w3_2 => settings.w3_2_story, + SonicFrontiers.LevelID.w3_3 => settings.w3_3_story, + SonicFrontiers.LevelID.w3_4 => settings.w3_4_story, + SonicFrontiers.LevelID.w3_5 => settings.w3_5_story, + SonicFrontiers.LevelID.w3_6 => settings.w3_6_story, + SonicFrontiers.LevelID.w3_7 => settings.w3_7_story, + SonicFrontiers.LevelID.w4_1 => settings.w4_1_story, + SonicFrontiers.LevelID.w4_2 => settings.w4_2_story, + SonicFrontiers.LevelID.w4_3 => settings.w4_3_story, + SonicFrontiers.LevelID.w4_4 => settings.w4_4_story, + SonicFrontiers.LevelID.w4_5 => settings.w4_5_story, + SonicFrontiers.LevelID.w4_6 => settings.w4_6_story, + SonicFrontiers.LevelID.w4_7 => settings.w4_7_story, + SonicFrontiers.LevelID.w4_8 => settings.w4_8_story, + SonicFrontiers.LevelID.w4_9 => settings.w4_9_story, + SonicFrontiers.LevelID.w4_A => settings.w4_A_story, + SonicFrontiers.LevelID.w4_B => settings.w4_B_story, + SonicFrontiers.LevelID.w4_C => settings.w4_C_story, + SonicFrontiers.LevelID.w4_D => settings.w4_D_story, + SonicFrontiers.LevelID.w4_E => settings.w4_E_story, + SonicFrontiers.LevelID.w4_F => settings.w4_F_story, + SonicFrontiers.LevelID.w4_G => settings.w4_G_story, + SonicFrontiers.LevelID.w4_H => settings.w4_H_story, + SonicFrontiers.LevelID.w4_I => settings.w4_I_story, + _ => false, + }; + + private bool CheckBoolSplit(string key, Settings settings) => key switch { + "Amy_First" => settings.Amy_First, + "Knuckles_First" => settings.Knuckles_First, + "Tails_First" => settings.Tails_First, + "Amy_Second" => settings.Amy_Second, + "Knuckles_Second" => settings.Knuckles_Second, + "Tails_Second" => settings.Tails_Second, + "Sonic_MasterTrial" => settings.Sonic_MasterTrial, + "Sonic_Tower1" => settings.Sonic_Tower1, + "Sonic_Tower2" => settings.Sonic_Tower2, + "Sonic_Tower3" => settings.Sonic_Tower3, + "Sonic_Tower4" => settings.Sonic_Tower4, + "Skill_Cyloop" => settings.Skill_Cyloop, + "Skill_PhantomRush" => settings.Skill_PhantomRush, + "Skill_AirTrick" => settings.Skill_AirTrick, + "Skill_StompAttack" => settings.Skill_StompAttack, + "Skill_QuickCyloop" => settings.Skill_QuickCyloop, + "Skill_SonicBoom" => settings.Skill_SonicBoom, + "Skill_WildRush" => settings.Skill_WildRush, + "Skill_LoopKick" => settings.Skill_LoopKick, + "Skill_HomingShot" => settings.Skill_HomingShot, + "Skill_AutoCombo" => settings.Skill_AutoCombo, + "Skill_SpinSlash" => settings.Skill_SpinSlash, + "Skill_RecoverySmash" => settings.Skill_RecoverySmash, + "Kronos_Ninja" => settings.Kronos_Ninja, + "Kronos_Door" => settings.Kronos_Door, + "Kronos_Amy" => settings.Kronos_Amy, + "Kronos_GigantosFirst" => settings.Kronos_GigantosFirst, + "Kronos_GreenCE" => settings.Kronos_GreenCE, + "Kronos_CyanCE" => settings.Kronos_CyanCE, + "Kronos_Tombstones" => settings.Kronos_Tombstones, + "Kronos_BlueCE" => settings.Kronos_BlueCE, + "Kronos_RedCE" => settings.Kronos_RedCE, + "Kronos_YellowCE" => settings.Kronos_YellowCE, + "Kronos_WhiteCE" => settings.Kronos_WhiteCE, + "Kronos_GigantosStart" => settings.Kronos_GigantosStart, + "Kronos_SuperSonic" => settings.Kronos_SuperSonic, + "Island_Kronos_story" => settings.Island_Kronos_story, + "Island_Kronos_fishing" => settings.Island_Kronos_fishing, + "Ares_Knuckles" => settings.Ares_Knuckles, + "Ares_WyvernFirst" => settings.Ares_WyvernFirst, + "Ares_Water" => settings.Ares_Water, + // "Ares_KocoRoundup" => settings.Ares_KocoRoundup, + "Ares_Crane" => settings.Ares_Crane, + "Ares_GreenCE" => settings.Ares_GreenCE, + "Ares_CyanCE" => settings.Ares_CyanCE, + "Ares_BlueCE" => settings.Ares_BlueCE, + "Ares_RedCE" => settings.Ares_RedCE, + "Ares_YellowCE" => settings.Ares_YellowCE, + "Ares_WhiteCE" => settings.Ares_WhiteCE, + "Ares_WyvernStart" => settings.Ares_WyvernStart, + "Ares_WyvernRun" => settings.Ares_WyvernRun, + "Ares_SuperSonic" => settings.Ares_SuperSonic, + "Island_Ares_story" => settings.Island_Ares_story, + "Island_Ares_fishing" => settings.Island_Ares_fishing, + "Chaos_Tails" => settings.Chaos_Tails, + "Chaos_KnightFirst" => settings.Chaos_KnightFirst, + "Chaos_HackingStart" => settings.Chaos_HackingStart, + "Chaos_Hacking" => settings.Chaos_Hacking, + "Chaos_GreenCE" => settings.Chaos_GreenCE, + "Chaos_CyanCE" => settings.Chaos_CyanCE, + "Chaos_PinballStart" => settings.Chaos_PinballStart, + "Chaos_PinballEnd" => settings.Chaos_PinballEnd, + "Chaos_BlueCE" => settings.Chaos_BlueCE, + "Chaos_RedCE" => settings.Chaos_RedCE, + "Chaos_YellowCE" => settings.Chaos_YellowCE, + "Chaos_WhiteCE" => settings.Chaos_WhiteCE, + "Chaos_KnightStart" => settings.Chaos_KnightStart, + "Chaos_SuperSonic" => settings.Chaos_SuperSonic, + "Island_Chaos_story" => settings.Island_Chaos_story, + "Island_Chaos_fishing" => settings.Island_Chaos_fishing, + "Rhea_Tower1" => settings.Rhea_Tower1, + "Rhea_Tower2" => settings.Rhea_Tower2, + "Rhea_Tower3" => settings.Rhea_Tower3, + "Rhea_Tower4" => settings.Rhea_Tower4, + "Rhea_Tower5" => settings.Rhea_Tower5, + "Rhea_Tower6" => settings.Rhea_Tower6, + "Island_Rhea_story" => settings.Island_Rhea_story, + "Ouranos_FirstHackingStart" => settings.Ouranos_FirstHackingStart, + "Ouranos_Bridge" => settings.Ouranos_Bridge, + "Ouranos_SupremeDefeated" => settings.Ouranos_SupremeDefeated, + "Ouranos_BlueCE" => settings.Ouranos_BlueCE, + "Ouranos_RedCE" => settings.Ouranos_RedCE, + "Ouranos_GreenCE" => settings.Ouranos_GreenCE, + "Ouranos_YellowCE" => settings.Ouranos_YellowCE, + "Ouranos_CyanCE" => settings.Ouranos_CyanCE, + //"Ouranos_WhiteCE" => settings.Ouranos_WhiteCE, + "Island_Ouranos_fishing" => settings.Island_Ouranos_fishing, + "Ouranos_SecondHackingStart" => settings.Ouranos_SecondHackingStart, + "Ouranos_FinalDoor" => settings.Ouranos_FinalDoor, + _ => false, + }; + + internal bool Reset(Settings settings) { + return HsmStatus.Current[1] == "Quit" && HsmStatus.Old[1] == "NewGameMenu" && settings.AutoReset; + } + + private bool ScanBossHsm(ProcessMemory process, string bossName, string bossMove) { + if (!Engine.GetObject(bossName, out IntPtr boss) || !process.Read(boss, out Boss bossData)) { + return false; + } + if (bossData.noOfElements >= 2048 || bossData.noOfElements <= 0) { + return false; + } + using (ArrayRental> buf = new(bossData.noOfElements)) { + if (!process.ReadArray(bossData.array.Value, buf.Span)) + return false; + var val = ""; + + foreach (var entry in buf.Span) { + if (!process.Read(entry.Value, out BossHsm bossHsm) + || !process.ReadPointer(bossHsm.statik.Value, out IntPtr name) + || !process.ReadString(name, 127, StringType.ASCII, out val) + || val != "GOCHsm2") { + continue; + } + + if (bossHsm.noOfElements >= 2048 || bossHsm.noOfElements <= 0) { + return false; + } + + using (ArrayRental> newBuf = new(bossHsm.noOfElements)) { + if (!process.ReadArray(bossHsm.array.Value, newBuf.Span)) + return false; + foreach (var element in newBuf.Span) { + + if (Engine.RTTI.Lookup(element.Value, out val) && val == bossMove) { + + return true; + } + + } + } + } + } + + return false; + } + + private bool playerHasComponentName(ProcessMemory process, string componentName) { + if (!process.Read(PlayerInstance.Current, out PlayerCharacter playerCharacter)) { + return false; + } + if (playerCharacter.noOfElements >= 2048 || playerCharacter.noOfElements <= 0) { + return false; + } + using (ArrayRental> buf = new(playerCharacter.noOfElements)) { + if (!process.ReadArray(playerCharacter.GOCArray.Value, buf.Span)) + return false; + string name = "N/A"; + foreach (var entry in buf.Span) { + if (!process.Read(entry.Value + 0x48, out IntPtr GOCPtr) + || !process.ReadPointer(GOCPtr, out IntPtr namePtr) + || !process.ReadString(namePtr, 127, StringType.ASCII, out name) + || name != componentName) { + continue; + } + return true; + } + } + + return false; + } + + /// + /// This function is essentially equivalent of the init descriptor in script-based autosplitters. + /// Everything you want to be executed when the game gets hooked needs to be put here. + /// The main purpose of this function is to perform sigscanning and get memory addresses and offsets + /// needed by the autosplitter. + /// + + /* private void GetAddresses() { diff --git a/JHelper.ProcessMemory b/JHelper.ProcessMemory index e69b3c9..6fe9eee 160000 --- a/JHelper.ProcessMemory +++ b/JHelper.ProcessMemory @@ -1 +1 @@ -Subproject commit e69b3c9db1155b9c33dab875c2a9b710c405a95e +Subproject commit 6fe9eee890780b43156b0fe34f012c1120f4bc69 diff --git a/LiveSplit.SonicFrontiers.csproj b/LiveSplit.SonicFrontiers.csproj index 6a272b9..7e672fa 100644 --- a/LiveSplit.SonicFrontiers.csproj +++ b/LiveSplit.SonicFrontiers.csproj @@ -11,7 +11,7 @@ Library disable AnyCPU - Release + Release;Debug False False False diff --git a/LiveSplit.SonicFrontiers.sln b/LiveSplit.SonicFrontiers.sln index f7e6fd4..c9964b0 100644 --- a/LiveSplit.SonicFrontiers.sln +++ b/LiveSplit.SonicFrontiers.sln @@ -1,15 +1,18 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 18 -VisualStudioVersion = 18.3.11520.95 d18.3 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36327.8 d17.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiveSplit.SonicFrontiers", "LiveSplit.SonicFrontiers.csproj", "{E62550EC-582A-4FBF-B139-EAF962D91F08}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E62550EC-582A-4FBF-B139-EAF962D91F08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E62550EC-582A-4FBF-B139-EAF962D91F08}.Debug|Any CPU.Build.0 = Debug|Any CPU {E62550EC-582A-4FBF-B139-EAF962D91F08}.Release|Any CPU.ActiveCfg = Release|Any CPU {E62550EC-582A-4FBF-B139-EAF962D91F08}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection diff --git a/Logic.cs b/Logic.cs index 885b925..b6dbf8f 100644 --- a/Logic.cs +++ b/Logic.cs @@ -1,5 +1,6 @@ using JHelper.Common.ProcessInterop; using LiveSplit.Model; +using LiveSplit.Options; using LiveSplit.UI.Components; using System; using System.Collections.Generic; @@ -11,142 +12,127 @@ namespace LiveSplit.SonicFrontiers; -internal partial class SonicFrontiersComponent : LogicComponent -{ - /// - /// Name of the component as it appears in the LiveSplit UI. - /// - public override string ComponentName => "Sonic X Shadow Generations - Autosplitter"; - - private readonly Task autosplitterTask; - private readonly CancellationTokenSource cancelToken = new(); - - /// - /// Main task method for the autosplitter that monitors the game process and updates the LiveSplit timer based on in-game events. - /// - /// Current state of the LiveSplit timer. - /// Token for cancelling the task. - private void AutosplitterLogic(LiveSplitState state, CancellationToken canceltoken) - { - // Array of target game process names to hook into - string[] gameProcessNames = ["SonicFrontiers.exe"]; - - // Interval for autosplitter updates (about 60 times per second) - TimeSpan updateInterval = TimeSpan.FromMilliseconds(1000d / 60d); - - // Timer model connected to LiveSplit state, allowing timer control - TimerModel timer = new() { CurrentState = state }; - - // Stopwatch to track time for each update cycle - Stopwatch clock = new(); - - // Main loop that will continue running until cancellation is requested - while (!canceltoken.IsCancellationRequested) - { - // Try to hook into the game process - using ProcessMemory? process = ProcessHook(gameProcessNames); - - // If the process is not available, wait and retry - if (process is null) - { - Task.Delay(1500, canceltoken).Wait(canceltoken); - continue; - } - - // Attempt to locate necessary memory addresses in the hooked process - // This loop will retry if memory scanning fails, catching any exceptions - Memory? memory = null; - while (!canceltoken.IsCancellationRequested && process.IsOpen && memory is null) - { - try - { - memory = new Memory(process, state); - } - catch - { - Task.Delay(1500, canceltoken).Wait(canceltoken); - } - } - - // If memory is still null, exit the loop to retry from the start - if (memory is null) - continue; - - // Primary loop for updating and checking game memory while the process remains open - while (!canceltoken.IsCancellationRequested && process.IsOpen) - { - clock.Start(); - - // Memory update cycle for the current game process and settings - memory.Update(process, Settings, state); - - // Timer logic to manage game-time, loading status, and potential resets or splits - if (timer.CurrentState.CurrentPhase == TimerPhase.Running || timer.CurrentState.CurrentPhase == TimerPhase.Paused) - { - // Check if the game is in a loading state and pause timer if so - bool? isLoading = memory.IsLoading(Settings); - if (isLoading is not null) - state.IsGameTimePaused = isLoading.Value; - - // Update in-game time if available - TimeSpan? gameTime = memory.IGT.Current; - if (gameTime is not null && memory.GameMode.Current != SonicFrontiers.GameMode.Story) - timer.CurrentState.SetGameTime(gameTime.Value); - - // Check if the game conditions require a timer reset or split - /* - if (memory.Reset(Settings)) - timer.Reset(); - */ - else if (timer.CurrentState.CurrentTime.RealTime > new TimeSpan(0, 0, 2) && memory.Split(Settings)) { - timer.Split(); - } - } - - // Start the timer if game start conditions are met and the timer is not running - if (timer.CurrentState.CurrentPhase == TimerPhase.NotRunning && memory.Start(Settings)) - { - //band-aid for igt preservation - memory.AccumulatedIGT = TimeSpan.Zero; - timer.Start(); - state.IsGameTimePaused = true; - - // Re-check if the game is loading to update the paused status - bool? isLoading = memory.IsLoading(Settings); - if (isLoading is not null) - state.IsGameTimePaused = isLoading.Value; - } - - // Calculate elapsed time for this update cycle - TimeSpan elapsed = clock.Elapsed; - clock.Reset(); - - // Wait if the cycle completed faster than the desired update interval - if (elapsed < updateInterval) - canceltoken.WaitHandle.WaitOne(updateInterval - elapsed); - } - - } - } - - /// - /// Attempts to hook into one of the target game processes specified in . - /// - /// Array of executable names to try hooking into. - /// A object representing the hooked process, or null if no process could be hooked. - private static ProcessMemory? ProcessHook(string[] exeNames) - { - try - { - // Attempt to hook into each process in exeNames and return the first successful match - return exeNames - .Select(ProcessMemory.HookProcess) - .FirstOrDefault(p => p is not null); - } - catch - { - // Return null if any errors occur during hooking - return null; - } - } +internal partial class SonicFrontiersComponent : LogicComponent { + /// + /// Name of the component as it appears in the LiveSplit UI. + /// + public override string ComponentName => "Sonic Frontiers - Autosplitter"; + + private readonly Task autosplitterTask; + private readonly CancellationTokenSource cancelToken = new(); + + /// + /// Main task method for the autosplitter that monitors the game process and updates the LiveSplit timer based on in-game events. + /// + /// Current state of the LiveSplit timer. + /// Token for cancelling the task. + private void AutosplitterLogic(LiveSplitState state, CancellationToken canceltoken) { + // Array of target game process names to hook into + string[] gameProcessNames = ["SonicFrontiers.exe"]; + + // Interval for autosplitter updates (about 60 times per second) + TimeSpan updateInterval = TimeSpan.FromMilliseconds(1000d / 60d); + + // Timer model connected to LiveSplit state, allowing timer control + TimerModel timer = new() { CurrentState = state }; + + // Stopwatch to track time for each update cycle + Stopwatch clock = new(); + // Main loop that will continue running until cancellation is requested + while (!canceltoken.IsCancellationRequested) { + // Try to hook into the game process + using ProcessMemory? process = ProcessHook(gameProcessNames); + + // If the process is not available, wait and retry + if (process is null) { + Task.Delay(1500, canceltoken).Wait(canceltoken); + continue; + } + + // Attempt to locate necessary memory addresses in the hooked process + // This loop will retry if memory scanning fails, catching any exceptions + Memory? memory = null; + while (!canceltoken.IsCancellationRequested && process.IsOpen && memory is null) { + try { + memory = new Memory(process, state); + Log.Info("memory created"); + } + catch { + Task.Delay(1500, canceltoken).Wait(canceltoken); + } + } + + // If memory is still null, exit the loop to retry from the start + if (memory is null) + continue; + // Primary loop for updating and checking game memory while the process remains open + while (!canceltoken.IsCancellationRequested && process.IsOpen) { + clock.Start(); + + // Memory update cycle for the current game process and settings + memory.Update(process, Settings, state); + + // Timer logic to manage game-time, loading status, and potential resets or splits + if (timer.CurrentState.CurrentPhase == TimerPhase.Running || timer.CurrentState.CurrentPhase == TimerPhase.Paused) { + // Check if the game is in a loading state and pause timer if so + bool? isLoading = memory.IsLoading(Settings); + if (isLoading is not null) + state.IsGameTimePaused = isLoading.Value; + + // Update in-game time if available + TimeSpan? gameTime = memory.GameTime(); + if (gameTime is not null && memory.GameMode.Current != SonicFrontiers.GameMode.Story) + timer.CurrentState.SetGameTime(gameTime.Value); + + // Check if the game conditions require a timer reset or split + /* + if (memory.Reset(Settings)) + timer.Reset(); + */ + if (memory.Split(Settings)) { + timer.Split(); + } + } + + // Start the timer if game start conditions are met and the timer is not running + if (timer.CurrentState.CurrentPhase == TimerPhase.NotRunning && memory.Start(Settings)) { + //band-aid for igt preservation + memory.AccumulatedIGT = TimeSpan.Zero; + timer.Start(); + state.IsGameTimePaused = true; + + // Re-check if the game is loading to update the paused status + bool? isLoading = memory.IsLoading(Settings); + if (isLoading is not null) + state.IsGameTimePaused = isLoading.Value; + } + + // Calculate elapsed time for this update cycle + TimeSpan elapsed = clock.Elapsed; + clock.Reset(); + + // Wait if the cycle completed faster than the desired update interval + if (elapsed < updateInterval) + canceltoken.WaitHandle.WaitOne(updateInterval - elapsed); + } + } + } + + /// + /// Attempts to hook into one of the target game processes specified in . + /// + /// Array of executable names to try hooking into. + /// A object representing the hooked process, or null if no process could be hooked. + private static ProcessMemory? ProcessHook(string[] exeNames) { + try { + // Attempt to hook into each process in exeNames and return the first successful match + return exeNames + .Select(ProcessMemory.HookProcess) + .FirstOrDefault(p => p is not null); + } + catch { + // Return null if any errors occur during hooking + return null; + } + } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 2a8016b..74bef27 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,6 +32,6 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.3")] -[assembly: AssemblyFileVersion("2.0.3")] +[assembly: AssemblyVersion("2.0.4")] +[assembly: AssemblyFileVersion("2.0.4")]