feat(floor): spawn next floor

This commit is contained in:
Kristofers Solo 2024-12-18 19:15:57 +02:00
parent de4989ccfb
commit 86bbee8cb8
11 changed files with 56 additions and 36 deletions

View File

@ -18,3 +18,8 @@ pub struct RespawnFloor {
pub struct DespawnFloor { pub struct DespawnFloor {
pub floor: u8, pub floor: u8,
} }
#[derive(Debug, Reflect, Event)]
pub struct TransitionFloor {
pub floor: u8,
}

View File

@ -3,7 +3,9 @@ pub mod events;
mod systems; mod systems;
use bevy::prelude::*; use bevy::prelude::*;
use events::TransitionFloor;
pub(super) fn plugin(app: &mut App) { pub(super) fn plugin(app: &mut App) {
app.add_plugins(systems::plugin); app.add_event::<TransitionFloor>()
.add_plugins(systems::plugin);
} }

View File

@ -0,0 +1,3 @@
use bevy::prelude::*;
pub(super) fn despawn_level(mut commands: Commands) {}

View File

@ -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::<MazePluginLoaded>),
);
}

View File

@ -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<TransitionFloor>) {
for event in event_reader.read() {
let floor = event.floor;
info!("Creating level for floor {}", floor);
commands.trigger(SpawnMaze { floor, ..default() });
}
}

View File

@ -2,7 +2,7 @@ use bevy::prelude::*;
use super::components::MazeConfig; use super::components::MazeConfig;
#[derive(Debug, Reflect, Event)] #[derive(Debug, Reflect, Event, Default)]
pub struct SpawnMaze { pub struct SpawnMaze {
pub floor: u8, pub floor: u8,
pub config: MazeConfig, pub config: MazeConfig,

View File

@ -14,6 +14,8 @@ use std::f32::consts::{FRAC_PI_2, FRAC_PI_3, FRAC_PI_6};
use super::common::generate_maze; use super::common::generate_maze;
const FLOOR_Y_OFFSET: u8 = 100;
pub(super) fn spawn_maze( pub(super) fn spawn_maze(
trigger: Trigger<SpawnMaze>, trigger: Trigger<SpawnMaze>,
mut commands: Commands, mut commands: Commands,
@ -24,11 +26,11 @@ pub(super) fn spawn_maze(
) { ) {
let SpawnMaze { floor, config } = trigger.event(); let SpawnMaze { floor, config } = trigger.event();
if maze_query.iter().any(|(_, f, _)| f.0 == *floor) { if maze_query.iter().any(|(_, f, _)| f.0 == *floor) {
warn!("Floor {} already exists, skipping creation", floor);
return; return;
} }
let maze = generate_maze(config).expect("Failed to generate maze during spawn"); let maze = generate_maze(config).expect("Failed to generate maze during spawn");
let y_offset = (floor - 1) * FLOOR_Y_OFFSET;
let entity = commands let entity = commands
.spawn(( .spawn((
@ -37,7 +39,7 @@ pub(super) fn spawn_maze(
Floor(*floor), Floor(*floor),
CurrentFloor, // TODO: remove CurrentFloor, // TODO: remove
config.clone(), config.clone(),
Transform::from_translation(Vec3::ZERO), Transform::from_translation(Vec3::ZERO.with_y(y_offset as f32)),
Visibility::Visible, Visibility::Visible,
)) ))
.id(); .id();

View File

@ -8,13 +8,3 @@ pub struct RespawnPlayer;
#[derive(Debug, Event)] #[derive(Debug, Event)]
pub struct DespawnPlayer; pub struct DespawnPlayer;
#[derive(Debug, Event)]
pub struct AscendPlayer {
pub floor: u8,
}
#[derive(Debug, Event)]
pub struct DescendPlayer {
pub floor: u8,
}

View File

@ -6,15 +6,13 @@ mod triggers;
use bevy::{ecs::system::RunSystemOnce, prelude::*}; use bevy::{ecs::system::RunSystemOnce, prelude::*};
use components::Player; use components::Player;
use events::{AscendPlayer, DescendPlayer, DespawnPlayer, RespawnPlayer, SpawnPlayer}; use events::{DespawnPlayer, RespawnPlayer, SpawnPlayer};
pub(super) fn plugin(app: &mut App) { pub(super) fn plugin(app: &mut App) {
app.register_type::<Player>() app.register_type::<Player>()
.add_event::<SpawnPlayer>() .add_event::<SpawnPlayer>()
.add_event::<RespawnPlayer>() .add_event::<RespawnPlayer>()
.add_event::<DespawnPlayer>() .add_event::<DespawnPlayer>()
.add_event::<AscendPlayer>()
.add_event::<DescendPlayer>()
.add_plugins((triggers::plugin, systems::plugin)); .add_plugins((triggers::plugin, systems::plugin));
} }

View File

@ -1,27 +1,26 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{ use crate::{
floor::components::{CurrentFloor, Floor}, floor::{
maze::components::MazeConfig, components::{CurrentFloor, Floor},
player::{ events::TransitionFloor,
components::{CurrentPosition, Player},
events::AscendPlayer,
}, },
maze::components::MazeConfig,
player::components::{CurrentPosition, Player},
}; };
pub(super) fn ascend_player( pub(super) fn ascend_player(
query: Query<&CurrentPosition, With<Player>>, query: Query<&CurrentPosition, With<Player>>,
maze_config_query: Query<(&MazeConfig, &Floor), With<CurrentFloor>>, maze_config_query: Query<(&MazeConfig, &Floor), With<CurrentFloor>>,
mut event_writer: EventWriter<AscendPlayer>, mut event_writer: EventWriter<TransitionFloor>,
) { ) {
let Ok((config, floor)) = maze_config_query.get_single() else { let Ok((config, floor)) = maze_config_query.get_single() else {
warn!("No current floor configuration found");
return; return;
}; };
for current_hex in query.iter() { for current_hex in query.iter() {
if current_hex.0 == config.end_pos { if current_hex.0 == config.end_pos {
event_writer.send(AscendPlayer { event_writer.send(TransitionFloor {
floor: *floor.increase(), floor: *floor.increase(),
}); });
return; return;

View File

@ -1,27 +1,26 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{ use crate::{
floor::components::{CurrentFloor, Floor}, floor::{
maze::components::MazeConfig, components::{CurrentFloor, Floor},
player::{ events::TransitionFloor,
components::{CurrentPosition, Player},
events::DescendPlayer,
}, },
maze::components::MazeConfig,
player::components::{CurrentPosition, Player},
}; };
pub(super) fn descend_player( pub(super) fn descend_player(
query: Query<&CurrentPosition, With<Player>>, query: Query<&CurrentPosition, With<Player>>,
maze_config_query: Query<(&MazeConfig, &Floor), With<CurrentFloor>>, maze_config_query: Query<(&MazeConfig, &Floor), With<CurrentFloor>>,
mut event_writer: EventWriter<DescendPlayer>, mut event_writer: EventWriter<TransitionFloor>,
) { ) {
let Ok((config, floor)) = maze_config_query.get_single() else { let Ok((config, floor)) = maze_config_query.get_single() else {
warn!("No current floor configuration found");
return; return;
}; };
for current_hex in query.iter() { for current_hex in query.iter() {
if current_hex.0 == config.start_pos { if current_hex.0 == config.start_pos && floor.0 != 1 {
event_writer.send(DescendPlayer { event_writer.send(TransitionFloor {
floor: *floor.decrease(), floor: *floor.decrease(),
}); });
return; return;