veloren/common/src/sys/controller.rs

122 lines
3.6 KiB
Rust
Raw Normal View History

use crate::comp::{
ActionState, Attacking, Controller, Gliding, Jumping, MoveDir, Respawning, Rolling, Stats, Vel,
Wielding,
2019-06-09 14:20:20 +00:00
};
use specs::{Entities, Join, ReadStorage, System, WriteStorage};
2019-06-09 14:20:20 +00:00
2019-06-09 19:33:20 +00:00
/// This system is responsible for validating controller inputs
2019-06-09 14:20:20 +00:00
pub struct Sys;
impl<'a> System<'a> for Sys {
type SystemData = (
Entities<'a>,
2019-07-21 16:50:13 +00:00
WriteStorage<'a, Controller>,
2019-06-09 14:20:20 +00:00
ReadStorage<'a, Stats>,
2019-06-13 18:09:50 +00:00
ReadStorage<'a, Vel>,
2019-06-30 17:48:38 +00:00
WriteStorage<'a, ActionState>,
2019-06-09 19:33:20 +00:00
WriteStorage<'a, MoveDir>,
2019-06-09 14:20:20 +00:00
WriteStorage<'a, Jumping>,
WriteStorage<'a, Attacking>,
WriteStorage<'a, Wielding>,
2019-06-11 04:08:55 +00:00
WriteStorage<'a, Rolling>,
2019-06-09 19:33:20 +00:00
WriteStorage<'a, Respawning>,
2019-06-09 14:20:20 +00:00
WriteStorage<'a, Gliding>,
);
fn run(
&mut self,
(
entities,
2019-07-21 16:50:13 +00:00
mut controllers,
2019-06-09 14:20:20 +00:00
stats,
2019-06-13 18:09:50 +00:00
velocities,
2019-06-30 17:48:38 +00:00
mut action_states,
2019-06-09 19:33:20 +00:00
mut move_dirs,
mut jumpings,
mut attackings,
mut wieldings,
2019-06-11 04:08:55 +00:00
mut rollings,
2019-06-09 19:33:20 +00:00
mut respawns,
mut glidings,
2019-06-09 14:20:20 +00:00
): Self::SystemData,
) {
for (entity, controller, stats, vel, mut a) in (
2019-06-09 14:20:20 +00:00
&entities,
2019-07-21 16:50:13 +00:00
&mut controllers,
2019-06-09 14:20:20 +00:00
&stats,
2019-06-13 18:09:50 +00:00
&velocities,
2019-06-30 17:48:38 +00:00
// Although this is changed, it is only kept for this system
// as it will be replaced in the action state system
&mut action_states,
2019-06-09 14:20:20 +00:00
)
.join()
{
if stats.is_dead {
2019-06-09 19:33:20 +00:00
// Respawn
if controller.respawn {
let _ = respawns.insert(entity, Respawning);
2019-06-09 19:33:20 +00:00
}
2019-06-09 14:20:20 +00:00
continue;
}
2019-06-16 15:40:47 +00:00
// Move dir
if !a.rolling {
let _ = move_dirs.insert(
2019-06-16 15:40:47 +00:00
entity,
MoveDir(if controller.move_dir.magnitude_squared() > 1.0 {
2019-06-16 15:40:47 +00:00
controller.move_dir.normalized()
} else {
controller.move_dir
}),
);
}
2019-06-09 19:33:20 +00:00
// Glide
if controller.glide && !a.on_ground && !a.attacking && !a.rolling {
let _ = glidings.insert(entity, Gliding);
2019-06-30 17:48:38 +00:00
a.gliding = true;
2019-06-09 14:20:20 +00:00
} else {
let _ = glidings.remove(entity);
2019-06-30 17:48:38 +00:00
a.gliding = false;
2019-06-09 14:20:20 +00:00
}
// Wield
if controller.attack && !a.wielding && !a.gliding && !a.rolling {
let _ = wieldings.insert(entity, Wielding::start());
a.wielding = true;
}
2019-06-09 14:20:20 +00:00
// Attack
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());
2019-06-30 17:48:38 +00:00
a.attacking = true;
2019-06-09 14:20:20 +00:00
}
2019-06-11 04:08:55 +00:00
// Roll
2019-06-29 20:40:40 +00:00
if controller.roll
&& !a.rolling
&& a.on_ground
&& a.moving
&& !a.attacking
&& !a.gliding
{
let _ = rollings.insert(entity, Rolling::start());
2019-06-30 17:48:38 +00:00
a.rolling = true;
}
// Jump
if controller.jump && a.on_ground && vel.0.z <= 0.0 {
let _ = jumpings.insert(entity, Jumping);
2019-06-30 17:48:38 +00:00
a.on_ground = false;
2019-06-11 04:08:55 +00:00
}
2019-07-21 16:15:31 +00:00
// Reset the controller ready for the next tick
*controller = Controller::default();
2019-06-09 14:20:20 +00:00
}
}
}