From 86bbee8cb82ab69f064ff2848d3e5d85ec168cee Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Wed, 18 Dec 2024 19:15:57 +0200 Subject: [PATCH] feat(floor): spawn next floor --- src/floor/events.rs | 5 +++++ src/floor/mod.rs | 4 +++- src/floor/systems/despawn.rs | 3 +++ src/floor/systems/mod.rs | 15 +++++++++++++-- src/floor/systems/spawn.rs | 11 +++++++++++ src/maze/events.rs | 2 +- src/maze/triggers/spawn.rs | 6 ++++-- src/player/events.rs | 10 ---------- src/player/mod.rs | 4 +--- src/player/systems/ascend.rs | 15 +++++++-------- src/player/systems/descend.rs | 17 ++++++++--------- 11 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 src/floor/systems/despawn.rs create mode 100644 src/floor/systems/spawn.rs diff --git a/src/floor/events.rs b/src/floor/events.rs index d9bd31c..8eb3b64 100644 --- a/src/floor/events.rs +++ b/src/floor/events.rs @@ -18,3 +18,8 @@ pub struct RespawnFloor { pub struct DespawnFloor { pub floor: u8, } + +#[derive(Debug, Reflect, Event)] +pub struct TransitionFloor { + pub floor: u8, +} diff --git a/src/floor/mod.rs b/src/floor/mod.rs index b0e8bc0..23e4944 100644 --- a/src/floor/mod.rs +++ b/src/floor/mod.rs @@ -3,7 +3,9 @@ pub mod events; mod systems; use bevy::prelude::*; +use events::TransitionFloor; pub(super) fn plugin(app: &mut App) { - app.add_plugins(systems::plugin); + app.add_event::() + .add_plugins(systems::plugin); } diff --git a/src/floor/systems/despawn.rs b/src/floor/systems/despawn.rs new file mode 100644 index 0000000..b66f570 --- /dev/null +++ b/src/floor/systems/despawn.rs @@ -0,0 +1,3 @@ +use bevy::prelude::*; + +pub(super) fn despawn_level(mut commands: Commands) {} diff --git a/src/floor/systems/mod.rs b/src/floor/systems/mod.rs index 5b1303d..cfbd806 100644 --- a/src/floor/systems/mod.rs +++ b/src/floor/systems/mod.rs @@ -1,3 +1,14 @@ -use bevy::prelude::*; +mod despawn; +mod spawn; -pub(super) fn plugin(_app: &mut App) {} +use crate::maze::MazePluginLoaded; +use bevy::prelude::*; +use despawn::despawn_level; +use spawn::spawn_floor; + +pub(super) fn plugin(app: &mut App) { + app.add_systems( + Update, + (spawn_floor, despawn_level).run_if(resource_exists::), + ); +} diff --git a/src/floor/systems/spawn.rs b/src/floor/systems/spawn.rs new file mode 100644 index 0000000..fa16052 --- /dev/null +++ b/src/floor/systems/spawn.rs @@ -0,0 +1,11 @@ +use bevy::prelude::*; + +use crate::{floor::events::TransitionFloor, maze::events::SpawnMaze}; + +pub(super) fn spawn_floor(mut commands: Commands, mut event_reader: EventReader) { + for event in event_reader.read() { + let floor = event.floor; + info!("Creating level for floor {}", floor); + commands.trigger(SpawnMaze { floor, ..default() }); + } +} diff --git a/src/maze/events.rs b/src/maze/events.rs index 24278ae..5686470 100644 --- a/src/maze/events.rs +++ b/src/maze/events.rs @@ -2,7 +2,7 @@ use bevy::prelude::*; use super::components::MazeConfig; -#[derive(Debug, Reflect, Event)] +#[derive(Debug, Reflect, Event, Default)] pub struct SpawnMaze { pub floor: u8, pub config: MazeConfig, diff --git a/src/maze/triggers/spawn.rs b/src/maze/triggers/spawn.rs index e7ed398..32e84e7 100644 --- a/src/maze/triggers/spawn.rs +++ b/src/maze/triggers/spawn.rs @@ -14,6 +14,8 @@ use std::f32::consts::{FRAC_PI_2, FRAC_PI_3, FRAC_PI_6}; use super::common::generate_maze; +const FLOOR_Y_OFFSET: u8 = 100; + pub(super) fn spawn_maze( trigger: Trigger, mut commands: Commands, @@ -24,11 +26,11 @@ pub(super) fn spawn_maze( ) { let SpawnMaze { floor, config } = trigger.event(); if maze_query.iter().any(|(_, f, _)| f.0 == *floor) { - warn!("Floor {} already exists, skipping creation", floor); return; } let maze = generate_maze(config).expect("Failed to generate maze during spawn"); + let y_offset = (floor - 1) * FLOOR_Y_OFFSET; let entity = commands .spawn(( @@ -37,7 +39,7 @@ pub(super) fn spawn_maze( Floor(*floor), CurrentFloor, // TODO: remove config.clone(), - Transform::from_translation(Vec3::ZERO), + Transform::from_translation(Vec3::ZERO.with_y(y_offset as f32)), Visibility::Visible, )) .id(); diff --git a/src/player/events.rs b/src/player/events.rs index 04ed340..953c8c9 100644 --- a/src/player/events.rs +++ b/src/player/events.rs @@ -8,13 +8,3 @@ pub struct RespawnPlayer; #[derive(Debug, Event)] pub struct DespawnPlayer; - -#[derive(Debug, Event)] -pub struct AscendPlayer { - pub floor: u8, -} - -#[derive(Debug, Event)] -pub struct DescendPlayer { - pub floor: u8, -} diff --git a/src/player/mod.rs b/src/player/mod.rs index 624c110..480168d 100644 --- a/src/player/mod.rs +++ b/src/player/mod.rs @@ -6,15 +6,13 @@ mod triggers; use bevy::{ecs::system::RunSystemOnce, prelude::*}; use components::Player; -use events::{AscendPlayer, DescendPlayer, DespawnPlayer, RespawnPlayer, SpawnPlayer}; +use events::{DespawnPlayer, RespawnPlayer, SpawnPlayer}; pub(super) fn plugin(app: &mut App) { app.register_type::() .add_event::() .add_event::() .add_event::() - .add_event::() - .add_event::() .add_plugins((triggers::plugin, systems::plugin)); } diff --git a/src/player/systems/ascend.rs b/src/player/systems/ascend.rs index c20f01a..8c47742 100644 --- a/src/player/systems/ascend.rs +++ b/src/player/systems/ascend.rs @@ -1,27 +1,26 @@ use bevy::prelude::*; use crate::{ - floor::components::{CurrentFloor, Floor}, - maze::components::MazeConfig, - player::{ - components::{CurrentPosition, Player}, - events::AscendPlayer, + floor::{ + components::{CurrentFloor, Floor}, + events::TransitionFloor, }, + maze::components::MazeConfig, + player::components::{CurrentPosition, Player}, }; pub(super) fn ascend_player( query: Query<&CurrentPosition, With>, maze_config_query: Query<(&MazeConfig, &Floor), With>, - mut event_writer: EventWriter, + mut event_writer: EventWriter, ) { let Ok((config, floor)) = maze_config_query.get_single() else { - warn!("No current floor configuration found"); return; }; for current_hex in query.iter() { if current_hex.0 == config.end_pos { - event_writer.send(AscendPlayer { + event_writer.send(TransitionFloor { floor: *floor.increase(), }); return; diff --git a/src/player/systems/descend.rs b/src/player/systems/descend.rs index d03b67e..852a1ab 100644 --- a/src/player/systems/descend.rs +++ b/src/player/systems/descend.rs @@ -1,27 +1,26 @@ use bevy::prelude::*; use crate::{ - floor::components::{CurrentFloor, Floor}, - maze::components::MazeConfig, - player::{ - components::{CurrentPosition, Player}, - events::DescendPlayer, + floor::{ + components::{CurrentFloor, Floor}, + events::TransitionFloor, }, + maze::components::MazeConfig, + player::components::{CurrentPosition, Player}, }; pub(super) fn descend_player( query: Query<&CurrentPosition, With>, maze_config_query: Query<(&MazeConfig, &Floor), With>, - mut event_writer: EventWriter, + mut event_writer: EventWriter, ) { let Ok((config, floor)) = maze_config_query.get_single() else { - warn!("No current floor configuration found"); return; }; for current_hex in query.iter() { - if current_hex.0 == config.start_pos { - event_writer.send(DescendPlayer { + if current_hex.0 == config.start_pos && floor.0 != 1 { + event_writer.send(TransitionFloor { floor: *floor.decrease(), }); return;