research(vfx): pin retail projectile and effect oracle

Establish the executable-backed PhysicsDesc, sequence-gate, PhysicsScript, CreateBlocking, particle-anchor, projectile, and Hidden-state behavior before changing runtime code. Correct stale blocking/threshold claims and synchronize the project instructions with the current UI architecture and matching retail binary.

Add copyright-safe packet and DAT-container fixtures plus a failing installed-DAT conformance audit for projectile shapes, typed tables, recall motion, default scripts, and raw CreateBlocking inventory.

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-13 22:40:42 +02:00
parent bb5acab9e6
commit d53fe30ffe
14 changed files with 1545 additions and 53 deletions

View file

@ -22,10 +22,11 @@ namespace AcDream.Core.Vfx;
/// renderer exposes per-part world transforms.
/// </description></item>
/// <item><description>
/// <see cref="CreateBlockingParticleHook"/> — same as
/// CreateParticleHook but the retail sequencer blocks animation
/// progression until the particle is done. We spawn the emitter
/// identically; the "blocking" semantics belong to the sequencer.
/// <see cref="CreateBlockingParticleHook"/> — has the same payload
/// as CreateParticleHook, but suppresses creation while the same nonzero
/// logical emitter ID is live. It does not pause animation. The dependency
/// currently omits that inherited payload; the retail compatibility reader
/// owns its decoding.
/// </description></item>
/// <item><description>
/// <see cref="DestroyParticleHook"/> — stop the most-recent emitter
@ -110,11 +111,11 @@ public sealed class ParticleHookSink : IAnimationHookSink
break;
case CreateBlockingParticleHook:
// Retail's CreateBlockingParticleHook is a sentinel (no
// payload) — the sequencer pauses advancement until the
// current particle emitter finishes. We surface this as
// "no spawn needed, just keep the current particle alive";
// blocking semantics live in the sequencer, not here.
// Retail gives this the full CreateParticle payload and
// suppresses creation only while the same nonzero logical ID
// is live; it never pauses animation. The dependency loses
// that payload, so TS-11 remains a no-op until the centralized
// raw-hook compatibility reader supplies the retail shape.
break;
case DestroyParticleHook dph: