mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-02 11:18:12 +00:00
4d924ef8d1
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.
70 lines
1.9 KiB
TypeScript
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);
|
|
});
|
|
});
|