From 754db60a00e5520de8b0219893ba7413952e4a6e Mon Sep 17 00:00:00 2001 From: evanpelle Date: Fri, 8 Aug 2025 18:38:16 -0700 Subject: [PATCH] Have trains produce more gold (#1759) ## Description: During the play test, trains did not produce enough gold. So increase gold, and give 4x bonus for allies. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [x] I have read and accepted the CLA agreement (only required once). ## Please put your Discord username so you can be contacted if a bug or regression is found: evan --- src/core/configuration/Config.ts | 2 +- src/core/configuration/DefaultConfig.ts | 5 +++-- src/core/game/TrainStation.ts | 23 ++++++++++------------- tests/core/game/TrainStation.test.ts | 9 +++++---- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/core/configuration/Config.ts b/src/core/configuration/Config.ts index 41ac87c37..263d92f6e 100644 --- a/src/core/configuration/Config.ts +++ b/src/core/configuration/Config.ts @@ -130,7 +130,7 @@ export interface Config { unitInfo(type: UnitType): UnitInfo; tradeShipGold(dist: number, numPorts: number): Gold; tradeShipSpawnRate(numberOfPorts: number): number; - trainGold(): Gold; + trainGold(isFriendly: boolean): Gold; trainSpawnRate(numberOfStations: number): number; trainStationMinRange(): number; trainStationMaxRange(): number; diff --git a/src/core/configuration/DefaultConfig.ts b/src/core/configuration/DefaultConfig.ts index 8fab450bf..95af6e07d 100644 --- a/src/core/configuration/DefaultConfig.ts +++ b/src/core/configuration/DefaultConfig.ts @@ -328,9 +328,10 @@ export class DefaultConfig implements Config { trainSpawnRate(numberOfStations: number): number { return Math.min(1400, Math.round(40 * Math.pow(numberOfStations, 0.5))); } - trainGold(): Gold { - return BigInt(4_000); + trainGold(isFriendly: boolean): Gold { + return isFriendly ? 100_000n : 25_000n; } + trainStationMinRange(): number { return 15; } diff --git a/src/core/game/TrainStation.ts b/src/core/game/TrainStation.ts index 8eb3bacee..f12125abe 100644 --- a/src/core/game/TrainStation.ts +++ b/src/core/game/TrainStation.ts @@ -18,19 +18,18 @@ interface TrainStopHandler { * Behavior to be defined */ class CityStopHandler implements TrainStopHandler { - private factor: bigint = BigInt(2); onStop( mg: Game, station: TrainStation, trainExecution: TrainExecution, ): void { const level = BigInt(station.unit.level() + 1); - let goldBonus = (mg.config().trainGold() * level) / this.factor; const stationOwner = station.unit.owner(); const trainOwner = trainExecution.owner(); + const isFriendly = stationOwner.isFriendly(trainOwner); + const goldBonus = mg.config().trainGold(isFriendly) * level; // Share revenue with the station owner if it's not the current player - if (stationOwner.isFriendly(trainOwner)) { - goldBonus += BigInt(1_000); // Bonus for everybody when trading with an ally! + if (isFriendly) { stationOwner.addGold(goldBonus, station.tile()); } trainOwner.addGold(goldBonus, station.tile()); @@ -38,7 +37,6 @@ class CityStopHandler implements TrainStopHandler { } class PortStopHandler implements TrainStopHandler { - private factor: bigint = BigInt(2); constructor(private random: PseudoRandom) {} onStop( mg: Game, @@ -46,12 +44,12 @@ class PortStopHandler implements TrainStopHandler { trainExecution: TrainExecution, ): void { const level = BigInt(station.unit.level() + 1); - let goldBonus = (mg.config().trainGold() * level) / this.factor; const stationOwner = station.unit.owner(); const trainOwner = trainExecution.owner(); - // Share revenue with the station owner if it's not the current player - if (stationOwner.isFriendly(trainOwner)) { - goldBonus += BigInt(1_000); // Bonus for everybody when trading with an ally! + const isFriendly = stationOwner.isFriendly(trainOwner); + const goldBonus = mg.config().trainGold(isFriendly) * level; + + if (isFriendly) { stationOwner.addGold(goldBonus, station.tile()); } trainOwner.addGold(goldBonus, station.tile()); @@ -59,18 +57,17 @@ class PortStopHandler implements TrainStopHandler { } class FactoryStopHandler implements TrainStopHandler { - private factor: bigint = BigInt(2); onStop( mg: Game, station: TrainStation, trainExecution: TrainExecution, ): void { - let goldBonus = mg.config().trainGold(); const stationOwner = station.unit.owner(); const trainOwner = trainExecution.owner(); + const isFriendly = stationOwner.isFriendly(trainOwner); + const goldBonus = mg.config().trainGold(isFriendly); // Share revenue with the station owner if it's not the current player - if (stationOwner.isFriendly(trainOwner)) { - goldBonus += BigInt(1_000); // Bonus for everybody when trading with an ally! + if (isFriendly) { stationOwner.addGold(goldBonus, station.tile()); } trainOwner.addGold(goldBonus, station.tile()); diff --git a/tests/core/game/TrainStation.test.ts b/tests/core/game/TrainStation.test.ts index fba6d03da..b0ed06165 100644 --- a/tests/core/game/TrainStation.test.ts +++ b/tests/core/game/TrainStation.test.ts @@ -16,7 +16,8 @@ describe("TrainStation", () => { game = { ticks: jest.fn().mockReturnValue(123), config: jest.fn().mockReturnValue({ - trainGold: () => BigInt(4000), + trainGold: (isFriendly: boolean) => + isFriendly ? BigInt(1000) : BigInt(500), }), addUpdate: jest.fn(), addExecution: jest.fn(), @@ -50,7 +51,7 @@ describe("TrainStation", () => { station.onTrainStop(trainExecution); - expect(unit.owner().addGold).toHaveBeenCalledWith(4000n, unit.tile()); + expect(unit.owner().addGold).toHaveBeenCalledWith(1000n, unit.tile()); }); it("handles allied trade", () => { @@ -60,9 +61,9 @@ describe("TrainStation", () => { station.onTrainStop(trainExecution); - expect(unit.owner().addGold).toHaveBeenCalledWith(5000n, unit.tile()); + expect(unit.owner().addGold).toHaveBeenCalledWith(2000n, unit.tile()); expect(trainExecution.owner().addGold).toHaveBeenCalledWith( - 5000n, + 2000n, unit.tile(), ); });