Implements IWeenieObject with GetRunRate and GetJumpHeight from decompiled client, cross-referenced against ACE MovementSystem. Default skills (Run=200, Jump=100) used until skill parsing ships. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
84 lines
2.6 KiB
C#
84 lines
2.6 KiB
C#
using AcDream.Core.Physics;
|
|
using Xunit;
|
|
|
|
namespace AcDream.Core.Tests.Physics;
|
|
|
|
public class PlayerWeenieTests
|
|
{
|
|
[Fact]
|
|
public void InqRunRate_Skill200_ReturnsCorrectRate()
|
|
{
|
|
var pw = new PlayerWeenie(runSkill: 200, jumpSkill: 100);
|
|
Assert.True(pw.InqRunRate(out float rate));
|
|
Assert.Equal(2.375f, rate, precision: 3);
|
|
}
|
|
|
|
[Fact]
|
|
public void InqRunRate_Skill800_ReturnsCap()
|
|
{
|
|
var pw = new PlayerWeenie(runSkill: 800, jumpSkill: 100);
|
|
Assert.True(pw.InqRunRate(out float rate));
|
|
Assert.Equal(4.5f, rate, precision: 3);
|
|
}
|
|
|
|
[Fact]
|
|
public void InqRunRate_Skill0_ReturnsBase()
|
|
{
|
|
var pw = new PlayerWeenie(runSkill: 0, jumpSkill: 100);
|
|
Assert.True(pw.InqRunRate(out float rate));
|
|
Assert.Equal(1.0f, rate, precision: 3);
|
|
}
|
|
|
|
[Fact]
|
|
public void InqJumpVelocity_FullExtent_Skill100()
|
|
{
|
|
var pw = new PlayerWeenie(runSkill: 100, jumpSkill: 100);
|
|
Assert.True(pw.InqJumpVelocity(1.0f, out float vz));
|
|
// height = (100/1400) * 22.2 + 0.05 ≈ 1.636
|
|
// vz = sqrt(1.636 * 19.6) ≈ 5.663
|
|
Assert.Equal(5.663f, vz, precision: 1);
|
|
}
|
|
|
|
[Fact]
|
|
public void InqJumpVelocity_HalfExtent_Skill100()
|
|
{
|
|
var pw = new PlayerWeenie(runSkill: 100, jumpSkill: 100);
|
|
Assert.True(pw.InqJumpVelocity(0.5f, out float vz));
|
|
// height = (100/1400) * 22.2 * 0.5 + 0.05 ≈ 0.843
|
|
float expectedHeight = 1.0f * (100f / 1400f * 22.2f + 0.05f) * 0.5f;
|
|
float expectedVz = MathF.Sqrt(expectedHeight * 19.6f);
|
|
Assert.Equal(expectedVz, vz, precision: 2);
|
|
}
|
|
|
|
[Fact]
|
|
public void InqJumpVelocity_ZeroSkill_ClampsToMinHeight()
|
|
{
|
|
var pw = new PlayerWeenie(runSkill: 0, jumpSkill: 0);
|
|
Assert.True(pw.InqJumpVelocity(1.0f, out float vz));
|
|
// height = max(0.05 * 1.0, 0.35) = 0.35
|
|
// vz = sqrt(0.35 * 19.6) ≈ 2.619
|
|
Assert.Equal(MathF.Sqrt(0.35f * 19.6f), vz, precision: 2);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetBurdenMod_Unencumbered_Returns1()
|
|
{
|
|
Assert.Equal(1.0f, PlayerWeenie.GetBurdenMod(0f));
|
|
Assert.Equal(1.0f, PlayerWeenie.GetBurdenMod(0.5f));
|
|
Assert.Equal(1.0f, PlayerWeenie.GetBurdenMod(0.99f));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetBurdenMod_Overloaded_Returns0()
|
|
{
|
|
Assert.Equal(0.0f, PlayerWeenie.GetBurdenMod(2.0f));
|
|
Assert.Equal(0.0f, PlayerWeenie.GetBurdenMod(3.0f));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetBurdenMod_PartialBurden_LinearDecrease()
|
|
{
|
|
Assert.Equal(0.5f, PlayerWeenie.GetBurdenMod(1.5f), precision: 3);
|
|
Assert.Equal(0.75f, PlayerWeenie.GetBurdenMod(1.25f), precision: 3);
|
|
}
|
|
}
|