diff --git a/src/game/engine/scenes/headless/player_api_main.gd b/src/game/engine/scenes/headless/player_api_main.gd index 0e2838ce..d58f8a5a 100644 --- a/src/game/engine/scenes/headless/player_api_main.gd +++ b/src/game/engine/scenes/headless/player_api_main.gd @@ -250,6 +250,10 @@ func _hydrate_player_api(num_players: int) -> void: # `load_state_json`. Without this no resource refinement runs. _apply_recipes() + # p3-26 B6b: stamp item combat bonuses so equipped gear boosts units in headless combat. + # Same `#[serde(skip)]` re-stamp pattern — load AFTER `load_state_json`. + _apply_item_combat() + ## p3-26 B3: stamp improvement definitions (DataLoader's improvements: id, build_turns, ## yields:{food,production}) onto `GdPlayerApi` via `set_improvement_defs_json`. Consumed by @@ -276,6 +280,18 @@ func _apply_recipes() -> void: _emit_event("recipes_api_loaded", {"bytes": n}) +## p3-26 B6b: stamp item combat bonuses (DataLoader's items: id, stats:[{key,value}]) onto +## `GdPlayerApi` via `set_item_combat_json`. Consumed by the headless combat path so equipped +## gear adds attack/defense. +func _apply_item_combat() -> void: + var items: Array = DataLoader.get_all_items() + if items.is_empty(): + _emit_protocol_error("items empty — equipped gear will not affect headless combat") + return + var n: int = int(_api.set_item_combat_json(JSON.stringify(items))) + _emit_event("item_combat_api_loaded", {"count": n}) + + ## p3-26 gap 2: stamp the natural-event category configs (DataLoader's merged ## `{category: {base_frequency, severity_weights, tiers, …}}`) onto `GdPlayerApi` via ## `set_events_config_json`. Consumed by `mc-turn`'s climate-phase event dispatch. diff --git a/src/simulator/api-gdext/src/player_api.rs b/src/simulator/api-gdext/src/player_api.rs index b2e394fa..c3561088 100644 --- a/src/simulator/api-gdext/src/player_api.rs +++ b/src/simulator/api-gdext/src/player_api.rs @@ -200,6 +200,16 @@ impl GdPlayerApi { self.state.load_recipes_json(json.to_string().as_str()) as i64 } + /// p3-26 B6b: load item combat bonuses (JSON array of item objects with + /// `stats`, from `public/resources/items/*.json`) so equipped gear boosts + /// units in headless combat. Returns the count stored. Call AFTER + /// `load_state_json` (the field is `#[serde(skip)]`). + #[func] + pub fn set_item_combat_json(&mut self, json: GString) -> i64 { + self.state + .load_item_combat_json(json.to_string().as_str()) as i64 + } + /// Stamp the runtime `UnitsCatalog` (id → `UnitStats`) onto the held /// `GameState`. Distinct from `set_units_catalog_json` (which loads the /// tactical `ai_unit_catalog`): this is the same `mc_units::UnitsCatalog`