diff --git a/common/src/sys/agent.rs b/common/src/sys/agent.rs index 82d887e997..c41dde878f 100644 --- a/common/src/sys/agent.rs +++ b/common/src/sys/agent.rs @@ -1,4 +1,4 @@ -use crate::comp::{Agent, Controller, Pos}; +use crate::comp::{Agent, Controller, Pos, Stats}; use rand::{seq::SliceRandom, thread_rng}; use specs::{Entities, Join, ReadStorage, System, WriteStorage}; use vek::*; @@ -8,14 +8,15 @@ pub struct Sys; impl<'a> System<'a> for Sys { type SystemData = ( Entities<'a>, - WriteStorage<'a, Agent>, ReadStorage<'a, Pos>, + ReadStorage<'a, Stats>, + WriteStorage<'a, Agent>, WriteStorage<'a, Controller>, ); - fn run(&mut self, (entities, mut agents, positions, mut controllers): Self::SystemData) { - for (entity, agent, pos, controller) in - (&entities, &mut agents, &positions, &mut controllers).join() + fn run(&mut self, (entities, positions, stats, mut agents, mut controllers): Self::SystemData) { + for (entity, pos, agent, controller) in + (&entities, &positions, &mut agents, &mut controllers).join() { match agent { Agent::Wanderer(bearing) => { @@ -60,52 +61,58 @@ impl<'a> System<'a> for Sys { } Agent::Enemy { bearing, target } => { const SIGHT_DIST: f32 = 30.0; + let mut choose_new = false; - let choose_new = match target.map(|tgt| positions.get(tgt)).flatten() { - Some(tgt_pos) => { - let dist = Vec2::::from(tgt_pos.0 - pos.0).magnitude(); - if dist < 2.0 { - controller.move_dir = Vec2::zero(); + if let Some((Some(target_pos), Some(target_stats))) = + target.map(|target| (positions.get(target), stats.get(target))) + { + let dist = Vec2::::from(target_pos.0 - pos.0).magnitude(); + if target_stats.is_dead { + choose_new = true; + } else if dist < 1.5 { + // Get more distance + controller.move_dir = + Vec2::::from(target_pos.0 - pos.0).normalized() * -0.96; + } else if dist < 4.0 { + // Fight and slowly move closer + controller.move_dir = + Vec2::::from(target_pos.0 - pos.0).normalized() * 0.1; - if rand::random::() < 0.05 { - controller.attack = true; - } else { - controller.attack = false; - } - - false - } else if dist < SIGHT_DIST { - controller.move_dir = - Vec2::::from(tgt_pos.0 - pos.0).normalized(); - - false + if rand::random::() < 0.1 { + controller.attack = true; } else { - true + controller.attack = false; } + } else if dist < SIGHT_DIST { + controller.move_dir = + Vec2::::from(target_pos.0 - pos.0).normalized() * 0.96; + } else { + choose_new = true; } - None => { - *bearing += - Vec2::new(rand::random::() - 0.5, rand::random::() - 0.5) - * 0.1 - - *bearing * 0.005; + } else { + *bearing += + Vec2::new(rand::random::() - 0.5, rand::random::() - 0.5) + * 0.1 + - *bearing * 0.005; - controller.move_dir = if bearing.magnitude_squared() > 0.1 { - bearing.normalized() - } else { - Vec2::zero() - }; - true - } - }; + controller.move_dir = if bearing.magnitude_squared() > 0.1 { + bearing.normalized() + } else { + Vec2::zero() + }; + + choose_new = true; + } if choose_new && rand::random::() < 0.1 { - let entities = (&entities, &positions) + let entities = (&entities, &positions, &stats) .join() - .filter(|(e, e_pos)| { + .filter(|(e, e_pos, e_stats)| { Vec2::::from(e_pos.0 - pos.0).magnitude() < SIGHT_DIST && *e != entity + && !e_stats.is_dead }) - .map(|(e, _)| e) + .map(|(e, _, _)| e) .collect::>(); let mut rng = thread_rng(); diff --git a/common/src/sys/combat.rs b/common/src/sys/combat.rs index 80174be9e6..726bda64a5 100644 --- a/common/src/sys/combat.rs +++ b/common/src/sys/combat.rs @@ -48,14 +48,13 @@ impl<'a> System<'a> for Sys { if entity != b && !stat_b.is_dead && pos.0.distance_squared(pos_b.0) < 50.0 - && ori.0.angle_between(pos_b.0 - pos.0).to_degrees() < 70.0 + && ori.0.angle_between(pos_b.0 - pos.0).to_degrees() < 90.0 { // Deal damage stat_b .health .change_by(-10, HealthSource::Attack { by: *uid }); // TODO: variable damage and weapon - vel_b.0 += (pos_b.0 - pos.0).normalized() * 10.0; - vel_b.0.z = 15.0; + vel_b.0.z = 4.0; let _ = force_updates.insert(b, ForceUpdate); } } diff --git a/common/src/sys/movement.rs b/common/src/sys/movement.rs index f278655d72..68ab82e9ef 100644 --- a/common/src/sys/movement.rs +++ b/common/src/sys/movement.rs @@ -126,7 +126,7 @@ impl<'a> System<'a> for Sys { } // Set direction based on velocity when on the ground - if Vec2::::from(vel.0).magnitude_squared() > 0.1 { + if Vec2::::from(vel.0).magnitude_squared() > 0.0001 { ori.0 = Lerp::lerp( ori.0, vel.0.normalized() * Vec3::new(1.0, 1.0, 0.0), diff --git a/voxygen/src/scene/figure.rs b/voxygen/src/scene/figure.rs index a43774169b..c9ce0fdcb4 100644 --- a/voxygen/src/scene/figure.rs +++ b/voxygen/src/scene/figure.rs @@ -767,24 +767,30 @@ impl FigureMgr { }; let target_skeleton = match animation_info.animation { - comp::Animation::Run => anim::quadruped::RunAnimation::update_skeleton( - state.skeleton_mut(), - (vel.0.magnitude(), time), - animation_info.time, - skeleton_attr, - ), - comp::Animation::Idle => anim::quadruped::IdleAnimation::update_skeleton( - state.skeleton_mut(), - time, - animation_info.time, - skeleton_attr, - ), - comp::Animation::Jump => anim::quadruped::JumpAnimation::update_skeleton( - state.skeleton_mut(), - (vel.0.magnitude(), time), - animation_info.time, - skeleton_attr, - ), + comp::Animation::Run | comp::Animation::Crun => { + anim::quadruped::RunAnimation::update_skeleton( + state.skeleton_mut(), + (vel.0.magnitude(), time), + animation_info.time, + skeleton_attr, + ) + } + comp::Animation::Idle | comp::Animation::Cidle => { + anim::quadruped::IdleAnimation::update_skeleton( + state.skeleton_mut(), + time, + animation_info.time, + skeleton_attr, + ) + } + comp::Animation::Jump | comp::Animation::Cjump => { + anim::quadruped::JumpAnimation::update_skeleton( + state.skeleton_mut(), + (vel.0.magnitude(), time), + animation_info.time, + skeleton_attr, + ) + } // TODO! _ => state.skeleton_mut().clone(), @@ -807,7 +813,7 @@ impl FigureMgr { }; let target_skeleton = match animation_info.animation { - comp::Animation::Run => { + comp::Animation::Run | comp::Animation::Crun => { anim::quadrupedmedium::RunAnimation::update_skeleton( state.skeleton_mut(), (vel.0.magnitude(), time), @@ -815,7 +821,7 @@ impl FigureMgr { skeleton_attr, ) } - comp::Animation::Idle => { + comp::Animation::Idle | comp::Animation::Cidle => { anim::quadrupedmedium::IdleAnimation::update_skeleton( state.skeleton_mut(), time, @@ -823,7 +829,7 @@ impl FigureMgr { skeleton_attr, ) } - comp::Animation::Jump => { + comp::Animation::Jump | comp::Animation::Cjump => { anim::quadrupedmedium::JumpAnimation::update_skeleton( state.skeleton_mut(), (vel.0.magnitude(), time),