diff --git a/assets/maps/map1.map b/assets/maps/map1.map index 0b69669..81a1e4b 100644 --- a/assets/maps/map1.map +++ b/assets/maps/map1.map @@ -641,57 +641,11 @@ } // entity 5 { -"classname" "named_entity" -"name" "fence_02" -// brush 0 -{ -( 1136 496 -256 ) ( 1136 497 -256 ) ( 1136 496 -255 ) origin [ 0 -1 0 0 ] [ 0 0 -1 0 ] 270 1 1 -( 1136 496 -256 ) ( 1136 496 -255 ) ( 1137 496 -256 ) origin [ 1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 -( 1136 496 -256 ) ( 1137 496 -256 ) ( 1136 497 -256 ) origin [ -1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 -( 1168 528 -240 ) ( 1168 529 -240 ) ( 1169 528 -240 ) origin [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 -( 1168 528 -240 ) ( 1169 528 -240 ) ( 1168 528 -239 ) origin [ -1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 -( 1168 528 -240 ) ( 1168 528 -239 ) ( 1168 529 -240 ) origin [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 -} -// brush 1 -{ -( 1151.375 512 -256 ) ( 1151.375 512 -255 ) ( 1151.375 511 -256 ) fence [ 1.9967346175427393e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1168 256 -224 ) ( 1168 256 -223 ) ( 1169 256 -224 ) fence [ -1 1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1136 512 -256 ) ( 1136 511 -256 ) ( 1137 512 -256 ) fence [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 -( 1168 256 256 ) ( 1169 256 256 ) ( 1168 255 256 ) fence [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 -( 1136 512 -256 ) ( 1137 512 -256 ) ( 1136 512 -255 ) fence [ 1 -1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1152 256 -224 ) ( 1152 255 -224 ) ( 1152 256 -223 ) fence [ -1.9967346175427393e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -} -} -// entity 6 -{ -"classname" "named_entity" -"name" "fence_01" -// brush 0 -{ -( 1151.375 256 -256 ) ( 1151.375 256 -255 ) ( 1151.375 255 -256 ) fence [ 1.9967346175427393e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1168 0 -224 ) ( 1168 0 -223 ) ( 1169 0 -224 ) fence [ -1 1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1136 256 -256 ) ( 1136 255 -256 ) ( 1137 256 -256 ) fence [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 -( 1168 0 256 ) ( 1169 0 256 ) ( 1168 -1 256 ) fence [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 -( 1136 256 -256 ) ( 1137 256 -256 ) ( 1136 256 -255 ) fence [ 1 -1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1152 0 -224 ) ( 1152 -1 -224 ) ( 1152 0 -223 ) fence [ -1.9967346175427393e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -} -// brush 1 -{ -( 1136 -16 -256 ) ( 1136 -15 -256 ) ( 1136 -16 -255 ) origin [ 0 -1 0 0 ] [ 0 0 -1 0 ] 270 1 1 -( 1136 -16 -256 ) ( 1136 -16 -255 ) ( 1137 -16 -256 ) origin [ 1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 -( 1136 -16 -256 ) ( 1137 -16 -256 ) ( 1136 -15 -256 ) origin [ -1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 -( 1168 16 -240 ) ( 1168 17 -240 ) ( 1169 16 -240 ) origin [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 -( 1168 16 -240 ) ( 1169 16 -240 ) ( 1168 16 -239 ) origin [ -1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 -( 1168 16 -240 ) ( 1168 16 -239 ) ( 1168 17 -240 ) origin [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 -} -} -// entity 7 -{ "classname" "platform_target" "origin" "1672 5249 776" "targetname" "secret_platform" } -// entity 8 +// entity 6 { "classname" "crates" // brush 0 @@ -704,7 +658,7 @@ ( 768 1008 -224 ) ( 768 1008 -223 ) ( 768 1009 -224 ) crate [ 0 1 0 16 ] [ 0 0 -1 0 ] 90 1 1 } } -// entity 9 +// entity 7 { "classname" "crates" // brush 0 @@ -717,7 +671,7 @@ ( 768 1264 -128 ) ( 768 1008 -256 ) ( 768 1008 -128 ) crate [ 0 1 0 16 ] [ 0 0 -1 0 ] 0 1 1 } } -// entity 10 +// entity 8 { "classname" "crates" // brush 0 @@ -730,7 +684,7 @@ ( 3568 512 -224 ) ( 3568 512 -223 ) ( 3568 513 -224 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 } } -// entity 11 +// entity 9 { "classname" "crates" // brush 0 @@ -743,7 +697,7 @@ ( 3568 768 -128 ) ( 3568 512 -256 ) ( 3568 512 -128 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 } } -// entity 12 +// entity 10 { "classname" "crates" // brush 0 @@ -756,7 +710,7 @@ ( 3568 768 32 ) ( 3568 768 33 ) ( 3568 769 32 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 } } -// entity 13 +// entity 11 { "classname" "crates" // brush 0 @@ -769,7 +723,7 @@ ( 3856 512 -224 ) ( 3856 512 -223 ) ( 3856 513 -224 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 90 1 1 } } -// entity 14 +// entity 12 { "classname" "crates" // brush 0 @@ -782,7 +736,7 @@ ( 3856 768 -128 ) ( 3856 512 -256 ) ( 3856 512 -128 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } } -// entity 15 +// entity 13 { "classname" "crates" // brush 0 @@ -795,7 +749,7 @@ ( 3728 768 32 ) ( 3728 768 33 ) ( 3728 769 32 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 90 1 1 } } -// entity 16 +// entity 14 { "classname" "crates" // brush 0 @@ -808,7 +762,7 @@ ( 4816 2816 -128 ) ( 4816 2560 -256 ) ( 4816 2560 -128 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1 } } -// entity 17 +// entity 15 { "classname" "crates" // brush 0 @@ -821,7 +775,7 @@ ( 1792 6144 -128 ) ( 1792 5888 -256 ) ( 1792 5888 -128 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1 } } -// entity 18 +// entity 16 { "classname" "crates" // brush 0 @@ -834,7 +788,7 @@ ( 1792 5888 128 ) ( 1792 5632 0 ) ( 1792 5632 128 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1 } } -// entity 19 +// entity 17 { "classname" "crates" // brush 0 @@ -847,7 +801,7 @@ ( 1792 5888 -128 ) ( 1792 5632 -256 ) ( 1792 5632 -128 ) crate [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 } } -// entity 20 +// entity 18 { "classname" "platform" "target" "secret_platform" @@ -870,3 +824,67 @@ ( 1680 5264 144 ) ( 1680 5264 145 ) ( 1680 5265 144 ) origin [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } } +// entity 19 +{ +"classname" "move_target" +"origin" "1152 0 -232" +"angles" "0 0 0" +"targetname" "target_fence_01" +} +// entity 20 +{ +"classname" "movable" +"name" "fence_01" +"target" "target_fence_01" +"rotation" "true" +// brush 0 +{ +( 1151.375 256 -256 ) ( 1151.375 256 -255 ) ( 1151.375 255 -256 ) fence [ 1.9967346175427393e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1168 0 -224 ) ( 1168 0 -223 ) ( 1169 0 -224 ) fence [ -1 1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1136 256 -256 ) ( 1136 255 -256 ) ( 1137 256 -256 ) fence [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 1168 0 256 ) ( 1169 0 256 ) ( 1168 -1 256 ) fence [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 1136 256 -256 ) ( 1137 256 -256 ) ( 1136 256 -255 ) fence [ 1 -1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1152 0 -224 ) ( 1152 -1 -224 ) ( 1152 0 -223 ) fence [ -1.9967346175427393e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 1 +{ +( 1136 -16 -256 ) ( 1136 -15 -256 ) ( 1136 -16 -255 ) origin [ 0 -1 0 0 ] [ 0 0 -1 0 ] 270 1 1 +( 1136 -16 -256 ) ( 1136 -16 -255 ) ( 1137 -16 -256 ) origin [ 1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 +( 1136 -16 -256 ) ( 1137 -16 -256 ) ( 1136 -15 -256 ) origin [ -1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 +( 1168 16 -240 ) ( 1168 17 -240 ) ( 1169 16 -240 ) origin [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 +( 1168 16 -240 ) ( 1169 16 -240 ) ( 1168 16 -239 ) origin [ -1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 +( 1168 16 -240 ) ( 1168 16 -239 ) ( 1168 17 -240 ) origin [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 +} +} +// entity 21 +{ +"classname" "move_target" +"origin" "1152 512 -232" +"angles" "0 -180 0" +"targetname" "target_fence_02" +} +// entity 22 +{ +"classname" "movable" +"name" "fence_02" +"rotation" "true" +"target" "target_fence_02" +// brush 0 +{ +( 1151.375 512 -256 ) ( 1151.375 512 -255 ) ( 1151.375 511 -256 ) fence [ 1.9967346175427393e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1168 256 -224 ) ( 1168 256 -223 ) ( 1169 256 -224 ) fence [ -1 1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1136 512 -256 ) ( 1136 511 -256 ) ( 1137 512 -256 ) fence [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 1168 256 256 ) ( 1169 256 256 ) ( 1168 255 256 ) fence [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 1136 512 -256 ) ( 1137 512 -256 ) ( 1136 512 -255 ) fence [ 1 -1.9967346175427393e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1152 256 -224 ) ( 1152 255 -224 ) ( 1152 256 -223 ) fence [ -1.9967346175427393e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 1 +{ +( 1136 496 -256 ) ( 1136 497 -256 ) ( 1136 496 -255 ) origin [ 0 -1 0 0 ] [ 0 0 -1 0 ] 270 1 1 +( 1136 496 -256 ) ( 1136 496 -255 ) ( 1137 496 -256 ) origin [ 1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 +( 1136 496 -256 ) ( 1137 496 -256 ) ( 1136 497 -256 ) origin [ -1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 +( 1168 528 -240 ) ( 1168 529 -240 ) ( 1169 528 -240 ) origin [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 +( 1168 528 -240 ) ( 1169 528 -240 ) ( 1168 528 -239 ) origin [ -1 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 +( 1168 528 -240 ) ( 1168 528 -239 ) ( 1168 529 -240 ) origin [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 +} +} diff --git a/src/gates.rs b/src/gates.rs index 0c9a42c..436da4c 100644 --- a/src/gates.rs +++ b/src/gates.rs @@ -1,9 +1,5 @@ -use std::collections::HashMap; - -use avian3d::math::PI; -use bevy::prelude::*; - -use crate::tb_entities::NamedEntity; +use crate::movables::TriggerMovableEvent; +use bevy::{prelude::*, utils::hashbrown::HashSet}; #[derive(Resource)] enum GatesState { @@ -20,7 +16,6 @@ fn update( mut commands: Commands, keyboard: Res>, mut state: ResMut, - mut names_entities: Query<(&NamedEntity, &mut Transform)>, asset_server: Res, ) { if keyboard.just_pressed(KeyCode::Digit1) { @@ -38,18 +33,12 @@ fn update( PlaybackSettings::DESPAWN, )); - let fences: HashMap<_, _> = vec![ - ("fence_01", Quat::from_rotation_y(PI / -2.)), - ("fence_02", Quat::from_rotation_y(PI / 2.)), - ] - .into_iter() - .collect(); + let entities: HashSet<_> = vec!["fence_01", "fence_02"] + .into_iter() + .map(|s| String::from(s)) + .collect(); - for (named_entity, mut transform) in names_entities.iter_mut() { - if let Some(fence) = fences.get(named_entity.name.as_str()) { - transform.rotate(*fence); - } - } + commands.trigger(TriggerMovableEvent(entities)); } } } diff --git a/src/main.rs b/src/main.rs index 1ffd29a..c9a715f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ mod camera; mod cash; mod gates; mod heads_ui; +mod movables; mod platforms; mod player; mod tb_entities; @@ -70,6 +71,7 @@ fn main() { app.add_plugins(heads_ui::plugin); app.add_plugins(gates::plugin); app.add_plugins(platforms::plugin); + app.add_plugins(movables::plugin); app.insert_resource(AmbientLight { color: Color::WHITE, diff --git a/src/movables.rs b/src/movables.rs new file mode 100644 index 0000000..e3dd3af --- /dev/null +++ b/src/movables.rs @@ -0,0 +1,83 @@ +use crate::tb_entities::{Movable, MoveTarget}; +use bevy::{prelude::*, utils::HashSet}; +use bevy_trenchbroom::class::Target; + +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +struct ActiveMovable { + pub start: Transform, + pub target: Transform, + pub start_time: f32, + pub duration: f32, +} + +#[derive(Event)] +pub struct TriggerMovableEvent(pub HashSet); + +pub fn plugin(app: &mut App) { + app.register_type::(); + app.add_systems(Update, move_active); + app.add_observer(trigger); +} + +fn trigger( + trigger: Trigger, + mut commands: Commands, + uninit_movables: Query< + (Entity, &Target, &Transform, &Movable), + (Without, With), + >, + targets: Query<(&MoveTarget, &Transform)>, + time: Res