- Options window in three tabs; the auto-pickup settings move to Beute; sliders move with their page; black sides like the save game screen. - Tastenbelegung: every binding settable (click, press key; Esc cancels, Backspace unbinds), "Alle zurücksetzen" as a game button, saved on OK. - Potions bindable (default unbound), named by the game's potion texts; the game's own potion hotkeys are off; bar tooltips show the bound key. - Map (M), overview map (Tab, held) and labels (Alt, held) bindable; the game's own M / Tab / Alt handling is switched off. - Save game key calls the game's save window code instead of a posted key. - Teleportationstrank: fixed text replacement from startup (also the Ausdauertrank items, potion kind 5 as well). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
6.8 KiB
To do
Fixed: aura visuals missing after loading (2026-10-15)
Saving marks effect objects (cObjectFX) dead; loading keeps the buff but drops
the aura effect (type 842) that follows the hero. src/mods/aura_restore.cpp
recreates it after a load for Heldenmut (0x3f7) and Klingenblick (0x3f8). Spell
auras (Steinhaut, Lichtschild, ...) use other effects; the user confirmed on
2026-10-17 that their visuals are back after loading too.
Data-driven arts instead of hardcoded art ids
Asked 2026-10-15: naming single arts as constants (kArtHeldenmut,
kArtFlammenwerfer, ... in src/game/engine/arts.h) does not scale. Mods
should decide by an art's properties, read from the game's own data:
- the definition tables
g_spellDefs(0x950a38, 71 x 0x94) andg_combatMoveDefs(0x94ddb0, 95 x 0x78): id, icon name, launch type, usable mounted, ... (tools/arttable.mjsdumps them; most fields unnamed); - map the remaining fields (regeneration group, lasting effect / aura,
duration, ...) and expose them as an
ArtInfolookup insrc/game/; - where the game itself hardcodes ids (e.g. the arts that always count as
magic in
cCreatureArts::AddGroupRegen, the "already active" switch inIsValidArtTarget), keep one table of those ids with the reason, instead of named constants spread over the mods; - optionally an own data file (JSON next to the DLL) for mod-side settings per art, if we need values the game does not have.
Art ranges: scaling and indicators
Asked 2026-10-15 (after making periodic aura hits strike everything in range, docs/aura-hits.md):
- art ranges should scale with the art's level, and possibly with new attributes;
- possibly show a range indicator (e.g. a ring around the hero for auras, or at the cursor for aimed arts).
Known so far: the periodic-hit aura (effect kind 0x12) uses
(cCreatureArts +0x56 + 20) * 10 world units, measured from the owner with
cCreature::DistanceTo (0x536f20); what +0x56 is (level? a stat?) is not
mapped yet. Other arts' ranges are not mapped. Fits the data-driven arts
item above (range as a property of an art, one place to compute it).
Rename life leech to "omnivamp"
Asked 2026-10-15: life leech (property 0x349, "Lebensentzug") becomes
"omnivamp". To do: the in-game texts (item property, tooltips, character
window). The leech code is the game's (0x5707a4.., property 0x349, in the
damage code 0x56aff0); it credits the hit's attacker (order +0x1c). Omnivamp usually means healing from all damage,
not only weapon hits: aura hits (docs/aura-hits.md) now name their attacker
so the game applies it;
other damage sources (spells, combat arts' extra hits, damage over time) may
follow.
Map and map zoom in widened views
Reported 2026-10-15: the map (and zooming it) does not support the widened render sizes yet. 2026-10-16: TAB map fixed (viewport shifted), M map spans the render width (docs/hud.md, "Large map"), zoomed view and its markers included. Confirmed in-game 2026-10-16.
Quest dialog glitches in widened views
Reported 2026-10-15: accepting a quest, the dialog window "kept glitching" and button clicks were not detected correctly. Probably the HUD layer (src/mods/hud.cpp: windows shifted while they render / handle events): the dialog may not be covered, or shifted twice. Details asked from the user.
WASD walks around walls (caves)
Reported 2026-10-15: in caves WASD movement behaves "as if the player tries to find another way to the target location if a wall comes up". WASD sends a walk order to a point 300 world units ahead (docs/wasd.md); when that point is behind a wall the pathfinder plans a detour. Idea: find the game's straight line / walkability check and shorten the target when the line is blocked (or stop / slide along the wall). Related to the pathfinder item above.
Esc closes an open dialog first
Asked 2026-10-15: with any dialog open (quest, trader, inventory, ...), Esc
should close that dialog instead of opening the game menu (ESC menu,
cUI_EscMenu). Esc is handled in the engine / UI manager hotkeys
(docs/wasd.md: engine 0x618130, UI manager 0x757120).
In-DLL smoke tests (later)
A test mode inside the mod DLL, started by an ini setting or command-line flag,
so builds can be checked without play-testing and without driving the real
mouse/keyboard like tools/autotest-load.ps1:
- load a fixed test save;
- play scripted input through the existing hooks (keys, casting arts, weapon set switches, save + reload);
- take back-buffer screenshots at checkpoints and log checks to
sacred_re.log(aura effect present after reload, slot 6-7 inventories survive a save, ...); - exit the game.
Better pathfinder (mouse clicks and monsters)
Replace the game's pathfinding with a more reliable and efficient one, for click-to-move and for monster AI. What we know so far:
- Walk orders are
cEvent_creaturecommand 4 with a ground target (+0x18/+0x1c), sent throughcEngine::SendCreatureOrder(0x6170d0), which snaps the target to a walkable point (0x616b70) and hands it tocCreature::ReceiveOrder(0x52e400, vf18, ~6400 decompiled lines). - Far targets (~2000 world units) are rejected or followed badly.
- Still to map: the path search itself, the sector/tile collision data it reads, and how monster AI issues its moves.
Key bindings moved for WASD movement (temporary)
W, A and S were game hotkeys. With WASD movement (src/mods/wasd.cpp) their
actions moved to other keys for now; choose final bindings (and update the
in-game texts/tooltips that name the old keys):
| Key | Action | Temporary key (sacred_re.ini) |
|---|---|---|
| W | potion kind 3 (cEngine::UseActionSlot, like Q/E/R/B/Space) |
game potion keys switched off; [keys] Potion1-5 (docs/options.md) |
| A | pick up items nearby (creature event 0x113) | Q ([keys] PickUp, 2026-10-17; was V) |
| S | save game window (UI_WND_SAVEGAME) |
K ([keys] SaveGame) |
| D | unbound | - |
Globally bound letters (engine 0x618130, UI manager 0x757120): A B C E F
H I L M N O P Q R S T W, Space, ^, digits. Individual windows may use more.
Potion stacks
Asked 2026-10-17 (after the potion counts on the bottom bar,
src/mods/potioncounts.cpp): potions of the same type (e.g. minor healing)
stack in one inventory cell, up to 20 per stack (a full stack starts a new
one). Drag, sell and drop move the whole stack, as with any other item. The
counts on the potion slots then add up the stacks. In progress, see
docs/item-stacks.md (open: sale price per stack, splitting on the ground).
Walking animation after loading (2026-10-17)
The hero sometimes plays a walking animation after a save game load while standing still. Not reproduced yet: a load log (hero mode, action, animation fields, orders) showed nothing unusual; right after a load the game itself sends one walk order (0x4) while the hero is idle. Measure again when it shows.