From 1c10ff756f67b94f4f512c26053820e2a5508f6e Mon Sep 17 00:00:00 2001 From: Justin Shipsey Date: Sat, 6 Jul 2019 19:00:05 +0000 Subject: [PATCH] Holding weapon while running/jumping/standing --- common/src/comp/inputs.rs | 12 ++++++------ common/src/sys/combat.rs | 14 +++++++++++++- common/src/sys/controller.rs | 16 +++++++++++++++- common/src/sys/phys.rs | 6 +++++- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/common/src/comp/inputs.rs b/common/src/comp/inputs.rs index 576d23c490..bf00528f72 100644 --- a/common/src/comp/inputs.rs +++ b/common/src/comp/inputs.rs @@ -8,13 +8,13 @@ pub struct Respawning; pub struct MoveDir(pub Vec2); #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] -pub struct Attacking { +pub struct Wielding { pub time: f32, pub applied: bool, } #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] -pub struct Wielding { +pub struct Attacking { pub time: f32, pub applied: bool, } @@ -41,7 +41,7 @@ impl Component for Respawning { type Storage = NullStorage; } -impl Attacking { +impl Wielding { pub fn start() -> Self { Self { time: 0.0, @@ -50,7 +50,7 @@ impl Attacking { } } -impl Wielding { +impl Attacking { pub fn start() -> Self { Self { time: 0.0, @@ -72,11 +72,11 @@ impl Component for MoveDir { type Storage = VecStorage; } -impl Component for Attacking { +impl Component for Wielding { type Storage = FlaggedStorage>; } -impl Component for Wielding { +impl Component for Attacking { type Storage = FlaggedStorage>; } diff --git a/common/src/sys/combat.rs b/common/src/sys/combat.rs index e307d27909..80174be9e6 100644 --- a/common/src/sys/combat.rs +++ b/common/src/sys/combat.rs @@ -1,5 +1,5 @@ use crate::{ - comp::{Attacking, ForceUpdate, HealthSource, Ori, Pos, Stats, Vel}, + comp::{Attacking, ForceUpdate, HealthSource, Ori, Pos, Stats, Vel, Wielding}, state::{DeltaTime, Uid}, }; use specs::{Entities, Join, Read, ReadStorage, System, WriteStorage}; @@ -15,6 +15,7 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, Ori>, WriteStorage<'a, Vel>, WriteStorage<'a, Attacking>, + WriteStorage<'a, Wielding>, WriteStorage<'a, Stats>, WriteStorage<'a, ForceUpdate>, ); @@ -29,6 +30,7 @@ impl<'a> System<'a> for Sys { orientations, mut velocities, mut attackings, + mut wieldings, mut stats, mut force_updates, ): Self::SystemData, @@ -73,5 +75,15 @@ impl<'a> System<'a> for Sys { .for_each(|e| { attackings.remove(e); }); + { + // Wields + for wielding in (&mut wieldings).join() { + if !wielding.applied && wielding.time > 0.3 { + wielding.applied = true; + } else { + wielding.time += dt.0; + } + } + } } } diff --git a/common/src/sys/controller.rs b/common/src/sys/controller.rs index a0dfd59858..c87436b295 100644 --- a/common/src/sys/controller.rs +++ b/common/src/sys/controller.rs @@ -1,5 +1,6 @@ use crate::comp::{ ActionState, Attacking, Controller, Gliding, Jumping, MoveDir, Respawning, Rolling, Stats, Vel, + Wielding, }; use specs::{Entities, Join, ReadStorage, System, WriteStorage}; @@ -15,6 +16,7 @@ impl<'a> System<'a> for Sys { WriteStorage<'a, MoveDir>, WriteStorage<'a, Jumping>, WriteStorage<'a, Attacking>, + WriteStorage<'a, Wielding>, WriteStorage<'a, Rolling>, WriteStorage<'a, Respawning>, WriteStorage<'a, Gliding>, @@ -31,6 +33,7 @@ impl<'a> System<'a> for Sys { mut move_dirs, mut jumpings, mut attackings, + mut wieldings, mut rollings, mut respawns, mut glidings, @@ -76,8 +79,19 @@ impl<'a> System<'a> for Sys { a.gliding = false; } + // Wield + if controller.attack && !a.wielding && !a.gliding && !a.rolling { + let _ = wieldings.insert(entity, Wielding::start()); + a.wielding = true; + } + // Attack - if controller.attack && !a.attacking && !a.gliding && !a.rolling { + if controller.attack + && !a.attacking + && wieldings.get(entity).map(|w| w.applied).unwrap_or(false) + && !a.gliding + && !a.rolling + { let _ = attackings.insert(entity, Attacking::start()); a.attacking = true; } diff --git a/common/src/sys/phys.rs b/common/src/sys/phys.rs index 5b54e650ca..5e3d9ccee0 100644 --- a/common/src/sys/phys.rs +++ b/common/src/sys/phys.rs @@ -1,5 +1,5 @@ use crate::{ - comp::{ActionState, Jumping, MoveDir, OnGround, Ori, Pos, Rolling, Stats, Vel}, + comp::{ActionState, Jumping, MoveDir, OnGround, Ori, Pos, Rolling, Stats, Vel, Wielding}, state::DeltaTime, terrain::TerrainMap, vol::{ReadVol, Vox}, @@ -48,6 +48,7 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, Stats>, ReadStorage<'a, ActionState>, WriteStorage<'a, Jumping>, + WriteStorage<'a, Wielding>, WriteStorage<'a, Rolling>, WriteStorage<'a, OnGround>, WriteStorage<'a, Pos>, @@ -65,6 +66,7 @@ impl<'a> System<'a> for Sys { stats, action_states, mut jumpings, + mut wieldings, mut rollings, mut on_grounds, mut positions, @@ -125,12 +127,14 @@ impl<'a> System<'a> for Sys { // Glide if a.gliding && vel.0.magnitude_squared() < GLIDE_SPEED.powf(2.0) && vel.0.z < 0.0 { + let _ = wieldings.remove(entity); let lift = GLIDE_ANTIGRAV + vel.0.z.powf(2.0) * 0.2; vel.0.z += dt.0 * lift * Vec2::::from(vel.0 * 0.15).magnitude().min(1.0); } // Roll if let Some(time) = rollings.get_mut(entity).map(|r| &mut r.time) { + let _ = wieldings.remove(entity); *time += dt.0; if *time > 0.55 || !a.moving { rollings.remove(entity);