feat(game-entities): Add register_yield function to City entities to apply dynamic building bonuses like culture or production yields

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-15 23:45:33 -07:00
parent 91ae2ffa56
commit a7695432f9

View file

@ -99,6 +99,35 @@ func _init(city_id: String = "", starting_buildings: Array[String] = []) -> void
for b in buildings:
b_arr.push_back(b)
_gd_city.call("initialize", id, b_arr)
for b in buildings:
_register_building_yields(b)
## Register flat yield bonuses for a building id by reading its JSON `effects`.
## Called on starting buildings in `_init` and after `add_building` so the
## Rust City.get_yields applies e.g. monument +2 culture.
func _register_building_yields(building_id: String) -> void:
if _gd_city == null:
return
var def: Dictionary = DataLoader.get_building(building_id)
if def.is_empty():
return
var food: float = 0.0
var production: float = 0.0
var gold: float = 0.0
var culture: float = 0.0
var science: float = 0.0
for effect: Dictionary in def.get("effects", []):
var value: float = float(effect.get("value", 0))
match effect.get("type", ""):
"food": food += value
"production": production += value
"gold": gold += value
"culture": culture += value
"science": science += value
_gd_city.call(
"register_building_yields", building_id, food, production, gold, culture, science
)
# ── Founding ────────────────────────────────────────────────────────
@ -381,6 +410,7 @@ func add_building(building: String) -> void:
buildings.append(building)
if _gd_city != null:
_gd_city.call("add_building", building)
_register_building_yields(building)
func has_building(building: String) -> bool: