diff --git a/assets/maps/map1.map b/assets/maps/map1.map index d13cf08..10c3fd1 100644 --- a/assets/maps/map1.map +++ b/assets/maps/map1.map @@ -906,3 +906,10 @@ "angles" "0 90 0" "head" "green grocer" } +// entity 25 +{ +"classname" "cutscene_camera" +"origin" "-56 -648 248" +"angles" "0 45 0" +"name" "fence_01" +} diff --git a/src/cutscene.rs b/src/cutscene.rs new file mode 100644 index 0000000..5e6c182 --- /dev/null +++ b/src/cutscene.rs @@ -0,0 +1,60 @@ +use crate::{DebugVisuals, tb_entities::CutsceneCamera}; +use bevy::prelude::*; + +#[derive(Event, Debug)] +pub struct StartCutscene(pub String); + +#[derive(Resource, Debug, Default)] +enum CutsceneState { + #[default] + None, + Playing { + timer: Timer, + }, +} + +pub fn plugin(app: &mut App) { + app.init_resource::(); + app.add_systems(Update, update); + app.add_observer(on_start_cutscene); +} + +fn on_start_cutscene( + trigger: Trigger, + cutscenes: Query<(&Transform, &CutsceneCamera), Without>, + mut res: ResMut, + mut cutscene_state: ResMut, + mut cam: Query<&mut Transform, With>, +) { + let cutscene = trigger.event().0.clone(); + + let Some((t, _)) = cutscenes + .iter() + .find(|(_, cutscene_camera)| cutscene == cutscene_camera.name) + else { + return; + }; + + res.cam_follow = false; + + *cam.single_mut() = *t; + + *cutscene_state = CutsceneState::Playing { + timer: Timer::from_seconds(2.0, TimerMode::Once), + }; +} + +fn update( + mut res: ResMut, + mut cutscene_state: ResMut, + time: Res