add radiation

This commit is contained in:
evanpelle
2024-12-04 13:21:35 -08:00
parent 5abe60070b
commit 5c51655eca
9 changed files with 158 additions and 112 deletions
+1 -1
View File
@@ -207,10 +207,10 @@
* use mini A* for all pathfinding DONE 12/3/2024
* bugfix: gameStop not found error DONE 12/3/2024
* log stack traces & display them on screen DONE 12/3/2024
* add radiation from nuke
* record and replay games for debugging purposes
* bugfix: destroyers can't find path to dst and freeze
* record single player game stats
* add radiation from nuke
* add cities
* create behavior tests
* create perf test
@@ -75,6 +75,10 @@ export class TerritoryLayer implements Layer {
}
paintTerritory(tile: Tile) {
if (tile.hasFallout()) {
this.paintCell(tile.cell(), this.theme.falloutColor(), 150)
return
}
if (!tile.hasOwner()) {
this.clearCell(tile.cell())
return
+2
View File
@@ -62,6 +62,7 @@ export interface Config {
tradeShipSpawnRate(): number
defensePostRange(): number
defensePostDefenseBonus(): number
falloutDefenseModifier(): number
}
export interface Theme {
@@ -71,6 +72,7 @@ export interface Theme {
defendedBorderColor(playerInfo: PlayerInfo): Colord;
terrainColor(tile: Tile): Colord;
backgroundColor(): Colord;
falloutColor(): Colord
font(): string;
}
+9
View File
@@ -7,6 +7,11 @@ import { pastelTheme } from "./PastelTheme";
export class DefaultConfig implements Config {
falloutDefenseModifier(): number {
return 2
}
defensePostRange(): number {
return 30
}
@@ -148,6 +153,10 @@ export class DefaultConfig implements Config {
}
mag *= tileToConquer.defenseBonus(attacker)
speed *= tileToConquer.defenseBonus(attacker)
if (tileToConquer.hasFallout()) {
mag *= this.falloutDefenseModifier()
speed *= this.falloutDefenseModifier()
}
if (attacker.isPlayer() && defender.isPlayer()) {
if (attacker.type() == PlayerType.Human && defender.type() == PlayerType.Bot) {
+121 -111
View File
@@ -1,123 +1,129 @@
import {Colord, colord, random} from "colord";
import {PlayerID, PlayerInfo, TerrainType, Tile} from "../game/Game";
import {Theme} from "./Config";
import {time} from "console";
import {PseudoRandom} from "../PseudoRandom";
import {simpleHash} from "../Util";
import { Colord, colord, random } from "colord";
import { PlayerID, PlayerInfo, TerrainType, Tile } from "../game/Game";
import { Theme } from "./Config";
import { time } from "console";
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});
private land = colord({r: 194, g: 193, b: 148});
private shore = colord({r: 204, g: 203, b: 158});
private water = colord({r: 75, g: 142, b: 190});
private shorelineWater = colord({r: 100, g: 143, b: 255});
private background = colord({ r: 60, g: 60, b: 60 });
private land = colord({ r: 194, g: 193, b: 148 });
private shore = colord({ r: 204, g: 203, b: 158 });
private falloutColors = [
colord({ r: 120, g: 255, b: 71 }), // Original color
colord({ r: 130, g: 255, b: 85 }), // Slightly lighter
colord({ r: 110, g: 245, b: 65 }), // Slightly darker
colord({ r: 125, g: 255, b: 75 }), // Warmer tint
colord({ r: 115, g: 250, b: 68 }) // Cooler tint
];
private water = colord({ r: 75, g: 142, b: 190 });
private shorelineWater = colord({ r: 100, g: 143, b: 255 });
private territoryColors: Colord[] = [
colord({r: 230, g: 100, b: 100}), // Bright Red
colord({r: 100, g: 180, b: 230}), // Sky Blue
colord({r: 230, g: 180, b: 80}), // Golden Yellow
colord({r: 180, g: 100, b: 230}), // Purple
colord({r: 80, g: 200, b: 120}), // Emerald Green
colord({r: 230, g: 130, b: 180}), // Pink
colord({r: 100, g: 160, b: 80}), // Olive Green
colord({r: 230, g: 150, b: 100}), // Peach
colord({r: 80, g: 130, b: 190}), // Navy Blue
colord({r: 210, g: 210, b: 100}), // Lime Yellow
colord({r: 190, g: 100, b: 130}), // Maroon
colord({r: 100, g: 210, b: 210}), // Turquoise
colord({r: 210, g: 140, b: 80}), // Light Orange
colord({r: 150, g: 110, b: 190}), // Lavender
colord({r: 180, g: 210, b: 120}), // Light Green
colord({r: 210, g: 100, b: 160}), // Hot Pink
colord({r: 100, g: 140, b: 110}), // Sea Green
colord({r: 230, g: 180, b: 180}), // Light Pink
colord({r: 120, g: 120, b: 190}), // Periwinkle
colord({r: 190, g: 170, b: 100}), // Sand
colord({r: 100, g: 180, b: 160}), // Aquamarine
colord({r: 210, g: 160, b: 200}), // Orchid
colord({r: 170, g: 190, b: 100}), // Yellow Green
colord({r: 100, g: 130, b: 150}), // Steel Blue
colord({r: 230, g: 140, b: 140}), // Salmon
colord({r: 140, g: 180, b: 220}), // Light Blue
colord({r: 200, g: 160, b: 110}), // Tan
colord({r: 180, g: 130, b: 180}), // Plum
colord({r: 130, g: 200, b: 130}), // Light Sea Green
colord({r: 220, g: 120, b: 120}), // Coral
colord({r: 120, g: 160, b: 200}), // Cornflower Blue
colord({r: 200, g: 200, b: 140}), // Khaki
colord({r: 160, g: 120, b: 160}), // Purple Gray
colord({r: 140, g: 180, b: 140}), // Dark Sea Green
colord({r: 200, g: 130, b: 110}), // Dark Salmon
colord({r: 130, g: 170, b: 190}), // Cadet Blue
colord({r: 190, g: 180, b: 160}), // Tan Gray
colord({r: 170, g: 140, b: 190}), // Medium Purple
colord({r: 160, g: 190, b: 160}), // Pale Green
colord({r: 190, g: 150, b: 130}), // Rosy Brown
colord({r: 140, g: 150, b: 180}), // Light Slate Gray
colord({r: 180, g: 170, b: 140}), // Dark Khaki
colord({r: 150, g: 130, b: 150}), // Thistle
colord({r: 170, g: 190, b: 180}), // Pale Blue Green
colord({r: 190, g: 140, b: 150}), // Puce
colord({r: 130, g: 180, b: 170}), // Medium Aquamarine
colord({r: 180, g: 160, b: 180}), // Mauve
colord({r: 160, g: 180, b: 140}), // Dark Olive Green
colord({r: 170, g: 150, b: 170}), // Dusty Rose
colord({r: 100, g: 180, b: 230}), // Sky Blue
colord({r: 230, g: 180, b: 80}), // Golden Yellow
colord({r: 180, g: 100, b: 230}), // Purple
colord({r: 80, g: 200, b: 120}), // Emerald Green
colord({r: 230, g: 130, b: 180}), // Pink
colord({r: 100, g: 160, b: 80}), // Olive Green
colord({r: 230, g: 150, b: 100}), // Peach
colord({r: 80, g: 130, b: 190}), // Navy Blue
colord({r: 210, g: 210, b: 100}), // Lime Yellow
colord({r: 190, g: 100, b: 130}), // Maroon
colord({r: 100, g: 210, b: 210}), // Turquoise
colord({r: 210, g: 140, b: 80}), // Light Orange
colord({r: 150, g: 110, b: 190}), // Lavender
colord({r: 180, g: 210, b: 120}), // Light Green
colord({r: 210, g: 100, b: 160}), // Hot Pink
colord({r: 100, g: 140, b: 110}), // Sea Green
colord({r: 230, g: 180, b: 180}), // Light Pink
colord({r: 120, g: 120, b: 190}), // Periwinkle
colord({r: 190, g: 170, b: 100}), // Sand
colord({r: 100, g: 180, b: 160}), // Aquamarine
colord({r: 210, g: 160, b: 200}), // Orchid
colord({r: 170, g: 190, b: 100}), // Yellow Green
colord({r: 100, g: 130, b: 150}), // Steel Blue
colord({r: 230, g: 140, b: 140}), // Salmon
colord({r: 140, g: 180, b: 220}), // Light Blue
colord({r: 200, g: 160, b: 110}), // Tan
colord({r: 180, g: 130, b: 180}), // Plum
colord({r: 130, g: 200, b: 130}), // Light Sea Green
colord({r: 220, g: 120, b: 120}), // Coral
colord({r: 120, g: 160, b: 200}), // Cornflower Blue
colord({r: 200, g: 200, b: 140}), // Khaki
colord({r: 160, g: 120, b: 160}), // Purple Gray
colord({r: 140, g: 180, b: 140}), // Dark Sea Green
colord({r: 200, g: 130, b: 110}), // Dark Salmon
colord({r: 130, g: 170, b: 190}), // Cadet Blue
colord({r: 190, g: 180, b: 160}), // Tan Gray
colord({r: 170, g: 140, b: 190}), // Medium Purple
colord({r: 160, g: 190, b: 160}), // Pale Green
colord({r: 190, g: 150, b: 130}), // Rosy Brown
colord({r: 140, g: 150, b: 180}), // Light Slate Gray
colord({r: 180, g: 170, b: 140}), // Dark Khaki
colord({r: 150, g: 130, b: 150}), // Thistle
colord({r: 170, g: 190, b: 180}), // Pale Blue Green
colord({r: 190, g: 140, b: 150}), // Puce
colord({r: 130, g: 180, b: 170}), // Medium Aquamarine
colord({r: 180, g: 160, b: 180}), // Mauve
colord({r: 160, g: 180, b: 140}), // Dark Olive Green
colord({r: 170, g: 150, b: 170}) // Dusty Rose
colord({ r: 230, g: 100, b: 100 }), // Bright Red
colord({ r: 100, g: 180, b: 230 }), // Sky Blue
colord({ r: 230, g: 180, b: 80 }), // Golden Yellow
colord({ r: 180, g: 100, b: 230 }), // Purple
colord({ r: 80, g: 200, b: 120 }), // Emerald Green
colord({ r: 230, g: 130, b: 180 }), // Pink
colord({ r: 100, g: 160, b: 80 }), // Olive Green
colord({ r: 230, g: 150, b: 100 }), // Peach
colord({ r: 80, g: 130, b: 190 }), // Navy Blue
colord({ r: 210, g: 210, b: 100 }), // Lime Yellow
colord({ r: 190, g: 100, b: 130 }), // Maroon
colord({ r: 100, g: 210, b: 210 }), // Turquoise
colord({ r: 210, g: 140, b: 80 }), // Light Orange
colord({ r: 150, g: 110, b: 190 }), // Lavender
colord({ r: 180, g: 210, b: 120 }), // Light Green
colord({ r: 210, g: 100, b: 160 }), // Hot Pink
colord({ r: 100, g: 140, b: 110 }), // Sea Green
colord({ r: 230, g: 180, b: 180 }), // Light Pink
colord({ r: 120, g: 120, b: 190 }), // Periwinkle
colord({ r: 190, g: 170, b: 100 }), // Sand
colord({ r: 100, g: 180, b: 160 }), // Aquamarine
colord({ r: 210, g: 160, b: 200 }), // Orchid
colord({ r: 170, g: 190, b: 100 }), // Yellow Green
colord({ r: 100, g: 130, b: 150 }), // Steel Blue
colord({ r: 230, g: 140, b: 140 }), // Salmon
colord({ r: 140, g: 180, b: 220 }), // Light Blue
colord({ r: 200, g: 160, b: 110 }), // Tan
colord({ r: 180, g: 130, b: 180 }), // Plum
colord({ r: 130, g: 200, b: 130 }), // Light Sea Green
colord({ r: 220, g: 120, b: 120 }), // Coral
colord({ r: 120, g: 160, b: 200 }), // Cornflower Blue
colord({ r: 200, g: 200, b: 140 }), // Khaki
colord({ r: 160, g: 120, b: 160 }), // Purple Gray
colord({ r: 140, g: 180, b: 140 }), // Dark Sea Green
colord({ r: 200, g: 130, b: 110 }), // Dark Salmon
colord({ r: 130, g: 170, b: 190 }), // Cadet Blue
colord({ r: 190, g: 180, b: 160 }), // Tan Gray
colord({ r: 170, g: 140, b: 190 }), // Medium Purple
colord({ r: 160, g: 190, b: 160 }), // Pale Green
colord({ r: 190, g: 150, b: 130 }), // Rosy Brown
colord({ r: 140, g: 150, b: 180 }), // Light Slate Gray
colord({ r: 180, g: 170, b: 140 }), // Dark Khaki
colord({ r: 150, g: 130, b: 150 }), // Thistle
colord({ r: 170, g: 190, b: 180 }), // Pale Blue Green
colord({ r: 190, g: 140, b: 150 }), // Puce
colord({ r: 130, g: 180, b: 170 }), // Medium Aquamarine
colord({ r: 180, g: 160, b: 180 }), // Mauve
colord({ r: 160, g: 180, b: 140 }), // Dark Olive Green
colord({ r: 170, g: 150, b: 170 }), // Dusty Rose
colord({ r: 100, g: 180, b: 230 }), // Sky Blue
colord({ r: 230, g: 180, b: 80 }), // Golden Yellow
colord({ r: 180, g: 100, b: 230 }), // Purple
colord({ r: 80, g: 200, b: 120 }), // Emerald Green
colord({ r: 230, g: 130, b: 180 }), // Pink
colord({ r: 100, g: 160, b: 80 }), // Olive Green
colord({ r: 230, g: 150, b: 100 }), // Peach
colord({ r: 80, g: 130, b: 190 }), // Navy Blue
colord({ r: 210, g: 210, b: 100 }), // Lime Yellow
colord({ r: 190, g: 100, b: 130 }), // Maroon
colord({ r: 100, g: 210, b: 210 }), // Turquoise
colord({ r: 210, g: 140, b: 80 }), // Light Orange
colord({ r: 150, g: 110, b: 190 }), // Lavender
colord({ r: 180, g: 210, b: 120 }), // Light Green
colord({ r: 210, g: 100, b: 160 }), // Hot Pink
colord({ r: 100, g: 140, b: 110 }), // Sea Green
colord({ r: 230, g: 180, b: 180 }), // Light Pink
colord({ r: 120, g: 120, b: 190 }), // Periwinkle
colord({ r: 190, g: 170, b: 100 }), // Sand
colord({ r: 100, g: 180, b: 160 }), // Aquamarine
colord({ r: 210, g: 160, b: 200 }), // Orchid
colord({ r: 170, g: 190, b: 100 }), // Yellow Green
colord({ r: 100, g: 130, b: 150 }), // Steel Blue
colord({ r: 230, g: 140, b: 140 }), // Salmon
colord({ r: 140, g: 180, b: 220 }), // Light Blue
colord({ r: 200, g: 160, b: 110 }), // Tan
colord({ r: 180, g: 130, b: 180 }), // Plum
colord({ r: 130, g: 200, b: 130 }), // Light Sea Green
colord({ r: 220, g: 120, b: 120 }), // Coral
colord({ r: 120, g: 160, b: 200 }), // Cornflower Blue
colord({ r: 200, g: 200, b: 140 }), // Khaki
colord({ r: 160, g: 120, b: 160 }), // Purple Gray
colord({ r: 140, g: 180, b: 140 }), // Dark Sea Green
colord({ r: 200, g: 130, b: 110 }), // Dark Salmon
colord({ r: 130, g: 170, b: 190 }), // Cadet Blue
colord({ r: 190, g: 180, b: 160 }), // Tan Gray
colord({ r: 170, g: 140, b: 190 }), // Medium Purple
colord({ r: 160, g: 190, b: 160 }), // Pale Green
colord({ r: 190, g: 150, b: 130 }), // Rosy Brown
colord({ r: 140, g: 150, b: 180 }), // Light Slate Gray
colord({ r: 180, g: 170, b: 140 }), // Dark Khaki
colord({ r: 150, g: 130, b: 150 }), // Thistle
colord({ r: 170, g: 190, b: 180 }), // Pale Blue Green
colord({ r: 190, g: 140, b: 150 }), // Puce
colord({ r: 130, g: 180, b: 170 }), // Medium Aquamarine
colord({ r: 180, g: 160, b: 180 }), // Mauve
colord({ r: 160, g: 180, b: 140 }), // Dark Olive Green
colord({ r: 170, g: 150, b: 170 }) // Dusty Rose
];
playerInfoColor(id: PlayerID): Colord {
return colord({r: 50, g: 50, b: 50})
return colord({ r: 50, g: 50, b: 50 })
}
territoryColor(playerInfo: PlayerInfo): Colord {
@@ -186,6 +192,10 @@ export const pastelTheme = new class implements Theme {
return this.background;
}
falloutColor(): Colord {
return this.rand.randElement(this.falloutColors)
}
font(): string {
return "Overpass, sans-serif";
}
+3
View File
@@ -83,6 +83,9 @@ export class NukeExecution implements Execution {
mp.removeTroops(2 * ratio[mp.id()])
others.add(mp)
}
if (tile.isLand()) {
this.mg.addFallout(tile)
}
}
for (const other of others) {
const alliance = this.player.allianceWith(other)
+2
View File
@@ -174,6 +174,7 @@ export interface Tile extends SearchNode {
defenseBonuses(): DefenseBonus[]
// defense bonus against this player
defenseBonus(player: Player): number
hasFallout(): boolean
}
export interface Unit {
@@ -314,6 +315,7 @@ export interface MutableGame extends Game {
units(...types: UnitType[]): MutableUnit[]
addTileDefenseBonus(tile: Tile, unit: Unit, amount: number): DefenseBonus
removeTileDefenseBonus(bonus: DefenseBonus): void
addFallout(tile: Tile)
}
export class TileEvent implements GameEvent {
+10
View File
@@ -65,6 +65,15 @@ export class GameImpl implements MutableGame {
})
}
addFallout(tile: Tile) {
const ti = tile as TileImpl
if (tile.hasOwner()) {
throw Error(`cannot set fallout, tile ${tile} has owner`)
}
ti._hasFallout = true
this.eventBus.emit(new TileEvent(tile))
}
addTileDefenseBonus(tile: Tile, unit: Unit, amount: number): DefenseBonus {
const df = { unit: unit, tile: tile, amount: amount };
(tile as TileImpl)._defenseBonuses.push(df)
@@ -322,6 +331,7 @@ export class GameImpl implements MutableGame {
tileImpl._owner = owner
owner._tiles.set(tile.cell().toString(), tile)
this.updateBorders(tile)
tileImpl._hasFallout = false
this.eventBus.emit(new TileEvent(tile))
}
+6
View File
@@ -13,6 +13,8 @@ export class TileImpl implements Tile {
public _defenseBonuses: DefenseBonus[] = []
public _hasFallout = false
constructor(
private readonly gs: GameImpl,
public _owner: PlayerImpl | TerraNulliusImpl,
@@ -20,6 +22,10 @@ export class TileImpl implements Tile {
private readonly _terrain: TerrainTileImpl
) { }
hasFallout(): boolean {
return this._hasFallout
}
terrainType(): TerrainType {
return this._terrain.type
}