perf(empire): Optimize gold income scaling performance by migrating empire logic from GDScript to Rust

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-27 03:08:07 -07:00
parent 91d7516049
commit 5e6b3d7170

View file

@ -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,
}
)