Files
OpenFrontIO/src/core/game/BuildValidator.ts
T
2024-11-16 13:48:33 -08:00

35 lines
1.3 KiB
TypeScript

import { bfs, dist, manhattanDist } from "../Util";
import { BuildItem, BuildItems, Game, Player, Tile, UnitType } from "./Game";
export class BuildValidator {
constructor(private game: Game) { }
canBuild(player: Player, tile: Tile, item: BuildItem): boolean {
if (!player.isAlive() || player.gold() < item.cost) {
return false
}
switch (item) {
case BuildItems.Nuke:
return player.units(UnitType.MissileSilo).length > 0
case BuildItems.Port:
return this.canBuildPort(player, tile)
case BuildItems.Destroyer:
return this.canBuildDestroyer(player, tile)
case BuildItems.MissileSilo:
return tile.owner() == player
default:
throw Error(`item ${item.type} not supported`)
}
}
canBuildPort(player: Player, tile: Tile): boolean {
return Array.from(bfs(tile, dist(tile, 20)))
.filter(t => t.owner() == player && t.isOceanShore()).length > 0
}
canBuildDestroyer(player: Player, tile: Tile): boolean {
return player.units(UnitType.Port)
.filter(u => manhattanDist(u.tile().cell(), tile.cell()) < this.game.config().boatMaxDistance()).length > 0
}
}