mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-23 02:05:40 +00:00
remove BuildValidator
This commit is contained in:
@@ -1,9 +1,4 @@
|
||||
import { BuildValidator } from "../game/BuildValidator";
|
||||
import { AllPlayers, Cell, Execution, MutableGame, MutablePlayer, MutableUnit, Player, PlayerID, Tile, Unit, UnitType } from "../game/Game";
|
||||
import { AStar, PathFinder } from "../PathFinding";
|
||||
import { PseudoRandom } from "../PseudoRandom";
|
||||
import { bfs, dist, manhattanDist } from "../Util";
|
||||
import { TradeShipExecution } from "./TradeShipExecution";
|
||||
import { Cell, Execution, MutableGame, MutablePlayer, MutableUnit, Player, PlayerID, Tile, Unit, UnitType } from "../game/Game";
|
||||
|
||||
export class MissileSiloExecution implements Execution {
|
||||
|
||||
@@ -26,7 +21,7 @@ export class MissileSiloExecution implements Execution {
|
||||
tick(ticks: number): void {
|
||||
if (this.silo == null) {
|
||||
const tile = this.mg.tile(this.cell)
|
||||
if (!new BuildValidator(this.mg).canBuild(this.player, tile, UnitType.MissileSilo)) {
|
||||
if (!this.player.canBuild(UnitType.MissileSilo, tile)) {
|
||||
console.warn(`player ${this.player} cannot build port at ${this.cell}`)
|
||||
this.active = false
|
||||
return
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { BuildValidator } from "../game/BuildValidator";
|
||||
import { Cell, Execution, MutableGame, MutablePlayer, PlayerID, Tile, MutableUnit, UnitType } from "../game/Game";
|
||||
import { PathFinder } from "../PathFinding";
|
||||
import { PseudoRandom } from "../PseudoRandom";
|
||||
@@ -35,7 +34,7 @@ export class NukeExecution implements Execution {
|
||||
|
||||
tick(ticks: number): void {
|
||||
if (this.nuke == null) {
|
||||
if (new BuildValidator(this.mg).canBuild(this.player, this.dst, UnitType.Nuke)) {
|
||||
if (this.player.canBuild(UnitType.Nuke, this.dst)) {
|
||||
const spawn = this.player.units(UnitType.MissileSilo)
|
||||
.sort((a, b) => manhattanDist(a.tile().cell(), this.cell) - manhattanDist(b.tile().cell(), this.cell))[0]
|
||||
this.nuke = this.player.buildUnit(UnitType.Nuke, 0, spawn.tile())
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { BuildValidator } from "../game/BuildValidator";
|
||||
import { AllPlayers, Cell, Execution, MutableGame, MutablePlayer, MutableUnit, Player, PlayerID, Tile, Unit, UnitType } from "../game/Game";
|
||||
import { AStar, PathFinder } from "../PathFinding";
|
||||
import { PseudoRandom } from "../PseudoRandom";
|
||||
@@ -30,7 +29,7 @@ export class PortExecution implements Execution {
|
||||
tick(ticks: number): void {
|
||||
if (this.port == null) {
|
||||
const tile = this.mg.tile(this.cell)
|
||||
if (!new BuildValidator(this.mg).canBuild(this.player, tile, UnitType.Port)) {
|
||||
if (!this.player.canBuild(UnitType.Port, tile)) {
|
||||
console.warn(`player ${this.player} cannot build port at ${this.cell}`)
|
||||
this.active = false
|
||||
return
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { BuildValidator } from "../game/BuildValidator";
|
||||
import { AllPlayers, Cell, Execution, MutableGame, MutablePlayer, MutableUnit, Player, PlayerID, Tile, Unit, UnitType } from "../game/Game";
|
||||
import { AStar, PathFinder } from "../PathFinding";
|
||||
import { PseudoRandom } from "../PseudoRandom";
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
import { bfs, dist, manhattanDist } from "../Util";
|
||||
import { Game, Player, Tile, UnitType } from "./Game";
|
||||
|
||||
export class BuildValidator {
|
||||
constructor(private game: Game) { }
|
||||
|
||||
canBuild(player: Player, tile: Tile, unitType: UnitType): boolean {
|
||||
const cost = this.game.unitInfo(unitType).cost
|
||||
if (!player.isAlive() || player.gold() < cost) {
|
||||
return false
|
||||
}
|
||||
switch (unitType) {
|
||||
case UnitType.Nuke:
|
||||
return player.units(UnitType.MissileSilo).length > 0
|
||||
case UnitType.Port:
|
||||
return this.canBuildPort(player, tile)
|
||||
case UnitType.Destroyer:
|
||||
return this.canBuildDestroyer(player, tile)
|
||||
case UnitType.MissileSilo:
|
||||
return tile.owner() == player
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -213,6 +213,8 @@ export interface Player {
|
||||
// Number between 0, 1
|
||||
targetTroopRatio(): number
|
||||
troops(): number
|
||||
|
||||
canBuild(type: UnitType, tile: Tile): boolean
|
||||
}
|
||||
|
||||
export interface MutablePlayer extends Player {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { MutablePlayer, Tile, PlayerInfo, PlayerID, PlayerType, Player, TerraNullius, Cell, Execution, AllianceRequest, MutableAllianceRequest, MutableAlliance, Alliance, Tick, TargetPlayerEvent, EmojiMessage, EmojiMessageEvent, AllPlayers, Gold, UnitType } from "./Game";
|
||||
import { ClientID } from "../Schemas";
|
||||
import { processName, simpleHash } from "../Util";
|
||||
import { bfs, dist, manhattanDist, processName, simpleHash } from "../Util";
|
||||
import { CellString, GameImpl } from "./GameImpl";
|
||||
import { UnitImpl } from "./UnitImpl";
|
||||
import { TileImpl } from "./TileImpl";
|
||||
@@ -324,6 +324,32 @@ export class PlayerImpl implements MutablePlayer {
|
||||
return toRemove
|
||||
}
|
||||
|
||||
canBuild(unitType: UnitType, tile: Tile): boolean {
|
||||
const cost = this.gs.unitInfo(unitType).cost
|
||||
if (!this.isAlive() || this.gold() < cost) {
|
||||
return false
|
||||
}
|
||||
switch (unitType) {
|
||||
case UnitType.Nuke:
|
||||
return this.units(UnitType.MissileSilo).length > 0
|
||||
case UnitType.Port:
|
||||
return this.canBuildPort(tile)
|
||||
case UnitType.Destroyer:
|
||||
return this.canBuildDestroyer(tile)
|
||||
case UnitType.MissileSilo:
|
||||
return tile.owner() == this
|
||||
}
|
||||
}
|
||||
|
||||
canBuildPort(tile: Tile): boolean {
|
||||
return Array.from(bfs(tile, dist(tile, 20)))
|
||||
.filter(t => t.owner() == this && t.isOceanShore()).length > 0
|
||||
}
|
||||
|
||||
canBuildDestroyer(tile: Tile): boolean {
|
||||
return this.units(UnitType.Port)
|
||||
.filter(u => manhattanDist(u.tile().cell(), tile.cell()) < this.gs.config().boatMaxDistance()).length > 0
|
||||
}
|
||||
|
||||
hash(): number {
|
||||
return simpleHash(this.id()) * (this.population() + this.numTilesOwned());
|
||||
|
||||
Reference in New Issue
Block a user