mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-02 19:28:09 +00:00
35 lines
1.3 KiB
TypeScript
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
|
|
}
|
|
} |