import { Game, Player, PlayerInfo, PlayerType, UnitType, } from "../src/core/game/Game"; import { setup } from "./util/Setup"; let game: Game; let player: Player; let other: Player; describe("PlayerImpl", () => { beforeEach(async () => { game = await setup( "plains", { instantBuild: true, }, [ new PlayerInfo("player", PlayerType.Human, null, "player_id"), new PlayerInfo("other", PlayerType.Human, null, "other_id"), ], ); while (game.inSpawnPhase()) { game.executeNextTick(); } player = game.player("player_id"); player.addGold(BigInt(1000000)); other = game.player("other_id"); game.config().structureMinDist = () => 10; }); test("City can be upgraded", () => { const city = player.buildUnit(UnitType.City, game.ref(0, 0), {}); const buCity = player .buildableUnits(game.ref(0, 0)) .find((bu) => bu.type === UnitType.City); expect(buCity).toBeDefined(); expect(buCity!.canUpgrade).toBe(city.id()); }); test("DefensePost cannot be upgraded", () => { player.buildUnit(UnitType.DefensePost, game.ref(0, 0), {}); const buDefensePost = player .buildableUnits(game.ref(0, 0)) .find((bu) => bu.type === UnitType.DefensePost); expect(buDefensePost).toBeDefined(); expect(buDefensePost!.canUpgrade).toBeFalsy(); }); test("City can be upgraded from another city", () => { const city = player.buildUnit(UnitType.City, game.ref(0, 0), {}); const cityToUpgrade = player.findUnitToUpgrade( UnitType.City, game.ref(0, 1), ); expect(cityToUpgrade).toBeTruthy(); if (cityToUpgrade === false) { return; } expect(cityToUpgrade.id()).toBe(city.id()); }); test("City cannot be upgraded when too far away", () => { player.buildUnit(UnitType.City, game.ref(0, 0), {}); const cityToUpgrade = player.findUnitToUpgrade( UnitType.City, game.ref(50, 50), ); expect(cityToUpgrade).toBe(false); }); test("Unit cannot be upgraded when not enough gold", () => { player.buildUnit(UnitType.City, game.ref(0, 0), {}); player.removeGold(BigInt(1000000)); const cityToUpgrade = player.findUnitToUpgrade( UnitType.City, game.ref(0, 1), ); expect(cityToUpgrade).toBe(false); }); test("Destination ports chances scale with level", () => { game.config().proximityBonusPortsNb = () => 0; player.conquer(game.ref(10, 10)); const playerPort = player.buildUnit(UnitType.Port, game.ref(10, 10), {}); other.conquer(game.ref(0, 0)); const otherPort = other.buildUnit(UnitType.Port, game.ref(0, 0), {}); otherPort.increaseLevel(); otherPort.increaseLevel(); const ports = player.tradingPorts(playerPort); expect(ports.length).toBe(3); }); test("Can't send alliance requests when dead", () => { // conquer other const otherTiles = other.tiles(); for (const tile of otherTiles) { player.conquer(tile); } expect(other.canSendAllianceRequest(player)).toBe(false); }); });