fix #416 #415: the retail button state/media machine — roster hover highlight clears; probe wait verbs bind without an artifact dir
#416 (char-select roster highlight never cleared on hover-leave): three decomp-grounded mechanisms replace the media-keyed _availableStates approximation. - UIElement_Button::UpdateState_ @0x00471CF0: the button machine commits ONLY states authored on the button's OWN ElementDesc (AccessStateDesc gate); unauthored requests no-op, preserving custom semantic states. - UIElement::SetState @0x00464E70: an unauthored state id is coerced to state 0 (the unnamed base state) and committed — ported into UiDatElement.TrySetRetailState with the base-descriptor PassToChildren cascade arm. - The SetState media rule @0x004651c0: a committed state replaces the playing media ONLY when its media array is non-empty. UiButton now keeps per-face-segment media states under that rule (segments model retail's PassToChildren children), and LayoutImporter records the raw MediaCount including the File=0 draw-nothing images the drawable filter drops — the roster bar children's base state is exactly such an image, and it is what clears the bar. The row template truth (probe, installed DAT): the row authors EMPTY Normal/rollover/Highlight descriptors with PassToChildren; the three bar children author rollover/Highlight media, NO Normal state, and a File=0 base image. An empty-media Normal_pressed still never blanks a Normal-art button (the media rule keeps the previous art — the exact behavior the old gate approximated), and the Appearance spins' property-only Highlight now genuinely commits: label recolors, arrow art lingers — the retail split AP-222 approximated with a requested-keyed label hack, now retired. Live-verified at char select: hover +alex shows the grey bar, moving off clears it, the selected row keeps its amber bar. #415 (probe wait world-* verbs dead): the filed snapshot-reset diagnosis was wrong — the automation bridge simply never bound without ACDREAM_AUTOMATION_ARTIFACT_DIR. A facts-only WorldRevealFactsAutomationRuntime now binds whenever the retained UI exists; checkpoint/screenshot verbs still require the artifact directory and now report that instead of a generic timeout. App tests 5568/3 skips, Runtime 1756/0, UI.Abstractions 926/0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
7aa08045d8
commit
91c1962b0d
11 changed files with 469 additions and 86 deletions
|
|
@ -164,6 +164,30 @@ public sealed class PowerbarLayoutProbeTests
|
|||
DumpElement(strings, root!, 0);
|
||||
}
|
||||
|
||||
/// <summary>2026-08-17 #416 (stuck character-select rollover): dump the
|
||||
/// character-management roster row template (0x21000004/0x100003A5) —
|
||||
/// which states it authors, which of them carry media, and the default
|
||||
/// state — so the hover-leave fix binds the authored truth.</summary>
|
||||
[Fact]
|
||||
public void ProbeCharacterSelectRowTemplate()
|
||||
{
|
||||
if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1")
|
||||
return;
|
||||
|
||||
var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR")
|
||||
?? Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||
"Documents",
|
||||
"Asheron's Call");
|
||||
using var dats = new DatCollection(datDir, DatAccessType.Read);
|
||||
var strings = new DatStringResolver(dats);
|
||||
|
||||
ElementInfo? row = LayoutImporter.ImportInfos(dats, 0x21000004u, 0x100003A5u);
|
||||
Assert.NotNull(row);
|
||||
Console.WriteLine("[pbprobe] === char-select roster row 0x21000004/0x100003A5 ===");
|
||||
DumpElement(strings, row!, 0);
|
||||
}
|
||||
|
||||
private static ElementInfo? FindById(ElementInfo element, uint id)
|
||||
{
|
||||
if (element.Id == id) return element;
|
||||
|
|
@ -219,7 +243,8 @@ public sealed class PowerbarLayoutProbeTests
|
|||
$"0x{pair.Key:X2}:{pair.Value.Kind}=0x{pair.Value.UnsignedValue:X}"));
|
||||
Console.WriteLine(
|
||||
$"[pbprobe] {indent} state 0x{stateId:X8} '{state.Name}'"
|
||||
+ $" passToChildren={state.PassToChildren}{text} props[{properties}]");
|
||||
+ $" passToChildren={state.PassToChildren} mediaCount={state.MediaCount}"
|
||||
+ $"{text} props[{properties}]");
|
||||
}
|
||||
foreach (ElementInfo child in e.Children)
|
||||
DumpElement(strings, child, depth + 1);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue