fix(motion): restore retail object manager order

Process animation completion at the retail process_hooks boundary, then run targeting, movement, PartArray completion, and PositionManager in the named UpdateObjectInternal order for local, remote, hidden, and position-less animated objects. Retire TS-42 with deterministic conformance coverage.\n\nCo-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-19 21:40:14 +02:00
parent 0f996db747
commit c5ab99081c
17 changed files with 493 additions and 98 deletions

View file

@ -120,7 +120,7 @@ public sealed class EntityEffectPoseRegistryTests
}
[Fact]
public void AnimationHookQueue_CompletesMotionStateEvenWhenPoseWasRemoved()
public void AnimationHookQueue_CompletesMotionStateAtCaptureEvenWhenPoseWasRemoved()
{
var poses = new EntityEffectPoseRegistry();
var queue = new AnimationHookFrameQueue(new AnimationHookRouter(), poses);
@ -134,12 +134,31 @@ public sealed class EntityEffectPoseRegistryTests
11u,
sequencer,
new AnimationHook[] { new AnimationDoneHook() });
Assert.Empty(sequencer.Manager.PendingAnimations);
queue.Drain();
Assert.Empty(sequencer.Manager.PendingAnimations);
Assert.Equal(0, queue.Count);
}
[Fact]
public void AnimationHookQueue_DeferredDrainDoesNotOwnPartArrayUseTime()
{
var poses = new EntityEffectPoseRegistry();
var queue = new AnimationHookFrameQueue(new AnimationHookRouter(), poses);
var sequencer = new AnimationSequencer(
new Setup(),
new MotionTable(),
new NullAnimationLoader());
sequencer.Manager.AddToQueue(0x10000001u, ticks: 0u);
queue.Capture(12u, sequencer, Array.Empty<AnimationHook>());
queue.Drain();
Assert.Single(sequencer.Manager.PendingAnimations);
}
[Fact]
public void Publish_UsesOutdoorEffectCellWithoutChangingRenderParent()
{