From d245535e684fd7544ea45bd034d782ecd97f17ef Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 31 Aug 2026 20:13:31 +0700 Subject: [PATCH] the HUD becomes UIParent's child, and cinematics fade through black MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - the transcription had dropped parent= on 72 declarations the reference carries (37 to UIParent, 28 to the action bar's art frame, 7 more), so the HUD was a field of top-level frames and UIParent:Hide() reached almost nothing — which is why a cinematic had to hide the UI at the draw level and then special-case the pointer; both workarounds are deleted and the HUD hides through the reference's own route; restoring only the UIParent half would have been the dangerous part (draw order is one flat sort, so a partial restore lifts frames over the neighbours they carry), and manifest order turns out to be load-bearing — a parent name that doesn't exist yet is silently ignored, so UIParent.xml moves to the reference's own slot with a test that fails if anything declares a child first; the chat still drew over a fly-by after all that, because the reference parents the chat windows on their TEMPLATE, invisible to a name-for-name diff when both sides rename — two declarations fix it, and the sweep that replaces the method loads the whole shipped manifest, fires CINEMATIC_START and asserts the survivors are exactly three: 91 frames visible before, 3 after, and the count comes back on stop - every cinematic boundary cuts through the reference's 0.25 s fade to black, and the next step hangs on the fade's COMPLETION, not a delay — the shot boundary is exactly where the reference does a blocking terrain load, so a delay-driven cut shows through a hitch and a completion-driven one cannot; and a fly-by now ends into black instead of a ~0.3 s loading cover: the reference raises no cover on that path, it holds black while the ground under the player loads back, so ours holds black while the stream catches up — budgeted, never an unbounded wait - the death arc keeps its promises across a relog: the body's own state machine now dies with the session — re-entering the world as a ghost used to match no arm of the world-edge machine, so the corpse query never went out and "Resurrect Now" stayed down until the next death; and a corpse wears its owner's guild crest — the corpse descriptor carries the guild field and resolves through the same crest cache a living tabard does, where ours dressed the body crestless - the char-select ghost gets its body kit: the screen resolves the state kit of the very "Ghost" aura a released ghost rides in the world — tint (140,185,253), alpha 0.5, and the Ghost_state wisp model at the body's attach point, pinned by a golden that decodes the row out of the shipped DBC; the airborne model is corrected before its fix lands — the address six comments called the gravity integrator is really the fall-velocity query, and a knockback is unsteerable because its launch PLANTS the forward bit, not because the arc is airborne (our guard was a velocity proxy, so a near-zero-speed knockback steered from frame 2); and the hover inspect card now decodes a picked part's mesh tag — alpha, rig slot, and both readings of the lighting payload side by side — turning a rebuild-and-two-probes hunt into a hover Co-Authored-By: Claude Fable 5 --- crates/benilla-app/assets/ui/ActionBar.xml | 34 +- crates/benilla-app/assets/ui/BagFrame.xml | 12 +- crates/benilla-app/assets/ui/BankFrame.xml | 2 +- .../benilla-app/assets/ui/CharacterFrame.xml | 4 +- crates/benilla-app/assets/ui/ChatFrame.xml | 14 +- crates/benilla-app/assets/ui/DressUpFrame.xml | 2 +- crates/benilla-app/assets/ui/ErrorsFrame.xml | 4 +- crates/benilla-app/assets/ui/FriendsFrame.xml | 2 +- .../benilla-app/assets/ui/GameMenuFrame.xml | 2 +- crates/benilla-app/assets/ui/GameTooltip.xml | 6 +- crates/benilla-app/assets/ui/GossipFrame.xml | 2 +- crates/benilla-app/assets/ui/ItemRef.xml | 2 +- crates/benilla-app/assets/ui/LootFrame.xml | 2 +- crates/benilla-app/assets/ui/MailFrame.xml | 4 +- .../benilla-app/assets/ui/MerchantFrame.xml | 2 +- crates/benilla-app/assets/ui/MicroMenu.xml | 16 +- crates/benilla-app/assets/ui/MultiBars.xml | 8 +- crates/benilla-app/assets/ui/OptionsFrame.xml | 2 +- crates/benilla-app/assets/ui/PetActionBar.xml | 2 +- crates/benilla-app/assets/ui/PetStable.xml | 2 +- crates/benilla-app/assets/ui/QuestFrame.xml | 2 +- .../benilla-app/assets/ui/QuestLogFrame.xml | 4 +- .../benilla-app/assets/ui/QuestTimerFrame.xml | 2 +- .../benilla-app/assets/ui/SpellBookFrame.xml | 2 +- crates/benilla-app/assets/ui/StanceBar.xml | 2 +- crates/benilla-app/assets/ui/TaxiFrame.xml | 2 +- crates/benilla-app/assets/ui/TradeFrame.xml | 2 +- crates/benilla-app/assets/ui/UiPanels.xml | 29 +- crates/benilla-app/assets/ui/UnitFrames.xml | 4 +- .../benilla-app/assets/ui/WorldMapFrame.xml | 13 +- crates/benilla-app/assets/ui/benilla.toc | 19 +- crates/benilla-app/src/cinematic.rs | 370 ++++++++++++++++-- .../benilla-app/src/creature_anim/select.rs | 2 +- crates/benilla-app/src/death.rs | 97 +++++ crates/benilla-app/src/debug_panel/inspect.rs | 20 + .../src/entities/attach/preview.rs | 305 ++++++++++++++- crates/benilla-app/src/entities/corpse.rs | 13 +- .../src/entities/equipment/resolve.rs | 36 +- crates/benilla-app/src/lib.rs | 2 + crates/benilla-app/src/player/mover.rs | 29 +- crates/benilla-app/src/player/state.rs | 7 +- crates/benilla-app/src/portrait/booth.rs | 249 +++++++++++- crates/benilla-app/src/portrait/dressup.rs | 10 +- crates/benilla-app/src/portrait/glue_booth.rs | 110 +++++- crates/benilla-app/src/portrait/mod.rs | 16 +- crates/benilla-app/src/portrait/test_bake.rs | 5 +- crates/benilla-app/src/screen_fade.rs | 289 ++++++++++++++ crates/benilla-app/src/ui_guild/mod.rs | 23 +- .../src/ui_script/cinematic_tests.rs | 55 +++ .../src/ui_script/game_menu_tests.rs | 3 + crates/benilla-app/src/ui_script/manifest.rs | 30 ++ crates/benilla-app/src/ui_script/mod.rs | 24 +- .../src/ui_script/options_tests.rs | 3 + .../src/ui_script/shipped_xml_tests.rs | 108 +++++ crates/benilla-app/tests/world_api_wall.rs | 15 +- .../src/messages/update_object/fields/mod.rs | 10 + crates/benilla-world/src/instance_tint.rs | 53 ++- crates/benilla-world/src/zfill.rs | 32 +- 58 files changed, 1908 insertions(+), 213 deletions(-) create mode 100644 crates/benilla-app/src/screen_fade.rs diff --git a/crates/benilla-app/assets/ui/ActionBar.xml b/crates/benilla-app/assets/ui/ActionBar.xml index e906ee57..72f59b5f 100644 --- a/crates/benilla-app/assets/ui/ActionBar.xml +++ b/crates/benilla-app/assets/ui/ActionBar.xml @@ -1715,7 +1715,7 @@ - + @@ -1825,7 +1825,7 @@ the rest state. Starts at the bar's CENTER exactly like the ref (its own first Update re-seats or hides it before anything is seen). --> - - - + diff --git a/crates/benilla-app/assets/ui/ErrorsFrame.xml b/crates/benilla-app/assets/ui/ErrorsFrame.xml index a25bc854..7bcfbdb0 100644 --- a/crates/benilla-app/assets/ui/ErrorsFrame.xml +++ b/crates/benilla-app/assets/ui/ErrorsFrame.xml @@ -48,7 +48,7 @@ end ]]> - + @@ -91,7 +91,7 @@ RaidBossEmoteFrame, its sibling in the same file, is NOT declared: zero corpus addons name it, and a shadowed name with no caller is building against a guess (1222's rejected clause). --> - + diff --git a/crates/benilla-app/assets/ui/FriendsFrame.xml b/crates/benilla-app/assets/ui/FriendsFrame.xml index b85d8595..44d109b1 100644 --- a/crates/benilla-app/assets/ui/FriendsFrame.xml +++ b/crates/benilla-app/assets/ui/FriendsFrame.xml @@ -2043,7 +2043,7 @@ - + diff --git a/crates/benilla-app/assets/ui/GameMenuFrame.xml b/crates/benilla-app/assets/ui/GameMenuFrame.xml index f4e50673..4e5ddb05 100644 --- a/crates/benilla-app/assets/ui/GameMenuFrame.xml +++ b/crates/benilla-app/assets/ui/GameMenuFrame.xml @@ -210,7 +210,7 @@ - + diff --git a/crates/benilla-app/assets/ui/GameTooltip.xml b/crates/benilla-app/assets/ui/GameTooltip.xml index e1833092..be11b962 100644 --- a/crates/benilla-app/assets/ui/GameTooltip.xml +++ b/crates/benilla-app/assets/ui/GameTooltip.xml @@ -455,7 +455,7 @@ -