review(physics): P1 Opus review APPROVE - UN-8 retired by byte decode; PK-timer semantics recorded for P3
All seven review lenses pass. CanJump's polarity is upgraded from
plausibility to proof: raw bytes of 0x00591b50 show fld load / fcomp
[0x007c5e24 = 2.0f] / test ah,5 / jp -> return 0, i.e. return 1 iff
load < 2.0 with unordered refusing - exactly the shipped code, NaN edge
included. UN-8 deleted. CACQualities::JumpStaminaCost's pk flag decoded
for P3: PlayerKillerStatus in {4,0x40} AND PropertyFloat 0x91 + 20 s >=
now.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
f30b90f5c1
commit
001e466d42
3 changed files with 47 additions and 5 deletions
|
|
@ -385,3 +385,43 @@ every pre-P1 `PlayerWeenieTests.cs` expectation unchanged.
|
|||
- `LiveSessionEventRouterTests` (Runtime, if a harness exists) or a focused
|
||||
new test: ObjectTable burden-trigger events recompute and push burden;
|
||||
Stamina vital change pushes CurrentStamina.
|
||||
|
||||
## 12. P1 Opus-review addenda (2026-07-30, post-implementation)
|
||||
|
||||
### 12a. UN-8 RETIRED — CanJump polarity byte-proven
|
||||
|
||||
Raw bytes of `CACQualities::CanJump @ 0x00591b50` in the PDB-paired
|
||||
v11.4186 binary (technique: `reference_pe_byte_decode`):
|
||||
|
||||
```
|
||||
e8 ca d5 ff ff call InqLoad (0x0058f130)
|
||||
85 c0 / 74 1a test eax,eax; jz return0 ; load unknowable -> 0
|
||||
d9 44 24 00 fld dword [esp] ; st0 = load
|
||||
d8 1d 24 5e 7c 00 fcomp dword [0x007c5e24] ; vs 2.0f (verified read)
|
||||
df e0 fnstsw ax
|
||||
f6 c4 05 test ah, 0x05 ; C0|C2
|
||||
7a 09 jp return0 ; PF=1 on {neither, both}
|
||||
b8 01 00 00 00 mov eax, 1 ; fall-through: C0 only
|
||||
```
|
||||
|
||||
`test ah,5` result parity: `0x00` (load ≥ 2.0, incl. ==) → PF=1 → 0;
|
||||
`0x01` (load < 2.0) → PF=0 → 1; `0x05` (unordered) → PF=1 → 0.
|
||||
**`CanJump = (load < 2.0f)`; NaN/unordered refuses.** The shipped
|
||||
`_burden < CanJumpLoadThreshold` matches exactly, including the NaN edge.
|
||||
|
||||
### 12b. PK-timer jump-cost semantics (for Slice P3 / TS-23)
|
||||
|
||||
`CACQualities::JumpStaminaCost @ 0x00591b90` (pc 412934-412968), fully
|
||||
readable: the `pk` flag passed to `MovementSystem::JumpStaminaCost` is
|
||||
|
||||
```
|
||||
pk = InqInt(0x86 /*134 PlayerKillerStatus*/, default 8) in {4 /*PK*/, 0x40 /*PKLite*/}
|
||||
&& InqFloat(0x91 /*145*/) succeeded
|
||||
&& (that_float + 20.0) >= Timer::cur_time
|
||||
```
|
||||
|
||||
i.e. PK/PKLite status AND a 20-second recency window on PropertyFloat
|
||||
0x91. The P3 implementer should plumb exactly this pair alongside the
|
||||
mover-flag work; `MovementSystem.JumpStaminaCost`'s pk branch
|
||||
(`(int)((power + 1) * 100)`, ACE-derived — the retail branch is an
|
||||
elided `_ftol2` tailcall) is already in place.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue