docs: reconcile project state and refresh README
This commit is contained in:
parent
97a095d628
commit
f6275f4501
12 changed files with 432 additions and 295 deletions
26
AGENTS.md
26
AGENTS.md
|
|
@ -116,24 +116,24 @@ user-gated. Deterministic world-lifecycle automation protects fresh login,
|
|||
outdoor/world-edge/dungeon travel, same-location revisit, exact graceful
|
||||
disconnect, and uncapped fresh-process reconnect with JSON/PNG artifacts.
|
||||
Release builds; the current performance-program checkpoint passes
|
||||
3,731 App tests / 3 skips and 8,708 complete-solution tests / 5 skips.
|
||||
3,763 App tests / 3 skips and 8,826 complete-solution tests / 5 skips.
|
||||
|
||||
**M4 feature work order (paused while the authorized performance program
|
||||
executes):** the six-slice pre-M4 world-interaction completion
|
||||
**M4 feature work order (active after the Modern Runtime closeout and Slice L
|
||||
deferral):** the six-slice pre-M4 world-interaction completion
|
||||
program in `docs/plans/2026-07-23-world-interaction-completion.md`: favorite
|
||||
spell-bar overflow, status Use/Assess, assessment information,
|
||||
equipped-child picking, vendor browsing, and authoritative vendor
|
||||
transactions. Slices 1 and 2 plus the adjacent shared-cooldown presentation are
|
||||
user-accepted. Slice 3's first connected gate exposed and corrected the
|
||||
monster-response flag mismatch, non-retail shared-panel mounting, and missing
|
||||
inscription transaction. The creature and common-item report corrections are
|
||||
user-accepted. Favorite-spell press-time selection and right-click local
|
||||
examination are implemented; the current visual gate is its corrected modern
|
||||
scarab/prismatic formula, DAT component icons, and authored 310 x 400 extent.
|
||||
transactions. Slices 1–3 plus the adjacent shared-cooldown presentation are
|
||||
user-accepted, including exact response flags, independent examination
|
||||
window, inscription transaction, complete creature/item/spell reports,
|
||||
favorite-spell press/right-click behavior, modern scarab/prismatic formula,
|
||||
DAT component icons, foreground stacking, and authored 310 x 400 extent.
|
||||
Resume at Slice 4 equipped-child world picking, then vendor browse and
|
||||
authoritative transactions.
|
||||
|
||||
**Current active engineering work:** complete Slices D–L of
|
||||
`docs/plans/2026-07-24-modern-runtime-architecture.md` under the recorded
|
||||
approval interlocks. Slices A–H completed by 2026-07-25.
|
||||
**Modern Runtime/performance status:** Slices A–K of
|
||||
`docs/plans/2026-07-24-modern-runtime-architecture.md` are complete. Slice L is
|
||||
parked at its L1 implementation checkpoint by user direction on 2026-07-27.
|
||||
Production world-mesh streaming now consumes the validated machine-local
|
||||
`acdream.pak` through `IPreparedAssetSource`; live DAT extraction remains
|
||||
explicit bake/equivalence/UI-Studio tooling. Capped, uncapped, dense-Arwic,
|
||||
|
|
|
|||
26
CLAUDE.md
26
CLAUDE.md
|
|
@ -114,24 +114,24 @@ user-gated. Deterministic world-lifecycle automation protects fresh login,
|
|||
outdoor/world-edge/dungeon travel, same-location revisit, exact graceful
|
||||
disconnect, and uncapped fresh-process reconnect with JSON/PNG artifacts.
|
||||
Release builds; the current performance-program checkpoint passes
|
||||
3,731 App tests / 3 skips and 8,708 complete-solution tests / 5 skips.
|
||||
3,763 App tests / 3 skips and 8,826 complete-solution tests / 5 skips.
|
||||
|
||||
**M4 feature work order (paused while the authorized performance program
|
||||
executes):** the six-slice pre-M4 world-interaction completion
|
||||
**M4 feature work order (active after the Modern Runtime closeout and Slice L
|
||||
deferral):** the six-slice pre-M4 world-interaction completion
|
||||
program in `docs/plans/2026-07-23-world-interaction-completion.md`: favorite
|
||||
spell-bar overflow, status Use/Assess, assessment information,
|
||||
equipped-child picking, vendor browsing, and authoritative vendor
|
||||
transactions. Slices 1 and 2 plus the adjacent shared-cooldown presentation are
|
||||
user-accepted. Slice 3's first connected gate exposed and corrected the
|
||||
monster-response flag mismatch, non-retail shared-panel mounting, and missing
|
||||
inscription transaction. The creature and common-item report corrections are
|
||||
user-accepted. Favorite-spell press-time selection and right-click local
|
||||
examination are implemented; the current visual gate is its corrected modern
|
||||
scarab/prismatic formula, DAT component icons, and authored 310 x 400 extent.
|
||||
transactions. Slices 1–3 plus the adjacent shared-cooldown presentation are
|
||||
user-accepted, including exact response flags, independent examination
|
||||
window, inscription transaction, complete creature/item/spell reports,
|
||||
favorite-spell press/right-click behavior, modern scarab/prismatic formula,
|
||||
DAT component icons, foreground stacking, and authored 310 x 400 extent.
|
||||
Resume at Slice 4 equipped-child world picking, then vendor browse and
|
||||
authoritative transactions.
|
||||
|
||||
**Current active engineering work:** complete Slices D–L of
|
||||
`docs/plans/2026-07-24-modern-runtime-architecture.md` under the recorded
|
||||
approval interlocks. Slices A–H completed by 2026-07-25.
|
||||
**Modern Runtime/performance status:** Slices A–K of
|
||||
`docs/plans/2026-07-24-modern-runtime-architecture.md` are complete. Slice L is
|
||||
parked at its L1 implementation checkpoint by user direction on 2026-07-27.
|
||||
Production world-mesh streaming now consumes the validated machine-local
|
||||
`acdream.pak` through `IPreparedAssetSource`; live DAT extraction remains
|
||||
explicit bake/equivalence/UI-Studio tooling. Capped, uncapped, dense-Arwic,
|
||||
|
|
|
|||
385
README.md
385
README.md
|
|
@ -2,195 +2,294 @@
|
|||
|
||||
A modern open-source C# / .NET 10 Asheron's Call client.
|
||||
|
||||
Faithful port of the retail client's behaviour to Silk.NET with a modern,
|
||||
plugin-friendly architecture. The code is modern; the behaviour is retail.
|
||||
acdream ports the observable behaviour of the September 2013 retail client to
|
||||
Silk.NET and a modern, plugin-friendly architecture. The code is modern; the
|
||||
behaviour is retail.
|
||||
|
||||
**Status:** playable pre-alpha; M3 ("Cast a spell") is active. The connected
|
||||
client supports the complete M2 combat/loot/inventory loop plus retained
|
||||
spellbook, component-book, favorite-spell, enchantment, portal-space, radar,
|
||||
chat, character, and inventory UI. Current work is verification and retail
|
||||
conformance, not a first-playable bring-up.
|
||||
**Status:** playable pre-alpha. M3, “Cast a spell,” landed on 2026-07-21 and
|
||||
M4, “Live in the world,” is active. The graphical client supports the connected
|
||||
combat, magic, movement, portal, inventory, loot, and retained-UI loops used by
|
||||
the current test characters. The presentation-independent `GameRuntime` and
|
||||
the Linux/Windows multi-session headless host are complete. Native Linux
|
||||
graphics are intentionally parked at the L1 capability checkpoint; Windows is
|
||||
the currently validated graphical platform.
|
||||
|
||||
Start at the [documentation map](docs/README.md) for the current milestone,
|
||||
roadmap, tactical issues, architecture, retail-divergence register, research,
|
||||
and durable memory.
|
||||
The [documentation map](docs/README.md) is the entry point for current
|
||||
milestones, roadmap state, architecture, issues, retail divergences, research,
|
||||
and durable project memory.
|
||||
|
||||
## Stack
|
||||
## Technology
|
||||
|
||||
- **Language:** C# .NET 10
|
||||
- **Graphics:** [Silk.NET](https://github.com/dotnet/Silk.NET) (OpenGL 4.3
|
||||
context; `GL_ARB_bindless_texture` and `GL_ARB_shader_draw_parameters` are
|
||||
mandatory)
|
||||
- **Audio:** OpenAL via Silk.NET
|
||||
- **Dat parsing:** [Chorizite.DatReaderWriter](https://github.com/Chorizite/DatReaderWriter)
|
||||
- **Networking:** Custom UDP + ISAAC cipher + game-message layer, wire-compatible
|
||||
with ACEmulator server
|
||||
- **Runtime:** C# and .NET 10
|
||||
- **Graphics:** [Silk.NET](https://github.com/dotnet/Silk.NET), OpenGL 4.3
|
||||
core, bindless textures, shader draw parameters, SSBOs, and multi-draw
|
||||
indirect
|
||||
- **Audio:** OpenAL through Silk.NET
|
||||
- **Content:** retail DAT files plus a machine-local, memory-mapped
|
||||
`acdream.pak` produced by `AcDream.Bake`
|
||||
- **Networking:** custom UDP, ISAAC cipher, and game-message layers compatible
|
||||
with ACEmulator
|
||||
- **UI:** retained retail gameplay UI plus opt-in ImGui developer tools
|
||||
- **Automation:** the same presentation-independent `GameRuntime` is hosted by
|
||||
both the graphical client and `AcDream.Headless`
|
||||
|
||||
## What works today
|
||||
The modern renderer is mandatory. There is no legacy renderer fallback.
|
||||
Startup reports an actionable error if the required OpenGL capabilities are
|
||||
missing.
|
||||
|
||||
- ACE login, character selection, world entry, chat, client commands, and
|
||||
graceful logout.
|
||||
- Outdoor, building, cellar, and dungeon streaming with portal-space travel,
|
||||
terrain/scenery/EnvCell rendering, collision, lighting, sky, fog, audio, and
|
||||
day/night presentation.
|
||||
- Local and observed player/NPC/monster movement, animation, selection, radar,
|
||||
combat stances, melee and missile presentation, death, corpses, chests, and
|
||||
looting.
|
||||
- Inventory bags, stack splitting, paperdoll/equipment, weapon switching,
|
||||
quick bars, item use, giving items to NPCs, and server-authoritative item
|
||||
movement.
|
||||
- Retained retail-style gameplay UI for vitals, chat, toolbar, inventory,
|
||||
character/skills, spellbook/components, helpful/harmful effects, combat and
|
||||
spell bars, radar/compass, indicator pages, and confirmation dialogs.
|
||||
- Spell catalog, learned/favorite spells, component preflight, connected casts,
|
||||
enchantments, DAT-driven missiles/effects, recall, Hidden/UnHide, and portal
|
||||
materialization presentation.
|
||||
- Plugin host, shared input/command abstractions, and permanent ImGui developer
|
||||
tools behind `ACDREAM_DEVTOOLS=1`.
|
||||
## What works
|
||||
|
||||
## Active gaps
|
||||
- ACE login, character selection, world entry, chat, client commands,
|
||||
reconnect, and graceful logout.
|
||||
- Outdoor, building, cellar, and dungeon streaming with prepared terrain,
|
||||
scenery, buildings, EnvCells, collision, portal visibility, sky, fog,
|
||||
lighting, audio, and day/night presentation.
|
||||
- Local and observed movement, animation, jumping, selection, radar, combat
|
||||
stances, melee, bows, crossbows, spell projectiles, death, corpses, chests,
|
||||
and looting.
|
||||
- Inventory bags, stable server ordering, stack splitting, ground drops,
|
||||
paperdoll equipment, weapon switching, quick bars, item use, cooldowns, and
|
||||
giving items to NPCs.
|
||||
- Retail-style retained UI for vitals, chat, toolbar, inventory, character,
|
||||
attributes, skills, spellbook, components, effects, combat/spell/jump bars,
|
||||
radar/compass, dialogs, external containers, and assessment.
|
||||
- Complete end-of-retail spell catalog, learned and favorite spells,
|
||||
component preflight, connected casts, enchantments, DAT-driven projectiles
|
||||
and effects, recall, portal-space travel, Hidden/UnHide, and remote
|
||||
materialization.
|
||||
- One presentation-independent runtime owner for session, entities, objects,
|
||||
inventory, character state, selection, interactions, combat, magic,
|
||||
movement, physics, projectiles, world environment, and portal transit.
|
||||
- A no-window Windows/Linux host with deterministic bot commands/events,
|
||||
shared immutable content, multi-session scheduling, isolation, reconnect,
|
||||
resource telemetry, and tested 1/5/10/30-session ownership.
|
||||
- Plugin loading, shared command/input abstractions, retained markup panels,
|
||||
and permanent ImGui developer tools behind `ACDREAM_DEVTOOLS=1`.
|
||||
|
||||
- R6's complete object-frame update path still needs the next local visual
|
||||
comparison; the final M3 gate is a two-client portal-out/materialization
|
||||
observer comparison.
|
||||
- Issue `#225` still needs the lifestone/particle alpha-order visual check,
|
||||
although its connected lifetime/performance gates pass.
|
||||
- Narrow behavior debt remains in issue `#153` (an unstreamed far-teleport
|
||||
edge case), issue `#116` (slide feel), and registered TS-50/TS-51 effect
|
||||
timing.
|
||||
- Many later retail systems remain roadmap work: advanced social/vendor/trade/
|
||||
crafting UI, full weather/lightning parity, deeper combat/stat systems,
|
||||
graphical Linux, and a true headless multi-session bot host.
|
||||
## Current boundaries
|
||||
|
||||
See [docs/README.md](docs/README.md) for document authority and current links.
|
||||
- The active M4 prelude is
|
||||
[world interaction completion](docs/plans/2026-07-23-world-interaction-completion.md).
|
||||
Slices 1–3, including assessment and its final formula/icon/layout
|
||||
correction, are user-accepted. Equipped-child picking and vendor
|
||||
browse/buy/sell are the next uncompleted slices.
|
||||
- Issue `#225` retains the lifestone/particle shared-alpha visual comparison.
|
||||
Its connected lifetime and performance routes already pass.
|
||||
- Narrow carried behaviour debt includes issue `#153` (an unstreamed
|
||||
far-teleport edge), issue `#116` (slide feel), issue `#235` (30 Hz capped/RDP
|
||||
jump presentation), and the live temporary-stopgap rows in the
|
||||
[retail divergence register](docs/architecture/retail-divergence-register.md).
|
||||
- Native Linux graphics are deferred. L0 portability and L1 backend/capability
|
||||
reporting are implemented; WSLg reaches the GPU through Mesa D3D12 but does
|
||||
not expose mandatory `GL_ARB_bindless_texture`. Resume with a supported
|
||||
physical Linux AMD/NVIDIA driver before beginning later Slice L work.
|
||||
- Advanced vendor/trade/crafting/social surfaces and larger M4 quest,
|
||||
character-creation, and emote bodies remain roadmap work.
|
||||
|
||||
## Building + running
|
||||
## Prerequisites
|
||||
|
||||
**Requires:**
|
||||
- .NET 10 SDK
|
||||
- A retail Asheron's Call dat directory (Turbine/Microsoft property —
|
||||
supply your own). Contains `client_portal.dat`, `client_cell_1.dat`,
|
||||
`client_highres.dat`, `client_local_English.dat`.
|
||||
- A running ACE (ACEmulator) server on `127.0.0.1:9000` (or override
|
||||
via env var)
|
||||
- Your own retail Asheron's Call DAT directory containing:
|
||||
- `client_portal.dat`
|
||||
- `client_cell_1.dat`
|
||||
- `client_highres.dat`
|
||||
- `client_local_English.dat`
|
||||
- A machine-local `acdream.pak` built from those DATs
|
||||
- A running ACE server for connected play; the examples use
|
||||
`127.0.0.1:9000`
|
||||
- For the graphical client, a driver exposing the mandatory modern OpenGL
|
||||
capabilities
|
||||
|
||||
**Launch (PowerShell on Windows — bash has trouble with the apostrophe
|
||||
in "Asheron's Call"):**
|
||||
The project does not distribute Microsoft/Turbine DAT files or derived
|
||||
prepared packages.
|
||||
|
||||
## Build and test
|
||||
|
||||
```powershell
|
||||
$env:ACDREAM_DAT_DIR = "$env:USERPROFILE\Documents\Asheron's Call"
|
||||
dotnet restore AcDream.slnx
|
||||
dotnet build AcDream.slnx -c Release
|
||||
dotnet test AcDream.slnx -c Release --no-build
|
||||
```
|
||||
|
||||
The current baseline is a successful Release build with **8,826 passing tests
|
||||
and 5 intentional skips**. The build currently reports 17 test-project
|
||||
warnings tracked by [`#228`](docs/ISSUES.md#228--clean-release-build-emits-17-test-project-warnings);
|
||||
production compilation has zero errors.
|
||||
|
||||
## Prepare content
|
||||
|
||||
Production rendering and collision use the validated prepared package rather
|
||||
than decoding world meshes on the frame path:
|
||||
|
||||
```powershell
|
||||
dotnet run --project src\AcDream.Bake\AcDream.Bake.csproj -c Release -- `
|
||||
--dat-dir "C:\Games\Asheron's Call" `
|
||||
--out "C:\Games\Asheron's Call\acdream.pak"
|
||||
```
|
||||
|
||||
A complete package is approximately 30 GB. It is machine-local and must not be
|
||||
committed. `ACDREAM_PAK_PATH` overrides the default
|
||||
`<DAT directory>\acdream.pak`.
|
||||
|
||||
## Run the graphical client
|
||||
|
||||
```powershell
|
||||
$env:ACDREAM_DAT_DIR = "C:\Games\Asheron's Call"
|
||||
$env:ACDREAM_PAK_PATH = "C:\Games\Asheron's Call\acdream.pak"
|
||||
$env:ACDREAM_LIVE = "1"
|
||||
$env:ACDREAM_TEST_HOST = "127.0.0.1"
|
||||
$env:ACDREAM_TEST_PORT = "9000"
|
||||
$env:ACDREAM_TEST_USER = "testaccount"
|
||||
$env:ACDREAM_TEST_PASS = "testpassword"
|
||||
$env:ACDREAM_RETAIL_UI = "1"
|
||||
$env:ACDREAM_RETAIL_UI = "1"
|
||||
|
||||
dotnet run --project src\AcDream.App\AcDream.App.csproj -c Release
|
||||
```
|
||||
|
||||
Offline CLI dat inspector (no server needed):
|
||||
The DAT directory can instead be supplied as the first positional argument:
|
||||
|
||||
```
|
||||
dotnet run --project src/AcDream.Cli -- "C:\path\to\Asheron's Call"
|
||||
```powershell
|
||||
dotnet run --project src\AcDream.App\AcDream.App.csproj -c Release -- `
|
||||
"C:\Games\Asheron's Call"
|
||||
```
|
||||
|
||||
## Diagnostic env vars
|
||||
## Run a headless session
|
||||
|
||||
`AcDream.Headless` loads no App, UI, OpenGL, native-window, or audio assembly.
|
||||
Create a version-1 configuration such as `bot.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"version": 1,
|
||||
"process": {
|
||||
"content": {
|
||||
"datDirectory": "/opt/ac",
|
||||
"preparedAssetPath": "/opt/ac/acdream.pak"
|
||||
}
|
||||
},
|
||||
"sessions": [
|
||||
{
|
||||
"id": "bot-1",
|
||||
"endpoint": { "host": "127.0.0.1", "port": 9000 },
|
||||
"account": "testaccount",
|
||||
"character": { "index": 0 },
|
||||
"policy": { "id": "idle" },
|
||||
"credential": {
|
||||
"provider": "environment",
|
||||
"reference": "ACDREAM_BOT_PASSWORD"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Then validate and run it:
|
||||
|
||||
```bash
|
||||
export ACDREAM_BOT_PASSWORD='testpassword'
|
||||
dotnet run --project src/AcDream.Headless/AcDream.Headless.csproj -c Release -- \
|
||||
validate --config bot.json
|
||||
dotnet run --project src/AcDream.Headless/AcDream.Headless.csproj -c Release -- \
|
||||
run --config bot.json
|
||||
```
|
||||
|
||||
For a single local session, `run` also accepts
|
||||
`--user <account> --password <password>`. Add uniquely identified session
|
||||
entries and credential references for a multi-session process. Available
|
||||
built-in policies are `idle`, `lifecycle-smoke`, `observer-movement`, and
|
||||
`portal-route-smoke`.
|
||||
|
||||
## Useful startup options
|
||||
|
||||
| Variable | Effect |
|
||||
|---|---|
|
||||
| `ACDREAM_DUMP_SKY=1` | Per-second dump of the interpolated `SkyKeyframe` values + per-SkyObject draw info + texture alpha histograms |
|
||||
| `ACDREAM_DUMP_MOTION=1` | Dump every inbound `UpdateMotion` + resulting `SetCycle` |
|
||||
| `ACDREAM_STREAM_RADIUS=N` | Legacy override for the configured two-tier streaming radii |
|
||||
| `ACDREAM_NO_AUDIO=1` | Suppress OpenAL init |
|
||||
| `ACDREAM_RETAIL_UI=1` | Enable retained retail gameplay UI |
|
||||
| `ACDREAM_DAT_DIR` | Retail DAT directory |
|
||||
| `ACDREAM_PAK_PATH` | Prepared package path; defaults to `<DAT dir>/acdream.pak` |
|
||||
| `ACDREAM_LIVE=1` | Enable connected mode |
|
||||
| `ACDREAM_TEST_HOST` / `ACDREAM_TEST_PORT` | ACE endpoint |
|
||||
| `ACDREAM_TEST_USER` / `ACDREAM_TEST_PASS` | Graphical-client credentials |
|
||||
| `ACDREAM_RETAIL_UI=1` | Enable the retained retail gameplay UI |
|
||||
| `ACDREAM_DEVTOOLS=1` | Enable ImGui developer tools |
|
||||
| `ACDREAM_UNCAPPED_RENDER=1` | Disable normal presentation pacing for throughput measurement |
|
||||
| `ACDREAM_DAY_GROUP=N` | Force a specific DayGroup index for A/B-testing weather presets |
|
||||
| `ACDREAM_RUN_SKILL=N` / `ACDREAM_JUMP_SKILL=N` | Client-side run/jump skill (default 200) |
|
||||
| `ACDREAM_NO_AUDIO=1` | Suppress OpenAL initialization |
|
||||
| `ACDREAM_UNCAPPED_RENDER=1` | Disable normal frame pacing for diagnostics |
|
||||
| `ACDREAM_DISPLAY_PROTOCOL=auto\|x11\|wayland` | Select the Linux GLFW backend |
|
||||
| `ACDREAM_DAY_GROUP=N` | Force a day-group index for weather/lighting comparisons |
|
||||
| `ACDREAM_STREAM_RADIUS=N` | Legacy override over configured streaming radii |
|
||||
| `ACDREAM_DUMP_SKY=1` | Dump sky interpolation and draw diagnostics |
|
||||
| `ACDREAM_DUMP_MOTION=1` | Dump inbound movement and motion-cycle decisions |
|
||||
|
||||
## Layout
|
||||
Additional diagnostic and budget controls are documented beside their typed
|
||||
owners and in the linked research plans; they are not stable user settings.
|
||||
|
||||
```
|
||||
## Repository layout
|
||||
|
||||
```text
|
||||
src/
|
||||
AcDream.App/ window, retained UI, rendering, audio, runtime wiring
|
||||
AcDream.Content/ GL-free DAT mesh/texture extraction
|
||||
AcDream.Core/ game state, physics, movement, world, gameplay logic
|
||||
AcDream.Core.Net/ UDP + ISAAC + game-message layer
|
||||
AcDream.UI.Abstractions/ shared UI/input ViewModels, commands, contracts
|
||||
AcDream.UI.ImGui/ permanent developer-tool renderer
|
||||
AcDream.Cli/ offline dat-inspector console app
|
||||
AcDream.Bake/ offline content bake tooling
|
||||
AcDream.Plugin.Abstractions/ plugin host interfaces
|
||||
AcDream.Plugins.Smoke/ example plugin
|
||||
AcDream.Runtime/ presentation-independent GameRuntime
|
||||
AcDream.App/ graphical host, retained UI, renderer, audio
|
||||
AcDream.Headless/ Windows/Linux no-window multi-session host
|
||||
AcDream.Core/ retail gameplay, movement, physics, world logic
|
||||
AcDream.Core.Net/ UDP, ISAAC, protocol and message routing
|
||||
AcDream.Content/ GL-free DAT and prepared-package content
|
||||
AcDream.Bake/ offline acdream.pak builder
|
||||
AcDream.Cli/ offline DAT inspector
|
||||
AcDream.UI.Abstractions/ shared UI/input models and contracts
|
||||
AcDream.UI.ImGui/ developer-tool presentation
|
||||
AcDream.Plugin.Abstractions/ BCL-only plugin contracts
|
||||
AcDream.Plugins.Smoke/ example plugin
|
||||
|
||||
tests/
|
||||
AcDream.*.Tests/ layer-matched xUnit projects (6,452 passing,
|
||||
5 intentional skips at the 2026-07-20 baseline)
|
||||
|
||||
tools/
|
||||
RetailTimeProbe/ Win32 P/Invoke ReadProcessMemory probe of
|
||||
the live retail acclient.exe — dumps
|
||||
TimeOfDay + sky-lighting globals so we
|
||||
can compare against acdream's state
|
||||
SkyObjectInspect/ dat-inspector for Region sky objects
|
||||
|
||||
references/ vendored read-only reference code — ACE,
|
||||
ACViewer, WorldBuilder, holtburger,
|
||||
AC2D, Chorizite, DatReaderWriter.
|
||||
Gitignored.
|
||||
AcDream.*.Tests/ layer-matched xUnit projects
|
||||
|
||||
docs/
|
||||
README.md documentation map + authority order
|
||||
architecture/ architecture, structure, divergence, WB inventory
|
||||
plans/ phase roadmaps + per-phase specs
|
||||
research/ decompile-derived research, per-phase
|
||||
findings, deep-dive agent reports
|
||||
audit/ phase-completion audits
|
||||
README.md documentation authority and current map
|
||||
architecture/ ownership, structure, divergence, WB inventory
|
||||
plans/ milestone, roadmap, and execution plans
|
||||
research/ retail pseudocode, traces, fixtures, evidence
|
||||
audit/ completion and conformance audits
|
||||
|
||||
memory/ durable engineering references
|
||||
references/ gitignored external reference repositories
|
||||
```
|
||||
|
||||
## Development workflow
|
||||
|
||||
All AC-specific behaviour is ported from the named retail client oracle
|
||||
(`docs/research/named-retail/`). The workflow is:
|
||||
All AC-specific behaviour starts from the named retail oracle in
|
||||
`docs/research/named-retail/`:
|
||||
|
||||
1. **Grep named retail first.** Find the matching `class::method` in the
|
||||
Sept 2013 named pseudo-C and headers.
|
||||
2. **Decompile only as fallback.** Use the older Ghidra chunks when the named
|
||||
oracle lacks the function.
|
||||
3. **Cross-reference.** Check against ACE's C# port and ACViewer /
|
||||
WorldBuilder.
|
||||
4. **Write pseudocode.** Translate C to readable pseudocode first.
|
||||
5. **Port faithfully.** Translate line-by-line, preserving variable
|
||||
names and control flow.
|
||||
6. **Conformance test.** Add tests using golden values from retail.
|
||||
7. **Integrate surgically.** Minimise churn in the surrounding pipeline.
|
||||
1. Search the named retail pseudo-C and headers by `class::method`.
|
||||
2. Use the older Ghidra chunks only when the named oracle is insufficient.
|
||||
3. Cross-reference ACE and the relevant client/viewer implementation.
|
||||
4. Record readable pseudocode and exact constants/order.
|
||||
5. Port the retail mechanism into the correct modern owner.
|
||||
6. Add conformance, lifecycle, and failure-boundary tests.
|
||||
7. Run the automated gate and the appropriate connected or visual gate.
|
||||
8. Update architecture, roadmap, divergences, and durable memory with the
|
||||
same change.
|
||||
|
||||
Guessing at AC-specific algorithms is explicitly forbidden — see
|
||||
`CLAUDE.md` for the full workflow rationale and the list of failure
|
||||
modes we've paid for in the past.
|
||||
Guessing at AC-specific algorithms is forbidden. See
|
||||
[AGENTS.md](AGENTS.md), [CLAUDE.md](CLAUDE.md), and the
|
||||
[architecture guide](docs/architecture/acdream-architecture.md) for the full
|
||||
rules.
|
||||
|
||||
## Reference repos
|
||||
## Reference projects
|
||||
|
||||
We cross-reference six external projects for retail behavior:
|
||||
- **ACE / ACEmulator:** authoritative server and protocol behaviour
|
||||
- **ACViewer:** character appearance and DAT presentation cross-check
|
||||
- **WorldBuilder:** extracted Silk.NET DAT/rendering foundation
|
||||
- **Chorizite.ACProtocol:** clean-room protocol reference
|
||||
- **holtburger:** broad non-retail client behaviour reference
|
||||
- **AC2D:** terrain and movement-packet cross-checks
|
||||
|
||||
- **ACE** (ACEmulator) — authoritative server-side protocol
|
||||
- **ACViewer** — MonoGame dat viewer; good for character appearance
|
||||
- **WorldBuilder** — Silk.NET dat editor; matches our stack
|
||||
- **Chorizite.ACProtocol** — clean-room C# protocol library
|
||||
- **holtburger** — most complete non-retail client; Rust TUI, full
|
||||
client-side behaviour
|
||||
- **AC2D** — C++ AC-client emulator; has the real terrain split
|
||||
formula and 0xF61C movement packet format
|
||||
The retail binary/decomp remains the behavioural oracle when references
|
||||
disagree.
|
||||
|
||||
See `CLAUDE.md` for which reference is authoritative for which domain.
|
||||
## Licence and game assets
|
||||
|
||||
## Licence
|
||||
The acdream source has not yet been assigned a top-level licence and is not
|
||||
ready for public redistribution. External reference code retains its own
|
||||
licence.
|
||||
|
||||
Not yet chosen. All external reference code is vendored under its own
|
||||
licence; see `references/*/LICENSE`. The acdream source code itself is
|
||||
unreleased — not yet distributed to the public. Once the licence
|
||||
choice is made it will go in a top-level `LICENSE` file.
|
||||
|
||||
The AC dat files and the game's intellectual property remain the
|
||||
property of Microsoft / Turbine. This project does not distribute any
|
||||
of those files or assets — you must supply your own retail install.
|
||||
Asheron's Call DAT files, art, names, and other game assets remain the property
|
||||
of Microsoft/Turbine. This repository does not distribute them; users must
|
||||
supply their own retail installation.
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ What does NOT go here:
|
|||
- Every session: scan OPEN issues at start; promote/close anything we touched during the session before ending.
|
||||
- Promoting to a Phase: mark as `DONE (promoted to Phase X)` + commit SHA where the Phase entry landed.
|
||||
|
||||
## Current queue — 2026-07-24
|
||||
## Current queue — 2026-07-27
|
||||
|
||||
- **Structural handoff:** all eight `GameWindow` decomposition slices and the
|
||||
automated closeout are complete. The 1,622-line native shell has typed
|
||||
|
|
@ -33,6 +33,10 @@ What does NOT go here:
|
|||
nine-stop soaks, and the Slice-7 framebuffer comparison pass. The user's
|
||||
connected visual matrix passed 2026-07-23, so the campaign is complete in
|
||||
[`docs/architecture/code-structure.md`](architecture/code-structure.md).
|
||||
- **Active M4 prelude:** resume
|
||||
[`plans/2026-07-23-world-interaction-completion.md`](plans/2026-07-23-world-interaction-completion.md).
|
||||
Slices 1–3, including the complete assessment surface, are user-accepted.
|
||||
Equipped-child picking and vendor browse/transactions remain Slices 4–6.
|
||||
- **Separate rendering gate:** `#225`, lifestone/particle alpha ordering. Its
|
||||
connected performance, lifetime, and unattended portal routes pass.
|
||||
- **Carried behavior debt:** `#153` far-teleport unstreamed-edge arrival and
|
||||
|
|
@ -44,35 +48,20 @@ What does NOT go here:
|
|||
smooth and physics, collision, and wire state remain correct.
|
||||
- **Build hygiene:** `#228` records 17 clean-Release test-project warnings;
|
||||
production compilation and all tests pass.
|
||||
- **Performance side track:** Slices A–E are complete. Typed
|
||||
completion admission, immediate generation-scoped old-world quiescence, and
|
||||
budgeted full-window/recenter retirement are live. Publication now advances
|
||||
from retained render/physics/static/building/EnvCell cursors without replay.
|
||||
The canonical reveal generation now owns the destination reservation across
|
||||
every typed budget dimension; incomplete worlds remain in portal space with
|
||||
retail's centered wait cue. E6 deterministic/resource suites and all three
|
||||
physical-local connected routes pass with zero stranded work/resource
|
||||
backlog. Slices F–L, including the former F/G and J gates, were explicitly
|
||||
approved 2026-07-24. Slice F now executes from the pre-runtime rollback
|
||||
anchor `e7d9d6fa`; its ownership, shadow-scene, cutover, and acceptance
|
||||
contract is
|
||||
[`plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md`](plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md).
|
||||
Evidence:
|
||||
[`research/2026-07-24-slice-e-cost-budgeted-streaming-report.md`](research/2026-07-24-slice-e-cost-budgeted-streaming-report.md).
|
||||
- **Modern Runtime execution:** Slices F–I are complete. Slice I removed
|
||||
production parsed collision graphs after exact flat differential and user
|
||||
collision acceptance; 8,413 Release tests / 5 skips and both exact-binary
|
||||
connected routes pass with `0/0/0` graph residency. J0's enforced
|
||||
presentation-independent project boundary and J1's borrowed
|
||||
view/command/event/lifecycle contract are live. J2's canonical
|
||||
session/transport lifetime and ordered inbound route are complete at
|
||||
`75930787`; J3 canonical entity/object lifetime and J4 gameplay-state
|
||||
ownership are complete through `89e6b207`. J5.1 canonical selection,
|
||||
combat, and target-mode ownership is complete at `b298f99f`; J5.2
|
||||
interaction-transaction ownership is complete at `f5f7b417`, with 8,561
|
||||
Release tests / 5 skips and the exact connected gate green. J5.3
|
||||
combat/magic-intent ownership is active from
|
||||
[`plans/2026-07-25-modern-runtime-slice-j.md`](plans/2026-07-25-modern-runtime-slice-j.md).
|
||||
- **Modern Runtime/performance program:** Slices A–K are complete. Prepared
|
||||
world/collision packages, typed residency, bounded publication/retirement,
|
||||
retained render-scene deltas, flat-authoritative collision, and bounded
|
||||
frame/network owners are production paths. Slice J closed at `a9a822f2`
|
||||
with one presentation-independent `GameRuntime` shared by graphical and
|
||||
no-window hosts. Slice K closed through `776482da` with the Windows/Linux
|
||||
multi-session host, shared immutable content, deterministic bot API,
|
||||
1/5/10/30-session and two-hour simulated gates, connected portal/movement
|
||||
parity, resource ceilings, and graceful zero-debt teardown.
|
||||
- **Deferred Linux graphical track:** L0 completed at `66f114b2`; L1's backend
|
||||
selection/capability implementation checkpoint landed at `11501d52`.
|
||||
Native Windows passes and WSLg correctly rejects its missing mandatory
|
||||
bindless capability. Physical-Linux validation and L2–L6 are parked by user
|
||||
direction; resume at the supported AMD/NVIDIA L1 gate.
|
||||
|
||||
The [documentation map](README.md) defines how this tactical ledger relates to
|
||||
the milestone, roadmap, architecture, divergence register, research, and
|
||||
|
|
|
|||
|
|
@ -4,48 +4,48 @@ This page is the entry point for project documentation. It distinguishes
|
|||
current sources of truth from implementation history so an old plan or issue
|
||||
banner cannot silently override the current program state.
|
||||
|
||||
## Current snapshot — 2026-07-26
|
||||
## Current snapshot — 2026-07-27
|
||||
|
||||
- **Milestone state:** M3, “Cast a spell,” landed 2026-07-21. M4, “Live in the
|
||||
world,” is active.
|
||||
- **M4 gameplay program (paused while the authorized performance program
|
||||
executes):** the pre-M4 world-interaction completion program
|
||||
in
|
||||
[`plans/2026-07-23-world-interaction-completion.md`](plans/2026-07-23-world-interaction-completion.md).
|
||||
The eight-slice `GameWindow` decomposition and its connected visual matrix
|
||||
are complete.
|
||||
- **Current active engineering program:** Slices A–I and J0–J5 of
|
||||
[`plans/2026-07-24-modern-runtime-architecture.md`](plans/2026-07-24-modern-runtime-architecture.md)
|
||||
are complete. Production uses prepared world/collision packages, typed
|
||||
residence, retained render-scene/delta submission, bounded frame owners, and
|
||||
flat-authoritative collision without parsed-graph production residency.
|
||||
Runtime owns canonical session/transport, entity/object lifetime, J4
|
||||
gameplay state, selection/interaction transactions, and combat/magic intent.
|
||||
App materialized projections and retained widgets borrow exact Runtime
|
||||
identity and action owners. Runtime also owns the sole per-session physics,
|
||||
collision, body/host, remote/projectile simulation, and cell-commit graph.
|
||||
J5 closed at `cdee7a4b` with one combined simulation ledger, a
|
||||
Runtime-only movement/use/combat/cast/projectile host, 8,596 complete
|
||||
Release tests / 5 skips, and exact-binary lifecycle plus nine-stop gates.
|
||||
J6 world/portal/environment and projection-handshake ownership is active in
|
||||
[`plans/2026-07-25-modern-runtime-slice-j.md`](plans/2026-07-25-modern-runtime-slice-j.md).
|
||||
- **Completed gates:** R6 locomotion/collision/projectile/teleport/radar and
|
||||
the final two-client portal-out/materialization observer comparison (`#218`).
|
||||
- **Separate visual verification:** the shared-alpha lifestone/particle result
|
||||
in `#225`; its connected resource-lifetime and performance routes pass.
|
||||
- **Carried behavior debt:** `#153` (far teleport onto an unstreamed edge),
|
||||
`#116` (two narrowed slide-response cases), and divergence rows TS-50/TS-51.
|
||||
- **Active engineering track:** Slice J's presentation-independent runtime,
|
||||
composition root, shared generation reset, and no-window closeout are
|
||||
complete. Build the approved Linux/headless multi-session host in Slice K.
|
||||
K0 is complete and K1 is active. K0's exact rollback is
|
||||
`git revert aada8a37c1e933f9f0a3f41dc4f05615b01023bc`.
|
||||
- **Divergence audit:** 178 active rows — IA 17, AD 37, AP 85, TS 34,
|
||||
and UN 5 — plus the retained retired TS-37 history note.
|
||||
- **Latest automated baseline:** Release build succeeds; 8,708 tests pass and
|
||||
five are intentionally skipped. The exact J8 lifecycle/reconnect and
|
||||
canonical nine-stop gates match embedded binary/source commit, converge
|
||||
every backlog, and complete with graceful zero-code exits and zero failures.
|
||||
- **M4 gameplay program:** resume the pre-M4
|
||||
[world-interaction completion program](plans/2026-07-23-world-interaction-completion.md).
|
||||
Favorite-spell overflow, status Use/Assess, and the complete assessment
|
||||
surface are user-accepted. Equipped-child picking and vendor
|
||||
browse/transactions remain Slices 4–6.
|
||||
- **Structural/runtime state:** all eight `GameWindow` decomposition slices,
|
||||
Modern Runtime Slices A–J, and the connected visual/lifecycle gates are
|
||||
complete. `GameWindow` is a 1,622-line composition/callback shell.
|
||||
`AcDream.Runtime.GameRuntime` owns canonical session, entity/object,
|
||||
gameplay, movement, physics, projectile, environment, and portal state;
|
||||
graphical and no-window hosts borrow the same owner graph.
|
||||
- **Headless state:** Slice K is complete. `AcDream.Headless` is a
|
||||
presentation-free Windows/Linux host with deterministic commands/events,
|
||||
shared immutable content, multi-session isolation, reconnect, resource
|
||||
telemetry, and 1/5/10/30-session gates. The final two-account native-Linux
|
||||
soak completed ten minutes, logged out through ACE, and converged every
|
||||
ownership ledger.
|
||||
- **Linux graphical state:** Slice L0 and the L1 implementation checkpoint are
|
||||
complete at `66f114b2` and `11501d52`. Native Windows passes the active
|
||||
modern-GL/audio/window smoke. WSLg X11/Wayland correctly reject their
|
||||
missing `GL_ARB_bindless_texture`. Physical-Linux validation and L2–L6 are
|
||||
explicitly deferred; resume at the supported AMD/NVIDIA L1 gate.
|
||||
- **Completed gameplay gates:** R6 locomotion/collision/projectile/teleport/
|
||||
radar, two-client portal-out/materialization, indoor prepared collision,
|
||||
loot ordering, local/remote ground drops, and selection-marker lifetime.
|
||||
- **Separate visual verification:** issue `#225`, the shared-alpha
|
||||
lifestone/particle result; its connected resource-lifetime and performance
|
||||
routes pass.
|
||||
- **Carried behaviour debt:** issue `#153` (far teleport onto an unstreamed
|
||||
edge), `#116` (narrowed slide response), `#235` (capped/RDP jump cadence),
|
||||
and the active temporary-stopgap rows in the divergence register.
|
||||
- **Divergence audit:** 189 active rows — IA 18, AD 38, AP 91, TS 38, and
|
||||
UN 4 — plus retained struck/retired historical rows such as TS-37.
|
||||
- **Latest automated baseline:** the Release build succeeds with the 17
|
||||
test-project warnings tracked by issue `#228`; 8,826 tests pass and five are
|
||||
intentionally skipped. App passes 3,763 / 3 skips. The L1 Windows supported
|
||||
smoke and WSLg X11/Wayland negative-capability reports all end with zero
|
||||
window/GL/input/audio ownership.
|
||||
|
||||
## Sources of truth
|
||||
|
||||
|
|
|
|||
|
|
@ -480,7 +480,7 @@ useful ordering seam, but its ownership status is **partial**.
|
|||
| Landblock presentation | **Complete** | `LandblockBuildFactory` owns the captured-origin DAT transaction; concrete render/physics/DAT-static publishers and `LandblockPresentationPipeline` own typed-meter publication and exact retryable retirement. `StreamingController` owns stable destination/control/unload/Near/Far queues and destination reservation. CPU mesh-cache restaging requires an exact live owner. `StreamingOriginRecenterCoordinator` serializes old-window retirement with teleport/session origin lifetimes. `GameWindow` retains construction and one pipeline field only (`c79d0a49`, closeout `4a205a3e`; Slice E closeout `91e82c3c`). |
|
||||
| Render-frame orchestration | **Complete** | `RenderFrameOrchestrator` owns the GPU-flight, resource, world/PView/shared-alpha, private-presentation, diagnostics, screenshot, and recovery graph. `GameWindow.OnRender` takes one logical window-size snapshot and performs one immutable handoff (`9d7df1bf`). |
|
||||
| Unified `GameEntity` | **Slice J complete** | Canonical identity, retained-object lifetime, direct views, ordered entity/object deltas, gameplay state, action/combat/magic/movement/physics/remote/projectile simulation, world environment, reveal/transit truth, and host acknowledgement share failure-safe Runtime owners while exact graphical sidecars stay in App. One `GameRuntime` composes the graph. `RuntimeGenerationReset` is the sole retryable canonical-generation reset for graphical and no-window hosts; the deterministic direct host proves lifecycle, commands, portal, reconnect, GUID reuse, fault recovery, isolation, and terminal convergence without presentation assemblies (`a9a822f2`). |
|
||||
| Headless host | **Slice K0 complete; K1 active** | `AcDream.Headless` references only Runtime. Its strict CLI validator, dependency closure, loaded-assembly guard, and Windows/Ubuntu CI establish a production process that cannot acquire App, UI, GL, native-window, or audio ownership (`aada8a37`). |
|
||||
| Headless host | **Slice K complete** | `AcDream.Headless` references only Runtime and loads no App/UI/GL/window/audio assembly. Portable paths/config/credentials, deterministic command/event scheduling, shared immutable content, exact per-session identity, failure quarantine, reconnect, resource telemetry, 1/5/10/30-session isolation, two-hour simulated endurance, and the exact two-account native-Linux connected soak pass through `776482da`. |
|
||||
|
||||
### 4.3 Revised extraction sequence
|
||||
|
||||
|
|
@ -781,7 +781,7 @@ fresh-process nine-stop soaks and the connected lifecycle/reconnect route pass
|
|||
with graceful exits; deterministic framebuffer captures preserve accepted
|
||||
Slice 7 geometry, UI/paperdoll layering, private viewports, depth/alpha, and
|
||||
reveal. The clean solution build retains only the 17 test-project warnings
|
||||
tracked by #228, and all three final corrected-diff reviews are clean. Only the
|
||||
tracked by #228, and all three final corrected-diff reviews are clean. The
|
||||
user's connected visual matrix passed 2026-07-23, including first-login radar,
|
||||
movement/combat, shared retained panels, recall/portal presentation, and
|
||||
graceful reconnect.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Retail Divergence Register — 2026-06-12
|
||||
# Retail Divergence Register — current through 2026-07-27
|
||||
|
||||
**What this is.** The single auditable register of every known place acdream's
|
||||
runtime behavior can deviate from the retail client (Sept 2013 EoR build,
|
||||
|
|
@ -37,7 +37,7 @@ accepted-divergence entries (#96, #49, #50).
|
|||
|
||||
---
|
||||
|
||||
## 1. Intentional architecture (IA) — 17 rows
|
||||
## 1. Intentional architecture (IA) — 18 active rows
|
||||
|
||||
| # | Divergence | Where (file:line) | Why it is safe / justified | Risk if assumption breaks | Retail oracle |
|
||||
|---|---|---|---|---|---|
|
||||
|
|
|
|||
|
|
@ -66,7 +66,8 @@ disabled (IA-21), installs each icon through the shared retained
|
|||
`UIRegion::SetImage` seam so it keeps the authored foreground stack, and
|
||||
one-time migrates stale saved examination dimensions to the authored
|
||||
310 x 400 extent while preserving retail-style later resizing.
|
||||
Its connected visual gate is pending. Slice 3's first connected gate exposed
|
||||
The corrected formula/icons/foreground stack, authored extent, and complete
|
||||
item report were user-accepted on 2026-07-24. Slice 3's first connected gate exposed
|
||||
three deeper defects, now corrected: the response enum mislabeled ACE's
|
||||
creature bit `0x0100` and dropped monster packets while retaining the busy
|
||||
cursor; the imported 310 x 400 examination layout was incorrectly hosted as
|
||||
|
|
@ -78,7 +79,8 @@ transaction under retail ownership/authorship rules; those corrections are
|
|||
user-confirmed. The item view now follows the complete EoR formatter dispatch,
|
||||
including literal set/rating/tinkering prose, weapon/armor/magic/XP/
|
||||
activation/healer/rare branches, and installed-DAT material and creature
|
||||
names. Its connected item-report comparison is Slice 3's remaining gate.
|
||||
names. Slices 1–3 are complete; M4 resumes at Slice 4 equipped-child picking,
|
||||
followed by vendor browsing and authoritative transactions.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -753,7 +755,7 @@ behavior. Estimated 17–26 days focused work, 3–5 weeks calendar.
|
|||
- **Missile/portal VFX cell-less rule clarified 2026-07-16.** The Steps 0–5 statement that later plays drop while an existing owner is cell-less applies only to ordinary F754/F755/default playback. Hidden/UnHide is retail's internal exception: `CPhysicsObj::set_hidden` resolves the typed script and calls `play_script_internal`, queuing it until scheduler eligibility returns. This preserves the human table's purple portal materialization across asynchronous destination placement.
|
||||
- **✓ M2 local attack receive funnel (live-gated 2026-07-15).** Retail `ExecuteAttack` only sends the request; ACE chooses the concrete melee/missile action and returns it in a non-autonomous mt-0 `UpdateMotion`. The local branch now runs that state through the same constructor-defaulted `MoveToInterpretedState` funnel and 15-bit action-stamp gate as remotes, then applies sticky/long-jump tails. The old local-only direct `Commands[]` replay is deleted. Shared conversion lives in `InboundInterpretedMotionFactory`; research: `docs/research/2026-07-11-local-combat-motion-pseudocode.md`.
|
||||
- **✓ M2 basic retail combat bar (live-gated 2026-07-15).** Production mounts authored `gmCombatUI` LayoutDesc `0x21000073`, shows it only for Melee/Missile, and routes mouse plus keyboard through one `CombatAttackController`. Corrections include the authored wider centered dark-red child range (accepted IA-20), full-width left-to-right bright live attack-charge feedback, exact Speed-left/Power-right justification, silent control-only `AttackDone(ActionCancelled)`, target-frame Keep in View with manual orbit, and persistent corpse motion: the AP-80 velocity-only NPC adaptation can now replace only Ready/Walk/Run, never authoritative Dead/actions. `CombatTargetController` ports the selection-cleared AutoTarget consumer, so a selected creature's authoritative Dead motion clears it and selects the nearest eligible creature when enabled. The 2026-07-12 replacement-corpse correction unifies both multi-frame and static/reactive spawns behind retail's CreateObject lifecycle: apply the wire's Dead state while detached, then `MotionTableManager::HandleEnterWorld` strips Ready→Dead links before the first in-world tick; multiple corpses remaining fallen passed the live user gate that day. Follow-up #205 makes the toolbar read the final canonical selection after a reentrant Auto Target notice and restricts automatic candidates to hostile non-player monsters (intentional PK-edge divergence IA-19); that live gate also passed 2026-07-12. Research: `docs/research/2026-07-11-retail-combat-bar-pseudocode.md`, `docs/research/2026-07-11-combat-target-camera-pseudocode.md`, `docs/research/2026-07-12-death-and-auto-target-pseudocode.md`; AP-24/AP-95 retired, AP-80 narrowed, AP-110 narrowed, AP-112 records the remaining attack-start and exact trained-Recklessness seams.
|
||||
- **M3 cast lifecycle + retained magic UI implemented 2026-07-15; visual gates pending.** `SpellCastingController` ports retail's immediate targeted/untargeted request boundary, component preflight, target eligibility, movement stop, and shared UI-busy lifetime while leaving turn/cast/fizzle/impact outcomes authoritative to ACE. Formula preflight reads decrypted portal.dat formulas, the SCID↔WCID map, canonical account randomization, exact school-focus map, infused-magic properties, and scarab-only substitution. `MagicCatalog` now projects all 6,266 end-of-retail SpellTable records into the shared Core metadata table; the incomplete 3,956-row CSV is test/research-only and AP-17 is retired. Complete live enchantment packets preserve spell/layer identity, all StatMod fields, client-clock normalization, and exact purge buckets. Authored retained surfaces now include the Magic page of `gmCombatUI`, all eight favorite tabs, equipped caster endowment, `gmSpellbookUI`, `gmSpellComponentUI`, both `gmEffectsUI` windows, and the floating Helpful/Harmful effect indicators. The favorite bar now ports retail horizontal empty-cell padding, shared UIItem 1–9 shortcut overlays, and the Cast button's three independently reflowed DAT face segments. Spell rows resolve UIItem prototype `0x10000343`; the component page now instantiates LayoutDesc `0x21000033` category/component templates `0x10000466/67`, including localized headings, exact row textures and columns, owned/desired counts, selection, and the 0..5000 desired-value contract. The authored scrollbars, exact filters/display ordering, learned-spell drag, and shared server-authoritative delete dialog are connected. `RetailPanelUiController` ports the shared one-active-panel lifecycle so toolbar and indicator launchers converge on one owner. #L.2/#L.3 close and #L.4/AP-110 narrow. Research: `docs/research/2026-07-15-retail-magic-ui-and-casting-pseudocode.md`, `docs/research/2026-07-15-retail-spell-catalog-pseudocode.md`.
|
||||
- **M3 cast lifecycle + retained magic UI shipped and user-accepted 2026-07-21.** `SpellCastingController` ports retail's immediate targeted/untargeted request boundary, component preflight, target eligibility, movement stop, and shared UI-busy lifetime while leaving turn/cast/fizzle/impact outcomes authoritative to ACE. Formula preflight reads decrypted portal.dat formulas, the SCID↔WCID map, canonical account randomization, exact school-focus map, infused-magic properties, and scarab-only substitution. `MagicCatalog` now projects all 6,266 end-of-retail SpellTable records into the shared Core metadata table; the incomplete 3,956-row CSV is test/research-only and AP-17 is retired. Complete live enchantment packets preserve spell/layer identity, all StatMod fields, client-clock normalization, and exact purge buckets. Authored retained surfaces now include the Magic page of `gmCombatUI`, all eight favorite tabs, equipped caster endowment, `gmSpellbookUI`, `gmSpellComponentUI`, both `gmEffectsUI` windows, and the floating Helpful/Harmful effect indicators. The favorite bar now ports retail horizontal empty-cell padding, shared UIItem 1–9 shortcut overlays, and the Cast button's three independently reflowed DAT face segments. Spell rows resolve UIItem prototype `0x10000343`; the component page now instantiates LayoutDesc `0x21000033` category/component templates `0x10000466/67`, including localized headings, exact row textures and columns, owned/desired counts, selection, and the 0..5000 desired-value contract. The authored scrollbars, exact filters/display ordering, learned-spell drag, and shared server-authoritative delete dialog are connected. `RetailPanelUiController` ports the shared one-active-panel lifecycle so toolbar and indicator launchers converge on one owner. #L.2/#L.3 close and #L.4/AP-110 narrow. Research: `docs/research/2026-07-15-retail-magic-ui-and-casting-pseudocode.md`, `docs/research/2026-07-15-retail-spell-catalog-pseudocode.md`.
|
||||
- **M3 favorite-bar empty-state correction 2026-07-15; visual gate pending.** Shortcut-number arrays remain shared with the status toolbar, but the cell background is now resolved independently from the favorite ItemList's inherited `0x1000000E` cell prototype. LayoutDesc `0x21000010` selects prototype `0x10000341`, whose exact brown/gold `ItemSlot_Empty` surface is `0x06001A97`; the blue toolbar-style `0x060074CF` substitution is removed. The cross-layout resolver and controller presentation are pinned by live-DAT and retained-layout conformance tests.
|
||||
- **Retail client command families implemented 2026-07-13; corrective live gate pending.** One shared typed catalog now separates retail client actions from ACE administrator commands for both chat backends. Named-decomp ports cover recall/house/PK travel; age/birth; framerate, lock, version, location, corpse, and die confirmation; clear plus named/automatic UI layouts; AFK/consent; emotes; friends; squelch/filter/message types; and fill-components. App owns execution, Core owns authoritative friends/squelch state, Core.Net owns exact UIQueue/ControlQueue packets. Confirmation reuse now ports retail `DialogFactory` contexts, queue groups/priority, fresh DAT roots, property results, callbacks/close notices, and server abort handling; `/die`, gameplay request tuples, and guarded item-use prompts share its type-1 LayoutDesc `0x2100003C` presenter. The first live gate passed the family except for raw suicide-success code `0x004A` and the title-bar-only FPS presentation; the correction maps retail's text and mounts SmartBox element `0x10000047` with live two-decimal `FPS`/`DEG`. #L.6 is closed; TS-31/TS-47 are narrowed. Research: `docs/research/2026-07-13-retail-client-command-families-pseudocode.md`, `docs/research/2026-07-13-retail-dialog-factory-pseudocode.md`.
|
||||
- **✓ SHIPPED — Character window** (`LayoutDesc 0x2100002E`, `CharacterStatController`, 2026-06-26, same branch). **Visually user-confirmed 2026-06-26 — Attributes tab reads as retail.** Three tabs, header (name/heritage/PK), large-gold level number (dat font, `largeDatFont` 18px), "Total Experience (XP):" + "XP for next level:" captions, 9-row attribute list (icons + right-aligned values + Health/Stamina/Mana vitals), click-to-select (top/bottom selection bars + footer State-B "{Attr}: {value}" / "Experience To Raise: Infinity!" + affordability-gated raise triangles), centered footer. User noted "still needs some polish for later" — deferred to Issue #158.
|
||||
|
|
|
|||
|
|
@ -87,7 +87,8 @@ program: spell-bar overflow, status Use/Assess, assessment information,
|
|||
equipped-child picking, vendor browsing, and authoritative vendor
|
||||
transactions. This is deliberately using the extracted interaction owners and
|
||||
canonical shared main-panel host before quest/emote/character-creation bodies
|
||||
broaden the feature surface.
|
||||
broaden the feature surface. Slices 1–3 are user-accepted; resume at Slice 4
|
||||
equipped-child picking.
|
||||
|
||||
The separately authorized modern-runtime performance program has completed
|
||||
Slices A–D: corrected measurement, prepared-package bake/dedup, package-only
|
||||
|
|
@ -405,7 +406,8 @@ disables component enforcement (IA-21), installs each icon as its authored
|
|||
template root's own foreground image, and resets obsolete saved dimensions
|
||||
once to the authored 310 x 400 extent. The Release build with #228's 17
|
||||
tracked test warnings, 3,557 App tests / 3 skips, and 7,988 complete-solution
|
||||
tests / 5 skips pass; the connected visual gate is pending.
|
||||
tests / 5 skips pass. The corrected formula/icons/foreground stack and
|
||||
authored extent were user-accepted on 2026-07-24.
|
||||
Slice 3's first connected gate found and corrected the real remaining defects:
|
||||
ACE creature flag `0x0100` was mislabeled as a weapon profile and left the
|
||||
appraisal busy reference held, retail's examination UI had been mounted as a
|
||||
|
|
@ -415,8 +417,9 @@ display-only. Exact response flags, the independent
|
|||
edit transaction are now ported and user-confirmed. Its item path now follows
|
||||
the complete EoR formatter dispatch, including literal set/rating/tinkering
|
||||
prose, weapon/armor/magic/XP/activation/healer/rare branches, and installed-DAT
|
||||
material/creature names. The connected item-report comparison is Slice 3's
|
||||
remaining gate.
|
||||
material/creature names. The connected item-report comparison was Slice 3's
|
||||
final accepted gate. Slices 1–3 are complete; resume at Slice 4
|
||||
equipped-child picking.
|
||||
|
||||
Carried:
|
||||
#153 far-teleport residual, #116 slide-response, the remaining R6 ownership cleanup plus
|
||||
|
|
@ -1215,7 +1218,7 @@ from M3 = retail-equivalent gameplay loop for melee and casters.
|
|||
|
||||
---
|
||||
|
||||
### M4 — "Live in the world" — 🟡 NEXT (~6–10 weeks)
|
||||
### M4 — "Live in the world" — 🟡 ACTIVE (~6–10 weeks)
|
||||
|
||||
**Entry condition:** complete the behavior-preserving `GameWindow`
|
||||
decomposition campaign before adding H.3/H.4/L.1e feature bodies. This protects
|
||||
|
|
|
|||
|
|
@ -7,14 +7,15 @@ connected gate exposed an incorrect IdentifyResponse flag table, a non-retail
|
|||
shared-panel mount, and its missing inscription transaction. All three are
|
||||
corrected and live-confirmed. The creature-page follow-up now has retail's
|
||||
ordered stat rows and animated private preview. The follow-up item report and
|
||||
authored 310 x 400 layout correction are implemented; their connected visual
|
||||
gate is pending. Favorite-spell press-time selection and right-click local
|
||||
SpellPanel examination are implemented. The follow-up now maps
|
||||
authored 310 x 400 layout correction are implemented and user-accepted.
|
||||
Favorite-spell press-time selection and right-click local SpellPanel
|
||||
examination are implemented and user-accepted. The follow-up maps
|
||||
component-disabled ACE characters to the modern scarab/prismatic formula,
|
||||
resolves formula icons by their DAT icon DIDs, installs those icons as each
|
||||
authored template root's own foreground image, and migrates stale examination
|
||||
dimensions once to the authored 310 x 400 extent. Their connected visual gate
|
||||
is pending.
|
||||
dimensions once to the authored 310 x 400 extent. The final connected
|
||||
assessment gate passed on 2026-07-24. Slices 1–3 are complete; resume at Slice
|
||||
4, equipped-child world picking.
|
||||
**Milestone:** M4 prerequisite/preamble.
|
||||
**Architecture:** retained gameplay UI over shared selection, object, and
|
||||
interaction state. `GameWindow` remains a composition/callback shell.
|
||||
|
|
@ -192,7 +193,7 @@ Focused conformance fixtures cover the geometry layering plus melee, launcher,
|
|||
armor, spell, and special-property reports. The Release solution build passes
|
||||
with the 17 warnings already tracked by #228, 3,514 App tests / 3 skips, and
|
||||
7,931 complete-solution tests / 5 skips. The connected visual result remains
|
||||
the closeout gate.
|
||||
the historical pre-acceptance checkpoint; the final gate passed 2026-07-24.
|
||||
|
||||
The item-format conformance correction adds literal hook-tail cursor fixtures,
|
||||
wire/session/object-table propagation tests, the exact Black Phyntos Hive
|
||||
|
|
@ -201,7 +202,7 @@ LayoutDesc color-palette/enchantment-style coverage. The isolated Release
|
|||
solution build passes with the same 17 tracked warnings; 3,522 App tests / 3
|
||||
skips and 7,942 complete-solution tests / 5 skips pass while the previously
|
||||
launched client retains the normal Release output lock. The corrected
|
||||
connected item visual remains the closeout gate.
|
||||
connected item visual was accepted 2026-07-24.
|
||||
|
||||
The exhaustive item-report correction replaces the remaining generic/numeric
|
||||
approximations with the complete named-retail dispatch. Equipment sets use the
|
||||
|
|
@ -218,7 +219,7 @@ need live player/localization state (effective shield, cooldown remaining, and
|
|||
augmentation-cost `StringInfo`), plus character and creature-font residuals.
|
||||
The focused item formatter suite passes 21/21, App Release passes 3,531 tests /
|
||||
3 skips, and the complete Release solution passes 7,952 tests / 5 skips. The
|
||||
connected item-report comparison is the remaining Slice 3 gate.
|
||||
connected item-report comparison passed on 2026-07-24.
|
||||
|
||||
The material-title and section-boundary correction carries
|
||||
`PublicWeenieDesc.MaterialType` from CreateObject through the canonical object
|
||||
|
|
@ -268,7 +269,8 @@ each component descriptor's icon DID rather than its inventory WCID, applies
|
|||
the modern scarab/prismatic formula when ACE disables component enforcement
|
||||
(IA-21), and introduces per-window authored-geometry revisions so an obsolete
|
||||
saved examination height resets once without discarding position or future
|
||||
user resizing. The connected visual gate is pending. The 61-test focused App
|
||||
user resizing. The corrected formula/icons/foreground stack and authored
|
||||
extent were accepted on 2026-07-24. The 61-test focused App
|
||||
gate passed before this correction. The corrected focused tests, Release build
|
||||
with #228's 17 tracked test warnings, 3,555 App tests / 3 skips, and 7,986
|
||||
complete-solution tests / 5 skips pass.
|
||||
|
|
|
|||
|
|
@ -2,33 +2,24 @@
|
|||
|
||||
**Date:** 2026-07-24
|
||||
|
||||
**Status:** Slices A–I and J0–J5 are complete. Flat-authoritative collision, zero-
|
||||
allocation resolve scratch, parsed-graph removal, connected correctness/
|
||||
lifetime acceptance, and Slice-I closeout landed 2026-07-25. Slices F–L were
|
||||
explicitly approved 2026-07-24. Slice J0–J1 established the enforced Runtime
|
||||
boundary and borrowed contract seam; J2 moved canonical session/transport
|
||||
lifetime and ordered inbound routing; J3.1–J3.6 moved canonical entity identity
|
||||
and object-table lifetime to Runtime, exact graphical projection identity to
|
||||
App, and one ordered canonical entity/object stream plus direct views to all
|
||||
hosts and closed the failure-safe owner ledger. J4.1 moved communication and
|
||||
social ownership into Runtime at `c9d25ade`; J4.2 moved inventory transaction
|
||||
ownership into Runtime at `011efbea`; J4.3 moved the coupled magic/player-sheet
|
||||
owner into Runtime at `d02a12ce`; J4.4 moved character settings/projections
|
||||
and the shared typed state-command seam at `dcb61efb`; J4.5 closed canonical
|
||||
gameplay-state ownership at `89e6b207`. J5 movement, physics, interaction,
|
||||
and combat ownership closed at `cdee7a4b` after canonical action state
|
||||
(`b298f99f`), interaction transactions (`f5f7b417`), and combat/magic intent
|
||||
(`20df9d15`), local movement/outbound cadence (`aa3f4a60`), and per-session
|
||||
physics/remote simulation (`7e6033d0`), projectile simulation (`2aee3356`),
|
||||
and the combined simulation ledger/Runtime-only closeout moved to Runtime.
|
||||
J6 completed at `18d17d8b`: Runtime owns world environment, canonical reveal
|
||||
generation/readiness, exact F751/Position destination correlation, and the
|
||||
generation/cell-scoped graphical-host acknowledgement suffix. J7 completed
|
||||
at `ce41efb9` with its automated gates and the user's 2026-07-27
|
||||
physical-display acceptance. J8 and Slice J closed at `a9a822f2`: graphical
|
||||
and direct hosts share one `GameRuntime`, one retryable generation-reset
|
||||
transaction, and one canonical gameplay-owner graph. Slice K is active; K0
|
||||
established the tested Windows/Linux headless boundary at `aada8a37`.
|
||||
**Status:** Slices A–K are complete. Slice L is deferred at its L1
|
||||
implementation checkpoint by user direction on 2026-07-27.
|
||||
Flat-authoritative collision, zero-allocation resolve scratch, parsed-graph
|
||||
removal, prepared content, typed residency, retained render-scene submission,
|
||||
and bounded frame owners are production paths. Slice J closed at `a9a822f2`:
|
||||
graphical and direct hosts share one presentation-independent `GameRuntime`,
|
||||
one retryable generation-reset transaction, and one canonical session/entity/
|
||||
object/gameplay/movement/physics/projectile/environment/transit owner graph.
|
||||
Slice K closed through `776482da`: the Windows/Linux no-window host, shared
|
||||
immutable content, deterministic bot API/scheduler, 1/5/10/30-session
|
||||
isolation, two-hour simulated endurance, connected portal/movement parity,
|
||||
resource ceilings, graceful reconnect/logout, and zero-debt teardown pass.
|
||||
Slice L0 landed at `66f114b2`; L1's immutable Win32/X11/Wayland selection,
|
||||
packaged GLFW 3.4 preference, atomic capability record, active modern-GL
|
||||
probes, and safe terminal reporting landed at `11501d52`. Native Windows AMD
|
||||
passes. WSLg correctly rejects its missing mandatory bindless-texture
|
||||
capability. Physical-Linux validation and L2–L6 are parked; resume at the
|
||||
supported AMD/NVIDIA L1 gate.
|
||||
|
||||
**Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and
|
||||
Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit.
|
||||
|
|
@ -1065,6 +1056,9 @@ host-parity tests after each move.
|
|||
|
||||
### Slice K — Linux headless and multi-session host
|
||||
|
||||
**Status:** complete through `776482da`; closeout is
|
||||
[`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md).
|
||||
|
||||
**Prepared execution plan:**
|
||||
[`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md).
|
||||
Implementation began after Slice J's no-window closeout at `a9a822f2`.
|
||||
|
|
@ -1100,9 +1094,14 @@ per-session incremental memory given a numeric ceiling at gate time.
|
|||
|
||||
### Slice L — Linux graphical host and evidence-gated GPU work
|
||||
|
||||
**Status:** deferred 2026-07-27. L0 is complete at `66f114b2`; the L1
|
||||
implementation checkpoint is `11501d52`. Physical supported-driver validation
|
||||
and L2–L6 remain pending.
|
||||
|
||||
**Prepared execution plan:**
|
||||
[`2026-07-26-modern-runtime-slice-l.md`](2026-07-26-modern-runtime-slice-l.md).
|
||||
Implementation begins after Slice K closes.
|
||||
Implementation began after Slice K closed and is parked at the recorded L1
|
||||
gate.
|
||||
|
||||
**Purpose:** Finish platform portability and only then pursue remaining GPU
|
||||
opportunities.
|
||||
|
|
@ -1309,10 +1308,20 @@ at every stable checkpoint. J7 completed at `ce41efb9`, and the user accepted
|
|||
its exact post-cutover visual matrix on 2026-07-27. J8 closed Slice J at
|
||||
`a9a822f2`; 395 Runtime tests, 3,731 App tests / 3 skips, 8,696 complete-
|
||||
solution tests / 5 skips, lifecycle/reconnect, and canonical nine-stop gates
|
||||
pass. Slice K is the current execution point.
|
||||
K0 completed at `aada8a37`: the no-App Windows/Ubuntu closure, strict
|
||||
no-connect validator, dependency/assembly guards, Release build, 8,708-test /
|
||||
5-skip complete suite, and local Ubuntu gates pass. K1 is active.
|
||||
pass. Slice K closed through `776482da`. K0 established the no-App
|
||||
Windows/Ubuntu dependency and loaded-assembly boundary; K1 added portable
|
||||
paths/config/credentials and the direct Runtime host; K2 added the
|
||||
deterministic scheduler and complete bot command/event API; K3 added shared
|
||||
immutable content plus multi-session isolation and connected observer parity;
|
||||
K4 added committed resource ceilings, 1/5/10/30-root and two-hour simulated
|
||||
endurance gates, and the ten-minute two-account native-Linux connected soak.
|
||||
That final process logged both accounts out through ACE and converged every
|
||||
Runtime/content ledger. Slice L0 then completed at `66f114b2`, and L1's
|
||||
implementation checkpoint landed at `11501d52`. App passes 3,763 / 3 skips
|
||||
and the complete Release suite passes 8,826 / 5 skips. Native Windows passes
|
||||
the packaged graphical/audio smoke; WSLg X11/Wayland correctly emit the
|
||||
actionable mandatory-bindless rejection with zero terminal ownership. Further
|
||||
Linux graphical work is deferred at the physical supported-driver L1 gate.
|
||||
Evidence:
|
||||
[`../research/2026-07-25-slice-g5-production-profile.md`](../research/2026-07-25-slice-g5-production-profile.md)
|
||||
and
|
||||
|
|
@ -1338,7 +1347,15 @@ and
|
|||
and
|
||||
[`../research/2026-07-26-slice-j5-7-simulation-ownership-closeout.md`](../research/2026-07-26-slice-j5-7-simulation-ownership-closeout.md)
|
||||
and
|
||||
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md).
|
||||
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md)
|
||||
and
|
||||
[`../research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`](../research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md)
|
||||
and
|
||||
[`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md)
|
||||
and
|
||||
[`../research/2026-07-27-slice-l0-platform-services.md`](../research/2026-07-27-slice-l0-platform-services.md)
|
||||
and
|
||||
[`../research/2026-07-27-slice-l1-graphical-capability-checkpoint.md`](../research/2026-07-27-slice-l1-graphical-capability-checkpoint.md).
|
||||
|
||||
The intended order is therefore:
|
||||
|
||||
|
|
@ -1352,9 +1369,9 @@ honest metrics + committed baselines (A — exit criteria block C)
|
|||
-> delta GPU submission (G)
|
||||
-> residual frame cleanup (H-a, H-b, H-c)
|
||||
-> flat collision assets (I — COMPLETE)
|
||||
-> presentation-independent runtime (J — CURRENT at J5)
|
||||
-> Linux/headless/multi-session (K)
|
||||
-> evidence-gated GPU jobs (L)
|
||||
-> presentation-independent runtime (J — COMPLETE)
|
||||
-> Linux/headless/multi-session (K — COMPLETE)
|
||||
-> Linux graphical / GPU evidence (L — DEFERRED at L1)
|
||||
```
|
||||
|
||||
This order improves the current graphical client first while laying clean
|
||||
|
|
|
|||
|
|
@ -246,3 +246,28 @@ ordinary `ObjectUpdated` events complete inventory work.
|
|||
|
||||
`GameWindow` now constructs and forwards narrow lifecycle edges to these
|
||||
owners; no selection algorithm or interaction request body belongs there.
|
||||
|
||||
## 2026-07-27 M4 world-interaction checkpoint
|
||||
|
||||
The six-slice world-interaction plan lives at
|
||||
`docs/plans/2026-07-23-world-interaction-completion.md`. Slices 1–3 are
|
||||
user-accepted:
|
||||
|
||||
- the favorite-spell bar owns its authored overflow controls and stable manual
|
||||
offset;
|
||||
- status Use/Assess shares canonical interaction and appraisal owners;
|
||||
- `gmFloatyExaminationUI` is an independent top-level window, not a shared
|
||||
primary-panel page;
|
||||
- object assessment owns exact response flags, balanced busy lifetime,
|
||||
selection-follow, inscription, complete EoR item/creature/spell reports, and
|
||||
the animated private creature preview;
|
||||
- retained items and favorite spells select on button-down; right-click uses
|
||||
the correct object-appraisal or local spell-report path;
|
||||
- component-disabled ACE profiles show the accepted scarab/prismatic formula,
|
||||
DAT icon DIDs, authored foreground stack, and 310 x 400 window extent.
|
||||
|
||||
Resume at Slice 4. It must add equipped-child world picking through the
|
||||
existing completed render-selection frame and exact child presentation key;
|
||||
do not invent a second selection state or marker anchor. Slices 5–6 then add
|
||||
vendor browsing and server-authoritative transactions through the same Runtime
|
||||
inventory/action owners.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue