From 51d1adbf5fb3b05a4dd0f195fbd0e2a9f114a44f Mon Sep 17 00:00:00 2001 From: Martin Indra Date: Wed, 22 Jun 2022 21:50:37 +0200 Subject: [PATCH] Implement simplistic PowerHub construction Relates to #23. --- Cargo.lock | 1 + crates/controller/Cargo.toml | 1 + crates/controller/src/command.rs | 90 ++++++++++++++++++++++++++++---- 3 files changed, 83 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 360e2c51a..fa6c117da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1630,6 +1630,7 @@ dependencies = [ "bevy", "de_core", "de_index", + "de_objects", "de_pathing", "de_terrain", "glam", diff --git a/crates/controller/Cargo.toml b/crates/controller/Cargo.toml index b884f8cac..fb8ab36f9 100644 --- a/crates/controller/Cargo.toml +++ b/crates/controller/Cargo.toml @@ -11,6 +11,7 @@ de_core = { path = "../core", version = "0.1.0-dev" } de_index = { path = "../index", version = "0.1.0-dev" } de_terrain = { path = "../terrain", version = "0.1.0-dev" } de_pathing = { path = "../pathing", version = "0.1.0-dev" } +de_objects = { path = "../objects", version = "0.1.0-dev" } # Other bevy = "0.7.0" diff --git a/crates/controller/src/command.rs b/crates/controller/src/command.rs index c5116210d..57c656e6e 100644 --- a/crates/controller/src/command.rs +++ b/crates/controller/src/command.rs @@ -2,7 +2,12 @@ use bevy::{ input::{mouse::MouseButtonInput, ElementState}, prelude::*, }; -use de_core::{objects::MovableSolid, projection::ToFlat}; +use de_core::{ + gconfig::GameConfig, + objects::{ActiveObjectType, MovableSolid, ObjectType}, + projection::ToFlat, +}; +use de_objects::{Draft, DraftBundle, SpawnBundle}; use de_pathing::UpdateEntityPath; use iyes_loopless::prelude::*; @@ -26,10 +31,22 @@ impl Plugin for CommandPlugin { .after(Labels::PreInputUpdate), ) .with_system( + // TODO do this after move_drafts? left_click_handler .run_if(on_pressed(MouseButton::Left)) .label(Labels::InputUpdate) .after(Labels::PreInputUpdate), + ) + .with_system( + // TODO rename to movement_handler + spawn_draft + .label(Labels::InputUpdate) + .after(Labels::PreInputUpdate), + ) + .with_system( + move_drafts + .label(Labels::InputUpdate) + .after(Labels::PreInputUpdate), ), ); } @@ -63,18 +80,73 @@ fn right_click_handler( } fn left_click_handler( - mut events: EventWriter, + mut commands: Commands, + game_config: Res, + mut select_events: EventWriter, keys: Res>, pointer: Res, + drafts: Query<(Entity, &Transform, &ObjectType), With>, ) { - let selection_mode = if keys.pressed(KeyCode::LControl) { - SelectionMode::Add + if drafts.is_empty() { + let selection_mode = if keys.pressed(KeyCode::LControl) { + SelectionMode::Add + } else { + SelectionMode::Replace + }; + let event = match pointer.entity() { + Some(entity) => SelectEvent::single(entity, selection_mode), + None => SelectEvent::none(selection_mode), + }; + select_events.send(event); } else { - SelectionMode::Replace + for (entity, &transform, &object_type) in drafts.iter() { + // TODO: spawn only if there is no collision + commands.entity(entity).despawn_recursive(); + commands + .spawn_bundle(SpawnBundle::new(object_type, transform)) + .insert(game_config.player()); + } + } +} + +fn spawn_draft( + mut commands: Commands, + keys: Res>, + pointer: Res, + drafts: Query>, +) { + if !keys.just_pressed(KeyCode::B) { + return; + } + + for entity in drafts.iter() { + commands.entity(entity).despawn_recursive(); + } + + let point = match pointer.terrain_point() { + Some(point) => point, + None => return, }; - let event = match pointer.entity() { - Some(entity) => SelectEvent::single(entity, selection_mode), - None => SelectEvent::none(selection_mode), + + // TODO: powerhub + let object_type = ObjectType::Active(ActiveObjectType::Base); + commands.spawn_bundle(DraftBundle::new( + object_type, + Transform { + translation: point, + ..Default::default() + }, + )); +} + +fn move_drafts(pointer: Res, mut drafts: Query<&mut Transform, With>) { + // TODO move by some delta, rather than to a point + // TODO: make this a no-op if the mouse was not moved + let point = match pointer.terrain_point() { + Some(point) => point, + None => return, }; - events.send(event); + for mut transform in drafts.iter_mut() { + transform.translation = point; + } }