From 24fc638a2b43f2d31182127741f781d941dd41be Mon Sep 17 00:00:00 2001 From: evanpelle Date: Thu, 7 Aug 2025 19:17:47 -0700 Subject: [PATCH] trade meta --- src/core/configuration/Config.ts | 2 +- src/core/configuration/DefaultConfig.ts | 34 ++++++++++++------------- src/core/execution/PortExecution.ts | 5 +++- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/core/configuration/Config.ts b/src/core/configuration/Config.ts index 16d6e95849..b621282788 100644 --- a/src/core/configuration/Config.ts +++ b/src/core/configuration/Config.ts @@ -129,7 +129,7 @@ export interface Config { defaultDonationAmount(sender: Player): number; unitInfo(type: UnitType): UnitInfo; tradeShipGold(dist: number, numPorts: number): Gold; - tradeShipSpawnRate(numberOfPorts: number): number; + tradeShipSpawnRate(numTradeShips: number, numPlayerPorts: number): number; trainGold(): Gold; trainSpawnRate(numberOfStations: number): number; trainStationMinRange(): number; diff --git a/src/core/configuration/DefaultConfig.ts b/src/core/configuration/DefaultConfig.ts index 8fab450bff..57082034d4 100644 --- a/src/core/configuration/DefaultConfig.ts +++ b/src/core/configuration/DefaultConfig.ts @@ -342,28 +342,28 @@ export class DefaultConfig implements Config { } tradeShipGold(dist: number, numPorts: number): Gold { - const baseGold = Math.floor(50000 + 100 * dist); - const basePortBonus = 0.25; - const diminishingFactor = 0.9; + const baseGold = 25000 + 100 * dist; + const portBonus = 1 + 0.5 * Math.sqrt(numPorts - 1); + return BigInt(Math.floor(portBonus * baseGold)); + } - let totalMultiplier = 1; - for (let i = 0; i < numPorts; i++) { - totalMultiplier += basePortBonus * Math.pow(diminishingFactor, i); + tradeShipSpawnRate(numTradeShips: number, numPlayerPorts: number): number { + if (numTradeShips >= 150) { + return 1_000_000; } + const baseSpawnRate = Math.floor(Math.pow(numTradeShips, 0.7) + 10); - return BigInt(Math.floor(baseGold * totalMultiplier)); + const multiplier = (10 * numPlayerPorts ** 0.5 + numPlayerPorts) / 10; + return Math.floor(baseSpawnRate * multiplier); } - // Chance to spawn a trade ship in one second, - tradeShipSpawnRate(numTradeShips: number): number { - if (numTradeShips < 20) { - return 5; - } - if (numTradeShips <= 150) { - const additional = numTradeShips - 20; - return Math.floor(Math.pow(additional, 0.85) + 5); - } - return 1_000_000; + expectedTradeShipSpawnRate( + numTradeShips: number, + numPlayerPorts: number, + ): number { + const spawnRate = this.tradeShipSpawnRate(numTradeShips, numPlayerPorts); + const expectedSpawn = numPlayerPorts * (1 / spawnRate); + return expectedSpawn; } unitInfo(type: UnitType): UnitInfo { diff --git a/src/core/execution/PortExecution.ts b/src/core/execution/PortExecution.ts index 6d3f453514..4e6bb6e7ec 100644 --- a/src/core/execution/PortExecution.ts +++ b/src/core/execution/PortExecution.ts @@ -78,7 +78,10 @@ export class PortExecution implements Execution { shouldSpawnTradeShip(): boolean { const numTradeShips = this.mg.unitCount(UnitType.TradeShip); - const spawnRate = this.mg.config().tradeShipSpawnRate(numTradeShips); + const numPlayerPorts = this.player.unitCount(UnitType.Port); + const spawnRate = this.mg + .config() + .tradeShipSpawnRate(numTradeShips, numPlayerPorts); for (let i = 0; i < this.port!.level(); i++) { if (this.random.chance(spawnRate)) { return true;