refactor(net): own live session composition
Extract reset, selection, entered-world, and route construction behind LiveSessionHost while preserving the sole LiveSessionController authority. Retain partial route and subscription cleanup for retry, and replace the embedded ACE-only shortcut with the exact named-retail unsigned skill formula. Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
parent
18d4b999de
commit
557eb7ef6b
22 changed files with 1430 additions and 236 deletions
|
|
@ -27,9 +27,11 @@ What does NOT go here:
|
|||
## Current queue — 2026-07-22
|
||||
|
||||
- **Active structural work:** `GameWindow` decomposition. Slices 1–7 are
|
||||
complete; `GameWindow.OnUpdate` and `GameWindow.OnRender` are typed
|
||||
orchestration handoffs and the class is 4,666 lines / 196 fields / 70
|
||||
methods. Final Slice 8 composition/shutdown cleanup is active in
|
||||
complete; Slice 8 checkpoints A–C now own native callbacks and live-session
|
||||
composition outside the shell. `GameWindow.OnUpdate` and
|
||||
`GameWindow.OnRender` are typed orchestration handoffs and the class is 4,589
|
||||
lines / 196 fields / 69 methods. Remaining Slice 8 composition/shutdown
|
||||
cleanup is active in
|
||||
[`docs/architecture/code-structure.md`](architecture/code-structure.md).
|
||||
This is the behavior-preserving prerequisite before new M4 feature bodies.
|
||||
- **Connected-gate fidelity:** `#232` adds canonical managed/GPU/cache-owner
|
||||
|
|
@ -73,6 +75,39 @@ Copy this block when adding a new issue:
|
|||
|
||||
---
|
||||
|
||||
## #233 — Live skill-credit resolver used an ACE shortcut, not retail's formula
|
||||
|
||||
**Status:** DONE (2026-07-22, GameWindow Slice 8 Checkpoint C)
|
||||
**Severity:** MEDIUM
|
||||
**Filed:** 2026-07-22
|
||||
**Component:** live character state / DAT skill formulas
|
||||
|
||||
**Description:** The live skill-update route calculated a skill's primary-
|
||||
attribute contribution with an ACE-oriented shortcut. It rejected every
|
||||
formula whose first multiplier was zero, truncated division, and added `W`
|
||||
after division. Custom DAT formulas—and any stock boundary landing on a half—
|
||||
could therefore display the wrong skill value.
|
||||
|
||||
**Root cause / status:** The binding cited ACE without first checking named
|
||||
retail. `SkillFormula::Calculate @ 0x00591960` treats all four arithmetic words
|
||||
as unsigned, fails only for `Z == 0`, forms the wrapping numerator
|
||||
`X*a + Y*b + W`, and rounds `numerator/Z` half-up. Checkpoint C moved that
|
||||
algorithm into `RetailSkillFormula`, added a named `LiveSkillCreditResolver`,
|
||||
and pinned zero-X, W placement, half rounding, unsigned reinterpretation, and
|
||||
32-bit wrap with conformance tests.
|
||||
|
||||
**Files:** `src/AcDream.App/Net/RetailSkillFormula.cs`;
|
||||
`tests/AcDream.App.Tests/Net/RetailSkillFormulaTests.cs`.
|
||||
|
||||
**Research:**
|
||||
[`docs/research/skill_formula_calculate_pseudocode.md`](research/skill_formula_calculate_pseudocode.md).
|
||||
|
||||
**Acceptance:** Live skill updates resolve the DAT entry and reproduce the
|
||||
named retail function for all unsigned field values; missing skills or
|
||||
attributes remain safely projected as zero.
|
||||
|
||||
---
|
||||
|
||||
## #232 — Nine-stop soak process-memory gate lacks canonical owner snapshots
|
||||
|
||||
**Status:** OPEN
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue