acdream/src/AcDream.App/Composition
Erik fe1bc70753 feat(ui): world-object hover tooltip — UIElement_SmartBoxWrapper::RecvNotice_SmartBoxObjectFound port
NOT the UI-element dwell-timer path. Retail's mechanism is
UIElement_SmartBoxWrapper::RecvNotice_SmartBoxObjectFound @0x004E5AD0,
fed every frame by FindObject @0x004E5430/Global_Loop @0x004E5620
using the current mouse position regardless of input focus. It fires
IMMEDIATELY (no dwell wait) on the found-object id CHANGING, gated by
the PlayerModule::ShowTooltips character option (already modeled in
CharacterOptionTable, default true), with text
ACCWeenieObject::GetObjectName(id, NAME_APPROPRIATE, 0) — the SAME
name call as item tooltips, but WITHOUT the item-cell's separate
stack-count prefix (a ground pile of arrows shows "Arrows", not
"20 Arrows" — a real, decomp-confirmed asymmetry).

Ported as RetailTooltipPresenter.UpdateWorldHoverTooltip, driven by
the SAME world-hover pick CursorFeedbackController's own found-cursor
already uses (WorldSelectionQuery.PickAtCursor, includeSelf: true —
own player is included on that precedent) and the SAME
ClientObjectTable-backed name resolver SocialAllegiancePageController's
ResolveWorldObjectName already established as this codebase's
pattern. New WorldTooltipRuntimeBindings threads it through
RetailUiRuntimeBindings; wired at InteractionRetainedUiComposition
alongside the existing cursorFeedback construction.

Queried only when no UI element is hovered — a narrowing from
retail's literal "raycast even under non-item UI chrome" (FindObject's
m_pElementLastOver check), called out in the class's own doc note as
a scoped interpretation rather than a byte-exact port.

The exact popup skin is an inference, not a measured value: an
exhaustive live-DAT sweep found UIElement_SmartBoxWrapper (class
0x10000030) has NO authored ElementDesc anywhere installed — unlike
every other tooltip trigger, it is evidently constructed directly by
gmGamePlayUI's own mode setup, not from a walkable LayoutDesc. This
port reuses the same P0x47=0x10000395/P0x48=0x21000041 pair every
other game-code SetTooltip caller in this family resolves to — the
best-evidenced choice, called out in register row TS-85 rather than
silently assumed exact.

Live-verified against a connected ACE session (session-config launch,
+Acdream): hovering a "Silver Tusker" near spawn mounted the correct
popup text and simultaneously flipped the cursor to its DefaultFound
variant, confirming the shared found-object pipeline drives both.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 23:02:29 +02:00
..
AnimationHookRegistrationSet.cs refactor(app): compose live presentation startup 2026-07-22 17:55:15 +02:00
CompositionAcquisitionScope.cs feat(render): Campaign V slice V6h — the Vulkan composition host 2026-07-28 11:47:37 +02:00
ContentEffectsAudioComposition.cs feat(app): Campaign CC slice CC4 — chargen screen shell + Heritage/Profession/Skills/Town pages 2026-08-15 17:45:51 +02:00
FrameRootComposition.cs feat(chargen): Campaign CC slice CC5 — Summary page, Finish flow, RandomizeCharacter port 2026-08-16 00:01:07 +02:00
GameWindowCompositionPipeline.cs refactor(app): close ordered startup composition 2026-07-22 19:20:20 +02:00
GameWindowGraphics.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
GameWindowPlatformAcquisition.cs refactor(app): define ordered composition contract 2026-07-22 15:03:40 +02:00
HostInputCameraComposition.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
InteractionRetainedUiComposition.cs feat(ui): world-object hover tooltip — UIElement_SmartBoxWrapper::RecvNotice_SmartBoxObjectFound port 2026-08-16 23:02:29 +02:00
InteractionUiRuntimeSources.cs feat(chargen): Campaign CC slice CC5 — Summary page, Finish flow, RandomizeCharacter port 2026-08-16 00:01:07 +02:00
LivePresentationComposition.cs fix(chargen): Campaign CC gate round 1 re-test 2 — R3-5/R3-6 color-key swatch/gradient textures 2026-08-16 17:20:31 +02:00
LivePresentationRuntimeBindings.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
PreparedSetupResolver.cs perf(content): remove exception-driven setup probes 2026-07-24 15:12:21 +02:00
SessionPlayerComposition.cs feat(runtime): share chat commands and run login sequence 2026-08-14 20:27:45 +02:00
SessionPlayerRuntimeBindings.cs refactor(app): compose session and player startup 2026-07-22 18:28:32 +02:00
SessionStartComposition.cs fix(plugins): close LA5 host lifecycle review 2026-08-14 19:05:13 +02:00
SettingsDevToolsComposition.cs refactor(settings): OP9 — retire the dead F11 settings surface + fully-superseded GameplaySettings 2026-08-11 13:18:53 +02:00
VulkanHostInputCameraCompositionFactory.cs fix #387: window resize never recreated the Vulkan swapchain (stretch) 2026-08-13 09:05:13 +02:00
WorldRenderComposition.cs feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00