From 975750b2942a8ef6e4544afc5b265ade9b539cdc Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 10 Nov 2024 19:50:57 -0800 Subject: [PATCH] destroyer moves upwards --- src/client/graphics/layers/UnitLayer.ts | 10 ++- src/core/Util.ts | 4 ++ src/core/execution/DestroyerExecution.ts | 2 + src/core/execution/ExecutionManager.ts | 90 +++++++++++++----------- src/core/game/Game.ts | 2 +- 5 files changed, 64 insertions(+), 44 deletions(-) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index ae0be9338..c2faf248e 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -1,7 +1,7 @@ import { Colord } from "colord"; import { Theme } from "../../../core/configuration/Config"; import { Unit, UnitEvent, Cell, Game, Tile, UnitType } from "../../../core/game/Game"; -import { bfs, dist } from "../../../core/Util"; +import { bfs, dist, euclDist } from "../../../core/Util"; import { Layer } from "./Layer"; import { EventBus } from "../../../core/EventBus"; @@ -72,7 +72,13 @@ export class UnitLayer implements Layer { } private handleDestroyerEvent(event: UnitEvent) { - + bfs(event.oldTile, euclDist(event.oldTile, 3)).forEach(t => { + this.clearCell(t.cell()) + }) + bfs(event.unit.tile(), euclDist(event.unit.tile(), 3)) + .forEach(t => this.paintCell(t.cell(), this.theme.borderColor(event.unit.owner().info()), 255)) + bfs(event.unit.tile(), euclDist(event.unit.tile(), 2)) + .forEach(t => this.paintCell(t.cell(), this.theme.territoryColor(event.unit.owner().info()), 180)) } private handleBoatEvent(event: UnitEvent) { diff --git a/src/core/Util.ts b/src/core/Util.ts index 0f60c874e..f4e500ab7 100644 --- a/src/core/Util.ts +++ b/src/core/Util.ts @@ -30,6 +30,10 @@ export function within(value: number, min: number, max: number): number { return Math.min(Math.max(value, min), max); } +export function euclDist(root: Tile, dist: number): (tile: Tile) => boolean { + return (n: Tile) => euclideanDist(root.cell(), n.cell()) <= dist; +} + export function dist(root: Tile, dist: number): (tile: Tile) => boolean { return (n: Tile) => manhattanDist(root.cell(), n.cell()) <= dist; } diff --git a/src/core/execution/DestroyerExecution.ts b/src/core/execution/DestroyerExecution.ts index 621dbdca7..22267293a 100644 --- a/src/core/execution/DestroyerExecution.ts +++ b/src/core/execution/DestroyerExecution.ts @@ -21,7 +21,9 @@ export class DestroyerExecution implements Execution { tick(ticks: number): void { if (this.destroyer == null) { this.destroyer = this._owner.addUnit(UnitType.Destroyer, 0, this.mg.tile(this.cell)) + return } + this.destroyer.move(this.destroyer.tile().neighbors()[0]) } owner(): MutablePlayer { diff --git a/src/core/execution/ExecutionManager.ts b/src/core/execution/ExecutionManager.ts index d3a272ee2..49575021e 100644 --- a/src/core/execution/ExecutionManager.ts +++ b/src/core/execution/ExecutionManager.ts @@ -16,6 +16,7 @@ import { EmojiExecution } from "./EmojiExecution"; import { DonateExecution } from "./DonateExecution"; import { NukeExecution } from "./NukeExecution"; import { SetTargetTroopRatioExecution } from "./SetTargetTroopRatioExecution"; +import { DestroyerExecution } from "./DestroyerExecution"; @@ -36,50 +37,57 @@ export class Executor { } createExec(intent: Intent): Execution { - if (intent.type == "attack") { - const source: Cell | null = intent.sourceX != null && intent.sourceY != null ? new Cell(intent.sourceX, intent.sourceY) : null - const target: Cell | null = intent.targetX != null && intent.targetY != null ? new Cell(intent.targetX, intent.targetY) : null - return new AttackExecution( - intent.troops, - intent.attackerID, - intent.targetID, - source, - target, - ) - } else if (intent.type == "spawn") { - return new SpawnExecution( - new PlayerInfo(sanitize(intent.name), intent.playerType, intent.clientID, intent.playerID), - new Cell(intent.x, intent.y) - ) - } else if (intent.type == "boat") { - return new TransportShipExecution( - intent.attackerID, - intent.targetID, - new Cell(intent.x, intent.y), - intent.troops - ) - } else if (intent.type == "allianceRequest") { - return new AllianceRequestExecution(intent.requestor, intent.recipient) - } else if (intent.type == "allianceRequestReply") { - return new AllianceRequestReplyExecution(intent.requestor, intent.recipient, intent.accept) - } else if (intent.type == "breakAlliance") { - return new BreakAllianceExecution(intent.requestor, intent.recipient) - } else if (intent.type == "targetPlayer") { - return new TargetPlayerExecution(intent.requestor, intent.target) - } else if (intent.type == "emoji") { - return new EmojiExecution(intent.sender, intent.recipient, intent.emoji) - } else if (intent.type == "donate") { - return new DonateExecution(intent.sender, intent.recipient, intent.troops) - } else if (intent.type == "nuke") { - return new NukeExecution(intent.sender, new Cell(intent.x, intent.y), intent.magnitude) - } else if (intent.type == "troop_ratio") { - return new SetTargetTroopRatioExecution(intent.player, intent.ratio) - } else { - throw new Error(`intent type ${intent} not found`) + switch (intent.type) { + case "attack": { + const source: Cell | null = intent.sourceX != null && intent.sourceY != null + ? new Cell(intent.sourceX, intent.sourceY) + : null; + const target: Cell | null = intent.targetX != null && intent.targetY != null + ? new Cell(intent.targetX, intent.targetY) + : null; + return new AttackExecution( + intent.troops, + intent.attackerID, + intent.targetID, + source, + target, + ); + } + case "spawn": + return new SpawnExecution( + new PlayerInfo(sanitize(intent.name), intent.playerType, intent.clientID, intent.playerID), + new Cell(intent.x, intent.y) + ); + case "boat": + return new TransportShipExecution( + intent.attackerID, + intent.targetID, + new Cell(intent.x, intent.y), + intent.troops + ); + case "allianceRequest": + return new AllianceRequestExecution(intent.requestor, intent.recipient); + case "allianceRequestReply": + return new AllianceRequestReplyExecution(intent.requestor, intent.recipient, intent.accept); + case "breakAlliance": + return new BreakAllianceExecution(intent.requestor, intent.recipient); + case "targetPlayer": + return new TargetPlayerExecution(intent.requestor, intent.target); + case "emoji": + return new EmojiExecution(intent.sender, intent.recipient, intent.emoji); + case "donate": + return new DonateExecution(intent.sender, intent.recipient, intent.troops); + case "nuke": + return new NukeExecution(intent.sender, new Cell(intent.x, intent.y), intent.magnitude); + case "troop_ratio": + return new SetTargetTroopRatioExecution(intent.player, intent.ratio); + case "create_destroyer": + return new DestroyerExecution(intent.player, new Cell(intent.x, intent.y)) + default: + throw new Error(`intent type ${intent} not found`); } } - spawnBots(numBots: number): Execution[] { return new BotSpawner(this.gs, this.gameID).spawnBots(numBots).map(i => this.createExec(i)) } diff --git a/src/core/game/Game.ts b/src/core/game/Game.ts index 19a773b12..7a20e73cd 100644 --- a/src/core/game/Game.ts +++ b/src/core/game/Game.ts @@ -36,7 +36,7 @@ export class Item { export const Items = { Nuke: new Item("Nuke", 1_000_000), - Destroyer: new Item("Destroyer", 100_000) + Destroyer: new Item("Destroyer", 10) } as const; export class Nation {