diff --git a/Cargo.lock b/Cargo.lock index dee1c96..4f9748d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -745,6 +745,30 @@ dependencies = [ "encase_derive_impl", ] +[[package]] +name = "bevy_eventlistener" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63aff74ac1477b88b57ff2f82fc711a7931414be7ee7d0e96aeea45b6d4a7cb6" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_eventlistener_derive", + "bevy_hierarchy", + "bevy_utils", +] + +[[package]] +name = "bevy_eventlistener_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc779559aa23b81da2b14fba90586755d225983c5b6d3154658e42fc088de7f" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.70", +] + [[package]] name = "bevy_gilrs" version = "0.14.2" @@ -913,6 +937,18 @@ dependencies = [ "tracing-wasm", ] +[[package]] +name = "bevy_lunex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e2bb6bf7507c23bb69edf4f045312448b8dbba73b85dda58e9178255ece099" +dependencies = [ + "bevy", + "bevy_mod_picking", + "colored", + "lunex_engine", +] + [[package]] name = "bevy_macro_utils" version = "0.14.2" @@ -948,6 +984,48 @@ dependencies = [ "glam", ] +[[package]] +name = "bevy_mod_picking" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e290b8ad3e72dc621da7a9c21129da10540d78290ef8857353190e0213cac692" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_eventlistener", + "bevy_math", + "bevy_picking_core", + "bevy_picking_highlight", + "bevy_picking_input", + "bevy_picking_raycast", + "bevy_picking_selection", + "bevy_reflect", + "bevy_render", + "bevy_utils", + "bevy_window", +] + +[[package]] +name = "bevy_mod_raycast" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e4ff45885c4716771a9f55977d8ce69596502a5241da55bf608d7cd71a9cb3" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "crossbeam-channel", +] + [[package]] name = "bevy_pbr" version = "0.14.2" @@ -975,6 +1053,90 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "bevy_picking_core" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020b6cf6079927a1e6a3dd883986546632d8d09ab77840997f4936a74eade722" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_eventlistener", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "uuid", +] + +[[package]] +name = "bevy_picking_highlight" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba45161608da1bb58cbc55fd83cf5e529e616a180778c394733c85056cd2b76" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_ecs", + "bevy_picking_core", + "bevy_picking_selection", + "bevy_reflect", +] + +[[package]] +name = "bevy_picking_input" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba8cf67c68a5e150c066366744f9a44006ead9ad280de1c9ca69a6a13c5e283" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_math", + "bevy_picking_core", + "bevy_picking_selection", + "bevy_reflect", + "bevy_render", + "bevy_utils", + "bevy_window", +] + +[[package]] +name = "bevy_picking_raycast" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b024e7b0a6062aafd5daa746e5298a1b726c6409de11e35e0b574b712ebda3d" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_mod_raycast", + "bevy_picking_core", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_window", +] + +[[package]] +name = "bevy_picking_selection" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0769d84e944fbc09b0475f068e5232a8a4be15339796539aecd747413ededd" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_eventlistener", + "bevy_input", + "bevy_picking_core", + "bevy_reflect", + "bevy_utils", +] + [[package]] name = "bevy_ptr" version = "0.14.2" @@ -1608,6 +1770,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "com" version = "0.6.0" @@ -3079,6 +3251,18 @@ dependencies = [ "imgref", ] +[[package]] +name = "lunex_engine" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d55d2e631c0eb2d5bc164ca826452f550a57a9b0d8da93e6e5625d23f533bd" +dependencies = [ + "bevy", + "colored", + "indexmap", + "thiserror", +] + [[package]] name = "mach2" version = "0.4.2" @@ -3966,6 +4150,7 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_asset_loader", + "bevy_lunex", "bevy_rapier3d", "buildings", "image 0.25.2", diff --git a/game/buildings/src/assets/building_asset.rs b/game/buildings/src/assets/building_asset.rs index a433dc3..4187b6d 100644 --- a/game/buildings/src/assets/building_asset.rs +++ b/game/buildings/src/assets/building_asset.rs @@ -23,6 +23,11 @@ pub struct BuildingAsset { pub cost: Vec, pub consumption: Vec, pub production: Vec, + + pub health: u32, + + pub building_type: BuildingType, + pub animations: Vec, } #[derive(Serialize, Deserialize, Debug, TypePath)] diff --git a/game/buildings/src/buildings/factory_building.rs b/game/buildings/src/buildings/factory_building.rs new file mode 100644 index 0000000..9c78898 --- /dev/null +++ b/game/buildings/src/buildings/factory_building.rs @@ -0,0 +1,6 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct FactoryBuildingInfo { + pub units_to_build: Vec<()> +} diff --git a/game/buildings/src/buildings/resource_gathering.rs b/game/buildings/src/buildings/resource_gathering.rs new file mode 100644 index 0000000..85dd925 --- /dev/null +++ b/game/buildings/src/buildings/resource_gathering.rs @@ -0,0 +1,8 @@ +use serde::{Deserialize, Serialize}; +use shared::identifiers::ResourceIdentifier; + +#[derive(Serialize, Deserialize, Debug)] +pub struct ResourceGatheringBuildingInfo { + pub resources_to_gather: Vec, + pub gather_range: usize, +} diff --git a/game/buildings/src/buildings/tech_building.rs b/game/buildings/src/buildings/tech_building.rs new file mode 100644 index 0000000..3e9f89f --- /dev/null +++ b/game/buildings/src/buildings/tech_building.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; +use shared::{building::BuildingIdentifier, StatusEffect}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct TechBuildingInfo { + pub effect_range: usize, + pub buildings_to_unlock: Vec, + pub buffs: Vec, +} diff --git a/game/main/Cargo.toml b/game/main/Cargo.toml index c6505ef..9164367 100644 --- a/game/main/Cargo.toml +++ b/game/main/Cargo.toml @@ -27,6 +27,7 @@ bevy_asset_loader = { version = "0.21.0", features = [ ] } ron = "0.8.1" image = "0.25.2" +bevy_lunex = "0.2.4" [features] tracing = [ diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index 8c1a19e..158acbf 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -2,7 +2,9 @@ use bevy::core_pipeline::experimental::taa::{TemporalAntiAliasBundle, TemporalAn use bevy::core_pipeline::prepass::DepthPrepass; use bevy::input::mouse::{MouseMotion, MouseScrollUnit, MouseWheel}; use bevy::prelude::*; +use bevy::render::view::RenderLayers; use bevy::window::{CursorGrabMode, PrimaryWindow}; +use bevy_lunex::prelude::MainUi; use shared::sets::GameplaySet; use shared::tags::MainCamera; use world_generation::hex_utils::HexCoord; @@ -59,6 +61,7 @@ fn setup(mut commands: Commands, mut msaa: ResMut) { MainCamera, DepthPrepass, PhosOrbitCamera::default(), + MainUi, )) // .insert(RenderLayers::layer(0)) .insert(TemporalAntiAliasBundle::default()); diff --git a/game/main/src/main.rs b/game/main/src/main.rs index ed03ec2..d758662 100644 --- a/game/main/src/main.rs +++ b/game/main/src/main.rs @@ -1,3 +1,5 @@ +use std::env; + use bevy::pbr::wireframe::WireframePlugin; use bevy::prelude::*; use bevy::render::texture::{ImageAddressMode, ImageFilterMode, ImageSamplerDescriptor}; @@ -10,8 +12,8 @@ mod map_rendering; mod phos; mod prelude; mod shader_extensions; -mod utlis; mod ui; +mod utlis; fn main() { App::new() diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index 82171c6..e0461eb 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -1,6 +1,7 @@ use crate::camera_system::components::PhosCamera; use crate::map_rendering::map_init::MapInitPlugin; use crate::map_rendering::render_distance_system::RenderDistancePlugin; +use crate::ui::game::build_ui::BuildUiPlugin; use crate::utlis::editor_plugin::EditorPlugin; use crate::utlis::tile_selection_plugin::TileSelectionPlugin; use crate::{camera_system::camera_plugin::PhosCameraPlugin, utlis::debug_plugin::DebugPlugin}; diff --git a/game/main/src/ui/game/build_ui.rs b/game/main/src/ui/game/build_ui.rs index 4263d1f..78ec27f 100644 --- a/game/main/src/ui/game/build_ui.rs +++ b/game/main/src/ui/game/build_ui.rs @@ -1,11 +1,54 @@ -use bevy::prelude::*; +use bevy::{prelude::*, render::view::RenderLayers}; +use bevy_lunex::prelude::*; +use shared::tags::MainCamera; pub struct BuildUiPlugin; impl Plugin for BuildUiPlugin { fn build(&self, app: &mut App) { - app.add_systems(PostStartup, setup); + // app.add_plugins(UiDefaultPlugins) + // .add_plugins(UiDebugPlugin::::new()); + + app.add_systems(PostStartup, setup_ui); } } -fn setup(mut commands: Commands) {} +fn setup_ui(mut commands: Commands, assets: Res) { + commands + .spawn(( + Camera2dBundle { + transform: Transform::from_xyz(0.0, 0.0, 1000.0), + ..default() + }, + MainUi, + )) + .insert(RenderLayers::layer(1)); + + commands + .spawn(( + UiTreeBundle:: { + tree: UiTree::new2d("BuildUi"), + ..default() + }, + Name::new("Build UI"), + SourceFromCamera, + RenderLayers::layer(1), + )) + .with_children(|ui| { + ui.spawn(( + UiLink::::path("Root"), + UiLayout::boundary() + .pos1(Ab(20.0)) + .pos2(Rl(100.0) - Ab(20.0)) + .pack::(), + RenderLayers::layer(1), + )); + + ui.spawn(( + UiLink::::path("Root/Rect"), + UiLayout::solid().size((Ab(1920.0), Ab(1080.0))).pack::(), + UiImage2dBundle::from(assets.load("textures/world/test2.png")), + RenderLayers::layer(1), + )); + }); +} diff --git a/game/main/src/ui/game/mod.rs b/game/main/src/ui/game/mod.rs index 6df843f..791f966 100644 --- a/game/main/src/ui/game/mod.rs +++ b/game/main/src/ui/game/mod.rs @@ -1,2 +1 @@ - -pub mod build_ui; +pub mod build_ui; \ No newline at end of file diff --git a/game/main/src/ui/mod.rs b/game/main/src/ui/mod.rs index 5a6b903..f7ee1cd 100644 --- a/game/main/src/ui/mod.rs +++ b/game/main/src/ui/mod.rs @@ -1,2 +1 @@ - pub mod game; diff --git a/game/shared/src/building.rs b/game/shared/src/building.rs index e3bdafc..3131418 100644 --- a/game/shared/src/building.rs +++ b/game/shared/src/building.rs @@ -1,6 +1,7 @@ +use bevy::reflect::Reflect; use serde::{Deserialize, Serialize}; -#[derive(Default, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Default, Reflect, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BuildingIdentifier(pub usize); impl From for BuildingIdentifier { diff --git a/game/shared/src/identifiers.rs b/game/shared/src/identifiers.rs index f1947d9..166f5d7 100644 --- a/game/shared/src/identifiers.rs +++ b/game/shared/src/identifiers.rs @@ -1,9 +1,15 @@ -use bevy::prelude::Resource; +use bevy::reflect::Reflect; use serde::{Deserialize, Serialize}; use world_generation::hex_utils::HexCoord; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Reflect)] pub struct ResourceIdentifier { pub id: u32, pub qty: u32, } + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub struct UnitIdentifier(u32); + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub struct TileIdentifier(u32); diff --git a/game/shared/src/lib.rs b/game/shared/src/lib.rs index b2f1167..2de0e49 100644 --- a/game/shared/src/lib.rs +++ b/game/shared/src/lib.rs @@ -1,3 +1,4 @@ +use bevy::reflect::Reflect; use serde::{Deserialize, Serialize}; pub mod building; @@ -17,3 +18,17 @@ pub enum Tier { Three, Superior, } + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub enum StatusEffect { + UnitRange(f32), + UnitAttack(f32), + UnitHealth(f32), + StructureRange(f32), + StructureAttack(f32), + StructureHealth(f32), + BuildSpeedMulti(f32), + BuildCostMulti(f32), + ConsumptionMulti(f32), + ProductionMulti(f32), +} diff --git a/game/units/src/lib.rs b/game/units/src/lib.rs index 440c589..61e9eb8 100644 --- a/game/units/src/lib.rs +++ b/game/units/src/lib.rs @@ -1,3 +1,5 @@ +use bevy::reflect::Reflect; +use serde::{Deserialize, Serialize}; pub mod assets; pub mod components;