fix(camera): port retail offset adjustment laws

This commit is contained in:
Erik 2026-08-31 05:42:23 +02:00
parent cb22691beb
commit 90eba0ec3c
7 changed files with 212 additions and 61 deletions

View file

@ -537,14 +537,50 @@ public class RetailChaseCameraTests
}
[Fact]
public void AdjustDistance_ClampsToRange()
public void AdjustDistance_UsesRetailMultiplicativeScale()
{
var cam = new RetailChaseCamera { Distance = 5f };
cam.AdjustDistance(-100f);
Assert.Equal(RetailChaseCamera.DistanceMin, cam.Distance);
cam.AdjustDistance(+1f);
Assert.Equal(6f, cam.Distance, 5);
cam.AdjustDistance(+200f);
Assert.Equal(RetailChaseCamera.DistanceMax, cam.Distance);
cam.AdjustDistance(-1f);
Assert.Equal(4.8f, cam.Distance, 5);
}
[Fact]
public void AdjustDistance_RefusesWholeWriteAtRetailComponentAndNearLimits()
{
var far = new RetailChaseCamera
{
Distance = 9.9f,
Pitch = 0f,
YawOffset = 0f,
};
far.AdjustDistance(+1f);
Assert.Equal(9.9f, far.Distance, 5);
var near = new RetailChaseCamera
{
Distance = 0.55f,
Pitch = 0f,
};
near.AdjustDistance(-1f);
Assert.Equal(0.55f, near.Distance, 5);
}
[Fact]
public void AdjustDistance_DiagonalOrbitUsesIndependentRetailXAndYLimits()
{
var cam = new RetailChaseCamera
{
Distance = 12f,
Pitch = 0f,
YawOffset = MathF.PI / 4f,
};
cam.AdjustDistance(+0.5f);
Assert.Equal(13.2f, cam.Distance, 5);
}
[Fact]
@ -579,18 +615,37 @@ public class RetailChaseCameraTests
cam.AdjustDistance(1f);
Assert.False(cam.IsInHead);
Assert.Equal(RetailChaseCamera.DistanceMin + 1f, cam.Distance);
Assert.Equal(MathF.Sqrt(0.6f * 0.6f + 0.5f * 0.5f), cam.Distance, 5);
}
[Fact]
public void AdjustPitch_ClampsToRange()
public void AdjustPitch_UsesRetailEightDegreeRotationAndPreservesLength()
{
var cam = new RetailChaseCamera { Pitch = 0f };
cam.AdjustPitch(-10f);
Assert.Equal(RetailChaseCamera.PitchMin, cam.Pitch);
var cam = new RetailChaseCamera { Distance = 5f, Pitch = 0f };
cam.AdjustPitch(+1f);
cam.AdjustPitch(+10f);
Assert.Equal(RetailChaseCamera.PitchMax, cam.Pitch);
Assert.Equal(RetailChaseCamera.OffsetAngleRadians, cam.Pitch, 6);
Assert.Equal(5f, cam.Distance, 6);
}
[Fact]
public void AdjustPitch_RefusesWholeWriteBelowRetailVerticalLimit()
{
var cam = new RetailChaseCamera { Distance = 3f, Pitch = -0.55f };
float before = cam.Pitch;
cam.AdjustPitch(-1f);
Assert.Equal(before, cam.Pitch);
Assert.Equal(3f, cam.Distance);
}
[Fact]
public void AdjustYaw_UsesRetailEightDegreeRotationUnit()
{
var cam = new RetailChaseCamera();
cam.AdjustYaw(+1f);
Assert.Equal(RetailChaseCamera.OffsetAngleRadians, cam.YawOffset, 6);
}
// ── Camera collision (A8.F) ───────────────────────────────────────