diff --git a/src/dev_tools.rs b/src/dev_tools.rs index 1b78f7e..14e85db 100644 --- a/src/dev_tools.rs +++ b/src/dev_tools.rs @@ -7,23 +7,29 @@ use bevy::{ }, input::common_conditions::input_just_pressed, prelude::*, + window::PrimaryWindow, }; -use bevy_inspector_egui::quick::WorldInspectorPlugin; +use bevy_inspector_egui::{bevy_egui::EguiContext, DefaultInspectorConfigPlugin}; -use crate::screens::Screen; +use crate::{maze::events::RecreateMazeEvent, screens::Screen}; +use bevy_egui::{ + egui::{self, Button, Color32, ScrollArea}, + EguiPlugin, +}; pub(super) fn plugin(app: &mut App) { // Log `Screen` state transitions. - app.add_systems(Update, log_transitions::); - - // Toggle the debug overlay for UI. - app.add_plugins(DebugUiPlugin); - app.add_plugins(WorldInspectorPlugin::default()); - app.add_systems( - Update, - toggle_debug_ui.run_if(input_just_pressed(TOGGLE_KEY)), - ); + app.add_systems(Update, log_transitions::) + .add_plugins(EguiPlugin) + .add_plugins(DebugUiPlugin) + .add_plugins(DefaultInspectorConfigPlugin) + .add_systems(Update, inspector_ui) + // Toggle the debug overlay for UI. + .add_systems( + Update, + toggle_debug_ui.run_if(input_just_pressed(TOGGLE_KEY)), + ); } const TOGGLE_KEY: KeyCode = KeyCode::Backquote; @@ -31,3 +37,30 @@ const TOGGLE_KEY: KeyCode = KeyCode::Backquote; fn toggle_debug_ui(mut options: ResMut) { options.toggle(); } + +fn inspector_ui(world: &mut World) { + let Ok(egui_context) = world + .query_filtered::<&mut EguiContext, With>() + .get_single(world) + else { + return; + }; + + let mut egui_context = egui_context.clone(); + + egui::Window::new("UI").show(egui_context.get_mut(), |ui| { + ScrollArea::vertical().show(ui, |ui| { + bevy_inspector_egui::bevy_inspector::ui_for_world(world, ui); + }); + + ui.add_space(8.); + + let button = Button::new("Recreate maze").fill(Color32::from_rgb(108, 108, 108)); + + if ui.add(button).clicked() { + if let Some(mut event_writer) = world.get_resource_mut::>() { + event_writer.send(RecreateMazeEvent { floor: 1 }); + } + } + }); +} diff --git a/src/maze/assets.rs b/src/maze/assets.rs index 539f4a6..3ae52fa 100644 --- a/src/maze/assets.rs +++ b/src/maze/assets.rs @@ -17,7 +17,7 @@ pub(crate) struct MazeAssets { pub(crate) fn create_base_assets( meshes: &mut ResMut>, materials: &mut ResMut>, - config: &Res, + config: &MazeConfig, ) -> MazeAssets { MazeAssets { hex_mesh: meshes.add(generate_hex_mesh(HEX_SIZE, config.height)), diff --git a/src/maze/components.rs b/src/maze/components.rs index 2cb53b4..1d9ccd8 100644 --- a/src/maze/components.rs +++ b/src/maze/components.rs @@ -2,8 +2,12 @@ use bevy::prelude::*; #[derive(Debug, Reflect, Component)] #[reflect(Component)] -pub(crate) struct MazeWall; +pub(crate) struct MazeFloor(pub(crate) u8); #[derive(Debug, Reflect, Component)] #[reflect(Component)] pub(crate) struct MazeTile; + +#[derive(Debug, Reflect, Component)] +#[reflect(Component)] +pub(crate) struct MazeWall; diff --git a/src/maze/events.rs b/src/maze/events.rs new file mode 100644 index 0000000..2a10115 --- /dev/null +++ b/src/maze/events.rs @@ -0,0 +1,6 @@ +use bevy::prelude::*; + +#[derive(Debug, Event)] +pub(crate) struct RecreateMazeEvent { + pub(crate) floor: u8, +} diff --git a/src/maze/mod.rs b/src/maze/mod.rs index 23064f0..26aec4f 100644 --- a/src/maze/mod.rs +++ b/src/maze/mod.rs @@ -2,6 +2,7 @@ use bevy::{ecs::world::Command, prelude::*}; use plugin::MazePlugin; mod assets; mod components; +pub mod events; pub mod plugin; mod resources; mod systems; diff --git a/src/maze/plugin.rs b/src/maze/plugin.rs index b08bb06..d4ce8c2 100644 --- a/src/maze/plugin.rs +++ b/src/maze/plugin.rs @@ -3,14 +3,22 @@ use bevy::{ prelude::*, }; -use super::{resources::Layout, systems, MazeConfig}; +use super::{ + events::RecreateMazeEvent, + resources::Layout, + systems::{self, recreation::handle_maze_recreation_event}, + MazeConfig, +}; #[derive(Default)] pub(crate) struct MazePlugin; impl Plugin for MazePlugin { fn build(&self, app: &mut App) { - app.init_resource::().init_resource::(); + app.init_resource::() + .init_resource::() + .add_event::() + .add_systems(Update, handle_maze_recreation_event); } } diff --git a/src/maze/systems/mod.rs b/src/maze/systems/mod.rs index c525b54..6fe5160 100644 --- a/src/maze/systems/mod.rs +++ b/src/maze/systems/mod.rs @@ -1,2 +1,3 @@ +pub mod recreation; pub mod setup; mod spawn; diff --git a/src/maze/systems/recreation.rs b/src/maze/systems/recreation.rs new file mode 100644 index 0000000..cadd2cb --- /dev/null +++ b/src/maze/systems/recreation.rs @@ -0,0 +1,30 @@ +use bevy::prelude::*; + +use crate::maze::{ + components::MazeFloor, events::RecreateMazeEvent, resources::Layout, MazeConfig, +}; + +use super::setup::setup_maze; + +pub(crate) fn handle_maze_recreation_event( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, + config: Res, + layout: Res, + query: Query<(Entity, &MazeFloor)>, + mut event_reader: EventReader, +) { + for event in event_reader.read() { + despawn_floor(&mut commands, &query, event.floor); + setup_maze(&mut commands, &mut meshes, &mut materials, &config, &layout); + } +} + +fn despawn_floor(commands: &mut Commands, query: &Query<(Entity, &MazeFloor)>, floor_num: u8) { + for (entity, maze_floor) in query.iter() { + if maze_floor.0 == floor_num { + commands.entity(entity).despawn_recursive(); + } + } +} diff --git a/src/maze/systems/setup.rs b/src/maze/systems/setup.rs index c00ee92..8e7da5e 100644 --- a/src/maze/systems/setup.rs +++ b/src/maze/systems/setup.rs @@ -1,7 +1,9 @@ use bevy::prelude::*; use hexlab::{GeneratorType, MazeBuilder}; -use crate::maze::{assets::create_base_assets, resources::Layout, MazeConfig}; +use crate::maze::{ + assets::create_base_assets, components::MazeFloor, resources::Layout, MazeConfig, +}; use super::spawn::spawn_single_hex_tile; @@ -11,6 +13,16 @@ pub(crate) fn setup( mut materials: ResMut>, config: Res, layout: Res, +) { + setup_maze(&mut commands, &mut meshes, &mut materials, &config, &layout); +} + +pub(super) fn setup_maze( + commands: &mut Commands, + meshes: &mut ResMut>, + materials: &mut ResMut>, + config: &MazeConfig, + layout: &Layout, ) { let maze = MazeBuilder::new() .with_radius(config.radius) @@ -19,10 +31,11 @@ pub(crate) fn setup( .build() .expect("Something went wrong while creating maze"); - let assets = create_base_assets(&mut meshes, &mut materials, &config); + let assets = create_base_assets(meshes, materials, config); commands .spawn(( Name::new("Floor"), + MazeFloor(1), SpatialBundle { transform: Transform::from_translation(Vec3::ZERO), ..default() diff --git a/src/maze/systems/spawn.rs b/src/maze/systems/spawn.rs index 25b13db..2ec9259 100644 --- a/src/maze/systems/spawn.rs +++ b/src/maze/systems/spawn.rs @@ -6,6 +6,7 @@ use hexx::HexOrientation; use crate::maze::{ assets::MazeAssets, + components::{MazeTile, MazeWall}, resources::{HEX_SIZE, WALL_SIZE}, }; @@ -25,6 +26,7 @@ pub(super) fn spawn_single_hex_tile( parent .spawn(( Name::new(format!("Hex {}", tile.to_string())), + MazeTile, PbrBundle { mesh: assets.hex_mesh.clone(), material: assets.hex_material.clone(), @@ -64,6 +66,7 @@ fn spawn_single_wall( ) { parent.spawn(( Name::new("Wall"), + MazeWall, PbrBundle { mesh: asstets.wall_mesh.clone(), material: asstets.wall_material.clone(),