refactor(empire-affected): ♻️ Restructure happiness calculation logic to support per-resource lookup, updating variable names and data structures for Rust compatibility

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-16 23:26:18 -07:00
parent 1da30dd702
commit 4874ed9868

View file

@ -60,7 +60,12 @@ static func process_turn(player: RefCounted, _game_map: RefCounted) -> void:
var ascension_active: bool = bool(player.ascension_active) var ascension_active: bool = bool(player.ascension_active)
var growth_tier: String = player.growth_tier if player.growth_tier != "" else "balanced" var growth_tier: String = player.growth_tier if player.growth_tier != "" else "balanced"
var unique_luxuries: int = _count_unique_luxuries(player, _game_map) # Collect the set of distinct luxury resource IDs accessible to this
# player. The Rust side expects `owned_luxuries: BTreeSet<String>` and
# sums per-resource happiness_per_unique_copy values. Previously this
# was `unique_luxury_count: i32` — rename and payload shape both changed
# when luxury happiness moved from a flat count to a per-resource lookup.
var owned_luxuries: Array[String] = _collect_unique_luxury_ids(player, _game_map)
var input_dict: Dictionary = { var input_dict: Dictionary = {
"city_count": player.cities.size(), "city_count": player.cities.size(),
@ -68,7 +73,7 @@ static func process_turn(player: RefCounted, _game_map: RefCounted) -> void:
"units_in_enemy_territory": units_in_enemy_territory, "units_in_enemy_territory": units_in_enemy_territory,
"ascension_active": ascension_active, "ascension_active": ascension_active,
"building_happiness": building_happiness, "building_happiness": building_happiness,
"unique_luxury_count": unique_luxuries, "owned_luxuries": owned_luxuries,
"growth_tier": growth_tier, "growth_tier": growth_tier,
} }
@ -127,11 +132,15 @@ const LUXURY_DEPOSITS: Array[String] = [
] ]
static func _count_unique_luxuries(player: RefCounted, game_map: RefCounted) -> int: static func _collect_unique_luxury_ids(player: RefCounted, game_map: RefCounted) -> Array[String]:
## Count unique luxury resources on tiles owned by the player's cities. ## Collect the set of distinct luxury resource IDs accessible to the
## player via owned tiles. Returns a sorted Array[String] suitable for
## JSON-serialising to Rust's `BTreeSet<String>` (sorted order preserves
## determinism across runs).
var result: Array[String] = []
if game_map == null: if game_map == null:
return 0 return result
var found: Dictionary = {} # resource_id → true var found: Dictionary = {} # resource_id → true (dedupe)
for city: Variant in player.cities: for city: Variant in player.cities:
for tile_pos: Vector2i in city.owned_tiles: for tile_pos: Vector2i in city.owned_tiles:
var tile: Resource = game_map.get_tile(tile_pos) var tile: Resource = game_map.get_tile(tile_pos)
@ -139,7 +148,11 @@ static func _count_unique_luxuries(player: RefCounted, game_map: RefCounted) ->
continue continue
if tile.resource_id in LUXURY_DEPOSITS and tile.resource_id not in found: if tile.resource_id in LUXURY_DEPOSITS and tile.resource_id not in found:
found[tile.resource_id] = true found[tile.resource_id] = true
return found.size() var ids: Array = found.keys()
ids.sort()
for id_: Variant in ids:
result.append(String(id_))
return result
static func _count_units_in_enemy_territory(player: RefCounted) -> int: static func _count_units_in_enemy_territory(player: RefCounted) -> int: