From 7ff3638eff451cb23e8706c41790589cb1153d1d Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sat, 29 Jun 2024 19:00:29 -0400 Subject: [PATCH] buildings --- Cargo.lock | 1 + game/buildings/Cargo.toml | 2 + game/buildings/src/assets/building_asset.rs | 2 +- .../buildings/src/assets/building_database.rs | 22 +++++++++ game/buildings/src/assets/mod.rs | 1 + game/buildings/src/build_queue.rs | 2 + game/buildings/src/building_plugin.rs | 47 ++++++++++++++----- ...buildings_database.rs => buildings_map.rs} | 6 +-- game/buildings/src/footprint.rs | 2 +- game/buildings/src/lib.rs | 2 +- game/main/src/camera_system/camera_plugin.rs | 4 +- game/main/src/map_rendering/map_init.rs | 10 ++-- game/main/src/phos.rs | 4 +- game/shared/src/building.rs | 6 +++ game/shared/src/despawn.rs | 4 +- game/shared/src/resource.rs | 2 +- game/shared/src/states.rs | 4 +- 17 files changed, 90 insertions(+), 31 deletions(-) create mode 100644 game/buildings/src/assets/building_database.rs rename game/buildings/src/{buildings_database.rs => buildings_map.rs} (95%) diff --git a/Cargo.lock b/Cargo.lock index 4a20966..4c87fdf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1325,6 +1325,7 @@ dependencies = [ name = "buildings" version = "0.1.0" dependencies = [ + "asset_loader", "bevy", "bevy_rapier3d", "serde", diff --git a/game/buildings/Cargo.toml b/game/buildings/Cargo.toml index 2e24167..ef9de48 100644 --- a/game/buildings/Cargo.toml +++ b/game/buildings/Cargo.toml @@ -11,6 +11,8 @@ world_generation = {path = "../../engine/world_generation"} shared = {path = "../shared"} bevy_rapier3d = "0.26.0" serde = {version="1.0.203", features=["derive"]} +asset_loader = {path = "../../engine/asset_loader"} + [features] tracing = [] diff --git a/game/buildings/src/assets/building_asset.rs b/game/buildings/src/assets/building_asset.rs index e278633..e607c08 100644 --- a/game/buildings/src/assets/building_asset.rs +++ b/game/buildings/src/assets/building_asset.rs @@ -4,7 +4,7 @@ use shared::resource::ResourceIdentifier; use crate::footprint::BuildingFootprint; -#[derive(Resource, Serialize, Deserialize)] +#[derive(Asset, TypePath, Debug, Serialize, Deserialize)] pub struct BuildingAsset { pub name: String, pub description: String, diff --git a/game/buildings/src/assets/building_database.rs b/game/buildings/src/assets/building_database.rs new file mode 100644 index 0000000..d29bfca --- /dev/null +++ b/game/buildings/src/assets/building_database.rs @@ -0,0 +1,22 @@ +use asset_loader::create_asset_loader; +use bevy::prelude::{self, Resource}; +use serde::{Deserialize, Serialize}; + +use super::building_asset::BuildingAsset; + +#[derive(Serialize, Deserialize, Debug, TypePath, Asset)] +pub struct BuildingDatabase { + pub hq: u32, + pub buildings_paths: Vec, + pub buildings: Vec, +} + +create_asset_loader!( + BuildingDatabasePlugin, + BuildingDatabaseLoader, + BuildingDatabase, + BuildingDatabaseState, + &["building.db.json"],; + buildings_paths -> buildings + ? +); diff --git a/game/buildings/src/assets/mod.rs b/game/buildings/src/assets/mod.rs index c5952ee..a88c222 100644 --- a/game/buildings/src/assets/mod.rs +++ b/game/buildings/src/assets/mod.rs @@ -1 +1,2 @@ pub mod building_asset; +pub mod building_database; diff --git a/game/buildings/src/build_queue.rs b/game/buildings/src/build_queue.rs index 324b36e..93b8e3b 100644 --- a/game/buildings/src/build_queue.rs +++ b/game/buildings/src/build_queue.rs @@ -1,6 +1,8 @@ +use bevy::prelude::Resource; use shared::building::BuildingIdentifier; use world_generation::hex_utils::HexCoord; +#[derive(Resource)] pub struct BuildQueue { pub queue: Vec, } diff --git a/game/buildings/src/building_plugin.rs b/game/buildings/src/building_plugin.rs index 605ebf6..ccccaa7 100644 --- a/game/buildings/src/building_plugin.rs +++ b/game/buildings/src/building_plugin.rs @@ -1,14 +1,24 @@ use bevy::{prelude::*, window::PrimaryWindow}; use bevy_rapier3d::{pipeline::QueryFilter, plugin::RapierContext}; -use shared::{despawn::Despawn, states::GameplayState, tags::MainCamera}; +use shared::{ + despawn::Despawn, + states::{GameplayState, MenuState}, + tags::MainCamera, +}; use world_generation::{hex_utils::HexCoord, map::map::Map}; +use crate::build_queue::{self, BuildQueue, QueueEntry}; + pub struct BuildingPugin; impl Plugin for BuildingPugin { fn build(&self, app: &mut App) { + app.insert_resource(BuildQueue::default()); + app.add_systems(Startup, init); app.add_systems(Update, hq_placement.run_if(in_state(GameplayState::PlaceHQ))); + + app.add_systems(PreUpdate, process_build_queue.run_if(in_state(GameplayState::Playing))); } } @@ -30,6 +40,8 @@ fn hq_placement( rapier_context: Res, map: Res, indicator: Res, + mut build_queue: ResMut, + next_state: ResMut>, ) { let win = window.single(); let (cam_transform, camera) = cam_query.single(); @@ -53,16 +65,29 @@ fn hq_placement( let contact_point = cam_ray.get_point(dist); let contact_coord = HexCoord::from_world_pos(contact_point); let positions = map.hex_select(&contact_coord, 3, true, |pos, h, _| pos.to_world(h)); - for p in positions { - commands.spawn(( - PbrBundle { - mesh: indicator.0.clone(), - material: indicator.1.clone(), - transform: Transform::from_translation(p), - ..default() - }, - Despawn, - )); + show_indicators(positions, &mut commands, &indicator); + + if mouse.just_pressed(MouseButton::Left) { + build_queue.queue.push(QueueEntry { + building: 0.into(), + pos: contact_coord, + }); } } } + +fn show_indicators(positions: Vec, commands: &mut Commands, indicator: &IndicatorCube) { + for p in positions { + commands.spawn(( + PbrBundle { + mesh: indicator.0.clone(), + material: indicator.1.clone(), + transform: Transform::from_translation(p), + ..default() + }, + Despawn, + )); + } +} + +fn process_build_queue(mut queue: ResMut) {} diff --git a/game/buildings/src/buildings_database.rs b/game/buildings/src/buildings_map.rs similarity index 95% rename from game/buildings/src/buildings_database.rs rename to game/buildings/src/buildings_map.rs index cbf5c0b..db9f6c2 100644 --- a/game/buildings/src/buildings_database.rs +++ b/game/buildings/src/buildings_map.rs @@ -2,13 +2,13 @@ use bevy::prelude::*; use world_generation::hex_utils::HexCoord; #[derive(Resource)] -pub struct BuildingDatabase { +pub struct BuildingMap { pub chunks: Vec, } -impl BuildingDatabase { +impl BuildingMap { pub fn new(size: UVec2) -> Self { - let mut db = BuildingDatabase { + let mut db = BuildingMap { chunks: Vec::with_capacity(size.length_squared() as usize), }; diff --git a/game/buildings/src/footprint.rs b/game/buildings/src/footprint.rs index 360c358..82f0cd2 100644 --- a/game/buildings/src/footprint.rs +++ b/game/buildings/src/footprint.rs @@ -2,7 +2,7 @@ use bevy::math::{IVec2, Vec3Swizzles}; use serde::{Deserialize, Serialize}; use world_generation::hex_utils::HexCoord; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] pub struct BuildingFootprint { pub footprint: Vec, } diff --git a/game/buildings/src/lib.rs b/game/buildings/src/lib.rs index 7cb53fb..6909842 100644 --- a/game/buildings/src/lib.rs +++ b/game/buildings/src/lib.rs @@ -1,6 +1,6 @@ pub mod assets; pub mod build_queue; pub mod building_plugin; -pub mod buildings_database; +pub mod buildings_map; pub mod footprint; pub use building_plugin::*; diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index fb7bac6..8423ebf 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -3,7 +3,7 @@ use bevy::core_pipeline::prepass::DepthPrepass; use bevy::input::mouse::{MouseMotion, MouseScrollUnit, MouseWheel}; use bevy::prelude::*; use bevy::window::CursorGrabMode; -use shared::states::GameState; +use shared::states::MenuState; use shared::tags::MainCamera; use world_generation::hex_utils::HexCoord; use world_generation::prelude::Map; @@ -18,7 +18,7 @@ impl Plugin for PhosCameraPlugin { app.add_systems(PreStartup, setup); - app.add_systems(Update, rts_camera_system.run_if(in_state(GameState::Playing))); + app.add_systems(Update, rts_camera_system.run_if(in_state(MenuState::InGame))); app.add_systems(PostUpdate, limit_camera_bounds); //Free Cam //app.add_systems(Update, (grab_mouse, (update_camera, update_camera_mouse).chain())); diff --git a/game/main/src/map_rendering/map_init.rs b/game/main/src/map_rendering/map_init.rs index bc4adc9..68f8b4c 100644 --- a/game/main/src/map_rendering/map_init.rs +++ b/game/main/src/map_rendering/map_init.rs @@ -7,7 +7,7 @@ use bevy::{ }; use bevy_inspector_egui::quick::ResourceInspectorPlugin; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; -use shared::states::{GameState, GameplayState}; +use shared::states::{GameplayState, MenuState}; use world_generation::{ biome_painter::*, heightmap::generate_heightmap, @@ -273,8 +273,8 @@ fn spawn_map( biome_painters: Res>, painter: Res, mut generator_state: ResMut>, - cur_game_state: Res>, - mut game_state: ResMut>, + cur_game_state: Res>, + mut game_state: ResMut>, mut gameplay_state: ResMut>, ) { let b_painter = biome_painters.get(painter.handle.clone()); @@ -332,8 +332,8 @@ fn spawn_map( commands.insert_resource(registry); generator_state.set(GeneratorState::Idle); - if cur_game_state.get() != &GameState::Playing { - game_state.set(GameState::Playing); + if cur_game_state.get() != &MenuState::InGame { + game_state.set(MenuState::InGame); gameplay_state.set(GameplayState::PlaceHQ); } } diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index 76fa34d..ebe60de 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -12,7 +12,7 @@ use bevy_rapier3d::plugin::{NoUserData, RapierPhysicsPlugin}; use buildings::BuildingPugin; use iyes_perf_ui::prelude::*; use shared::despawn::DespawnPuglin; -use shared::states::{GameState, GameplayState}; +use shared::states::{MenuState, GameplayState}; use world_generation::biome_painter::BiomePainterPlugin; use world_generation::tile_manager::TileAssetPlugin; use world_generation::tile_mapper::TileMapperAssetPlugin; @@ -29,7 +29,7 @@ impl Plugin for PhosGamePlugin { DespawnPuglin, )); - app.insert_state(GameState::Startup); + app.insert_state(MenuState::Startup); app.insert_state(GameplayState::Waiting); //Systems - Startup diff --git a/game/shared/src/building.rs b/game/shared/src/building.rs index 21617dc..904f8ef 100644 --- a/game/shared/src/building.rs +++ b/game/shared/src/building.rs @@ -2,3 +2,9 @@ use serde::{Deserialize, Serialize}; #[derive(Default, PartialEq, Eq, Serialize, Deserialize)] pub struct BuildingIdentifier(u32); + +impl From for BuildingIdentifier { + fn from(value: u32) -> Self { + return BuildingIdentifier(value); + } +} diff --git a/game/shared/src/despawn.rs b/game/shared/src/despawn.rs index e9231ba..60722b5 100644 --- a/game/shared/src/despawn.rs +++ b/game/shared/src/despawn.rs @@ -1,4 +1,4 @@ -use crate::states::GameState; +use crate::states::MenuState; use bevy::prelude::*; pub struct DespawnPuglin; @@ -17,7 +17,7 @@ impl Plugin for DespawnPuglin { app.add_systems(PostUpdate, despawn_at); app.add_systems( PreUpdate, - (despawn, despawn_after).run_if(not(in_state(GameState::Paused))), + (despawn, despawn_after).run_if(not(in_state(MenuState::Paused))), ); } } diff --git a/game/shared/src/resource.rs b/game/shared/src/resource.rs index 2d7cc8c..f9ad934 100644 --- a/game/shared/src/resource.rs +++ b/game/shared/src/resource.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] pub struct ResourceIdentifier { pub id: u32, pub qty: u32, diff --git a/game/shared/src/states.rs b/game/shared/src/states.rs index 6513a9b..6245409 100644 --- a/game/shared/src/states.rs +++ b/game/shared/src/states.rs @@ -1,11 +1,11 @@ use bevy::prelude::*; #[derive(States, Debug, Clone, PartialEq, Eq, Hash)] -pub enum GameState { +pub enum MenuState { Startup, MainMenu, Loading, - Playing, + InGame, Paused, }