Files
sacred_k/docs/todo.md
T
khallaandClaude Opus 5.5 c6c5530709 Maps in widened views: TAB overlay in place, M map across the full width
- hud: shift SetViewport/Clear with moved windows (TAB overview map)
- megamap: view constants patched to the render width (clip, scroll limit,
  edge scrolling, centre, dark band, zoomed view and its markers); frame
  stretched to the screen edges, zoom controls and their click area centred
- hud: Anchor::Screen windows are drawn and clicked unshifted but still own
  the event scope
- autotest waits for log markers instead of fixed delays (~18 s per run)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 01:12:34 +02:00

128 lines
5.9 KiB
Markdown

# 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 and are not covered
yet; check them if their visuals go missing 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) and
`g_combatMoveDefs` (`0x94ddb0`, 95 x 0x78): id, icon name, launch type,
usable mounted, ... (`tools/arttable.mjs` dumps them; most fields unnamed);
- map the remaining fields (regeneration group, lasting effect / aura,
duration, ...) and expose them as an `ArtInfo` lookup in `src/game/`;
- where the game itself hardcodes ids (e.g. the arts that always count as
magic in `cCreatureArts::AddGroupRegen`, the "already active" switch in
`IsValidArtTarget`), 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`:
1. load a fixed test save;
2. play scripted input through the existing hooks (keys, casting arts, weapon
set switches, save + reload);
3. 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, ...);
4. 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_creature` command 4 with a ground target (+0x18/+0x1c),
sent through `cEngine::SendCreatureOrder` (`0x6170d0`), which snaps the
target to a walkable point (`0x616b70`) and hands it to
`cCreature::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 | action slot 3 (`cEngine::UseActionSlot`, like Q/E/R/B/Space) | G (`[keys] ActionSlot3`) |
| A | pick up items nearby (creature event 0x113) | V (`[keys] PickUp`) |
| 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.