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 .init_state::<crate::SimulState>()
15 .init_resource::<crate::SimulStartTime>()
16 .add_systems(
18 OnEnter(SimulState::RunningWithoutGravity),
19 sys::reset_simul_start_time_uncond,
20 )
21 .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}