Устранить нагрузочные флаки финальной матрицы

This commit is contained in:
2026-08-18 18:58:27 +03:00
parent 9d792bdee4
commit fa68e2e04a
4 changed files with 31 additions and 4 deletions
@@ -17,7 +17,8 @@ final class LateLevelScenarios {
LevelPlaytestBot.Input.rightJump(),
snapshot -> snapshot.playerX() >= 640f)
.step("Stand on the frozen block", 2_500L, LevelPlaytestBot.Input.none(),
snapshot -> snapshot.playerX() >= 626f
snapshot -> snapshot.playerOnGround()
&& snapshot.playerX() >= 626f
&& snapshot.playerY() >= 668f
&& snapshot.playerY() <= 690f)
.step("Land on the first ledge from the frozen block", 3_000L,
@@ -277,7 +278,8 @@ final class LateLevelScenarios {
&& (snapshot.playerOnMovingPlatform()
|| (snapshot.playerY() >= 770f
&& !Float.isNaN(snapshot.firstMovingPlatformY())
&& snapshot.firstMovingPlatformY() >= 780f)))
&& snapshot.firstMovingPlatformY() >= 750f
&& snapshot.firstMovingPlatformMovingDown())))
.step("Take off toward the moving lift", 1_000L,
LevelPlaytestBot.Input.rightJump(),
snapshot -> snapshot.playerAlive()
@@ -285,7 +287,8 @@ final class LateLevelScenarios {
|| snapshot.playerY() <= 670f))
.step("Board the moving lift", 2_000L,
LevelPlaytestBot.Input.right(),
GameView.AutomationSnapshot::playerOnMovingPlatform)
LevelPlaytestBot.whileDeathsAtMost(3,
GameView.AutomationSnapshot::playerOnMovingPlatform))
.step("Brake toward the lift center", 1_000L,
LevelPlaytestBot.Input.left(),
snapshot -> snapshot.playerOnMovingPlatform()
@@ -69,7 +69,7 @@ public final class EarlyLevelScenarios {
.step("Approach the saw", 3_000L, LevelPlaytestBot.Input.right(),
LevelPlaytestBot.whileDeathsAtMost(1, snapshot -> snapshot.playerAlive()
&& snapshot.playerOnGround()
&& snapshot.playerX() >= 390f))
&& snapshot.playerX() >= 360f))
.step("Take off before the saw", 1_000L, LevelPlaytestBot.Input.rightJump(),
LevelPlaytestBot.whileDeathsAtMost(1, snapshot -> snapshot.playerAlive()
&& !snapshot.playerOnGround()
@@ -60,6 +60,7 @@ public final class GameView extends View implements Runnable {
private final boolean playerOnMovingPlatform;
private final boolean firstMovingPlatformPowered;
private final boolean firstMovingPlatformMovingRight;
private final boolean firstMovingPlatformMovingDown;
private final float firstCorpseX;
private final boolean playerOnGround;
@@ -95,6 +96,23 @@ public final class GameView extends View implements Runnable {
boolean firstMovingPlatformPowered,
boolean firstMovingPlatformMovingRight, float firstCorpseX,
boolean playerOnGround) {
this(completed, playerAlive, allDoorsOpen, visiblyPaused, inputActive, levelNumber,
elapsedMilliseconds, playerX, playerY, deaths, corpseCount,
firstMovingPlatformX, firstMovingPlatformY, playerOnMovingPlatform,
firstMovingPlatformPowered, firstMovingPlatformMovingRight, false,
firstCorpseX, playerOnGround);
}
AutomationSnapshot(boolean completed, boolean playerAlive, boolean allDoorsOpen,
boolean visiblyPaused, boolean inputActive, int levelNumber,
long elapsedMilliseconds,
float playerX, float playerY, int deaths, int corpseCount,
float firstMovingPlatformX, float firstMovingPlatformY,
boolean playerOnMovingPlatform,
boolean firstMovingPlatformPowered,
boolean firstMovingPlatformMovingRight,
boolean firstMovingPlatformMovingDown, float firstCorpseX,
boolean playerOnGround) {
this.completed = completed;
this.playerAlive = playerAlive;
this.allDoorsOpen = allDoorsOpen;
@@ -111,6 +129,7 @@ public final class GameView extends View implements Runnable {
this.playerOnMovingPlatform = playerOnMovingPlatform;
this.firstMovingPlatformPowered = firstMovingPlatformPowered;
this.firstMovingPlatformMovingRight = firstMovingPlatformMovingRight;
this.firstMovingPlatformMovingDown = firstMovingPlatformMovingDown;
this.firstCorpseX = firstCorpseX;
this.playerOnGround = playerOnGround;
}
@@ -131,6 +150,7 @@ public final class GameView extends View implements Runnable {
public boolean playerOnMovingPlatform() { return playerOnMovingPlatform; }
public boolean firstMovingPlatformPowered() { return firstMovingPlatformPowered; }
public boolean firstMovingPlatformMovingRight() { return firstMovingPlatformMovingRight; }
public boolean firstMovingPlatformMovingDown() { return firstMovingPlatformMovingDown; }
public float firstCorpseX() { return firstCorpseX; }
public boolean playerOnGround() { return playerOnGround; }
}
@@ -1977,12 +1997,14 @@ public final class GameView extends View implements Runnable {
float firstMovingPlatformY = Float.NaN;
boolean firstMovingPlatformPowered = false;
boolean firstMovingPlatformMovingRight = false;
boolean firstMovingPlatformMovingDown = false;
for (PlatformState state : platformStates) {
if (state.definition.isMoving()) {
firstMovingPlatformX = state.x;
firstMovingPlatformY = state.y;
firstMovingPlatformPowered = signalActive(state.definition.controlId);
firstMovingPlatformMovingRight = state.x > state.previousX;
firstMovingPlatformMovingDown = state.y > state.previousY;
break;
}
}
@@ -2007,6 +2029,7 @@ public final class GameView extends View implements Runnable {
playerOnMovingPlatform,
firstMovingPlatformPowered,
firstMovingPlatformMovingRight,
firstMovingPlatformMovingDown,
corpses.isEmpty() ? Float.NaN : corpses.get(0).x,
player.onGround
);
@@ -137,6 +137,7 @@ public final class LevelPlaytestBotTest {
assertTrue(Float.isNaN(snapshot.firstMovingPlatformY()));
assertFalse(snapshot.playerOnMovingPlatform());
assertFalse(snapshot.firstMovingPlatformMovingDown());
}
@Test