10-phase linear pipeline: PreInput → Input → Movement → Simulation → Economy → Storyteller → Snapshot → PostSnapshot → Knowledge → TickAdvance. Each system assigned to exactly one phase via .in_set(TickPhase::X). Cross-phase .after()/.before() eliminated — only intra-phase ordering remains. Prevents schedule cycles by construction. SimulationPlugin refactored into sub-plugins by domain: - InputPlugin (player actions, interactions, dialogue dispatch) - MovementPlugin (pathfinding, movement validation, spatial indexing) - SocialPlugin (conversations, sound, voice enrichment, follow state) - EconomyPlugin (tâtonnement tick, IPC query serving) - TimePlugin (chunk streaming, news ticker, tick advancement) All other plugins (NPC, Knowledge, Perception, Storyteller, Settings, Bridge) updated to use TickPhase assignments instead of cross-plugin ordering constraints. BridgePlugin trimmed to bridge I/O concerns only. Part A of #843. Parts B (multi-threaded executor) and C (background workers) follow. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
37 lines
1.5 KiB
Rust
37 lines
1.5 KiB
Rust
//! Input phase plugin — processes player actions and interaction commands.
|
|
//!
|
|
//! All systems run in [`TickPhase::Input`]. Intra-phase ordering:
|
|
//! - `process_player_input` runs first (dispatches queued actions)
|
|
//! - Door/terminal/examine/triangle run after input (consume dispatched events)
|
|
|
|
use bevy_app::prelude::*;
|
|
use bevy_ecs::schedule::IntoScheduleConfigs;
|
|
|
|
use crate::tick_phases::TickPhase;
|
|
|
|
pub struct InputPlugin;
|
|
|
|
impl Plugin for InputPlugin {
|
|
fn build(&self, app: &mut App) {
|
|
app.init_resource::<super::input::InputQueue>()
|
|
.init_resource::<super::interaction::TerminalInteractedQueue>()
|
|
// Triangle resolution resources (#250)
|
|
.init_resource::<super::triangle::ResolveTriangleQueue>()
|
|
.add_systems(
|
|
Update,
|
|
(
|
|
super::input::process_player_input,
|
|
super::interaction::process_door_interaction
|
|
.after(super::input::process_player_input),
|
|
super::interaction::process_terminal_interaction
|
|
.after(super::input::process_player_input),
|
|
super::examine::process_examine_interaction
|
|
.after(super::input::process_player_input),
|
|
super::triangle::apply_resolve_triangle
|
|
.after(super::input::process_player_input),
|
|
)
|
|
.in_set(TickPhase::Input),
|
|
);
|
|
}
|
|
}
|