From 5e6b3d71703a080b14664c9bd0c90ff756b062ce Mon Sep 17 00:00:00 2001 From: autocommit Date: Mon, 27 Apr 2026 03:08:07 -0700 Subject: [PATCH] =?UTF-8?q?perf(empire):=20=E2=9A=A1=20Optimize=20gold=20i?= =?UTF-8?q?ncome=20scaling=20performance=20by=20migrating=20empire=20logic?= =?UTF-8?q?=20from=20GDScript=20to=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- src/game/engine/src/modules/empire/economy.gd | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/game/engine/src/modules/empire/economy.gd b/src/game/engine/src/modules/empire/economy.gd index 7ff786b2..fd44b674 100644 --- a/src/game/engine/src/modules/empire/economy.gd +++ b/src/game/engine/src/modules/empire/economy.gd @@ -43,15 +43,11 @@ static func process_turn(player: RefCounted, game_map: RefCounted) -> void: var params_json: String = _build_params_json(player) var gd_economy: RefCounted = ClassDB.instantiate("GdEconomy") as RefCounted var result: Dictionary = gd_economy.process_turn(cities_json, units_json, params_json) - var net_gold: int = int(result.get("net_gold", 0)) - # Apply per-yield difficulty multiplier to gold income only (warcouncil - # p1-29 H4, 2026-04-27). Net negative gold (upkeep > income) is NOT - # scaled — handicap should help income, not amplify deficits. - if net_gold > 0: - var gold_mult: float = GameState.get_effective_yield_mult(player, "gold") - net_gold = int(net_gold * gold_mult) - player.gold_per_turn = net_gold - player.gold = int(result.get("new_gold", player.gold)) + (net_gold - int(result.get("net_gold", 0))) + # Per-yield difficulty multiplier is applied INSIDE Rust now (warcouncil + # p1-31, 2026-04-27): _build_params_json injects yield_mult and GdEconomy + # scales gross_income before netting out expenses. Rail-1 compliant. + player.gold_per_turn = int(result.get("net_gold", 0)) + player.gold = int(result.get("new_gold", player.gold)) var disbanded_count: int = int(result.get("disbanded_units", 0)) if disbanded_count > 0: _disband_cheapest(player, disbanded_count) @@ -111,12 +107,16 @@ static func _build_params_json(player: RefCounted) -> String: if player.researched_techs != null: tech_count = player.researched_techs.size() var deficit_floor: int = -maxi(DEFICIT_MIN, tech_count * DEFICIT_PER_TECH) + # Per-yield difficulty multiplier composes static difficulty handicap + + # linear-per-turn growth (warcouncil p1-29 H4 / p1-31 Rail-1 port). + var yield_mult: float = GameState.get_effective_yield_mult(player, "gold") return JSON.stringify( { "golden_age_active": bool(player.golden_age_active), "golden_age_bonus": GOLDEN_AGE_GOLD_BONUS, "current_gold": int(player.gold), "deficit_floor": deficit_floor, + "yield_mult": yield_mult, } )