- 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>
2.1 KiB
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.)