add logic break alliance. break alliance makes you traitor

This commit is contained in:
evanpelle
2024-09-18 19:37:26 -07:00
parent bdbe1b759c
commit e6d509b66c
6 changed files with 51 additions and 6 deletions
+3 -3
View File
@@ -128,7 +128,6 @@ export interface Player {
boats(): Boat[]
ownsTile(cell: Cell): boolean
isAlive(): boolean
executions(): ExecutionView[]
borderTiles(): ReadonlySet<Tile>
isPlayer(): this is Player
neighbors(): (Player | TerraNullius)[]
@@ -140,6 +139,7 @@ export interface Player {
alliances(): Alliance[]
alliedWith(other: Player): boolean
pendingAllianceRequestWith(other: Player): boolean
isTraitor(): boolean
toString(): string
}
@@ -156,6 +156,7 @@ export interface MutablePlayer extends Player {
incomingAllianceRequests(): MutableAllianceRequest[]
outgoingAllianceRequests(): MutableAllianceRequest[]
alliances(): MutableAlliance[]
breakAllianceWith(other: Player): void
addBoat(troops: number, tile: Tile, target: Player | TerraNullius): MutableBoat
}
@@ -185,8 +186,7 @@ export interface MutableGame extends Game {
players(): MutablePlayer[]
addPlayer(playerInfo: PlayerInfo, troops: number): MutablePlayer
executions(): Execution[]
removeInactiveExecutions(): void
removeExecution(exec: Execution): void
// todo move to player.
createAllianceRequest(requestor: Player, recipient: Player): MutableAllianceRequest
}
+10
View File
@@ -316,4 +316,14 @@ export class GameImpl implements MutableGame {
this.eventBus.emit(new BoatEvent(boat, oldTile))
}
public breakAlliance(breaker: Player, other: Player) {
const breakerSet = new Set(breaker.alliances())
const alliances = other.alliances().filter(a => breakerSet.has(a))
if (alliances.length != 1) {
throw new Error('must have exactly one alliance')
}
this.alliances_ = this.alliances_.filter(a => a != alliances[0])
// TODO emit event.
}
}
+14
View File
@@ -5,9 +5,12 @@ import {CellString, GameImpl} from "./GameImpl";
import {BoatImpl} from "./BoatImpl";
import {TileImpl} from "./TileImpl";
import {TerraNulliusImpl} from "./TerraNulliusImpl";
import {threadId} from "worker_threads";
export class PlayerImpl implements MutablePlayer {
private isTraitor_ = false
public _borderTiles: Set<Tile> = new Set();
public _boats: BoatImpl[] = [];
@@ -130,6 +133,17 @@ export class PlayerImpl implements MutablePlayer {
}
isTraitor(): boolean {
return this.isTraitor_
}
breakAllianceWith(other: Player): void {
if (!this.alliedWith(other)) {
throw new Error('cannot break alliance, already allied')
}
this.isTraitor_ = true
this.gs.breakAlliance(this, other)
}
hash(): number {
return simpleHash(this.id()) * (this.troops() + this.numTilesOwned());