From 330b6b93cb199022f43ebb826aadd3dcd2547acb Mon Sep 17 00:00:00 2001 From: evanpelle Date: Mon, 2 Dec 2024 07:51:01 -0800 Subject: [PATCH] finish defense post --- TODO.txt | 8 +++++++- src/client/graphics/layers/TerritoryLayer.ts | 2 +- src/core/configuration/Config.ts | 1 + src/core/configuration/DefaultConfig.ts | 2 +- src/core/configuration/DevConfig.ts | 6 +++--- src/core/configuration/PastelTheme.ts | 9 +++++++++ src/core/game/GameImpl.ts | 4 ++-- src/core/game/TileImpl.ts | 4 ++++ src/core/pathfinding/AStar.ts | 3 ++- src/core/pathfinding/MiniAStar.ts | 2 +- 10 files changed, 31 insertions(+), 10 deletions(-) diff --git a/TODO.txt b/TODO.txt index 7b411b5a7..bf2a93a70 100644 --- a/TODO.txt +++ b/TODO.txt @@ -202,12 +202,18 @@ * add info view on top right DONE 11/30/2024 * add info view for units DONE 11/30/2024 * add defense post -* bugfix: destroyers can't find path to dest and freeze +* bugfix: when thread doesn't complete computation, do it in main +* bugfix: destroyers can't find path to dst and freeze * bugfix: when trade ships captured don't render +* bugfix: gameStop not found error * use mini A* for all pathfinding +* log stack traces & display them on screen +* record and replay games for debugging purposes * record single player game stats * add radiation from nuke * add cities +* create behavior tests +* create perf test * create alternate view to show friendly & enemy units * spread out calculate clusters * NPC has relations diff --git a/src/client/graphics/layers/TerritoryLayer.ts b/src/client/graphics/layers/TerritoryLayer.ts index 1b5a7f229..7a2edac37 100644 --- a/src/client/graphics/layers/TerritoryLayer.ts +++ b/src/client/graphics/layers/TerritoryLayer.ts @@ -84,7 +84,7 @@ export class TerritoryLayer implements Layer { if (tile.defenseBonuses().filter(db => db.unit.owner() == owner).length > 0) { this.paintCell( tile.cell(), - colord({ r: 0, g: 0, b: 0 }), + this.theme.defendedBorderColor(owner.info()), 255 ) } else { diff --git a/src/core/configuration/Config.ts b/src/core/configuration/Config.ts index 99a39cfe2..88cabcffd 100644 --- a/src/core/configuration/Config.ts +++ b/src/core/configuration/Config.ts @@ -68,6 +68,7 @@ export interface Theme { playerInfoColor(id: PlayerID): Colord; territoryColor(playerInfo: PlayerInfo): Colord; borderColor(playerInfo: PlayerInfo): Colord; + defendedBorderColor(playerInfo: PlayerInfo): Colord; terrainColor(tile: Tile): Colord; backgroundColor(): Colord; font(): string; diff --git a/src/core/configuration/DefaultConfig.ts b/src/core/configuration/DefaultConfig.ts index 085329574..24d81ac72 100644 --- a/src/core/configuration/DefaultConfig.ts +++ b/src/core/configuration/DefaultConfig.ts @@ -8,7 +8,7 @@ import { pastelTheme } from "./PastelTheme"; export class DefaultConfig implements Config { defensePostRange(): number { - return 20 + return 30 } defensePostDefenseBonus(): number { return 3 diff --git a/src/core/configuration/DevConfig.ts b/src/core/configuration/DevConfig.ts index 77e7d0344..d72b57aa3 100644 --- a/src/core/configuration/DevConfig.ts +++ b/src/core/configuration/DevConfig.ts @@ -5,7 +5,7 @@ export const devConfig = new class extends DefaultConfig { unitInfo(type: UnitType): UnitInfo { const info = super.unitInfo(type) const oldCost = info.cost - info.cost = (p: Player) => oldCost(p) / 1000 + info.cost = (p: Player) => oldCost(p) / 100000 return info } @@ -13,8 +13,8 @@ export const devConfig = new class extends DefaultConfig { return 95 } numSpawnPhaseTurns(): number { - // return 40 - return 100 + return 40 + // return 100 } gameCreationRate(): number { return 10 * 1000 diff --git a/src/core/configuration/PastelTheme.ts b/src/core/configuration/PastelTheme.ts index 17382567b..37420f38e 100644 --- a/src/core/configuration/PastelTheme.ts +++ b/src/core/configuration/PastelTheme.ts @@ -6,6 +6,7 @@ import {PseudoRandom} from "../PseudoRandom"; import {simpleHash} from "../Util"; export const pastelTheme = new class implements Theme { + private rand = new PseudoRandom(123) private background = colord({r: 60, g: 60, b: 60}); @@ -131,6 +132,14 @@ export const pastelTheme = new class implements Theme { b: Math.max(tc.b - 40, 0) }) } + defendedBorderColor(playerInfo: PlayerInfo): Colord { + const bc = this.borderColor(playerInfo).rgba; + return colord({ + r: Math.max(bc.r - 40, 0), + g: Math.max(bc.g - 40, 0), + b: Math.max(bc.b - 40, 0) + }) + } terrainColor(tile: Tile): Colord { let mag = tile.magnitude() diff --git a/src/core/game/GameImpl.ts b/src/core/game/GameImpl.ts index 19ac3e822..fd80ca762 100644 --- a/src/core/game/GameImpl.ts +++ b/src/core/game/GameImpl.ts @@ -68,14 +68,14 @@ export class GameImpl implements MutableGame { addTileDefenseBonus(tile: Tile, unit: Unit, amount: number): DefenseBonus { const df = { unit: unit, tile: tile, amount: amount }; (tile as TileImpl)._defenseBonuses.push(df) - // this.eventBus.emit(new TileEvent(tile)) + this.eventBus.emit(new TileEvent(tile)) return df } removeTileDefenseBonus(bonus: DefenseBonus): void { const t = bonus.tile as TileImpl t._defenseBonuses = t._defenseBonuses.filter(db => db != bonus) - // this.eventBus.emit(new TileEvent(bonus.tile)) + this.eventBus.emit(new TileEvent(bonus.tile)) } units(...types: UnitType[]): UnitImpl[] { diff --git a/src/core/game/TileImpl.ts b/src/core/game/TileImpl.ts index 17e5c4142..b88923b22 100644 --- a/src/core/game/TileImpl.ts +++ b/src/core/game/TileImpl.ts @@ -20,6 +20,10 @@ export class TileImpl implements Tile { private readonly _terrain: TerrainTileImpl ) { } + terrainType(): TerrainType { + return this._terrain.type + } + defenseBonus(player: Player): number { if (this.owner() == player) { throw Error(`cannot get defense bonus of tile already owned by player`) diff --git a/src/core/pathfinding/AStar.ts b/src/core/pathfinding/AStar.ts index b00970239..8863be5bd 100644 --- a/src/core/pathfinding/AStar.ts +++ b/src/core/pathfinding/AStar.ts @@ -1,4 +1,4 @@ -import { Cell, Tile } from "../game/Game"; +import { Cell, TerrainType, Tile } from "../game/Game"; export interface AStar { compute(): PathFindResultType @@ -26,6 +26,7 @@ export interface SearchNode { cost(): number cell(): Cell neighbors(): SearchNode[] + terrainType(): TerrainType } export interface Point { x: number; diff --git a/src/core/pathfinding/MiniAStar.ts b/src/core/pathfinding/MiniAStar.ts index 1722f5cef..4cda90a52 100644 --- a/src/core/pathfinding/MiniAStar.ts +++ b/src/core/pathfinding/MiniAStar.ts @@ -21,7 +21,7 @@ export class MiniAStar implements AStar { this.aStar = new SerialAStar( miniSrc, miniDst, - (t => (t as TerrainTile).terrainType() == TerrainType.Ocean), + canMove, iterations, maxTries )