From 23339426ccaa48608982c969cfd0b7cb5ab8e70e Mon Sep 17 00:00:00 2001
From: Haerbin23456 <60066765+Haerbin23456@users.noreply.github.com>
Date: Tue, 21 Apr 2026 15:58:56 +0800
Subject: [PATCH 1/6] Update replay patches for current STS2 method signatures
---
RunReplays/Utils/EncounterRngTracker.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/RunReplays/Utils/EncounterRngTracker.cs b/RunReplays/Utils/EncounterRngTracker.cs
index 1aaea70..c66ec3d 100644
--- a/RunReplays/Utils/EncounterRngTracker.cs
+++ b/RunReplays/Utils/EncounterRngTracker.cs
@@ -7,6 +7,7 @@
using MegaCrit.Sts2.Core.Runs;
using MegaCrit.Sts2.Core.Unlocks;
+
namespace RunReplays.Utils;
///
From 1a98ac48c9ae62ca93f99d187deaecc151d76bdc Mon Sep 17 00:00:00 2001
From: Haerbin23456 <60066765+Haerbin23456@users.noreply.github.com>
Date: Tue, 21 Apr 2026 15:59:22 +0800
Subject: [PATCH 2/6] Stabilize hand selection replay and safe step execution
---
RunReplays/Commands/SelectHandCardsCommand.cs | 11 ++++++++++-
RunReplays/ReplayDispatcher.cs | 17 ++++++++++++++++-
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/RunReplays/Commands/SelectHandCardsCommand.cs b/RunReplays/Commands/SelectHandCardsCommand.cs
index e4ab93d..841d987 100644
--- a/RunReplays/Commands/SelectHandCardsCommand.cs
+++ b/RunReplays/Commands/SelectHandCardsCommand.cs
@@ -79,7 +79,16 @@ public override ExecuteResult Execute()
HandSelectionCapture.PressHolder(nHand, holder);
}
- HandSelectionCapture.ConfirmSelection(nHand);
+ try
+ {
+ HandSelectionCapture.ConfirmSelection(nHand);
+ }
+ catch (System.Reflection.TargetInvocationException)
+ {
+ // Single-card selections auto-complete when PressHolder toggles the
+ // card, so the TaskCompletionSource is already resolved. Swallow the
+ // "task already completed" exception — the selection succeeded.
+ }
HandSelectionCapture.ActiveHand = null;
return ExecuteResult.Ok();
}
diff --git a/RunReplays/ReplayDispatcher.cs b/RunReplays/ReplayDispatcher.cs
index 42b8a29..b1b2d1f 100644
--- a/RunReplays/ReplayDispatcher.cs
+++ b/RunReplays/ReplayDispatcher.cs
@@ -612,9 +612,24 @@ public static bool Paused
///
public static void Step()
{
+ if (!ReplayEngine.IsActive)
+ return;
+
if (!_paused) Paused = true;
+
+ if (_dispatchInProgress
+ || ReplayState.ActionInFlight
+ || ReplayState.CardPlayInFlight
+ || ReplayState.PotionInFlight
+ || CardPlayReplayPatch.IsAwaitingEndTurnCompletion
+ || MapMoveInFlight)
+ {
+ GD.Print("[RunReplays] Step ignored: dispatcher is busy.");
+ return;
+ }
+
_stepping = true;
- DispatchNow();
+ Callable.From(ExecuteNext).CallDeferred();
}
private static float _delayBetweenCommands = 1.0f;
///
From 59397cd121508c3c9205a33c1efe5c4849c6350b Mon Sep 17 00:00:00 2001
From: Haerbin23456 <60066765+Haerbin23456@users.noreply.github.com>
Date: Tue, 21 Apr 2026 16:10:41 +0800
Subject: [PATCH 3/6] Retry treasure relic pick until synchronizer is ready
---
RunReplays/Commands/TreasureCommands.cs | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/RunReplays/Commands/TreasureCommands.cs b/RunReplays/Commands/TreasureCommands.cs
index ebedc25..288f555 100644
--- a/RunReplays/Commands/TreasureCommands.cs
+++ b/RunReplays/Commands/TreasureCommands.cs
@@ -70,9 +70,24 @@ public TakeChestRelicCommand() : base("") { }
public override ExecuteResult Execute()
{
var sync = RunManager.Instance.TreasureRoomRelicSynchronizer;
- PlayerActionBuffer.LogDispatcher("[TakeChestRelic] PickRelicLocally(0)");
- Callable.From(() => sync.PickRelicLocally(0)).CallDeferred();
- return ExecuteResult.Ok();
+ var relics = sync.CurrentRelics;
+ if (relics == null || relics.Count == 0)
+ {
+ PlayerActionBuffer.LogDispatcher("[TakeChestRelic] Relics not ready yet; retrying.");
+ return ExecuteResult.Retry(200);
+ }
+
+ try
+ {
+ PlayerActionBuffer.LogDispatcher("[TakeChestRelic] PickRelicLocally(0)");
+ sync.PickRelicLocally(0);
+ return ExecuteResult.Ok();
+ }
+ catch (System.InvalidOperationException ex)
+ {
+ PlayerActionBuffer.LogDispatcher($"[TakeChestRelic] Pick not ready ({ex.Message}); retrying.");
+ return ExecuteResult.Retry(200);
+ }
}
public static TakeChestRelicCommand? TryParse(string raw)
From 4aa2477db9e719044ec2357dc7525f0d5bd8b443 Mon Sep 17 00:00:00 2001
From: Haerbin23456 <60066765+Haerbin23456@users.noreply.github.com>
Date: Tue, 21 Apr 2026 16:24:54 +0800
Subject: [PATCH 4/6] Add detailed treasure replay diagnostics for chest flow
---
RunReplays/Commands/TreasureCommands.cs | 45 +++++++++++++++++--
.../Patches/Replay/TreasureRoomReplayPatch.cs | 5 ++-
RunReplays/ReplayEngine.cs | 7 +++
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/RunReplays/Commands/TreasureCommands.cs b/RunReplays/Commands/TreasureCommands.cs
index 288f555..ee39352 100644
--- a/RunReplays/Commands/TreasureCommands.cs
+++ b/RunReplays/Commands/TreasureCommands.cs
@@ -1,7 +1,10 @@
+using System.Collections;
+using System.Reflection;
using Godot;
using MegaCrit.Sts2.Core.Nodes.CommonUi;
using MegaCrit.Sts2.Core.Nodes.GodotExtensions;
using MegaCrit.Sts2.Core.Nodes.Rooms;
+using MegaCrit.Sts2.Core.Multiplayer.Game;
using MegaCrit.Sts2.Core.Runs;
using RunReplays.Patches.Replay;
@@ -28,8 +31,17 @@ public override string Describe()
public override ExecuteResult Execute()
{
NTreasureRoom? room = TreasureRoomReplayPatch.ActiveRoom;
- if (room == null || !room.IsInsideTree())
+ if (room == null)
+ {
+ PlayerActionBuffer.LogDispatcher("[OpenChest] ActiveRoom is null; retrying.");
+ return ExecuteResult.Retry(200);
+ }
+
+ if (!room.IsInsideTree())
+ {
+ PlayerActionBuffer.LogDispatcher("[OpenChest] ActiveRoom is not in tree; retrying.");
return ExecuteResult.Retry(200);
+ }
NButton? chest = room.GetNodeOrNull("%Chest");
if (chest == null)
@@ -38,6 +50,8 @@ public override ExecuteResult Execute()
return ExecuteResult.Retry(200);
}
+ PlayerActionBuffer.LogDispatcher(
+ $"[OpenChest] Emit Released; chestInside={chest.IsInsideTree()} sync={TreasureSyncDebug.Describe(RunManager.Instance.TreasureRoomRelicSynchronizer)}");
chest.EmitSignal(NClickableControl.SignalName.Released, chest);
return ExecuteResult.Ok();
}
@@ -70,10 +84,12 @@ public TakeChestRelicCommand() : base("") { }
public override ExecuteResult Execute()
{
var sync = RunManager.Instance.TreasureRoomRelicSynchronizer;
+ PlayerActionBuffer.LogDispatcher($"[TakeChestRelic] Attempt; {TreasureSyncDebug.Describe(sync)}");
+
var relics = sync.CurrentRelics;
if (relics == null || relics.Count == 0)
{
- PlayerActionBuffer.LogDispatcher("[TakeChestRelic] Relics not ready yet; retrying.");
+ PlayerActionBuffer.LogDispatcher($"[TakeChestRelic] Relics not ready; {TreasureSyncDebug.Describe(sync)}; retrying.");
return ExecuteResult.Retry(200);
}
@@ -85,7 +101,8 @@ public override ExecuteResult Execute()
}
catch (System.InvalidOperationException ex)
{
- PlayerActionBuffer.LogDispatcher($"[TakeChestRelic] Pick not ready ({ex.Message}); retrying.");
+ PlayerActionBuffer.LogDispatcher(
+ $"[TakeChestRelic] Pick not ready ({ex.Message}); {TreasureSyncDebug.Describe(sync)}; retrying.");
return ExecuteResult.Retry(200);
}
}
@@ -98,3 +115,25 @@ public override ExecuteResult Execute()
return null;
}
}
+
+internal static class TreasureSyncDebug
+{
+ private static readonly FieldInfo? VotesField =
+ typeof(TreasureRoomRelicSynchronizer).GetField("_votes", BindingFlags.NonPublic | BindingFlags.Instance);
+
+ private static readonly FieldInfo? PredictedVoteField =
+ typeof(TreasureRoomRelicSynchronizer).GetField("_predictedVote", BindingFlags.NonPublic | BindingFlags.Instance);
+
+ private static readonly FieldInfo? SinglePlayerSkippedField =
+ typeof(TreasureRoomRelicSynchronizer).GetField("_singlePlayerSkipped", BindingFlags.NonPublic | BindingFlags.Instance);
+
+ internal static string Describe(TreasureRoomRelicSynchronizer sync)
+ {
+ int currentRelics = sync.CurrentRelics?.Count ?? -1;
+ int votes = (VotesField?.GetValue(sync) as ICollection)?.Count ?? -1;
+ bool singlePlayerSkipped = SinglePlayerSkippedField?.GetValue(sync) is bool b && b;
+ string predictedVote = PredictedVoteField?.GetValue(sync)?.ToString() ?? "null";
+
+ return $"syncState(relics={currentRelics}, votes={votes}, predicted={predictedVote}, skipped={singlePlayerSkipped})";
+ }
+}
diff --git a/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs b/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs
index b468a97..a6c42d3 100644
--- a/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs
+++ b/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs
@@ -1,10 +1,10 @@
using HarmonyLib;
+using Godot;
using MegaCrit.Sts2.Core.Nodes.Rooms;
using MegaCrit.Sts2.Core.Nodes.Screens.TreasureRoomRelic;
namespace RunReplays.Patches.Replay;
-
public static class TreasureRoomReplayPatch
{
internal static NTreasureRoom? ActiveRoom;
@@ -19,6 +19,7 @@ public static void Postfix(NTreasureRoom __instance)
return;
ActiveRoom = __instance;
+ GD.Print($"[RunReplays] TreasureRoom _Ready captured; insideTree={__instance.IsInsideTree()}");
ReplayDispatcher.TryDispatch();
}
}
@@ -32,6 +33,8 @@ public static void Postfix()
if (!ReplayEngine.IsActive)
return;
+ var sync = MegaCrit.Sts2.Core.Runs.RunManager.Instance.TreasureRoomRelicSynchronizer;
+ GD.Print($"[RunReplays] TreasureRelics initialized; {RunReplays.Commands.TreasureSyncDebug.Describe(sync)}");
ReplayDispatcher.TryDispatch();
}
}
diff --git a/RunReplays/ReplayEngine.cs b/RunReplays/ReplayEngine.cs
index 87f2b60..e99593f 100644
--- a/RunReplays/ReplayEngine.cs
+++ b/RunReplays/ReplayEngine.cs
@@ -34,6 +34,13 @@ private static ReplayCommand SignalConsumed(ReplayCommand cmd, [CallerMemberName
if (_recentConsumed.Count >= 2)
_recentConsumed.RemoveAt(0);
_recentConsumed.Add(cmd);
+
+ if (cmd is OpenChestCommand || cmd is TakeChestRelicCommand || cmd is MapMoveCommand)
+ {
+ string next = _pending.Count > 0 ? _pending.Peek().ToString() : "";
+ GD.Print($"[RunReplays] Consumed {cmd.GetType().Name} ({cmd}); next={next}; pending={_pending.Count}");
+ }
+
ContextChanged?.Invoke();
if (_replayActive && _pending.Count == 0)
{
From 5ebb9bdecc9a3347f68750649e16b0c7f553f725 Mon Sep 17 00:00:00 2001
From: Haerbin23456 <60066765+Haerbin23456@users.noreply.github.com>
Date: Tue, 21 Apr 2026 16:30:31 +0800
Subject: [PATCH 5/6] Handle treasure map-move stalls without forcing room
transition
---
RunReplays/ReplayDispatcher.cs | 42 +++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 8 deletions(-)
diff --git a/RunReplays/ReplayDispatcher.cs b/RunReplays/ReplayDispatcher.cs
index b1b2d1f..f6d328f 100644
--- a/RunReplays/ReplayDispatcher.cs
+++ b/RunReplays/ReplayDispatcher.cs
@@ -893,14 +893,22 @@ private static void WatchdogTick()
&& ReplayEngine.PeekNext(out ReplayCommand? cmd) && cmd != null
&& cmd is MapMoveCommand)
{
- // Force-clear blockers so dispatch can proceed.
- ReplayState.ClearActionInFlight();
- MapMoveInFlight = false;
- _dispatchInProgress = false;
- _lastDispatchedCmd = null;
- NMapScreen.Instance?.Open();
- NMapScreen.Instance?.SetTravelEnabled(true);
- DispatchNow();
+ var room = GetCurrentRoom();
+ if (room != null)
+ {
+ GD.Print($"[RunReplays] Watchdog holding MapMove; still in room={room.GetType().Name}");
+ }
+ else
+ {
+ // Force-clear blockers so dispatch can proceed.
+ ReplayState.ClearActionInFlight();
+ MapMoveInFlight = false;
+ _dispatchInProgress = false;
+ _lastDispatchedCmd = null;
+ NMapScreen.Instance?.Open();
+ NMapScreen.Instance?.SetTravelEnabled(true);
+ DispatchNow();
+ }
}
ScheduleWatchdogTick();
@@ -933,6 +941,24 @@ internal static void TryDispatch([System.Runtime.CompilerServices.CallerMemberNa
GD.Print($"[RunReplays] TryDispatch miss — cmd={cmd.GetType().Name} dispatchable=[{dispatchableNames}]");
DiagnosticLog.Write("Dispatch",
$"miss — cmd={cmd.GetType().Name}({cmd}) dispatchable=[{dispatchableNames}]");
+
+ if (cmd is MapMoveCommand && GetCurrentRoom() is TreasureRoom)
+ {
+ var sync = RunManager.Instance.TreasureRoomRelicSynchronizer;
+ var relics = sync.CurrentRelics;
+ if (relics != null && relics.Count > 0)
+ {
+ try
+ {
+ GD.Print($"[RunReplays] TreasureFlow fallback — pending MapMove in TreasureRoom; auto-picking relic.");
+ sync.PickRelicLocally(0);
+ }
+ catch (InvalidOperationException ex)
+ {
+ GD.Print($"[RunReplays] TreasureFlow fallback pick failed: {ex.Message}");
+ }
+ }
+ }
return;
}
From 5a037e891b23fb96381b1d9eb604aef28e493106 Mon Sep 17 00:00:00 2001
From: Haerbin23456 <60066765+Haerbin23456@users.noreply.github.com>
Date: Tue, 21 Apr 2026 16:59:26 +0800
Subject: [PATCH 6/6] Remove diagnostic logging and debug helpers from treasure
replay
Strip all GD.Print, LogDispatcher debug messages, and the
TreasureSyncDebug reflection helper that were added during
treasure room bug investigation. Retain the actual bug fixes:
- TakeChestRelicCommand retry + InvalidOperationException guard
- Step() busy-state guard
- Watchdog room check preventing premature MapMove
- TreasureFlow fallback auto-pick in TryDispatch
---
RunReplays/Commands/TreasureCommands.cs | 47 +------------------
.../Patches/Replay/TreasureRoomReplayPatch.cs | 5 +-
RunReplays/ReplayDispatcher.cs | 21 ++-------
RunReplays/ReplayEngine.cs | 7 ---
RunReplays/Utils/EncounterRngTracker.cs | 1 -
5 files changed, 6 insertions(+), 75 deletions(-)
diff --git a/RunReplays/Commands/TreasureCommands.cs b/RunReplays/Commands/TreasureCommands.cs
index ee39352..b048819 100644
--- a/RunReplays/Commands/TreasureCommands.cs
+++ b/RunReplays/Commands/TreasureCommands.cs
@@ -1,10 +1,7 @@
-using System.Collections;
-using System.Reflection;
using Godot;
using MegaCrit.Sts2.Core.Nodes.CommonUi;
using MegaCrit.Sts2.Core.Nodes.GodotExtensions;
using MegaCrit.Sts2.Core.Nodes.Rooms;
-using MegaCrit.Sts2.Core.Multiplayer.Game;
using MegaCrit.Sts2.Core.Runs;
using RunReplays.Patches.Replay;
@@ -31,17 +28,8 @@ public override string Describe()
public override ExecuteResult Execute()
{
NTreasureRoom? room = TreasureRoomReplayPatch.ActiveRoom;
- if (room == null)
- {
- PlayerActionBuffer.LogDispatcher("[OpenChest] ActiveRoom is null; retrying.");
+ if (room == null || !room.IsInsideTree())
return ExecuteResult.Retry(200);
- }
-
- if (!room.IsInsideTree())
- {
- PlayerActionBuffer.LogDispatcher("[OpenChest] ActiveRoom is not in tree; retrying.");
- return ExecuteResult.Retry(200);
- }
NButton? chest = room.GetNodeOrNull("%Chest");
if (chest == null)
@@ -50,8 +38,6 @@ public override ExecuteResult Execute()
return ExecuteResult.Retry(200);
}
- PlayerActionBuffer.LogDispatcher(
- $"[OpenChest] Emit Released; chestInside={chest.IsInsideTree()} sync={TreasureSyncDebug.Describe(RunManager.Instance.TreasureRoomRelicSynchronizer)}");
chest.EmitSignal(NClickableControl.SignalName.Released, chest);
return ExecuteResult.Ok();
}
@@ -84,25 +70,18 @@ public TakeChestRelicCommand() : base("") { }
public override ExecuteResult Execute()
{
var sync = RunManager.Instance.TreasureRoomRelicSynchronizer;
- PlayerActionBuffer.LogDispatcher($"[TakeChestRelic] Attempt; {TreasureSyncDebug.Describe(sync)}");
var relics = sync.CurrentRelics;
if (relics == null || relics.Count == 0)
- {
- PlayerActionBuffer.LogDispatcher($"[TakeChestRelic] Relics not ready; {TreasureSyncDebug.Describe(sync)}; retrying.");
return ExecuteResult.Retry(200);
- }
try
{
- PlayerActionBuffer.LogDispatcher("[TakeChestRelic] PickRelicLocally(0)");
sync.PickRelicLocally(0);
return ExecuteResult.Ok();
}
- catch (System.InvalidOperationException ex)
+ catch (System.InvalidOperationException)
{
- PlayerActionBuffer.LogDispatcher(
- $"[TakeChestRelic] Pick not ready ({ex.Message}); {TreasureSyncDebug.Describe(sync)}; retrying.");
return ExecuteResult.Retry(200);
}
}
@@ -115,25 +94,3 @@ public override ExecuteResult Execute()
return null;
}
}
-
-internal static class TreasureSyncDebug
-{
- private static readonly FieldInfo? VotesField =
- typeof(TreasureRoomRelicSynchronizer).GetField("_votes", BindingFlags.NonPublic | BindingFlags.Instance);
-
- private static readonly FieldInfo? PredictedVoteField =
- typeof(TreasureRoomRelicSynchronizer).GetField("_predictedVote", BindingFlags.NonPublic | BindingFlags.Instance);
-
- private static readonly FieldInfo? SinglePlayerSkippedField =
- typeof(TreasureRoomRelicSynchronizer).GetField("_singlePlayerSkipped", BindingFlags.NonPublic | BindingFlags.Instance);
-
- internal static string Describe(TreasureRoomRelicSynchronizer sync)
- {
- int currentRelics = sync.CurrentRelics?.Count ?? -1;
- int votes = (VotesField?.GetValue(sync) as ICollection)?.Count ?? -1;
- bool singlePlayerSkipped = SinglePlayerSkippedField?.GetValue(sync) is bool b && b;
- string predictedVote = PredictedVoteField?.GetValue(sync)?.ToString() ?? "null";
-
- return $"syncState(relics={currentRelics}, votes={votes}, predicted={predictedVote}, skipped={singlePlayerSkipped})";
- }
-}
diff --git a/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs b/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs
index a6c42d3..b468a97 100644
--- a/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs
+++ b/RunReplays/Patches/Replay/TreasureRoomReplayPatch.cs
@@ -1,10 +1,10 @@
using HarmonyLib;
-using Godot;
using MegaCrit.Sts2.Core.Nodes.Rooms;
using MegaCrit.Sts2.Core.Nodes.Screens.TreasureRoomRelic;
namespace RunReplays.Patches.Replay;
+
public static class TreasureRoomReplayPatch
{
internal static NTreasureRoom? ActiveRoom;
@@ -19,7 +19,6 @@ public static void Postfix(NTreasureRoom __instance)
return;
ActiveRoom = __instance;
- GD.Print($"[RunReplays] TreasureRoom _Ready captured; insideTree={__instance.IsInsideTree()}");
ReplayDispatcher.TryDispatch();
}
}
@@ -33,8 +32,6 @@ public static void Postfix()
if (!ReplayEngine.IsActive)
return;
- var sync = MegaCrit.Sts2.Core.Runs.RunManager.Instance.TreasureRoomRelicSynchronizer;
- GD.Print($"[RunReplays] TreasureRelics initialized; {RunReplays.Commands.TreasureSyncDebug.Describe(sync)}");
ReplayDispatcher.TryDispatch();
}
}
diff --git a/RunReplays/ReplayDispatcher.cs b/RunReplays/ReplayDispatcher.cs
index f6d328f..0dbc495 100644
--- a/RunReplays/ReplayDispatcher.cs
+++ b/RunReplays/ReplayDispatcher.cs
@@ -623,10 +623,7 @@ public static void Step()
|| ReplayState.PotionInFlight
|| CardPlayReplayPatch.IsAwaitingEndTurnCompletion
|| MapMoveInFlight)
- {
- GD.Print("[RunReplays] Step ignored: dispatcher is busy.");
return;
- }
_stepping = true;
Callable.From(ExecuteNext).CallDeferred();
@@ -894,11 +891,7 @@ private static void WatchdogTick()
&& cmd is MapMoveCommand)
{
var room = GetCurrentRoom();
- if (room != null)
- {
- GD.Print($"[RunReplays] Watchdog holding MapMove; still in room={room.GetType().Name}");
- }
- else
+ if (room == null)
{
// Force-clear blockers so dispatch can proceed.
ReplayState.ClearActionInFlight();
@@ -941,22 +934,14 @@ internal static void TryDispatch([System.Runtime.CompilerServices.CallerMemberNa
GD.Print($"[RunReplays] TryDispatch miss — cmd={cmd.GetType().Name} dispatchable=[{dispatchableNames}]");
DiagnosticLog.Write("Dispatch",
$"miss — cmd={cmd.GetType().Name}({cmd}) dispatchable=[{dispatchableNames}]");
-
if (cmd is MapMoveCommand && GetCurrentRoom() is TreasureRoom)
{
var sync = RunManager.Instance.TreasureRoomRelicSynchronizer;
var relics = sync.CurrentRelics;
if (relics != null && relics.Count > 0)
{
- try
- {
- GD.Print($"[RunReplays] TreasureFlow fallback — pending MapMove in TreasureRoom; auto-picking relic.");
- sync.PickRelicLocally(0);
- }
- catch (InvalidOperationException ex)
- {
- GD.Print($"[RunReplays] TreasureFlow fallback pick failed: {ex.Message}");
- }
+ try { sync.PickRelicLocally(0); }
+ catch (InvalidOperationException) { }
}
}
return;
diff --git a/RunReplays/ReplayEngine.cs b/RunReplays/ReplayEngine.cs
index e99593f..87f2b60 100644
--- a/RunReplays/ReplayEngine.cs
+++ b/RunReplays/ReplayEngine.cs
@@ -34,13 +34,6 @@ private static ReplayCommand SignalConsumed(ReplayCommand cmd, [CallerMemberName
if (_recentConsumed.Count >= 2)
_recentConsumed.RemoveAt(0);
_recentConsumed.Add(cmd);
-
- if (cmd is OpenChestCommand || cmd is TakeChestRelicCommand || cmd is MapMoveCommand)
- {
- string next = _pending.Count > 0 ? _pending.Peek().ToString() : "";
- GD.Print($"[RunReplays] Consumed {cmd.GetType().Name} ({cmd}); next={next}; pending={_pending.Count}");
- }
-
ContextChanged?.Invoke();
if (_replayActive && _pending.Count == 0)
{
diff --git a/RunReplays/Utils/EncounterRngTracker.cs b/RunReplays/Utils/EncounterRngTracker.cs
index c66ec3d..1aaea70 100644
--- a/RunReplays/Utils/EncounterRngTracker.cs
+++ b/RunReplays/Utils/EncounterRngTracker.cs
@@ -7,7 +7,6 @@
using MegaCrit.Sts2.Core.Runs;
using MegaCrit.Sts2.Core.Unlocks;
-
namespace RunReplays.Utils;
///