From 05d6c7b8154e562c4783b7828625657a34d06eda Mon Sep 17 00:00:00 2001 From: evanpelle Date: Tue, 8 Jul 2025 10:40:26 -0700 Subject: [PATCH] update meta --- src/core/configuration/Config.ts | 3 +- src/core/configuration/DefaultConfig.ts | 71 +++++++++++++++++++----- src/core/execution/TradeShipExecution.ts | 7 ++- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/core/configuration/Config.ts b/src/core/configuration/Config.ts index cab53fc83..f32028205 100644 --- a/src/core/configuration/Config.ts +++ b/src/core/configuration/Config.ts @@ -129,7 +129,7 @@ export interface Config { donateCooldown(): Tick; defaultDonationAmount(sender: Player): number; unitInfo(type: UnitType): UnitInfo; - tradeShipGold(dist: number): Gold; + tradeShipGold(dist: number, numPorts: number): Gold; tradeShipSpawnRate(numberOfPorts: number): number; trainGold(): Gold; trainSpawnRate(numberOfStations: number): number; @@ -141,6 +141,7 @@ export interface Config { SAMCooldown(): number; SiloCooldown(): number; defensePostDefenseBonus(): number; + defensePostSpeedBonus(): number; falloutDefenseModifier(percentOfFallout: number): number; difficultyModifier(difficulty: Difficulty): number; warshipPatrolRange(): number; diff --git a/src/core/configuration/DefaultConfig.ts b/src/core/configuration/DefaultConfig.ts index 77087b6f2..63bbc0c06 100644 --- a/src/core/configuration/DefaultConfig.ts +++ b/src/core/configuration/DefaultConfig.ts @@ -235,6 +235,9 @@ export class DefaultConfig implements Config { traitorDefenseDebuff(): number { return 0.5; } + traitorSpeedDebuff(): number { + return 0.7; + } traitorDuration(): number { return 30 * 10; // 30 seconds } @@ -289,9 +292,15 @@ export class DefaultConfig implements Config { defensePostRange(): number { return 30; } + defensePostDefenseBonus(): number { return 5; } + + defensePostSpeedBonus(): number { + return 3; + } + playerTeams(): TeamCountConfig { return this._gameConfig.playerTeams ?? 0; } @@ -316,12 +325,6 @@ export class DefaultConfig implements Config { infiniteTroops(): boolean { return this._gameConfig.infiniteTroops; } - tradeShipGold(dist: number): Gold { - return BigInt(Math.floor(10000 + 150 * Math.pow(dist, 1.1))); - } - tradeShipSpawnRate(numberOfPorts: number): number { - return Math.min(50, Math.round(10 * Math.pow(numberOfPorts, 0.6))); - } trainSpawnRate(numberOfStations: number): number { return Math.min(1400, Math.round(70 * Math.pow(numberOfStations, 0.8))); } @@ -338,6 +341,34 @@ export class DefaultConfig implements Config { return 100; } + tradeShipGold(dist: number, numPorts: number): Gold { + const baseGold = Math.floor(50000 + 130 * dist); + const basePortBonus = 0.2; + const diminishingFactor = 0.95; + + let totalMultiplier = 1; + for (let i = 0; i < numPorts; i++) { + totalMultiplier += basePortBonus * Math.pow(diminishingFactor, i); + } + + return BigInt(Math.floor(baseGold * totalMultiplier)); + } + + // Chance to spawn a trade ship in one second, + tradeShipSpawnRate(numTradeShips: number): number { + if (numTradeShips <= 20) { + return 5; + } + if (numTradeShips > this.tradeShipCap()) { + return 1_000_000; + } + return numTradeShips - 15; + } + + tradeShipCap(): number { + return 100; + } + unitInfo(type: UnitType): UnitInfo { switch (type) { case UnitType.TransportShip: @@ -572,7 +603,7 @@ export class DefaultConfig implements Config { const type = gm.terrainType(tileToConquer); switch (type) { case TerrainType.Plains: - mag = 85; + mag = 80; speed = 16.5; break; case TerrainType.Highland: @@ -591,11 +622,12 @@ export class DefaultConfig implements Config { tileToConquer, gm.config().defensePostRange(), UnitType.DefensePost, - ({ unit }) => unit.owner() === defender, )) { - mag *= this.defensePostDefenseBonus(); - speed *= this.defensePostDefenseBonus(); - break; + if (dp.unit.owner() === defender) { + mag *= this.defensePostDefenseBonus(); + speed *= this.defensePostSpeedBonus(); + break; + } } } @@ -642,7 +674,8 @@ export class DefaultConfig implements Config { tilesPerTickUsed: within(defender.troops() / (5 * attackTroops), 0.2, 1.5) * speed * - largeSpeedMalus, + largeSpeedMalus * + (defender.isTraitor() ? this.traitorSpeedDebuff() : 1), }; } else { return { @@ -665,8 +698,18 @@ export class DefaultConfig implements Config { numAdjacentTilesWithEnemy: number, ): number { if (defender.isPlayer()) { + let defendingTroops = defender.troops(); + for (const attack of defender.outgoingAttacks()) { + if ( + attack.target().isPlayer() && + attack.target().id() === attacker.id() + ) { + // If the defender has a counter attack, that should count as defending troops. + defendingTroops += attack.troops(); + } + } return ( - within(((5 * attackTroops) / defender.troops()) * 2, 0.01, 0.5) * + within(((5 * attackTroops) / defendingTroops) * 2, 0.01, 0.5) * numAdjacentTilesWithEnemy * 3 ); @@ -803,7 +846,7 @@ export class DefaultConfig implements Config { nukeMagnitudes(unitType: UnitType): NukeMagnitude { switch (unitType) { case UnitType.MIRVWarhead: - return { inner: 25, outer: 30 }; + return { inner: 12, outer: 18 }; case UnitType.AtomBomb: return { inner: 12, outer: 30 }; case UnitType.HydrogenBomb: diff --git a/src/core/execution/TradeShipExecution.ts b/src/core/execution/TradeShipExecution.ts index b885b68d6..b0e4f12fb 100644 --- a/src/core/execution/TradeShipExecution.ts +++ b/src/core/execution/TradeShipExecution.ts @@ -126,7 +126,12 @@ export class TradeShipExecution implements Execution { private complete() { this.active = false; this.tradeShip!.delete(false); - const gold = this.mg.config().tradeShipGold(this.tilesTraveled); + const gold = this.mg + .config() + .tradeShipGold( + this.tilesTraveled, + this.tradeShip!.owner().units(UnitType.Port).length, + ); if (this.wasCaptured) { this.tradeShip!.owner().addGold(gold, this._dstPort.tile());