fix(ui): Campaign AS AS2 fix round — review findings F13-F18

Opus's dual-lens review of the AS2 header-identity-block commit
(f8a22589) approved the retail port as exact and ordered six
mechanical fixes:

- F13: correct the plan doc's "static tinted preview" claim about
  retail's examine-window paperdoll — the decomp shows retail's clone
  IS animated (BasicCreatureExamineUI::Init @0x004AB9C0 ->
  CPhysicsObj::makeObject -> MorphToExistingObject +
  play_script_internal, CreatureMode::Render driving update_position
  every frame), just decoupled from the live target. AD-114 already
  records the correct deviation; only the plan doc's rationale text
  was wrong.
- F14: add a regression test pinning the monster path (character:
  false, success:false, no String 5 / Int 0x105 marker) so element
  0x1000053A stays cleared — the exact case that used to emit the
  invented "Assessment incomplete" literal AS2 deleted. This is the
  test coverage the AS2 commit message over-claimed already existed.
- F15: dedup the PK/PKLite PWD bit constants that were copy-pasted
  across three files into named PublicWeenieFlags.PlayerKiller
  (0x20) / PlayerKillerLite (0x02000000) values, routing all three
  consumers (AppraisalUiController, CharacterSheetProvider,
  LocalPlayerTeleportController) through them. Pure mechanical
  substitution; the write side (PlayerKillerStatusBitfield.Apply) is
  untouched.
- F16: file register row AD-115 for a real, previously-unrecorded
  deviation the AS2 commit introduced: BuildCharacterTitleDisplay
  clears element 0x10000151 when neither source resolves, where
  retail (CharExamineUI::Show, BasicCreatureExamineUI::Init) never
  clears it and would show the previous target's stale title
  instead. Marked intentional — ours is deliberately better.
- F17: narrow BuildPlayerKillerDisplay's doc comment — retail's
  `cur_weenobj != 0` guard @0x004b482f skips only the PK line, not
  the whole response; the whole-response drop on a missing local
  object is separate, pre-existing, and out of scope here.
- F18: ledger row for AS2 now reads "review fix round" with the land
  commit and a note that the fix SHA is recorded at review-close.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-25 08:59:29 +02:00
parent f8a2258979
commit cc5290af7d
7 changed files with 85 additions and 30 deletions

View file

@ -23,9 +23,17 @@ Missing vs retail:
Explicit owner rulings:
- **The animated 3D paperdoll is an INTENTIONAL acdream deviation** (retail
shows a static tinted preview; its colors are buggy in retail). Keep it.
Register row required (added in the first slice that touches the window).
- **The animated 3D paperdoll is an INTENTIONAL acdream deviation.** Retail's
examine preview clone is NOT a static tinted preview — it is
INDEPENDENTLY ANIMATED, just decoupled from the live target:
`BasicCreatureExamineUI::Init @0x004AB9C0` clones the selected object via
`CPhysicsObj::makeObject @0x005144B0` (which runs `MorphToExistingObject`
then `play_script_internal(setup->default_script_id)`), sets the clone's
heading to 191.367905°, and `CreatureMode::Render @0x004529D0` runs
`update_position` on it every frame — its colors are buggy in retail.
acdream's deviation is that our preview mirrors the target's LIVE motion
instead of playing its own private, decoupled cycle. Keep ours. Register
row required (added in the first slice that touches the window).
- Retail comparison is the oracle for text composition; all strings come
from DAT StringTables per the decomp — **never hardcoded English
literals**.
@ -127,7 +135,7 @@ round → narrow re-review → REVIEW-CLOSED.
| Slice | State | Land / fix commits | Notes |
|---|---|---|---|
| AS1 | **DONE 2026-08-25** | (docs commit) | 3-agent research; ground-truth doc committed |
| AS2 | ready to dispatch | — | |
| AS2 | review fix round | `f8a22589` | fix round (this commit) |
| AS3 | pending AS2 review-close | — | |
| AS4 | pending AS3 review-close | — | |
| AS5 | pending AS4 review-close | — | |