Esc menu without "Exportieren"; export screen mod removed

- cUI_EscMenu::BuildLines hook: the UI_ESC_EXPORT line is removed, the
  lines below move up, the window shrinks by one line, centred.
- game/ui/control.h: control vector helpers (ControlsIn, RemoveControl,
  SetControlAt, DeleteControl, ControlNamed), used by the main menu too.
- The export screen is unreachable now: charexport.cpp and
  docs/char-export.md deleted. Spielen screen redesign noted in todo.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
khallaandClaude Opus 5.5 committed 2026-10-20 21:56:11 +02:00
1 parent 618288e310
commit e0d8d0ce7e
9 files changed
+105 -195

No files matched your search

-48
View File
@@ -1,48 +0,0 @@
# Character export screen (`src/mods/charexport.cpp`)
Request (2026-10-18): the export screen (Esc menu "Exportieren") was not
adapted to widescreen (layout and clicks shifted), slots could not be
cleared or overwritten; the screen and the save game window need black
beside the background picture.
## Layout
See `hud.md`, "Full-screen windows": the 3D scene was stretched across the
wide viewport; the window now draws with a viewport on the centred frame.
## cUI_Character
One window for the main menu's character selection / import and the export
screen (vtable 0x894fa8, render vf44 0x70f160, events vf10 0x70e860).
| Field | Meaning |
|---|---|
| +0x390 | mode: 4 selection, 5 export, 6 overwrite confirmation (7 import) |
| +0x394 | previous mode |
| +0x1b4 | 8 slot controls; hero id at +0x2f8 (0: empty) |
| +0x1d6 | selected slot (char, -1 none) |
| +0x3b4 | erase button ("UI_CHAR_ERASE_TOOLTIP") |
| Address | Function |
|---|---|
| 0x70c760 | SetMode (mode), ret 4; entering mode 5 reloads the heroes |
| 0x70c440 | SelectSlot (char slot), ret 4; shows the erase button in modes 4 / 7 only |
| 0x70d0f0 | ExecuteAction (action, slot, extra), ret 0xc: 6 export into slot (`Save\Hero%.2d.pax`), 9 export with confirmation if occupied |
| 0x70e650 | right-hand button: in mode 5 action 6 (empty slot) or 9 (occupied) |
| 0x7f01a0 | HeroSlots_DeleteHero (slot + 1), thiscall on 0x7d7c40(), ret 4 |
## Overwrite
Measured with a log: exporting to an occupied slot was already the game's own
path (action 9 -> mode 6 confirmation -> action 6). It only failed because
clicks hit the wrong place before the layout fix.
## Clear
The erase button is created for every mode, and its click handler (vf10)
does not check the mode: it opens the game's confirmation
(UI_CHAR_ERASE_CONFIRM, cUI_BusyDlg), whose answer (0x72087b) calls
DeleteHero. The mod shows the button in export mode whenever an occupied slot
is selected (after SetMode / SelectSlot). After DeleteHero, if the screen is
in export mode, it enters export mode again (reloads the heroes) and clears
the selection; otherwise the erased hero stayed until the next export.
+8 -1
View File
@@ -258,6 +258,14 @@ flag +0x54 |= 0x40. The Esc menu line keeps its action (Show
direct save while a game runs. Its text is patched at 0x6bc1f7 (id 0x41b is
used by other windows too). Loading is from the main menu only.
The Esc menu has no "Exportieren" (request 2026-10-20): `cUI_EscMenu::BuildLines`
(0x6bb870, called by the constructor and on an event) makes five
cUI_StaticText64 lines in the vector +0x158, 0x24 apart; each handles its own
events. After it the UI_ESC_EXPORT line is removed and deleted, the lines
below move up, and the window (0x108 x 0xc8) loses 0x24 of height, staying
centred. With it the export screen (cUI_Character mode 5) is unreachable;
its mod (charexport.cpp, an erase button for export slots) was deleted.
### Migration
On first start (no `characters\` folder): after a backup in
@@ -268,7 +276,6 @@ kept, the newest file overall is the shared hero.
## Open
- Reset a difficulty.
- Remove the export / import UI.
- Silent autosave every 10 minutes.
- Quickload (row 0) does not know characters.
- Multiplayer (see `todo.md`).
+10 -5
View File
@@ -182,13 +182,10 @@ From the characters rework (`docs/characters.md`, request of 2026-10-19):
- **Unlock difficulties by story completion.** Bronze and Silber stay open;
difficulty d >= 2 opens when the story on d - 1 is completed. The counters
are one byte per difficulty in cStatsManager +0x5704 (read 0x424be0) and
travel in the save header (+0x88..+0x98) and the hero file. Today every
difficulty up to the highest played one is offered (and Silber).
travel in the save header (+0x88..+0x98) and the hero file. Done
2026-10-20 (docs/characters.md).
- **Reset a difficulty.** Remove one world from a character (the shared hero
stays); a button / dialog entry in the load window.
- **Remove the export / import UI.** The Esc menu's "Exportieren" and the
character screen's import (cUI_Character mode 5, `docs/char-export.md`):
characters replace exported heroes.
- **Silent autosave every 10 minutes** (a setting later) into the
autosave file, without the busy dialog, like the direct save
(`SaveOnTick`) but marked as an autosave.
@@ -196,3 +193,11 @@ From the characters rework (`docs/characters.md`, request of 2026-10-19):
current character, but the quickload event (0x116, engine +0x68 = row,
flag 0x200) loads `GAME00.PAK`, which is not listed; make it reload the
current character's world (or its newer autosave).
## Savegames screen redesign ("Spielen")
Asked 2026-10-20: redesign the load window (cUI_Savegame, the "Spielen"
screen, characters.cpp): show a render of the selected character, use the
space far better. The user looks for 16:9 artwork so the screens can be
widened beyond the 1024 frame (now drawn in a centred 1024x768 viewport with
black sides, hud.cpp FrameScope).