diff --git a/TODO.txt b/TODO.txt index a519958ee..a459bba7a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -202,7 +202,8 @@ * add info view on top right DONE 11/30/2024 * add info view for units DONE 11/30/2024 * add defense post -* record single player games +* use mini A* for all pathfinding +* record single player game stats * add radiation from nuke * add cities * create alternate view to show friendly & enemy units diff --git a/resources/images/ShieldIcon.png b/resources/images/ShieldIcon.png index 391902d6c..e1db2168e 100644 Binary files a/resources/images/ShieldIcon.png and b/resources/images/ShieldIcon.png differ diff --git a/src/client/graphics/layers/StructureLayer.ts b/src/client/graphics/layers/StructureLayer.ts index 110e42de8..f5e2e5674 100644 --- a/src/client/graphics/layers/StructureLayer.ts +++ b/src/client/graphics/layers/StructureLayer.ts @@ -1,4 +1,4 @@ -import { Colord } from "colord"; +import { colord, Colord } from "colord"; import { Theme } from "../../../core/configuration/Config"; import { Unit, UnitEvent, Cell, Game, Tile, UnitType } from "../../../core/game/Game"; import { bfs, dist, euclDist } from "../../../core/Util"; @@ -160,6 +160,19 @@ export class StructureLayer implements Layer { onUnitEvent(event: UnitEvent) { this.handleUnitRendering(event); + if (event.unit.type() == UnitType.DefensePost) { + if (!event.unit.isActive()) { + return + } + // Array.from( + // bfs( + // event.unit.tile(), + // dist(event.unit.tile(), this.game.config().defensePostRange()) + // ) + // ).filter(t => t.isBorder() && t.owner() == event.unit.owner()).forEach(t => { + // this.paintCell(t.cell(), colord({ r: 255, g: 255, b: 255 }), 255) + // }) + } } paintCell(cell: Cell, color: Colord, alpha: number) { diff --git a/src/client/graphics/layers/TerritoryLayer.ts b/src/client/graphics/layers/TerritoryLayer.ts index c6dfd6c31..6dbe4128c 100644 --- a/src/client/graphics/layers/TerritoryLayer.ts +++ b/src/client/graphics/layers/TerritoryLayer.ts @@ -1,7 +1,7 @@ import { PriorityQueue } from "@datastructures-js/priority-queue"; -import { Cell, Game, Player, Tile, TileEvent } from "../../../core/game/Game"; +import { Cell, Game, Player, Tile, TileEvent, UnitEvent, UnitType } from "../../../core/game/Game"; import { PseudoRandom } from "../../../core/PseudoRandom"; -import { Colord } from "colord"; +import { colord, Colord } from "colord"; import { bfs, dist } from "../../../core/Util"; import { Theme } from "../../../core/configuration/Config"; import { Layer } from "./Layer"; @@ -13,12 +13,10 @@ export class TerritoryLayer implements Layer { private context: CanvasRenderingContext2D private imageData: ImageData - private tileToRenderQueue: PriorityQueue<{ tileEvent: TileEvent, lastUpdate: number }> = new PriorityQueue((a, b) => { return a.lastUpdate - b.lastUpdate }) + private tileToRenderQueue: PriorityQueue<{ tile: Tile, lastUpdate: number }> = new PriorityQueue((a, b) => { return a.lastUpdate - b.lastUpdate }) private random = new PseudoRandom(123) private theme: Theme = null - - constructor(private game: Game, eventBus: EventBus) { this.theme = game.config().theme() eventBus.on(TileEvent, e => this.tileUpdate(e)) @@ -70,9 +68,9 @@ export class TerritoryLayer implements Layer { while (numToRender > 0) { numToRender-- - const event = this.tileToRenderQueue.pop().tileEvent - this.paintTerritory(event.tile) - event.tile.neighbors().forEach(t => this.paintTerritory(t)) + const tile = this.tileToRenderQueue.pop().tile + this.paintTerritory(tile) + tile.neighbors().forEach(t => this.paintTerritory(t)) } } @@ -83,11 +81,19 @@ export class TerritoryLayer implements Layer { } const owner = tile.owner() as Player if (tile.isBorder()) { - this.paintCell( - tile.cell(), - this.theme.borderColor(owner.info()), - 255 - ) + if (tile.defenseBonuses().filter(db => db.unit.owner() == owner).length > 0) { + this.paintCell( + tile.cell(), + colord({ r: 0, g: 0, b: 0 }), + 255 + ) + } else { + this.paintCell( + tile.cell(), + this.theme.borderColor(owner.info()), + 255 + ) + } } else { this.paintCell( tile.cell(), @@ -112,7 +118,17 @@ export class TerritoryLayer implements Layer { this.imageData.data[offset + 3] = 0; // Set alpha to 0 (fully transparent) } + unitEvent(event: UnitEvent) { + if (event.unit.type() == UnitType.DefensePost) { + bfs(event.unit.tile(), dist(event.unit.tile(), this.game.config().defensePostRange())).forEach(t => this.enqueue(t)) + } + } + tileUpdate(event: TileEvent) { - this.tileToRenderQueue.push({ tileEvent: event, lastUpdate: this.game.ticks() + this.random.nextFloat(0, .5) }) + this.enqueue(event.tile) + } + + enqueue(tile: Tile) { + this.tileToRenderQueue.push({ tile: tile, lastUpdate: this.game.ticks() + this.random.nextFloat(0, .5) }) } } \ No newline at end of file diff --git a/src/client/index.html b/src/client/index.html index 6727c65b3..186f72409 100644 --- a/src/client/index.html +++ b/src/client/index.html @@ -28,7 +28,7 @@