feat(physics): integrate live projectile runtime

Attach the retail projectile driver to canonical LiveEntityRecord ownership, sharing one PhysicsBody and full-cell identity with RemoteMotion regardless of creation order. Apply timestamp-gated state, vector, and position corrections in place, preserve active ordinary-body behavior when Missile clears, and keep renderer, effects, shadows, and spatial buckets synchronized across loaded/pending transitions.

Validate malformed packets before canonical timestamp mutation, validate adopted bodies from their current frame rather than stale CreateObject data, serialize late Setup resolution with streaming DAT reads, and preserve classification across clock anomalies. Retain shadow registrations through temporary leave-world residence while logical teardown remains generation-scoped.

Add 31 App lifecycle/adversarial tests plus Core shadow suspension coverage, and synchronize the retail pseudocode, architecture, milestones, roadmap, and durable physics memory.

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-14 12:51:42 +02:00
parent f02b995e4f
commit a51ebc66e9
12 changed files with 2559 additions and 32 deletions

View file

@ -471,7 +471,7 @@ include dungeons.
`PlayerDescription.Options1` preserves retail's player secure-trade
preference. See
`docs/research/2026-07-13-retail-give-item-pseudocode.md` and issue #216.
- **M2/M3 missile, effect, and portal presentation campaign (Steps 06
- **M2/M3 missile, effect, and portal presentation campaign (Steps 07
implemented and independently reviewed 2026-07-14)** — named-retail projectile and
physics-script behavior is pinned in one oracle, the complete `PhysicsDesc`
and F754/F755 wire surfaces are parsed with retail timestamp gates, and
@ -515,9 +515,19 @@ include dungeons.
Setup-local sphere sweeps, exact missile target/ethereal exclusions,
self-shadow rejection, retail collision response, and full-cell landblock
rebasing. Missile adds PathClipped but never PerfectClip. AP-67, TS-2, TS-10,
TS-11, and TS-12 are retired; AP-83/AP-91 remain dormant. The remaining
steps integrate live projectile ownership/corrections and port Hidden/UnHide
portal presentation.
TS-11, and TS-12 are retired; AP-83/AP-91 remain dormant. Step 7 attaches
that primitive to the canonical `LiveEntityRecord`: arrows, bolts, and spell
missiles share one body and one renderer identity across prediction,
authoritative State/Vector/Position/Movement corrections, full-cell
rebucketing, pending-landblock residence, delete, session reset, and GUID
reuse. MovementManager presentation shares the same body and the canonical
live-record cell regardless of which component was created first;
pending/leave-world shadows retain their registration for exact re-entry even
if Missile classification changes while pending; static missile effect
roots follow every predicted frame, and materialized rehydration never uses a
stale spawn cell. No impact, damage, effect, or delete event is synthesized
client-side. The remaining steps port
Hidden/UnHide portal presentation and run final hardening/visual gates.
- **L.1c local attack receive path (implemented 2026-07-11; live gate pending)**
local non-autonomous mt-0 UpdateMotion now uses retail's wholesale interpreted
funnel and action-stamp gate, so ACE's server-selected melee/missile action