diff --git a/src/game/engine/scenes/tests/auto_play.gd b/src/game/engine/scenes/tests/auto_play.gd index bf0e6fd5..dfc64034 100644 --- a/src/game/engine/scenes/tests/auto_play.gd +++ b/src/game/engine/scenes/tests/auto_play.gd @@ -1580,6 +1580,41 @@ func _next_building(city: Variant, player: Variant, city_count: int, has_founder _score_add(scores, "forge_titan", 12.0) _score_add(scores, "mithril_vanguard", 18.0) + # World wonders: scored alongside units/buildings so they actually compete + # (warcouncil p0-01 wonder gate). Earlier override-after-pick approaches + # rarely fired because the picker preferred tier units. Now wonders enter + # the scoring loop directly with personality-weighted score. + # Score = (era * 1.5 + 4) * personality_axis + # personality_axis ∈ [0.4, 1.6]: tall (deepforge/ironhold high-prod) + + # wealthy (goldvein high-wealth) clans value wonders; aggressive + # (blackhammer high-agg) clans don't. + # Gated on city.buildings >= 3 so very early game still prioritizes the + # fundamental forge / monument / walls chain. + if Array(city.buildings).size() >= 3: + var clan_id_w: String = str(player.get("clan_id") if player.get("clan_id") != null else "") + var w_axis: float = 1.0 + if not clan_id_w.is_empty(): + var pers_w: Dictionary = DataLoader.get_ai_personality(clan_id_w) + if not pers_w.is_empty(): + var axes_w: Dictionary = pers_w.get("strategic_axes", {}) + var prod_w: float = _norm_axis(axes_w, "production") + var wlth_w: float = _norm_axis(axes_w, "wealth") + var agg_w: float = _norm_axis(axes_w, "aggression") + w_axis = clampf(0.4 + (prod_w + wlth_w) * 0.6 - agg_w * 0.3, 0.4, 1.6) + var existing_blds: Array = Array(city.buildings) + for wb: Dictionary in DataLoader.get_all_buildings(): + var wid: String = str(wb.get("id", "")) + if wid.is_empty() or wid in existing_blds: + continue + if wb.get("wonder_type") == null: + continue + if not city.can_build(wid, player): + continue + var era_w: int = int(wb.get("era", 1)) + # Score band: era 1 wonder ~ 5.5, era 5 wonder ~ 11.5, era 10 wonder ~ 19 + # (× 0.4-1.6 personality) — competitive with cavalry (5) → ironwarden (8) → forge_titan (12) → mithril_vanguard (18). + scores[wid] = (4.0 + era_w * 1.5) * w_axis + # Log top-3 each time production is selected — emergent strategy visibility if not scores.is_empty(): var ranked: Array = scores.keys()