the HUD becomes UIParent's child, and cinematics fade through black

- 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 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-08-31 20:13:31 +07:00
co-authored by Claude Fable 5
parent a6e8929f18
commit d245535e68
58 changed files with 1908 additions and 213 deletions
@@ -111,6 +111,18 @@ pub(super) struct InspectStores<'w, 's> {
&'static benilla_assets::ModelAnimations,
),
>,
/// The **picked submesh's own `MeshTag`** — the per-instance shading payload, decoded by its
/// owning module ([`benilla_world::mesh_tag::describe`]).
///
/// The `light` line above names which *law* an object is on; this names what its parts are
/// actually carrying under that law, and the two together are what settle a "why is this body
/// lit wrong?" report. The payload's meaning switches on material state, which a tag alone
/// cannot know, so the decode prints BOTH readings of bits 6..=18 side by side — a shade byte
/// of 255 (the MCSH-shadowed half-intensity) sits inside a probe slot of 2047, and a writer
/// using the wrong law for its material is invisible in either reading alone and obvious in
/// the pair. Read off the picked entity itself, not the parent: `WorldObject` and `MeshTag`
/// both ride the submesh.
tags: Query<'w, 's, &'static bevy::mesh::MeshTag>,
}
/// The inspector overlay, drawn only while armed: a weak top-centre "armed" pill (so it's obvious the
@@ -186,6 +198,11 @@ pub(super) fn inspect_ui(
let (reputations, plates, plate_mode) =
(&*stores.reputations, &stores.plates.0, &*stores.plate_mode);
let go_templates = &*stores.go_templates;
// The picked submesh's shading payload — off the hit entity itself (see the field's doc).
let tag_line = mouseover
.entity
.and_then(|e| stores.tags.get(e).ok())
.map(|t| format!("tag {}", benilla_world::mesh_tag::describe(t.0)));
let (stores, kinds, collision, lit, motion, go_anims) = (
&stores.stores,
&stores.kinds,
@@ -537,6 +554,9 @@ pub(super) fn inspect_ui(
if let Some(line) = &light_line {
lines.push(line.clone());
}
if let Some(line) = &tag_line {
lines.push(line.clone());
}
lines.push(format!("{:.1} yd away", mouseover.distance));
// The inspector owns left-click while armed (player::control suppresses left-orbit during inspect),