diff --git a/crates/border-wars/src/lib.rs b/crates/border-wars/src/lib.rs index a4acdb8..9ae0ca0 100644 --- a/crates/border-wars/src/lib.rs +++ b/crates/border-wars/src/lib.rs @@ -5,6 +5,7 @@ use bevy::prelude::*; pub mod camera; pub mod map; pub mod scenes; +pub mod ui; /// The current scene of the game. #[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash, States)] diff --git a/crates/border-wars/src/main.rs b/crates/border-wars/src/main.rs index cc2c72e..153c1b8 100644 --- a/crates/border-wars/src/main.rs +++ b/crates/border-wars/src/main.rs @@ -3,8 +3,10 @@ use bevy::prelude::*; use border_wars::camera::CameraPlugin; use border_wars::map::click_tile::TilesClickable; +use border_wars::map::generation::{MapGenerationPlugin, StartMapGeneration}; use border_wars::map::renderer::RendererPlugin; use border_wars::scenes::ScenesPlugin; +use border_wars::ui::tiles_info::TilesInfoPlugin; fn main() { App::new() @@ -13,5 +15,15 @@ fn main() { .add_plugins(RendererPlugin) .add_plugins(CameraPlugin) .add_plugins(TilesClickable) + .add_plugins(MapGenerationPlugin) + .add_systems(OnEnter(border_wars::CurrentScene::Game), start) + .add_plugins(TilesInfoPlugin) .run(); } + +fn start(mut event: EventWriter) { + event.send(StartMapGeneration { + seed: 0, + radius: 10, + }); +} diff --git a/crates/border-wars/src/map/click_tile.rs b/crates/border-wars/src/map/click_tile.rs index fb66845..bc2286f 100644 --- a/crates/border-wars/src/map/click_tile.rs +++ b/crates/border-wars/src/map/click_tile.rs @@ -1,6 +1,6 @@ //! All programs related to the clicking on a tile. -use bevy::prelude::*; +use bevy::{input::mouse::MouseButtonInput, prelude::*}; use super::Tile; @@ -36,14 +36,18 @@ impl Plugin for TilesClickable { /// Handles the mouse click and gets the position of the cursor in the world. /// Finally, it sends an event with the position of the cursor. fn mouse_handler( - mouse_button_input: Res>, + mut mouse_button_event: EventReader, windows: Query<&Window>, cameras: Query<(&Camera, &GlobalTransform)>, mut events_writer: EventWriter, not_clickable_zones: Query<(&Node, &GlobalTransform), With>, ui_scale: Res, ) { - if !mouse_button_input.just_pressed(MouseButton::Left) { + let Some(event) = mouse_button_event.read().next() else { + return; + }; + + if !(event.state.is_pressed() && event.button == MouseButton::Left) { return; } diff --git a/crates/border-wars/src/map/mod.rs b/crates/border-wars/src/map/mod.rs index 9172176..5b434bc 100644 --- a/crates/border-wars/src/map/mod.rs +++ b/crates/border-wars/src/map/mod.rs @@ -13,7 +13,7 @@ use self::hex::*; pub type TilePosition = HexPosition; /// The tile of the map. -#[derive(Component, Debug)] +#[derive(Component, Debug, Clone, Copy, PartialEq, Eq)] pub enum Tile { /// The hill tile. Hill, diff --git a/crates/border-wars/src/ui/mod.rs b/crates/border-wars/src/ui/mod.rs new file mode 100644 index 0000000..66e9cb6 --- /dev/null +++ b/crates/border-wars/src/ui/mod.rs @@ -0,0 +1,3 @@ +//! TODO + +pub mod tiles_info; diff --git a/crates/border-wars/src/ui/tiles_info.rs b/crates/border-wars/src/ui/tiles_info.rs new file mode 100644 index 0000000..201286e --- /dev/null +++ b/crates/border-wars/src/ui/tiles_info.rs @@ -0,0 +1,111 @@ +//! TODO + +use bevy::prelude::*; + +use crate::map::click_tile::TileJustClicked; +use crate::map::Tile; + +/// TODO +pub struct TilesInfoPlugin; + +impl Plugin for TilesInfoPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, handle_tile_click) + .init_resource::() + .add_systems(Update, update_tile_info_text) + .add_systems(OnEnter(crate::CurrentScene::Game), init_text_zone); + } +} + +impl Tile { + fn get_info_text(&self) -> String { + match self { + Tile::Hill => "This is a hill".to_string(), + Tile::Grass => "This is grass".to_string(), + Tile::Forest => "This is a forest".to_string(), + } + } +} + +#[derive(Resource, Default)] +enum SelectedTile { + Tile(Tile, u32), + #[default] + None, +} + +impl SelectedTile { + fn index(&self) -> Option { + match self { + SelectedTile::Tile(_, index) => Some(*index), + SelectedTile::None => None, + } + } +} + +fn handle_tile_click( + mut event: EventReader, + mut query: Query<(&Tile, Entity, &mut Transform)>, + mut selected: ResMut, +) { + if let Some(event) = event.read().last() { + let save_selected = selected.index(); + for (_, entity, mut transform) in query.iter_mut() { + if selected.index() == Some(entity.index()) { + if event.0 == entity.index() { + *selected = SelectedTile::None; + } + transform.translation.y -= 10.; + } + } + + for (tile, entity, mut transform) in query.iter_mut() { + if event.0 == entity.index() && save_selected != Some(event.0) { + *selected = SelectedTile::Tile(*tile, entity.index()); + transform.translation.y += 10.; + } + } + + } +} + +fn init_text_zone(mut commands: Commands) { + commands + .spawn(TextBundle { + style: Style { + position_type: PositionType::Absolute, + + ..default() + }, + ..default() + }) + .insert(TileInfoText); +} + +/// TODO +#[derive(Component)] +pub struct TileInfoText; + +fn update_tile_info_text( + mut query: Query<(&mut Transform, &mut Text, &mut Visibility), With>, + selected: Res, +) { + for (mut transform, mut text, mut visibility) in query.iter_mut() { + if selected.index().is_none() { + *visibility = Visibility::Hidden; + return; + } + if let SelectedTile::Tile(tile, _) = *selected { + text.sections = vec![TextSection { + value: tile.get_info_text(), + style: TextStyle { + font_size: 20.0, + color: Color::WHITE, + ..default() + }, + }]; + *visibility = Visibility::Visible; + transform.translation.z = 1.0; + } + } +}