buildings

This commit is contained in:
2024-06-29 19:00:29 -04:00
parent 805f50e40f
commit 7ff3638eff
17 changed files with 90 additions and 31 deletions

1
Cargo.lock generated
View File

@@ -1325,6 +1325,7 @@ dependencies = [
name = "buildings"
version = "0.1.0"
dependencies = [
"asset_loader",
"bevy",
"bevy_rapier3d",
"serde",

View File

@@ -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 = []

View File

@@ -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,

View File

@@ -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<String>,
pub buildings: Vec<BuildingAsset>,
}
create_asset_loader!(
BuildingDatabasePlugin,
BuildingDatabaseLoader,
BuildingDatabase,
BuildingDatabaseState,
&["building.db.json"],;
buildings_paths -> buildings
?
);

View File

@@ -1 +1,2 @@
pub mod building_asset;
pub mod building_database;

View File

@@ -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<QueueEntry>,
}

View File

@@ -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<RapierContext>,
map: Res<Map>,
indicator: Res<IndicatorCube>,
mut build_queue: ResMut<BuildQueue>,
next_state: ResMut<NextState<GameplayState>>,
) {
let win = window.single();
let (cam_transform, camera) = cam_query.single();
@@ -53,6 +65,18 @@ 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));
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<Vec3>, commands: &mut Commands, indicator: &IndicatorCube) {
for p in positions {
commands.spawn((
PbrBundle {
@@ -65,4 +89,5 @@ fn hq_placement(
));
}
}
}
fn process_build_queue(mut queue: ResMut<BuildQueue>) {}

View File

@@ -2,13 +2,13 @@ use bevy::prelude::*;
use world_generation::hex_utils::HexCoord;
#[derive(Resource)]
pub struct BuildingDatabase {
pub struct BuildingMap {
pub chunks: Vec<BuildingChunk>,
}
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),
};

View File

@@ -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<IVec2>,
}

View File

@@ -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::*;

View File

@@ -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()));

View File

@@ -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<Assets<BiomePainterAsset>>,
painter: Res<CurrentBiomePainter>,
mut generator_state: ResMut<NextState<GeneratorState>>,
cur_game_state: Res<State<GameState>>,
mut game_state: ResMut<NextState<GameState>>,
cur_game_state: Res<State<MenuState>>,
mut game_state: ResMut<NextState<MenuState>>,
mut gameplay_state: ResMut<NextState<GameplayState>>,
) {
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);
}
}

View File

@@ -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

View File

@@ -2,3 +2,9 @@ use serde::{Deserialize, Serialize};
#[derive(Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct BuildingIdentifier(u32);
impl From<u32> for BuildingIdentifier {
fn from(value: u32) -> Self {
return BuildingIdentifier(value);
}
}

View File

@@ -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))),
);
}
}

View File

@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
#[derive(Serialize, Deserialize, Debug)]
pub struct ResourceIdentifier {
pub id: u32,
pub qty: u32,

View File

@@ -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,
}