bevy_autoplay/
lib.rs

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}