fix(spells): load complete retail DAT catalog

Replace the incomplete 3,956-row production CSV with one immutable projection of all 6,266 records in portal.dat. Preserve retail formula targeting, shared Spellbook/MagicRuntime metadata ownership, and fail startup when the required SpellTable is absent.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-15 21:17:13 +02:00
parent 09612f9981
commit 0eab7497c1
19 changed files with 633 additions and 114 deletions

View file

@ -1,29 +1,29 @@
# Game-data tables
Reference data tables loaded by acdream at runtime or used as research
input. Tracked in git so subagents + post-compaction sessions inherit
them without round-tripping through `refs/`.
Reference data tables used as research input and focused test fixtures.
Tracked in git so later sessions inherit them without round-tripping through
external repositories. Production spell metadata comes directly from the
installed retail DATs through `DatCollection`.
## Contents
| File | Loader | Notes |
|------|--------|-------|
| `spells.csv` | `src/AcDream.Core/Spells/SpellTable.cs` (load via `SpellTable.LoadFromCsv` at `GameWindow.OnLoad`). Copied to `bin/<config>/net10.0/data/spells.csv` via `<None Update>` in `AcDream.App.csproj`. | 3,956 retail spells × 35 columns. Key fields: `Spell ID`, `Name`, `School`, `Family` (buff stacking bucket — issue #6 needs this), `IconId [Hex]`, `Mana`, `Duration`, `IsDebuff`, `IsFellowship`, `Description`. |
| `spells.csv` | Legacy `SpellTable.LoadFromCsv` test/tool input only; not copied to production output. | Historical 3,956-row server-side export. The installed end-of-retail SpellTable contains 6,266 records, so this file must never be treated as a complete client catalog. |
## Format note — `spells.csv`
RFC 4180 with header row. The `Description` column is quoted with embedded
commas; everything else is plain. See `SpellTable` parser for the canonical
column ordering.
commas; everything else is plain. See `SpellTable` for the legacy parser.
## Provenance
`spells.csv` came from a server-side database export of the retail
spell table (likely a community-shared dump from circa 2017-2019 with
~99% field coverage). Spell IDs match the wire opcodes used by ACE.
The `Family` column is the AC retail spell-family enum used for buff
stacking.
`spells.csv` came from a server-side database export of the retail spell table,
likely a community-shared dump from circa 20172019. Spell IDs match the wire
values used by ACE, but the file omits 2,310 records present in the installed
end-of-retail DAT and some exported target masks differ from the retail
client's formula-derived result.
If the file ever needs updating from a fresher source, replace
`spells.csv` in this directory; the `<None Update PreserveNewest>`
copy will sync it to bin output on next build.
Do not update production behavior by replacing this file. The canonical
runtime projection and its retail references are documented in
`docs/research/2026-07-15-retail-spell-catalog-pseudocode.md`.