mirror of
https://github.com/kristoferssolo/maze-ascension.git
synced 2025-10-21 19:20:34 +00:00
feat(floor): spawn next floor
This commit is contained in:
parent
de4989ccfb
commit
86bbee8cb8
@ -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,
|
||||||
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
3
src/floor/systems/despawn.rs
Normal file
3
src/floor/systems/despawn.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
pub(super) fn despawn_level(mut commands: Commands) {}
|
||||||
@ -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>),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
11
src/floor/systems/spawn.rs
Normal file
11
src/floor/systems/spawn.rs
Normal 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() });
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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,
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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,
|
|
||||||
}
|
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user