//! Social simulation plugin — NPC conversations, knowledge transfer, disclosure. //! //! All systems run in [`TickPhase::Simulation`]. Intra-phase ordering: //! - conversations → knowledge_transfer (transfer reads conversation results) //! - conversations → sound collection (sound reads conversation events) use bevy_app::prelude::*; use bevy_ecs::schedule::IntoScheduleConfigs; use crate::tick_phases::TickPhase; pub struct SocialPlugin; impl Plugin for SocialPlugin { fn build(&self, app: &mut App) { app.init_resource::() .init_resource::() .init_resource::() .init_resource::() .add_systems( Update, ( super::conversation::run_npc_conversations, super::npc_knowledge_transfer::transfer_npc_knowledge .after(super::conversation::run_npc_conversations), super::sound::collect_sound_events .after(super::conversation::run_npc_conversations), // Voice enrichment (D-138) — rewrite NPC text with voiced variants. // No-op when VoiceCacheResource is absent. crate::voice::integration::voice_enrich_dialogue_response, crate::voice::integration::voice_enrich_conversation_events .after(super::conversation::run_npc_conversations), // POI discovery reads visibility geometry (also Simulation phase) super::poi_discovery::discover_pois, // Follow state reads visibility geometry + movement super::follow::update_follow_state, // Contraband scan reads movement + NPC awareness super::contraband::check_contraband_scan, // Pressure reads NPC awareness + relationship graph super::pressure::update_character_pressure, // Triangle escalation (#250) — runs on game-minute boundaries super::triangle::tick_triangle_escalation, ) .in_set(TickPhase::Simulation), ); } }