fix(combat): match retail live attack feedback

Keep AttackDone control statuses out of chat, preserve dead motion across zero-velocity position updates, render the authored power meter from right to left, and retain the rotatable viewer offset during target tracking.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-11 21:10:01 +02:00
parent 33cc9aa16a
commit 5276a83087
16 changed files with 231 additions and 67 deletions

View file

@ -141,6 +141,33 @@ public class RetailChaseCameraTests
Assert.Null(RetailChaseCamera.ComputeTrackedHeading(pivot, pivot));
}
[Fact]
public void DesiredPose_TrackedHeadingWithNoOrbit_PlacesBoomBehindTargetDirection()
{
var pivot = new Vector3(10f, 20f, 1.5f);
var (eye, forward) = RetailChaseCamera.ComputeDesiredPose(
pivot, Vector3.UnitX, distance: 5f, pitch: 0f, viewerYawOffset: 0f);
Assert.Equal(new Vector3(5f, 20f, 1.5f), eye);
Assert.Equal(Vector3.UnitX, forward);
}
[Fact]
public void DesiredPose_TrackedHeadingRetainsViewerOffsetOrbitAndLooksAtPivot()
{
var pivot = new Vector3(10f, 20f, 1.5f);
var (eye, forward) = RetailChaseCamera.ComputeDesiredPose(
pivot, Vector3.UnitX, distance: 5f, pitch: 0f,
viewerYawOffset: MathF.PI / 2f);
Assert.Equal(10f, eye.X, 5);
Assert.Equal(15f, eye.Y, 5);
Assert.Equal(1.5f, eye.Z, 5);
Assert.Equal(Vector3.Normalize(pivot - eye), forward);
}
[Fact]
public void Basis_HorizontalHeading_IsOrthonormalAndRightHanded()
{