diff --git a/src/floor/events.rs b/src/floor/events.rs index 8eb3b64..1f743c8 100644 --- a/src/floor/events.rs +++ b/src/floor/events.rs @@ -19,7 +19,9 @@ pub struct DespawnFloor { pub floor: u8, } -#[derive(Debug, Reflect, Event)] -pub struct TransitionFloor { - pub floor: u8, +#[derive(Debug, Reflect, Event, Default)] +pub enum TransitionFloor { + #[default] + Ascend, + Descent, } diff --git a/src/floor/systems/spawn.rs b/src/floor/systems/spawn.rs index fa16052..91bfdc7 100644 --- a/src/floor/systems/spawn.rs +++ b/src/floor/systems/spawn.rs @@ -1,11 +1,36 @@ use bevy::prelude::*; -use crate::{floor::events::TransitionFloor, maze::events::SpawnMaze}; +use crate::{ + floor::{ + components::{CurrentFloor, Floor}, + events::TransitionFloor, + }, + maze::events::SpawnMaze, +}; + +pub(super) fn spawn_floor( + mut commands: Commands, + query: Query<(Entity, &Floor), With>, + mut event_reader: EventReader, +) { + let Ok((entity, floor)) = query.get_single() else { + return; + }; -pub(super) fn spawn_floor(mut commands: Commands, mut event_reader: EventReader) { for event in event_reader.read() { - let floor = event.floor; + dbg!(event); + let floor = match event { + TransitionFloor::Ascend => *floor.increase(), + TransitionFloor::Descent => *floor.decrease(), + }; + + if floor == 1 { + return; + } + info!("Creating level for floor {}", floor); + + commands.entity(entity).remove::(); commands.trigger(SpawnMaze { floor, ..default() }); } } diff --git a/src/maze/events.rs b/src/maze/events.rs index 5686470..ead86a9 100644 --- a/src/maze/events.rs +++ b/src/maze/events.rs @@ -1,8 +1,7 @@ +use super::components::MazeConfig; use bevy::prelude::*; -use super::components::MazeConfig; - -#[derive(Debug, Reflect, Event, Default)] +#[derive(Debug, Reflect, Event)] pub struct SpawnMaze { pub floor: u8, pub config: MazeConfig, @@ -18,3 +17,12 @@ pub struct RespawnMaze { pub struct DespawnMaze { pub floor: u8, } + +impl Default for SpawnMaze { + fn default() -> Self { + Self { + floor: 1, + config: MazeConfig::default(), + } + } +} diff --git a/src/maze/systems/setup.rs b/src/maze/systems/setup.rs index c9dd708..b26c975 100644 --- a/src/maze/systems/setup.rs +++ b/src/maze/systems/setup.rs @@ -1,7 +1,6 @@ -use crate::maze::{components::MazeConfig, events::SpawnMaze}; +use crate::maze::events::SpawnMaze; use bevy::prelude::*; pub(crate) fn setup(mut commands: Commands) { - let config = MazeConfig::default(); - commands.trigger(SpawnMaze { floor: 1, config }); + commands.trigger(SpawnMaze::default()); } diff --git a/src/maze/triggers/spawn.rs b/src/maze/triggers/spawn.rs index 32e84e7..bc03dcc 100644 --- a/src/maze/triggers/spawn.rs +++ b/src/maze/triggers/spawn.rs @@ -26,6 +26,7 @@ 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; } diff --git a/src/player/systems/ascend.rs b/src/player/systems/ascend.rs index 8c47742..808120f 100644 --- a/src/player/systems/ascend.rs +++ b/src/player/systems/ascend.rs @@ -1,28 +1,24 @@ use bevy::prelude::*; use crate::{ - floor::{ - components::{CurrentFloor, Floor}, - events::TransitionFloor, - }, + floor::{components::CurrentFloor, 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>, + maze_config_query: Query<&MazeConfig, With>, mut event_writer: EventWriter, ) { - let Ok((config, floor)) = maze_config_query.get_single() else { + let Ok(config) = maze_config_query.get_single() else { + warn!("Failed to get maze configuration for current floor - cannot ascend player"); return; }; for current_hex in query.iter() { if current_hex.0 == config.end_pos { - event_writer.send(TransitionFloor { - floor: *floor.increase(), - }); + event_writer.send(TransitionFloor::Ascend); return; } } diff --git a/src/player/systems/descend.rs b/src/player/systems/descend.rs index 852a1ab..3e72798 100644 --- a/src/player/systems/descend.rs +++ b/src/player/systems/descend.rs @@ -15,14 +15,13 @@ pub(super) fn descend_player( mut event_writer: EventWriter, ) { let Ok((config, floor)) = maze_config_query.get_single() else { + warn!("Failed to get maze configuration for current floor - cannot descend player"); return; }; for current_hex in query.iter() { if current_hex.0 == config.start_pos && floor.0 != 1 { - event_writer.send(TransitionFloor { - floor: *floor.decrease(), - }); + event_writer.send(TransitionFloor::Descent); return; } } diff --git a/src/player/systems/mod.rs b/src/player/systems/mod.rs index df081cd..647cfb8 100644 --- a/src/player/systems/mod.rs +++ b/src/player/systems/mod.rs @@ -3,6 +3,7 @@ mod descend; mod input; mod movement; pub mod setup; +mod transition_floor; use crate::maze::MazePluginLoaded; use ascend::ascend_player;