- 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>
40 lines
2.1 KiB
Markdown
40 lines
2.1 KiB
Markdown
# Esc closes windows first (`src/mods/escape.cpp`)
|
|
|
|
Asked 2026-10-15: with a dialog open, Esc should close it instead of opening
|
|
the game menu.
|
|
|
|
## The game (`cUI_Manager::HandleEsc` 0x756ba0, measured 2026-10-15)
|
|
|
|
On an Esc key event the UI manager (`0x757544`) calls HandleEsc. It knows its
|
|
windows by slot (cUI_Manager dwords): 0x20 taskbar, 0x21 inventory, 0x22
|
|
equipment, 0x23 blacksmith, 0x24 merchant, 0x25 megamap, 0x26 overview map,
|
|
0x27 mercenary (party panel), 0x28 stats, 0x29 console, 0x2a diary (quest
|
|
book), 0x2b savegame, 0x2c ESC menu, 0x2d purchase, 0x2e master, 0x2f options,
|
|
0x30 chest, 0x31 horse, 0x32 network info, 0x33 net portrait, 0x34
|
|
character, 0x35 cube. It closes the ESC menu, the megamap, the quest book, or
|
|
(with 0x21/0x23/0x24/0x2e/0x30 open) the inventory; hides 0x2b / 0x2f;
|
|
otherwise opens the ESC menu. With a trader open only the inventory closed,
|
|
and the trader opened it again.
|
|
|
|
Closing a window: a cEventUI2 (vtable 0x88edd0, 0x80 bytes: +4 code 0x12,
|
|
+8 subtype 5 = hide, names via 0x5904e0: sender at +0x28, window at +0x48 as
|
|
measured in the commands the game sends when a window is closed by its
|
|
button or hotkey; a string at +0x68, 0x423920 / 0x416660) sent to the UI
|
|
manager's event handler (vf00, 0x757120), which routes it by name. Sent to
|
|
the window's own vf10 it was not understood (first version).
|
|
|
|
## The mod
|
|
|
|
HandleEsc is hooked: unless the ESC menu is open, every visible window of a
|
|
table (slot, name) gets that hide command, and Esc does nothing else. If none
|
|
is open, the game handles Esc as before.
|
|
|
|
Quest dialogs are tooltips (docs/hud.md) that block all input until answered.
|
|
A click on one of their entries (cUI_Tooltip::HandleEvent 0x6e71e2) hides the
|
|
tooltip (0x731ee0, flag 1), calls cDialogManager::Answer (0x49a090 on
|
|
0xaaaf00, (owner = tooltip +0x21cc, answer)) and clears 0xab5314. Answer sends
|
|
every player hero a cEvent_creature 0x10c (ends the input lock) and passes
|
|
answers below 100000 to the quest script (0x46bd80). Esc does the same with
|
|
answer 0xffffffff: the dialog closes, nothing is chosen. (Hiding the tooltip
|
|
alone left the input lock; measured with a write watch on its flags.)
|