Files
sacred_k/docs/escape.md
T
khallaandClaude Opus 5.5 a7f8496b2b Quest dialogs: stay centred, clickable, closable with Esc
- 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>
2026-10-16 00:39:29 +02:00

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