fly_b/simul/
state.rs

1use bevy::prelude::*;
2
3use crate::SimulState;
4
5#[derive(Debug, Default)]
6pub struct SimulStatePlugin {
7    _priv_fields_placeholder: (),
8}
9
10impl Plugin for SimulStatePlugin {
11    fn build(&self, app: &mut App) {
12        app
13            // Resources
14            .init_state::<crate::SimulState>()
15            .init_resource::<crate::SimulStartTime>()
16            // Reset simulation start time.
17            .add_systems(
18                OnEnter(SimulState::RunningWithoutGravity),
19                sys::reset_simul_start_time_uncond,
20            )
21            // Move using graph edges.
22            .add_systems(Update, (sys::circulate, sys::restart_game));
23    }
24}
25
26pub mod states;
27
28pub mod res {
29    use std::time;
30
31    use bevy::prelude::*;
32    use derive_more::{From, Into};
33
34    #[derive(Resource, Default, Clone, Copy, From, PartialEq, Eq, PartialOrd, Ord, Hash, Into)]
35    pub struct SimulStartTime(time::Duration);
36}
37
38pub mod sys {
39    use bevy::prelude::*;
40
41    use crate::{simul::HeroDeath, SimulState};
42
43    use crate::SimulStartTime;
44
45    pub fn restart_game(
46        mut restart_cause: EventReader<HeroDeath>,
47        mut next_state: ResMut<NextState<SimulState>>,
48    ) {
49        if !restart_cause.is_empty() {
50            let _ = next_state.0.insert(SimulState::Cleanup);
51            restart_cause.clear();
52        }
53    }
54
55    pub fn circulate(state: Res<State<SimulState>>, mut next_state: ResMut<NextState<SimulState>>) {
56        if !state.is_running() {
57            let _ = *next_state.0.insert(state.forward());
58        }
59    }
60
61    pub fn reset_simul_start_time_uncond(mut start_time: ResMut<SimulStartTime>, time: Res<Time>) {
62        *start_time = time.elapsed().into();
63    }
64}