diff --git a/MinecraftClient.Tests/Pathing/Execution/PathTimingContractTests.cs b/MinecraftClient.Tests/Pathing/Execution/PathTimingContractTests.cs index a7f417c3..383d3d73 100644 --- a/MinecraftClient.Tests/Pathing/Execution/PathTimingContractTests.cs +++ b/MinecraftClient.Tests/Pathing/Execution/PathTimingContractTests.cs @@ -44,4 +44,26 @@ public sealed class PathTimingContractTests PathingContractAssert.TimingMatches(budget, result); } + + [Theory] + [InlineData("same-move-straight-traverse-chain")] + [InlineData("same-move-diagonal-chain")] + [InlineData("same-move-ascend-staircase")] + [InlineData("same-move-descend-staircase")] + [InlineData("same-move-aligned-parkour-chain")] + [InlineData("mixed-traverse-turn-parkour-turn-traverse")] + [InlineData("mixed-diagonal-ascend-traverse-descend")] + [InlineData("mixed-traverse-ascend-parkour-descend")] + [InlineData("turn-density-alternating-traverse-diagonal-chain")] + [InlineData("speed-carry-repeated-traverse-ascend")] + [InlineData("speed-carry-repeated-traverse-descend")] + [InlineData("speed-carry-repeated-traverse-parkour")] + public void LongRoute_ExecutionStaysWithinBudget(string scenarioId) + { + PathingExecutionScenario scenario = PathingExecutionScenarioCatalog.Get(scenarioId); + PathingTimingBudget budget = PathingContractStore.LoadFromRepositoryRoot().GetTiming(scenarioId); + PathingScenarioResult result = PathingScenarioRunner.RunAccepted(scenario); + + PathingContractAssert.TimingMatches(budget, result); + } } diff --git a/MinecraftClient.Tests/Pathing/Execution/PathingContractBootstrapTests.cs b/MinecraftClient.Tests/Pathing/Execution/PathingContractBootstrapTests.cs index 71fbfa9f..4f579995 100644 --- a/MinecraftClient.Tests/Pathing/Execution/PathingContractBootstrapTests.cs +++ b/MinecraftClient.Tests/Pathing/Execution/PathingContractBootstrapTests.cs @@ -39,4 +39,27 @@ public sealed class PathingContractBootstrapTests if (planResult.Status == PathStatus.Success) _output.WriteLine(PathingContractBootstrapWriter.WriteTimingFragment(scenarioId, PathingScenarioRunner.RunAccepted(scenario))); } + + [Theory] + [InlineData("same-move-straight-traverse-chain")] + [InlineData("same-move-diagonal-chain")] + [InlineData("same-move-ascend-staircase")] + [InlineData("same-move-descend-staircase")] + [InlineData("same-move-aligned-parkour-chain")] + [InlineData("mixed-traverse-turn-parkour-turn-traverse")] + [InlineData("mixed-diagonal-ascend-traverse-descend")] + [InlineData("mixed-traverse-ascend-parkour-descend")] + [InlineData("turn-density-alternating-traverse-diagonal-chain")] + [InlineData("speed-carry-repeated-traverse-ascend")] + [InlineData("speed-carry-repeated-traverse-descend")] + [InlineData("speed-carry-repeated-traverse-parkour")] + public void PrintLongRouteContractFragments(string scenarioId) + { + PathingExecutionScenario scenario = PathingExecutionScenarioCatalog.Get(scenarioId); + PathResult planResult = PathingScenarioRunner.PlanOnly(scenario); + + _output.WriteLine(PathingContractBootstrapWriter.WritePlannerFragment(scenarioId, planResult)); + if (planResult.Status == PathStatus.Success) + _output.WriteLine(PathingContractBootstrapWriter.WriteTimingFragment(scenarioId, PathingScenarioRunner.RunAccepted(scenario))); + } } diff --git a/MinecraftClient.Tests/Pathing/Execution/Scenarios/PathingExecutionScenarioCatalog.cs b/MinecraftClient.Tests/Pathing/Execution/Scenarios/PathingExecutionScenarioCatalog.cs index 520180b5..f88ac0db 100644 --- a/MinecraftClient.Tests/Pathing/Execution/Scenarios/PathingExecutionScenarioCatalog.cs +++ b/MinecraftClient.Tests/Pathing/Execution/Scenarios/PathingExecutionScenarioCatalog.cs @@ -88,6 +88,96 @@ internal static class PathingExecutionScenarioCatalog StartYaw = 315f, MaxExecutionTicks = 420 }, + "same-move-straight-traverse-chain" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildSameMoveStraightTraverseChain, + Start = new Location(300.5, 80, 300.5), + Goal = new GoalBlock(312, 80, 300), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "same-move-diagonal-chain" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildSameMoveDiagonalChain, + Start = new Location(320.5, 80, 320.5), + Goal = new GoalBlock(327, 80, 327), + StartYaw = 315f, + MaxExecutionTicks = 420 + }, + "same-move-aligned-parkour-chain" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildSameMoveAlignedParkourChain, + Start = new Location(380.5, 80, 380.5), + Goal = new GoalBlock(388, 80, 380), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "mixed-traverse-turn-parkour-turn-traverse" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildMixedTraverseTurnParkourTurnTraverse, + Start = new Location(400.5, 80, 400.5), + Goal = new GoalBlock(408, 80, 404), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "mixed-diagonal-ascend-traverse-descend" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildMixedDiagonalAscendTraverseDescend, + Start = new Location(420.5, 80, 420.5), + Goal = new GoalBlock(428, 80, 422), + StartYaw = 315f, + MaxExecutionTicks = 420 + }, + "mixed-traverse-ascend-parkour-descend" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildMixedTraverseAscendParkourDescend, + Start = new Location(440.5, 80, 440.5), + Goal = new GoalBlock(448, 80, 440), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "turn-density-alternating-traverse-diagonal-chain" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildTurnDensityAlternatingTraverseDiagonalChain, + Start = new Location(460.5, 80, 460.5), + Goal = new GoalBlock(466, 80, 466), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "speed-carry-repeated-traverse-ascend" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildSpeedCarryRepeatedTraverseAscend, + Start = new Location(480.5, 80, 480.5), + Goal = new GoalBlock(488, 84, 480), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "speed-carry-repeated-traverse-descend" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildSpeedCarryRepeatedTraverseDescend, + Start = new Location(500.5, 83, 500.5), + Goal = new GoalBlock(507, 80, 500), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, + "speed-carry-repeated-traverse-parkour" => new PathingExecutionScenario + { + Id = scenarioId, + BuildWorld = BuildSpeedCarryRepeatedTraverseParkour, + Start = new Location(520.5, 80, 520.5), + Goal = new GoalBlock(529, 80, 520), + StartYaw = 270f, + MaxExecutionTicks = 420 + }, _ => throw new ArgumentOutOfRangeException(nameof(scenarioId), scenarioId, null) }; @@ -199,4 +289,151 @@ internal static class PathingExecutionScenarioCatalog FlatWorldTestBuilder.SetSolid(world, 684, 79, 624); return world; } + + private static World BuildSameMoveStraightTraverseChain() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 298, max: 314); + FlatWorldTestBuilder.ClearBox(world, 298, 79, 298, 314, 90, 302); + FlatWorldTestBuilder.FillSolid(world, 300, 79, 300, 312, 79, 300); + return world; + } + + private static World BuildSameMoveDiagonalChain() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 318, max: 330); + FlatWorldTestBuilder.ClearBox(world, 318, 79, 318, 330, 90, 330); + FlatWorldTestBuilder.SetSolid(world, 320, 79, 320); + FlatWorldTestBuilder.SetSolid(world, 321, 79, 321); + FlatWorldTestBuilder.SetSolid(world, 322, 79, 322); + FlatWorldTestBuilder.SetSolid(world, 323, 79, 323); + FlatWorldTestBuilder.SetSolid(world, 324, 79, 324); + FlatWorldTestBuilder.SetSolid(world, 325, 79, 325); + FlatWorldTestBuilder.SetSolid(world, 326, 79, 326); + FlatWorldTestBuilder.SetSolid(world, 327, 79, 327); + return world; + } + + private static World BuildSameMoveAlignedParkourChain() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 378, max: 390); + FlatWorldTestBuilder.ClearBox(world, 378, 79, 378, 390, 90, 382); + FlatWorldTestBuilder.SetSolid(world, 380, 79, 380); + FlatWorldTestBuilder.SetSolid(world, 382, 79, 380); + FlatWorldTestBuilder.SetSolid(world, 384, 79, 380); + FlatWorldTestBuilder.SetSolid(world, 386, 79, 380); + FlatWorldTestBuilder.SetSolid(world, 388, 79, 380); + return world; + } + + private static World BuildMixedTraverseTurnParkourTurnTraverse() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 398, max: 410); + FlatWorldTestBuilder.ClearBox(world, 398, 79, 398, 410, 90, 406); + FlatWorldTestBuilder.SetSolid(world, 400, 79, 400); + FlatWorldTestBuilder.SetSolid(world, 401, 79, 400); + FlatWorldTestBuilder.SetSolid(world, 402, 79, 400); + FlatWorldTestBuilder.SetSolid(world, 402, 79, 401); + FlatWorldTestBuilder.SetSolid(world, 402, 79, 402); + FlatWorldTestBuilder.SetSolid(world, 404, 79, 402); + FlatWorldTestBuilder.SetSolid(world, 405, 79, 402); + FlatWorldTestBuilder.SetSolid(world, 406, 79, 402); + FlatWorldTestBuilder.SetSolid(world, 406, 79, 403); + FlatWorldTestBuilder.SetSolid(world, 406, 79, 404); + FlatWorldTestBuilder.SetSolid(world, 407, 79, 404); + FlatWorldTestBuilder.SetSolid(world, 408, 79, 404); + return world; + } + + private static World BuildMixedDiagonalAscendTraverseDescend() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 418, max: 430); + FlatWorldTestBuilder.ClearBox(world, 418, 79, 418, 430, 92, 424); + FlatWorldTestBuilder.SetSolid(world, 420, 79, 420); + FlatWorldTestBuilder.SetSolid(world, 421, 79, 421); + FlatWorldTestBuilder.SetSolid(world, 422, 79, 422); + FlatWorldTestBuilder.SetSolid(world, 423, 80, 422); + FlatWorldTestBuilder.SetSolid(world, 424, 81, 422); + FlatWorldTestBuilder.SetSolid(world, 425, 81, 422); + FlatWorldTestBuilder.SetSolid(world, 426, 81, 422); + FlatWorldTestBuilder.SetSolid(world, 427, 80, 422); + FlatWorldTestBuilder.SetSolid(world, 428, 79, 422); + return world; + } + + private static World BuildMixedTraverseAscendParkourDescend() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 438, max: 450); + FlatWorldTestBuilder.ClearBox(world, 438, 79, 438, 450, 92, 442); + FlatWorldTestBuilder.SetSolid(world, 440, 79, 440); + FlatWorldTestBuilder.SetSolid(world, 441, 79, 440); + FlatWorldTestBuilder.SetSolid(world, 442, 80, 440); + FlatWorldTestBuilder.SetSolid(world, 443, 81, 440); + FlatWorldTestBuilder.SetSolid(world, 444, 81, 440); + FlatWorldTestBuilder.SetSolid(world, 446, 81, 440); + FlatWorldTestBuilder.SetSolid(world, 447, 80, 440); + FlatWorldTestBuilder.SetSolid(world, 448, 79, 440); + return world; + } + + private static World BuildTurnDensityAlternatingTraverseDiagonalChain() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 458, max: 468); + FlatWorldTestBuilder.ClearBox(world, 458, 79, 458, 468, 90, 468); + FlatWorldTestBuilder.SetSolid(world, 460, 79, 460); + FlatWorldTestBuilder.SetSolid(world, 461, 79, 460); + FlatWorldTestBuilder.SetSolid(world, 461, 79, 461); + FlatWorldTestBuilder.SetSolid(world, 462, 79, 462); + FlatWorldTestBuilder.SetSolid(world, 463, 79, 462); + FlatWorldTestBuilder.SetSolid(world, 463, 79, 463); + FlatWorldTestBuilder.SetSolid(world, 464, 79, 464); + FlatWorldTestBuilder.SetSolid(world, 465, 79, 464); + FlatWorldTestBuilder.SetSolid(world, 465, 79, 465); + FlatWorldTestBuilder.SetSolid(world, 466, 79, 466); + return world; + } + + private static World BuildSpeedCarryRepeatedTraverseAscend() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 478, max: 490); + FlatWorldTestBuilder.ClearBox(world, 478, 79, 478, 490, 94, 482); + FlatWorldTestBuilder.SetSolid(world, 480, 79, 480); + FlatWorldTestBuilder.SetSolid(world, 481, 79, 480); + FlatWorldTestBuilder.SetSolid(world, 482, 80, 480); + FlatWorldTestBuilder.SetSolid(world, 483, 80, 480); + FlatWorldTestBuilder.SetSolid(world, 484, 81, 480); + FlatWorldTestBuilder.SetSolid(world, 485, 81, 480); + FlatWorldTestBuilder.SetSolid(world, 486, 82, 480); + FlatWorldTestBuilder.SetSolid(world, 487, 82, 480); + FlatWorldTestBuilder.SetSolid(world, 488, 83, 480); + return world; + } + + private static World BuildSpeedCarryRepeatedTraverseDescend() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 498, max: 510); + FlatWorldTestBuilder.ClearBox(world, 498, 79, 498, 510, 94, 502); + FlatWorldTestBuilder.SetSolid(world, 500, 82, 500); + FlatWorldTestBuilder.SetSolid(world, 501, 82, 500); + FlatWorldTestBuilder.SetSolid(world, 502, 81, 500); + FlatWorldTestBuilder.SetSolid(world, 503, 81, 500); + FlatWorldTestBuilder.SetSolid(world, 504, 80, 500); + FlatWorldTestBuilder.SetSolid(world, 505, 80, 500); + FlatWorldTestBuilder.SetSolid(world, 506, 79, 500); + FlatWorldTestBuilder.SetSolid(world, 507, 79, 500); + return world; + } + + private static World BuildSpeedCarryRepeatedTraverseParkour() + { + World world = FlatWorldTestBuilder.CreateStoneFloor(min: 518, max: 532); + FlatWorldTestBuilder.ClearBox(world, 518, 79, 518, 532, 90, 522); + FlatWorldTestBuilder.SetSolid(world, 520, 79, 520); + FlatWorldTestBuilder.SetSolid(world, 521, 79, 520); + FlatWorldTestBuilder.SetSolid(world, 523, 79, 520); + FlatWorldTestBuilder.SetSolid(world, 524, 79, 520); + FlatWorldTestBuilder.SetSolid(world, 526, 79, 520); + FlatWorldTestBuilder.SetSolid(world, 527, 79, 520); + FlatWorldTestBuilder.SetSolid(world, 529, 79, 520); + return world; + } } diff --git a/MinecraftClient.Tests/TestData/Pathing/pathing-planner-contracts.json b/MinecraftClient.Tests/TestData/Pathing/pathing-planner-contracts.json index ef519a79..4be87817 100644 --- a/MinecraftClient.Tests/TestData/Pathing/pathing-planner-contracts.json +++ b/MinecraftClient.Tests/TestData/Pathing/pathing-planner-contracts.json @@ -5,33 +5,81 @@ "segments": [ { "moveType": "Diagonal", - "startBlock": { "x": 171, "y": 80, "z": 160 }, - "endBlock": { "x": 172, "y": 80, "z": 161 } + "startBlock": { + "x": 171, + "y": 80, + "z": 160 + }, + "endBlock": { + "x": 172, + "y": 80, + "z": 161 + } }, { "moveType": "Diagonal", - "startBlock": { "x": 172, "y": 80, "z": 161 }, - "endBlock": { "x": 173, "y": 80, "z": 162 } + "startBlock": { + "x": 172, + "y": 80, + "z": 161 + }, + "endBlock": { + "x": 173, + "y": 80, + "z": 162 + } }, { "moveType": "Traverse", - "startBlock": { "x": 173, "y": 80, "z": 162 }, - "endBlock": { "x": 174, "y": 80, "z": 162 } + "startBlock": { + "x": 173, + "y": 80, + "z": 162 + }, + "endBlock": { + "x": 174, + "y": 80, + "z": 162 + } }, { "moveType": "Ascend", - "startBlock": { "x": 174, "y": 80, "z": 162 }, - "endBlock": { "x": 175, "y": 81, "z": 162 } + "startBlock": { + "x": 174, + "y": 80, + "z": 162 + }, + "endBlock": { + "x": 175, + "y": 81, + "z": 162 + } }, { "moveType": "Ascend", - "startBlock": { "x": 175, "y": 81, "z": 162 }, - "endBlock": { "x": 176, "y": 82, "z": 162 } + "startBlock": { + "x": 175, + "y": 81, + "z": 162 + }, + "endBlock": { + "x": 176, + "y": 82, + "z": 162 + } }, { "moveType": "Ascend", - "startBlock": { "x": 176, "y": 82, "z": 162 }, - "endBlock": { "x": 177, "y": 83, "z": 162 } + "startBlock": { + "x": 176, + "y": 82, + "z": 162 + }, + "endBlock": { + "x": 177, + "y": 83, + "z": 162 + } } ] }, @@ -41,28 +89,68 @@ "segments": [ { "moveType": "Ascend", - "startBlock": { "x": 340, "y": 80, "z": 340 }, - "endBlock": { "x": 341, "y": 81, "z": 340 } + "startBlock": { + "x": 340, + "y": 80, + "z": 340 + }, + "endBlock": { + "x": 341, + "y": 81, + "z": 340 + } }, { "moveType": "Ascend", - "startBlock": { "x": 341, "y": 81, "z": 340 }, - "endBlock": { "x": 342, "y": 82, "z": 340 } + "startBlock": { + "x": 341, + "y": 81, + "z": 340 + }, + "endBlock": { + "x": 342, + "y": 82, + "z": 340 + } }, { "moveType": "Ascend", - "startBlock": { "x": 342, "y": 82, "z": 340 }, - "endBlock": { "x": 343, "y": 83, "z": 340 } + "startBlock": { + "x": 342, + "y": 82, + "z": 340 + }, + "endBlock": { + "x": 343, + "y": 83, + "z": 340 + } }, { "moveType": "Ascend", - "startBlock": { "x": 343, "y": 83, "z": 340 }, - "endBlock": { "x": 344, "y": 84, "z": 340 } + "startBlock": { + "x": 343, + "y": 83, + "z": 340 + }, + "endBlock": { + "x": 344, + "y": 84, + "z": 340 + } }, { "moveType": "Ascend", - "startBlock": { "x": 344, "y": 84, "z": 340 }, - "endBlock": { "x": 345, "y": 85, "z": 340 } + "startBlock": { + "x": 344, + "y": 84, + "z": 340 + }, + "endBlock": { + "x": 345, + "y": 85, + "z": 340 + } } ] }, @@ -72,18 +160,42 @@ "segments": [ { "moveType": "Descend", - "startBlock": { "x": 362, "y": 85, "z": 360 }, - "endBlock": { "x": 364, "y": 83, "z": 360 } + "startBlock": { + "x": 362, + "y": 85, + "z": 360 + }, + "endBlock": { + "x": 364, + "y": 83, + "z": 360 + } }, { "moveType": "Descend", - "startBlock": { "x": 364, "y": 83, "z": 360 }, - "endBlock": { "x": 366, "y": 81, "z": 360 } + "startBlock": { + "x": 364, + "y": 83, + "z": 360 + }, + "endBlock": { + "x": 366, + "y": 81, + "z": 360 + } }, { "moveType": "Descend", - "startBlock": { "x": 366, "y": 81, "z": 360 }, - "endBlock": { "x": 367, "y": 80, "z": 360 } + "startBlock": { + "x": 366, + "y": 81, + "z": 360 + }, + "endBlock": { + "x": 367, + "y": 80, + "z": 360 + } } ] }, @@ -98,23 +210,55 @@ "segments": [ { "moveType": "Parkour", - "startBlock": { "x": 580, "y": 80, "z": 580 }, - "endBlock": { "x": 582, "y": 80, "z": 580 } + "startBlock": { + "x": 580, + "y": 80, + "z": 580 + }, + "endBlock": { + "x": 582, + "y": 80, + "z": 580 + } }, { "moveType": "Parkour", - "startBlock": { "x": 582, "y": 80, "z": 580 }, - "endBlock": { "x": 584, "y": 80, "z": 580 } + "startBlock": { + "x": 582, + "y": 80, + "z": 580 + }, + "endBlock": { + "x": 584, + "y": 80, + "z": 580 + } }, { "moveType": "Parkour", - "startBlock": { "x": 584, "y": 80, "z": 580 }, - "endBlock": { "x": 586, "y": 80, "z": 580 } + "startBlock": { + "x": 584, + "y": 80, + "z": 580 + }, + "endBlock": { + "x": 586, + "y": 80, + "z": 580 + } }, { "moveType": "Parkour", - "startBlock": { "x": 586, "y": 80, "z": 580 }, - "endBlock": { "x": 588, "y": 80, "z": 580 } + "startBlock": { + "x": 586, + "y": 80, + "z": 580 + }, + "endBlock": { + "x": 588, + "y": 80, + "z": 580 + } } ] }, @@ -124,18 +268,42 @@ "segments": [ { "moveType": "Parkour", - "startBlock": { "x": 600, "y": 80, "z": 600 }, - "endBlock": { "x": 602, "y": 80, "z": 602 } + "startBlock": { + "x": 600, + "y": 80, + "z": 600 + }, + "endBlock": { + "x": 602, + "y": 80, + "z": 602 + } }, { "moveType": "Parkour", - "startBlock": { "x": 602, "y": 80, "z": 602 }, - "endBlock": { "x": 604, "y": 80, "z": 604 } + "startBlock": { + "x": 602, + "y": 80, + "z": 602 + }, + "endBlock": { + "x": 604, + "y": 80, + "z": 604 + } }, { "moveType": "Parkour", - "startBlock": { "x": 604, "y": 80, "z": 604 }, - "endBlock": { "x": 606, "y": 80, "z": 606 } + "startBlock": { + "x": 604, + "y": 80, + "z": 604 + }, + "endBlock": { + "x": 606, + "y": 80, + "z": 606 + } } ] }, @@ -145,18 +313,42 @@ "segments": [ { "moveType": "Parkour", - "startBlock": { "x": 620, "y": 80, "z": 620 }, - "endBlock": { "x": 622, "y": 80, "z": 620 } + "startBlock": { + "x": 620, + "y": 80, + "z": 620 + }, + "endBlock": { + "x": 622, + "y": 80, + "z": 620 + } }, { "moveType": "Parkour", - "startBlock": { "x": 622, "y": 80, "z": 620 }, - "endBlock": { "x": 624, "y": 80, "z": 621 } + "startBlock": { + "x": 622, + "y": 80, + "z": 620 + }, + "endBlock": { + "x": 624, + "y": 80, + "z": 621 + } }, { "moveType": "Parkour", - "startBlock": { "x": 624, "y": 80, "z": 621 }, - "endBlock": { "x": 626, "y": 80, "z": 622 } + "startBlock": { + "x": 624, + "y": 80, + "z": 621 + }, + "endBlock": { + "x": 626, + "y": 80, + "z": 622 + } } ] }, @@ -166,23 +358,55 @@ "segments": [ { "moveType": "Parkour", - "startBlock": { "x": 640, "y": 80, "z": 620 }, - "endBlock": { "x": 642, "y": 81, "z": 620 } + "startBlock": { + "x": 640, + "y": 80, + "z": 620 + }, + "endBlock": { + "x": 642, + "y": 81, + "z": 620 + } }, { "moveType": "Descend", - "startBlock": { "x": 642, "y": 81, "z": 620 }, - "endBlock": { "x": 644, "y": 80, "z": 620 } + "startBlock": { + "x": 642, + "y": 81, + "z": 620 + }, + "endBlock": { + "x": 644, + "y": 80, + "z": 620 + } }, { "moveType": "Parkour", - "startBlock": { "x": 644, "y": 80, "z": 620 }, - "endBlock": { "x": 646, "y": 81, "z": 620 } + "startBlock": { + "x": 644, + "y": 80, + "z": 620 + }, + "endBlock": { + "x": 646, + "y": 81, + "z": 620 + } }, { "moveType": "Descend", - "startBlock": { "x": 646, "y": 81, "z": 620 }, - "endBlock": { "x": 648, "y": 80, "z": 620 } + "startBlock": { + "x": 646, + "y": 81, + "z": 620 + }, + "endBlock": { + "x": 648, + "y": 80, + "z": 620 + } } ] }, @@ -192,18 +416,973 @@ "segments": [ { "moveType": "Ascend", - "startBlock": { "x": 680, "y": 80, "z": 620 }, - "endBlock": { "x": 681, "y": 81, "z": 621 } + "startBlock": { + "x": 680, + "y": 80, + "z": 620 + }, + "endBlock": { + "x": 681, + "y": 81, + "z": 621 + } }, { "moveType": "Parkour", - "startBlock": { "x": 681, "y": 81, "z": 621 }, - "endBlock": { "x": 683, "y": 81, "z": 623 } + "startBlock": { + "x": 681, + "y": 81, + "z": 621 + }, + "endBlock": { + "x": 683, + "y": 81, + "z": 623 + } }, { "moveType": "Descend", - "startBlock": { "x": 683, "y": 81, "z": 623 }, - "endBlock": { "x": 684, "y": 80, "z": 624 } + "startBlock": { + "x": 683, + "y": 81, + "z": 623 + }, + "endBlock": { + "x": 684, + "y": 80, + "z": 624 + } + } + ] + }, + { + "scenarioId": "turn-density-alternating-traverse-diagonal-chain", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Diagonal", + "startBlock": { + "x": 460, + "y": 80, + "z": 460 + }, + "endBlock": { + "x": 461, + "y": 80, + "z": 461 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 461, + "y": 80, + "z": 461 + }, + "endBlock": { + "x": 462, + "y": 80, + "z": 462 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 462, + "y": 80, + "z": 462 + }, + "endBlock": { + "x": 463, + "y": 80, + "z": 463 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 463, + "y": 80, + "z": 463 + }, + "endBlock": { + "x": 464, + "y": 80, + "z": 464 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 464, + "y": 80, + "z": 464 + }, + "endBlock": { + "x": 465, + "y": 80, + "z": 465 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 465, + "y": 80, + "z": 465 + }, + "endBlock": { + "x": 466, + "y": 80, + "z": 466 + } + } + ] + }, + { + "scenarioId": "mixed-traverse-ascend-parkour-descend", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Traverse", + "startBlock": { + "x": 440, + "y": 80, + "z": 440 + }, + "endBlock": { + "x": 441, + "y": 80, + "z": 440 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 441, + "y": 80, + "z": 440 + }, + "endBlock": { + "x": 442, + "y": 81, + "z": 440 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 442, + "y": 81, + "z": 440 + }, + "endBlock": { + "x": 443, + "y": 82, + "z": 440 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 443, + "y": 82, + "z": 440 + }, + "endBlock": { + "x": 444, + "y": 82, + "z": 440 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 444, + "y": 82, + "z": 440 + }, + "endBlock": { + "x": 446, + "y": 82, + "z": 440 + } + }, + { + "moveType": "Descend", + "startBlock": { + "x": 446, + "y": 82, + "z": 440 + }, + "endBlock": { + "x": 448, + "y": 80, + "z": 440 + } + } + ] + }, + { + "scenarioId": "same-move-aligned-parkour-chain", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Parkour", + "startBlock": { + "x": 380, + "y": 80, + "z": 380 + }, + "endBlock": { + "x": 382, + "y": 80, + "z": 380 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 382, + "y": 80, + "z": 380 + }, + "endBlock": { + "x": 384, + "y": 80, + "z": 380 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 384, + "y": 80, + "z": 380 + }, + "endBlock": { + "x": 386, + "y": 80, + "z": 380 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 386, + "y": 80, + "z": 380 + }, + "endBlock": { + "x": 388, + "y": 80, + "z": 380 + } + } + ] + }, + { + "scenarioId": "mixed-diagonal-ascend-traverse-descend", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Diagonal", + "startBlock": { + "x": 420, + "y": 80, + "z": 420 + }, + "endBlock": { + "x": 421, + "y": 80, + "z": 421 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 421, + "y": 80, + "z": 421 + }, + "endBlock": { + "x": 422, + "y": 80, + "z": 422 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 422, + "y": 80, + "z": 422 + }, + "endBlock": { + "x": 423, + "y": 81, + "z": 422 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 423, + "y": 81, + "z": 422 + }, + "endBlock": { + "x": 424, + "y": 82, + "z": 422 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 424, + "y": 82, + "z": 422 + }, + "endBlock": { + "x": 425, + "y": 82, + "z": 422 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 425, + "y": 82, + "z": 422 + }, + "endBlock": { + "x": 426, + "y": 82, + "z": 422 + } + }, + { + "moveType": "Descend", + "startBlock": { + "x": 426, + "y": 82, + "z": 422 + }, + "endBlock": { + "x": 428, + "y": 80, + "z": 422 + } + } + ] + }, + { + "scenarioId": "speed-carry-repeated-traverse-ascend", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Traverse", + "startBlock": { + "x": 480, + "y": 80, + "z": 480 + }, + "endBlock": { + "x": 481, + "y": 80, + "z": 480 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 481, + "y": 80, + "z": 480 + }, + "endBlock": { + "x": 482, + "y": 81, + "z": 480 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 482, + "y": 81, + "z": 480 + }, + "endBlock": { + "x": 483, + "y": 81, + "z": 480 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 483, + "y": 81, + "z": 480 + }, + "endBlock": { + "x": 484, + "y": 82, + "z": 480 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 484, + "y": 82, + "z": 480 + }, + "endBlock": { + "x": 485, + "y": 82, + "z": 480 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 485, + "y": 82, + "z": 480 + }, + "endBlock": { + "x": 486, + "y": 83, + "z": 480 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 486, + "y": 83, + "z": 480 + }, + "endBlock": { + "x": 487, + "y": 83, + "z": 480 + } + }, + { + "moveType": "Ascend", + "startBlock": { + "x": 487, + "y": 83, + "z": 480 + }, + "endBlock": { + "x": 488, + "y": 84, + "z": 480 + } + } + ] + }, + { + "scenarioId": "speed-carry-repeated-traverse-descend", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Traverse", + "startBlock": { + "x": 500, + "y": 83, + "z": 500 + }, + "endBlock": { + "x": 501, + "y": 83, + "z": 500 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 501, + "y": 83, + "z": 500 + }, + "endBlock": { + "x": 504, + "y": 81, + "z": 500 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 504, + "y": 81, + "z": 500 + }, + "endBlock": { + "x": 505, + "y": 81, + "z": 500 + } + }, + { + "moveType": "Descend", + "startBlock": { + "x": 505, + "y": 81, + "z": 500 + }, + "endBlock": { + "x": 507, + "y": 80, + "z": 500 + } + } + ] + }, + { + "scenarioId": "speed-carry-repeated-traverse-parkour", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Traverse", + "startBlock": { + "x": 520, + "y": 80, + "z": 520 + }, + "endBlock": { + "x": 521, + "y": 80, + "z": 520 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 521, + "y": 80, + "z": 520 + }, + "endBlock": { + "x": 523, + "y": 80, + "z": 520 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 523, + "y": 80, + "z": 520 + }, + "endBlock": { + "x": 524, + "y": 80, + "z": 520 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 524, + "y": 80, + "z": 520 + }, + "endBlock": { + "x": 526, + "y": 80, + "z": 520 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 526, + "y": 80, + "z": 520 + }, + "endBlock": { + "x": 527, + "y": 80, + "z": 520 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 527, + "y": 80, + "z": 520 + }, + "endBlock": { + "x": 529, + "y": 80, + "z": 520 + } + } + ] + }, + { + "scenarioId": "same-move-diagonal-chain", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Diagonal", + "startBlock": { + "x": 320, + "y": 80, + "z": 320 + }, + "endBlock": { + "x": 321, + "y": 80, + "z": 321 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 321, + "y": 80, + "z": 321 + }, + "endBlock": { + "x": 322, + "y": 80, + "z": 322 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 322, + "y": 80, + "z": 322 + }, + "endBlock": { + "x": 323, + "y": 80, + "z": 323 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 323, + "y": 80, + "z": 323 + }, + "endBlock": { + "x": 324, + "y": 80, + "z": 324 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 324, + "y": 80, + "z": 324 + }, + "endBlock": { + "x": 325, + "y": 80, + "z": 325 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 325, + "y": 80, + "z": 325 + }, + "endBlock": { + "x": 326, + "y": 80, + "z": 326 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 326, + "y": 80, + "z": 326 + }, + "endBlock": { + "x": 327, + "y": 80, + "z": 327 + } + } + ] + }, + { + "scenarioId": "same-move-straight-traverse-chain", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Traverse", + "startBlock": { + "x": 300, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 301, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 301, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 302, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 302, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 303, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 303, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 304, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 304, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 305, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 305, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 306, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 306, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 307, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 307, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 308, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 308, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 309, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 309, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 310, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 310, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 311, + "y": 80, + "z": 300 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 311, + "y": 80, + "z": 300 + }, + "endBlock": { + "x": 312, + "y": 80, + "z": 300 + } + } + ] + }, + { + "scenarioId": "mixed-traverse-turn-parkour-turn-traverse", + "expectedStatus": "Success", + "segments": [ + { + "moveType": "Traverse", + "startBlock": { + "x": 400, + "y": 80, + "z": 400 + }, + "endBlock": { + "x": 401, + "y": 80, + "z": 400 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 401, + "y": 80, + "z": 400 + }, + "endBlock": { + "x": 402, + "y": 80, + "z": 401 + } + }, + { + "moveType": "Parkour", + "startBlock": { + "x": 402, + "y": 80, + "z": 401 + }, + "endBlock": { + "x": 404, + "y": 80, + "z": 402 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 404, + "y": 80, + "z": 402 + }, + "endBlock": { + "x": 405, + "y": 80, + "z": 402 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 405, + "y": 80, + "z": 402 + }, + "endBlock": { + "x": 406, + "y": 80, + "z": 403 + } + }, + { + "moveType": "Diagonal", + "startBlock": { + "x": 406, + "y": 80, + "z": 403 + }, + "endBlock": { + "x": 407, + "y": 80, + "z": 404 + } + }, + { + "moveType": "Traverse", + "startBlock": { + "x": 407, + "y": 80, + "z": 404 + }, + "endBlock": { + "x": 408, + "y": 80, + "z": 404 + } } ] } diff --git a/MinecraftClient.Tests/TestData/Pathing/pathing-timing-budgets.json b/MinecraftClient.Tests/TestData/Pathing/pathing-timing-budgets.json index d8adf3bb..729119bc 100644 --- a/MinecraftClient.Tests/TestData/Pathing/pathing-timing-budgets.json +++ b/MinecraftClient.Tests/TestData/Pathing/pathing-timing-budgets.json @@ -4,12 +4,36 @@ "expectedTotalTicks": 0, "maxTotalTicks": 0, "segments": [ - { "moveType": "Diagonal", "expectedTicks": 0, "maxTicks": 0 }, - { "moveType": "Diagonal", "expectedTicks": 0, "maxTicks": 0 }, - { "moveType": "Traverse", "expectedTicks": 0, "maxTicks": 0 }, - { "moveType": "Ascend", "expectedTicks": 0, "maxTicks": 0 }, - { "moveType": "Ascend", "expectedTicks": 0, "maxTicks": 0 }, - { "moveType": "Ascend", "expectedTicks": 0, "maxTicks": 0 } + { + "moveType": "Diagonal", + "expectedTicks": 0, + "maxTicks": 0 + }, + { + "moveType": "Diagonal", + "expectedTicks": 0, + "maxTicks": 0 + }, + { + "moveType": "Traverse", + "expectedTicks": 0, + "maxTicks": 0 + }, + { + "moveType": "Ascend", + "expectedTicks": 0, + "maxTicks": 0 + }, + { + "moveType": "Ascend", + "expectedTicks": 0, + "maxTicks": 0 + }, + { + "moveType": "Ascend", + "expectedTicks": 0, + "maxTicks": 0 + } ] }, { @@ -17,11 +41,31 @@ "expectedTotalTicks": 56, "maxTotalTicks": 68, "segments": [ - { "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 }, - { "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 }, - { "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 }, - { "moveType": "Ascend", "expectedTicks": 11, "maxTicks": 14 }, - { "moveType": "Ascend", "expectedTicks": 12, "maxTicks": 15 } + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Ascend", + "expectedTicks": 12, + "maxTicks": 15 + } ] }, { @@ -29,9 +73,21 @@ "expectedTotalTicks": 61, "maxTotalTicks": 74, "segments": [ - { "moveType": "Descend", "expectedTicks": 24, "maxTicks": 29 }, - { "moveType": "Descend", "expectedTicks": 25, "maxTicks": 30 }, - { "moveType": "Descend", "expectedTicks": 12, "maxTicks": 15 } + { + "moveType": "Descend", + "expectedTicks": 24, + "maxTicks": 29 + }, + { + "moveType": "Descend", + "expectedTicks": 25, + "maxTicks": 30 + }, + { + "moveType": "Descend", + "expectedTicks": 12, + "maxTicks": 15 + } ] }, { @@ -45,10 +101,26 @@ "expectedTotalTicks": 0, "maxTotalTicks": 2, "segments": [ - { "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 }, - { "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 }, - { "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 }, - { "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 } + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 27, + "maxTicks": 33 + } ] }, { @@ -56,9 +128,21 @@ "expectedTotalTicks": 20, "maxTotalTicks": 24, "segments": [ - { "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 }, - { "moveType": "Parkour", "expectedTicks": 61, "maxTicks": 74 }, - { "moveType": "Parkour", "expectedTicks": 20, "maxTicks": 24 } + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 20, + "maxTicks": 24 + } ] }, { @@ -66,9 +150,21 @@ "expectedTotalTicks": 0, "maxTotalTicks": 2, "segments": [ - { "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 }, - { "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 }, - { "moveType": "Parkour", "expectedTicks": 27, "maxTicks": 33 } + { + "moveType": "Parkour", + "expectedTicks": 27, + "maxTicks": 33 + }, + { + "moveType": "Parkour", + "expectedTicks": 27, + "maxTicks": 33 + }, + { + "moveType": "Parkour", + "expectedTicks": 27, + "maxTicks": 33 + } ] }, { @@ -76,10 +172,26 @@ "expectedTotalTicks": 33, "maxTotalTicks": 40, "segments": [ - { "moveType": "Parkour", "expectedTicks": 13, "maxTicks": 16 }, - { "moveType": "Descend", "expectedTicks": 201, "maxTicks": 242 }, - { "moveType": "Parkour", "expectedTicks": 19, "maxTicks": 23 }, - { "moveType": "Descend", "expectedTicks": 14, "maxTicks": 17 } + { + "moveType": "Parkour", + "expectedTicks": 13, + "maxTicks": 16 + }, + { + "moveType": "Descend", + "expectedTicks": 201, + "maxTicks": 242 + }, + { + "moveType": "Parkour", + "expectedTicks": 19, + "maxTicks": 23 + }, + { + "moveType": "Descend", + "expectedTicks": 14, + "maxTicks": 17 + } ] }, { @@ -87,9 +199,426 @@ "expectedTotalTicks": 31, "maxTotalTicks": 38, "segments": [ - { "moveType": "Ascend", "expectedTicks": 81, "maxTicks": 98 }, - { "moveType": "Parkour", "expectedTicks": 16, "maxTicks": 20 }, - { "moveType": "Descend", "expectedTicks": 15, "maxTicks": 18 } + { + "moveType": "Ascend", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 16, + "maxTicks": 20 + }, + { + "moveType": "Descend", + "expectedTicks": 15, + "maxTicks": 18 + } + ] + }, + { + "scenarioId": "turn-density-alternating-traverse-diagonal-chain", + "expectedTotalTicks": 47, + "maxTotalTicks": 57, + "segments": [ + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 7, + "maxTicks": 9 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + } + ] + }, + { + "scenarioId": "mixed-traverse-ascend-parkour-descend", + "expectedTotalTicks": 40, + "maxTotalTicks": 48, + "segments": [ + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Traverse", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 18, + "maxTicks": 22 + }, + { + "moveType": "Descend", + "expectedTicks": 22, + "maxTicks": 27 + } + ] + }, + { + "scenarioId": "same-move-aligned-parkour-chain", + "expectedTotalTicks": 0, + "maxTotalTicks": 2, + "segments": [ + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 61, + "maxTicks": 74 + }, + { + "moveType": "Parkour", + "expectedTicks": 27, + "maxTicks": 33 + } + ] + }, + { + "scenarioId": "mixed-diagonal-ascend-traverse-descend", + "expectedTotalTicks": 96, + "maxTotalTicks": 116, + "segments": [ + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Ascend", + "expectedTicks": 32, + "maxTicks": 39 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Descend", + "expectedTicks": 26, + "maxTicks": 32 + } + ] + }, + { + "scenarioId": "speed-carry-repeated-traverse-ascend", + "expectedTotalTicks": 66, + "maxTotalTicks": 80, + "segments": [ + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Ascend", + "expectedTicks": 11, + "maxTicks": 14 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Ascend", + "expectedTicks": 12, + "maxTicks": 15 + } + ] + }, + { + "scenarioId": "speed-carry-repeated-traverse-descend", + "expectedTotalTicks": 41, + "maxTotalTicks": 50, + "segments": [ + { + "moveType": "Traverse", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 22, + "maxTicks": 27 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Descend", + "expectedTicks": 13, + "maxTicks": 16 + } + ] + }, + { + "scenarioId": "speed-carry-repeated-traverse-parkour", + "expectedTotalTicks": 0, + "maxTotalTicks": 2, + "segments": [ + { + "moveType": "Traverse", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 18, + "maxTicks": 22 + }, + { + "moveType": "Traverse", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 15, + "maxTicks": 18 + }, + { + "moveType": "Traverse", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 29, + "maxTicks": 35 + } + ] + }, + { + "scenarioId": "same-move-diagonal-chain", + "expectedTotalTicks": 55, + "maxTotalTicks": 66, + "segments": [ + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 7, + "maxTicks": 9 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 7, + "maxTicks": 9 + }, + { + "moveType": "Diagonal", + "expectedTicks": 9, + "maxTicks": 11 + } + ] + }, + { + "scenarioId": "same-move-straight-traverse-chain", + "expectedTotalTicks": 70, + "maxTotalTicks": 84, + "segments": [ + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 5, + "maxTicks": 7 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 6, + "maxTicks": 8 + }, + { + "moveType": "Traverse", + "expectedTicks": 7, + "maxTicks": 9 + } + ] + }, + { + "scenarioId": "mixed-traverse-turn-parkour-turn-traverse", + "expectedTotalTicks": 46, + "maxTotalTicks": 56, + "segments": [ + { + "moveType": "Traverse", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 81, + "maxTicks": 98 + }, + { + "moveType": "Parkour", + "expectedTicks": 14, + "maxTicks": 17 + }, + { + "moveType": "Traverse", + "expectedTicks": 7, + "maxTicks": 9 + }, + { + "moveType": "Diagonal", + "expectedTicks": 8, + "maxTicks": 10 + }, + { + "moveType": "Diagonal", + "expectedTicks": 9, + "maxTicks": 11 + }, + { + "moveType": "Traverse", + "expectedTicks": 8, + "maxTicks": 10 + } ] } ]