Files
OpenFrontIO/tests/core/executions/MIRVExecution.test.ts
T
Restart2008 4d924ef8d1 Fix: Standardize MIRV travel time
Addresses player report regarding unfair and unintuitive MIRV launch delays.
MIRV travel time is now fixed at 5 ticks, independent of click location.

- Modified MIRVExecution.ts to dynamically calculate speed based on a fixed travel time.
- Added MIRVExecution.test.ts to verify the fixed travel time.
2025-10-25 20:51:30 -07:00

70 lines
1.9 KiB
TypeScript

import { MirvExecution } from "../../../src/core/execution/MIRVExecution";
import { SpawnExecution } from "../../../src/core/execution/SpawnExecution";
import {
Game,
Player,
PlayerInfo,
PlayerType,
UnitType,
} from "../../../src/core/game/Game";
import { TileRef } from "../../../src/core/game/GameMap";
import { setup } from "../../util/Setup";
import { constructionExecution, executeTicks } from "../../util/utils";
let game: Game;
let player: Player;
describe("MirvExecution", () => {
beforeEach(async () => {
game = await setup("plains", { infiniteGold: true, instantBuild: true });
const playerInfo = new PlayerInfo(
"player_id",
PlayerType.Human,
null,
"player_id",
);
game.addPlayer(playerInfo);
game.addExecution(
new SpawnExecution(game.player(playerInfo.id).info(), game.ref(1, 1)),
);
while (game.inSpawnPhase()) {
game.executeNextTick();
}
player = game.player("player_id");
constructionExecution(game, player, 1, 1, UnitType.MissileSilo);
});
test("MIRV should have a fixed travel time regardless of target distance", async () => {
const nearTarget = game.ref(5, 5);
const farTarget = game.ref(50, 50);
const mirvNear = new MirvExecution(player, nearTarget);
game.addExecution(mirvNear);
const mirvFar = new MirvExecution(player, farTarget);
game.addExecution(mirvFar);
// Execute ticks until both MIRVs have landed
let ticksNear = 0;
let ticksFar = 0;
while (mirvNear.isActive() || mirvFar.isActive()) {
game.executeNextTick();
if (mirvNear.isActive()) {
ticksNear++;
}
if (mirvFar.isActive()) {
ticksFar++;
}
}
// The travel times should be approximately the same
// Allowing for a small margin of error due to pathfinding or tick execution nuances
const tolerance = 2; // Ticks
expect(Math.abs(ticksNear - ticksFar)).toBeLessThanOrEqual(tolerance);
});
});