- megamap: the zoomed view (0x6cc950) is shared by the large map and the
TAB overview map; its centre is now set per call from the drawing
window's offset (hud::DrawOffsetX) instead of fixed to the render width
- input: drop the Ctrl/Alt pass-through; GetKeyState reports Alt as held
after Alt+Tab, which switched all bindings back to the game's handling
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- respec: the panel's unused second button array becomes − buttons between
name and value; attributes give back invested points, skills give back
skill points, a level-1 skill is removed and can be chosen anew; all
through the game's own point functions (protected copy stays in sync)
- the − is the + icon with its vertical arm covered (no minus image exists)
- hud: RenderCentred / HandleCentred for mods hooking centred windows;
mouse event helpers shared in game/ui/events.h
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Quest dialogs are tooltips. A tooltip now keeps the offset it gets when it
becomes visible (the hovered window's, or centred for dialogs) and records
it for hit tests; its own event handler is shifted too. Hidden windows no
longer count as hovered.
- Esc closes a visible dialog the way its answer buttons do: hide, then
cDialogManager::Answer with no answer (ends the input lock, nothing chosen).
- Autotest can select a save game row (-Save).
- Names for the UI manager, tooltip and dialog functions.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Creatures were culled beyond 1024+200 x 768+200 screen pixels (cmp 4C8h /
3C8h in both object passes): invisible in the right part of a wide view,
and the player too once the centre passed 1224. The bounds follow the
render size now.
- Centre immediates written as negatives (-200h / -180h), missed before:
the row renderer's static object origin (0x62babb) and aiming at the
cursor (0x4fb620).
- HUD: moved windows no longer shift the shared mouse cursor object; the
cursor accessor (0x6550f0) hands them a per-thread shifted copy and writes
back what they changed. World input on other threads read the shifted
position now and then, which made hold-to-move jerky.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Mouse move events carry previous and current x (+4, +0xc); button events
x at +8. All are shifted, and restored to the saved values.
- The cursor object's previous x (+0xc) is shifted too: picking up an item
writes the cursor position into the event (0x6559a0).
- GetMouseClientPos returns the shifted position inside a moved window.
- Window hit tests (vf1c 0x731d40, taskbar 0x6dfb10) called outside a window
scope, e.g. 'is UI under the cursor' for world picking (0x75a370), use the
offset the top-level window was last drawn with.
- The item carried by the cursor (0x6555e0) and the UI manager's centred
status line / message box (0x75bbf0, 0x75c200) draw with the centre offset.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
New mods/hud: while a HUD window renders, screen-space vertices passed to
D3D7 DrawPrimitive/DrawIndexedPrimitive are shifted by dx; while it handles
an event, the UI event point (category 5, +0x48) is shifted by -dx. Applied
to cUI_Taskbar2 (centred) and cUI_Mercenary (portrait + health, right edge).
3D belt items line up without help (their projection is screen-centred).
re::AttachRuntimeHook hooks functions only known at runtime (COM methods).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>