1use std::time::Duration;
2
3use bevy::{
4 app::{App, Plugin, Update},
5 input::InputSystem,
6 prelude::*,
7};
8use play::{play, start_playing, stop_playing};
9use record::{record, start_recording, stop_recording};
10use save::{load_recording, load_recording_and_play, save_recording};
11use session::Session;
12
13mod play;
14mod record;
15mod save;
16mod session;
17mod storable;
18pub mod testing;
19
20#[derive(States, Debug, Clone, PartialEq, Eq, Hash, Default)]
21pub enum AutoplayState {
22 #[default]
23 Stopped,
24 Playing,
25 Recording,
26}
27
28#[derive(Resource)]
29struct StartTime(pub Duration);
30
31#[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)]
32pub struct AutoplaySystem;
33
34#[derive(Event)]
35pub struct SaveToFile(pub String);
36
37#[derive(Event)]
38pub struct LoadFromFile(pub String);
39
40#[derive(Event)]
41pub struct LoadFromFileAndPlay(pub String);
42
43pub struct AutoplayPlugin;
44
45impl Plugin for AutoplayPlugin {
46 fn build(&self, app: &mut App) {
47 app.insert_state(AutoplayState::Stopped)
48 .insert_resource(StartTime(Duration::new(0, 0)))
49 .insert_resource(Session::default())
50 .add_event::<SaveToFile>()
51 .add_event::<LoadFromFile>()
52 .add_event::<LoadFromFileAndPlay>()
53 .add_systems(OnEnter(AutoplayState::Recording), start_recording)
54 .add_systems(OnExit(AutoplayState::Recording), stop_recording)
55 .add_systems(OnEnter(AutoplayState::Playing), start_playing)
56 .add_systems(OnExit(AutoplayState::Playing), stop_playing)
57 .add_systems(
58 Update,
59 (save_recording, load_recording, load_recording_and_play),
60 )
61 .add_systems(
62 PreUpdate,
63 (
64 record.run_if(in_state(AutoplayState::Recording)),
65 play.run_if(in_state(AutoplayState::Playing)),
66 )
67 .chain()
68 .after(InputSystem)
69 .in_set(AutoplaySystem),
70 );
71 }
72}