89 lines
3.8 KiB
C#
89 lines
3.8 KiB
C#
using AcDream.Core.Combat;
|
|
using AcDream.Core.Physics;
|
|
using Xunit;
|
|
|
|
namespace AcDream.Core.Tests.Combat;
|
|
|
|
public sealed class CombatAnimationPlannerTests
|
|
{
|
|
[Theory]
|
|
[InlineData(0x10000058u, CombatAnimationKind.MeleeSwing)] // ThrustMed
|
|
[InlineData(0x1000005Bu, CombatAnimationKind.MeleeSwing)] // SlashHigh
|
|
[InlineData(0x1000017Du, CombatAnimationKind.MeleeSwing)] // OffhandDoubleThrustMed
|
|
[InlineData(0x1000018Eu, CombatAnimationKind.MeleeSwing)] // PunchFastLow
|
|
[InlineData(0x10000061u, CombatAnimationKind.MissileAttack)] // Shoot
|
|
[InlineData(0x100000D4u, CombatAnimationKind.MissileAttack)] // Reload
|
|
[InlineData(0x10000062u, CombatAnimationKind.CreatureAttack)] // AttackHigh1
|
|
[InlineData(0x1000018Bu, CombatAnimationKind.CreatureAttack)] // AttackLow6
|
|
[InlineData(0x400000D3u, CombatAnimationKind.SpellCast)] // CastSpell
|
|
[InlineData(0x400000E0u, CombatAnimationKind.SpellCast)] // UseMagicStaff
|
|
[InlineData(0x10000051u, CombatAnimationKind.HitReaction)] // Twitch1
|
|
[InlineData(0x10000055u, CombatAnimationKind.HitReaction)] // StaggerBackward
|
|
[InlineData(0x40000011u, CombatAnimationKind.Death)] // Dead
|
|
[InlineData(0x8000003Eu, CombatAnimationKind.CombatStance)] // SwordCombat
|
|
[InlineData(0x80000043u, CombatAnimationKind.CombatStance)] // SlingCombat
|
|
[InlineData(0x80000044u, CombatAnimationKind.CombatStance)] // 2HandedSwordCombat
|
|
public void ClassifyMotionCommand_RecognisesRetailCombatCommands(
|
|
uint command,
|
|
CombatAnimationKind expected)
|
|
{
|
|
Assert.Equal(expected, CombatAnimationPlanner.ClassifyMotionCommand(command));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(0x0170, 0x10000170u)] // OffhandSlashHigh
|
|
[InlineData(0x017D, 0x1000017Du)] // OffhandDoubleThrustMed
|
|
[InlineData(0x018B, 0x1000018Bu)] // AttackLow6
|
|
[InlineData(0x018E, 0x1000018Eu)] // PunchFastLow
|
|
public void MotionCommandResolver_UsesNamedRetailLateCombatCommands(
|
|
ushort wireCommand,
|
|
uint expectedFullCommand)
|
|
{
|
|
Assert.Equal(expectedFullCommand, MotionCommandResolver.ReconstructFullCommand(wireCommand));
|
|
}
|
|
|
|
[Fact]
|
|
public void PlanFromWireCommand_Swing_IsActionOverlay()
|
|
{
|
|
var plan = CombatAnimationPlanner.PlanFromWireCommand(0x0058, speedMod: 1.25f);
|
|
|
|
Assert.Equal(CombatAnimationKind.MeleeSwing, plan.Kind);
|
|
Assert.Equal(AnimationCommandRouteKind.Action, plan.RouteKind);
|
|
Assert.Equal(0x10000058u, plan.MotionCommand);
|
|
Assert.Equal(1.25f, plan.SpeedMod);
|
|
Assert.True(plan.HasMotion);
|
|
}
|
|
|
|
[Fact]
|
|
public void PlanFromWireCommand_Dead_IsPersistentSubState()
|
|
{
|
|
var plan = CombatAnimationPlanner.PlanFromWireCommand(0x0011);
|
|
|
|
Assert.Equal(CombatAnimationKind.Death, plan.Kind);
|
|
Assert.Equal(AnimationCommandRouteKind.SubState, plan.RouteKind);
|
|
Assert.Equal(MotionCommand.Dead, plan.MotionCommand);
|
|
}
|
|
|
|
[Fact]
|
|
public void PlanFromWireCommand_Unknown_IsNone()
|
|
{
|
|
var plan = CombatAnimationPlanner.PlanFromWireCommand(0xFFFF);
|
|
|
|
Assert.Equal(CombatAnimationPlan.None, plan);
|
|
Assert.False(plan.HasMotion);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(CombatAnimationEvent.CombatCommenceAttack)]
|
|
[InlineData(CombatAnimationEvent.AttackDone)]
|
|
[InlineData(CombatAnimationEvent.AttackerNotification)]
|
|
[InlineData(CombatAnimationEvent.DefenderNotification)]
|
|
[InlineData(CombatAnimationEvent.EvasionAttackerNotification)]
|
|
[InlineData(CombatAnimationEvent.EvasionDefenderNotification)]
|
|
[InlineData(CombatAnimationEvent.VictimNotification)]
|
|
[InlineData(CombatAnimationEvent.KillerNotification)]
|
|
public void PlanForEvent_DoesNotInventAnimations(CombatAnimationEvent combatEvent)
|
|
{
|
|
Assert.Equal(CombatAnimationPlan.None, CombatAnimationPlanner.PlanForEvent(combatEvent));
|
|
}
|
|
}
|