Стабилизировать проходы пилы уровня 10
This commit is contained in:
@@ -122,13 +122,19 @@ final class LateLevelScenarios {
|
|||||||
snapshot -> snapshot.playerAlive() && snapshot.playerX() < 250f)
|
snapshot -> snapshot.playerAlive() && snapshot.playerX() < 250f)
|
||||||
.step("Approach the launch saw", 2_500L,
|
.step("Approach the launch saw", 2_500L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerX() >= 350f)
|
LevelPlaytestBot.whileDeathsAtMost(1,
|
||||||
|
LevelPlaytestBot.groundedAliveAtOrBeyond(280f)))
|
||||||
.step("Take off before the launch saw", 1_000L,
|
.step("Take off before the launch saw", 1_000L,
|
||||||
LevelPlaytestBot.Input.rightJump(),
|
LevelPlaytestBot.Input.rightJump(),
|
||||||
snapshot -> snapshot.playerAlive() && snapshot.playerY() <= 680f)
|
LevelPlaytestBot.whileDeathsAtMost(1,
|
||||||
|
snapshot -> snapshot.playerAlive()
|
||||||
|
&& !snapshot.playerOnGround()
|
||||||
|
&& snapshot.playerY() <= 680f))
|
||||||
.step("Clear the launch saw", 2_000L,
|
.step("Clear the launch saw", 2_000L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerAlive() && snapshot.playerX() >= 680f)
|
LevelPlaytestBot.whileDeathsAtMost(1,
|
||||||
|
snapshot -> snapshot.playerAlive()
|
||||||
|
&& snapshot.playerX() >= 680f))
|
||||||
.step("Approach the delivered lift body", 1_500L,
|
.step("Approach the delivered lift body", 1_500L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerX() >= 730f)
|
snapshot -> snapshot.playerX() >= 730f)
|
||||||
@@ -143,13 +149,19 @@ final class LateLevelScenarios {
|
|||||||
snapshot -> snapshot.playerAlive() && snapshot.playerX() < 250f)
|
snapshot -> snapshot.playerAlive() && snapshot.playerX() < 250f)
|
||||||
.step("Return to the launch saw", 2_500L,
|
.step("Return to the launch saw", 2_500L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerX() >= 350f)
|
LevelPlaytestBot.whileDeathsAtMost(2,
|
||||||
|
LevelPlaytestBot.groundedAliveAtOrBeyond(280f)))
|
||||||
.step("Take off before the saw again", 1_000L,
|
.step("Take off before the saw again", 1_000L,
|
||||||
LevelPlaytestBot.Input.rightJump(),
|
LevelPlaytestBot.Input.rightJump(),
|
||||||
snapshot -> snapshot.playerAlive() && snapshot.playerY() <= 680f)
|
LevelPlaytestBot.whileDeathsAtMost(2,
|
||||||
|
snapshot -> snapshot.playerAlive()
|
||||||
|
&& !snapshot.playerOnGround()
|
||||||
|
&& snapshot.playerY() <= 680f))
|
||||||
.step("Clear the saw again", 2_000L,
|
.step("Clear the saw again", 2_000L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerAlive() && snapshot.playerX() >= 680f)
|
LevelPlaytestBot.whileDeathsAtMost(2,
|
||||||
|
snapshot -> snapshot.playerAlive()
|
||||||
|
&& snapshot.playerX() >= 680f))
|
||||||
.step("Approach the lift body again", 1_500L,
|
.step("Approach the lift body again", 1_500L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerX() >= 730f)
|
snapshot -> snapshot.playerX() >= 730f)
|
||||||
@@ -190,13 +202,19 @@ final class LateLevelScenarios {
|
|||||||
snapshot -> snapshot.playerAlive() && snapshot.playerX() < 250f)
|
snapshot -> snapshot.playerAlive() && snapshot.playerX() < 250f)
|
||||||
.step("Approach the saw for the final crossing", 2_500L,
|
.step("Approach the saw for the final crossing", 2_500L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerX() >= 350f)
|
LevelPlaytestBot.whileDeathsAtMost(3,
|
||||||
|
LevelPlaytestBot.groundedAliveAtOrBeyond(280f)))
|
||||||
.step("Take off for the final saw crossing", 1_000L,
|
.step("Take off for the final saw crossing", 1_000L,
|
||||||
LevelPlaytestBot.Input.rightJump(),
|
LevelPlaytestBot.Input.rightJump(),
|
||||||
snapshot -> snapshot.playerAlive() && snapshot.playerY() <= 680f)
|
LevelPlaytestBot.whileDeathsAtMost(3,
|
||||||
|
snapshot -> snapshot.playerAlive()
|
||||||
|
&& !snapshot.playerOnGround()
|
||||||
|
&& snapshot.playerY() <= 680f))
|
||||||
.step("Clear the saw for the final crossing", 2_000L,
|
.step("Clear the saw for the final crossing", 2_000L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerAlive() && snapshot.playerX() >= 680f)
|
LevelPlaytestBot.whileDeathsAtMost(3,
|
||||||
|
snapshot -> snapshot.playerAlive()
|
||||||
|
&& snapshot.playerX() >= 680f))
|
||||||
.step("Approach the retained lift body", 1_500L,
|
.step("Approach the retained lift body", 1_500L,
|
||||||
LevelPlaytestBot.Input.right(),
|
LevelPlaytestBot.Input.right(),
|
||||||
snapshot -> snapshot.playerX() >= 730f)
|
snapshot -> snapshot.playerX() >= 730f)
|
||||||
|
|||||||
@@ -47,6 +47,23 @@ public final class LevelPlaytestBot {
|
|||||||
boolean reached(GameView.AutomationSnapshot snapshot);
|
boolean reached(GameView.AutomationSnapshot snapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static SnapshotCondition groundedAliveAtOrBeyond(float minimumX) {
|
||||||
|
return snapshot -> snapshot.playerAlive()
|
||||||
|
&& snapshot.playerOnGround()
|
||||||
|
&& snapshot.playerX() >= minimumX;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SnapshotCondition whileDeathsAtMost(
|
||||||
|
int maximumDeaths, SnapshotCondition completion) {
|
||||||
|
return snapshot -> {
|
||||||
|
if (snapshot.deaths() > maximumDeaths) {
|
||||||
|
throw new AssertionError("Route expected at most " + maximumDeaths
|
||||||
|
+ " deaths but observed " + snapshot.deaths());
|
||||||
|
}
|
||||||
|
return completion.reached(snapshot);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public static final class Scenario {
|
public static final class Scenario {
|
||||||
private final int levelNumber;
|
private final int levelNumber;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.projectsacrifice.game;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
@@ -127,6 +128,40 @@ public final class LevelPlaytestBotTest {
|
|||||||
assertFalse(snapshot.playerOnMovingPlatform());
|
assertFalse(snapshot.playerOnMovingPlatform());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void groundedApproachWaitsForAliveGroundedPlayerAtCheckpoint() {
|
||||||
|
LevelPlaytestBot.SnapshotCondition checkpoint =
|
||||||
|
LevelPlaytestBot.groundedAliveAtOrBeyond(280f);
|
||||||
|
|
||||||
|
assertFalse(checkpoint.reached(snapshot(true, true, 279f, 1)));
|
||||||
|
assertFalse(checkpoint.reached(snapshot(false, true, 280f, 1)));
|
||||||
|
assertFalse(checkpoint.reached(snapshot(true, false, 280f, 1)));
|
||||||
|
assertTrue(checkpoint.reached(snapshot(true, true, 280f, 1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void expectedDeathGuardFailsBeforeAnAccidentalRetry() {
|
||||||
|
LevelPlaytestBot.SnapshotCondition guarded = LevelPlaytestBot.whileDeathsAtMost(
|
||||||
|
1, snapshot -> snapshot.playerX() >= 280f);
|
||||||
|
|
||||||
|
assertTrue(guarded.reached(snapshot(true, false, 320f, 1)));
|
||||||
|
try {
|
||||||
|
guarded.reached(snapshot(false, false, 470f, 2));
|
||||||
|
fail("An accidental second death must fail the route immediately");
|
||||||
|
} catch (AssertionError expected) {
|
||||||
|
assertTrue(expected.getMessage(), expected.getMessage().contains("expected at most 1"));
|
||||||
|
assertTrue(expected.getMessage(), expected.getMessage().contains("observed 2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GameView.AutomationSnapshot snapshot(
|
||||||
|
boolean alive, boolean onGround, float x, int deaths) {
|
||||||
|
return new GameView.AutomationSnapshot(
|
||||||
|
false, alive, false, false, false,
|
||||||
|
10, 0L, x, 760f, deaths, deaths,
|
||||||
|
Float.NaN, Float.NaN, false, false, Float.NaN, onGround);
|
||||||
|
}
|
||||||
|
|
||||||
private static final class ScriptedDriver implements LevelPlaytestBot.Driver {
|
private static final class ScriptedDriver implements LevelPlaytestBot.Driver {
|
||||||
private int startedLevel;
|
private int startedLevel;
|
||||||
private long nowMillis;
|
private long nowMillis;
|
||||||
|
|||||||
Reference in New Issue
Block a user