fix #208: keep combat bar hidden in peace mode
Treat combat-window visibility as gameplay-state owned so character layout restoration cannot replay a stale visible bit. Reset combat state to NonCombat at character-session entry, matching retail ClientCombatSystem::Begin. Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
parent
00fe993f6f
commit
8e9c538519
8 changed files with 109 additions and 14 deletions
|
|
@ -66,6 +66,39 @@ public sealed class RetailWindowLayoutPersistenceTests : IDisposable
|
|||
Assert.Null(store.LoadWindowLayout("default", "800x600", "radar", default));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Restore_StateManagedWindow_PreservesAuthoritativeVisibility()
|
||||
{
|
||||
var store = new SettingsStore(PathName);
|
||||
store.SaveWindowLayout(
|
||||
"Alice",
|
||||
"800x600",
|
||||
"combat",
|
||||
new UiWindowLayout(44f, 55f, 200f, 100f, true, false, false));
|
||||
|
||||
var root = new UiRoot { Width = 800, Height = 600 };
|
||||
RetailWindowHandle handle = Mount(root, "combat");
|
||||
handle.Hide();
|
||||
using var persistence = new RetailWindowLayoutPersistence(
|
||||
root.WindowManager,
|
||||
store,
|
||||
() => "Alice",
|
||||
() => (800, 600),
|
||||
stateManagedVisibilityWindows: ["combat"]);
|
||||
|
||||
persistence.RestoreAll();
|
||||
|
||||
Assert.Equal((44f, 55f), (handle.Left, handle.Top));
|
||||
Assert.False(handle.IsVisible);
|
||||
|
||||
// Combat mode owns subsequent show/hide transitions as well; they must
|
||||
// not turn into saved user visibility preferences.
|
||||
handle.Show();
|
||||
UiWindowLayout saved = Assert.IsType<UiWindowLayout>(
|
||||
store.LoadWindowLayout("Alice", "800x600", "combat", default));
|
||||
Assert.False(saved.Visible);
|
||||
}
|
||||
|
||||
private static RetailWindowHandle Mount(
|
||||
UiRoot root,
|
||||
string name,
|
||||
|
|
|
|||
|
|
@ -128,15 +128,17 @@ public sealed class CombatStateTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
public void Clear_ResetsHealthCache()
|
||||
public void Clear_ResetsCharacterSessionToPeaceMode()
|
||||
{
|
||||
var state = new CombatState();
|
||||
state.OnUpdateHealth(1, 0.5f);
|
||||
state.OnUpdateHealth(2, 0.8f);
|
||||
state.SetCombatMode(CombatMode.Melee);
|
||||
|
||||
state.Clear();
|
||||
|
||||
Assert.Equal(1f, state.GetHealthPercent(1)); // back to default
|
||||
Assert.Equal(0, state.TrackedTargetCount);
|
||||
Assert.Equal(CombatMode.NonCombat, state.CurrentMode);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue