veloren/common/src/comp/states/mod.rs

105 lines
3.2 KiB
Rust
Raw Normal View History

2019-12-26 14:43:59 +00:00
// Module declarations
mod basic_attack;
mod basic_block;
mod charge_attack;
mod climb;
mod fall;
mod glide;
mod jump;
mod roll;
mod run;
mod sit;
mod stand;
mod swim;
mod wield;
// Reexports
pub use basic_attack::*;
pub use basic_block::*;
pub use charge_attack::*;
pub use climb::*;
pub use fall::*;
pub use glide::*;
pub use jump::*;
pub use roll::*;
pub use run::*;
pub use sit::*;
pub use stand::*;
pub use swim::*;
pub use wield::*;
// TODO: Attach these to racial components and/or ecs resources
pub const HUMANOID_ACCEL: f32 = 50.0;
pub const HUMANOID_SPEED: f32 = 120.0;
pub const HUMANOID_AIR_ACCEL: f32 = 10.0;
pub const HUMANOID_AIR_SPEED: f32 = 100.0;
pub const HUMANOID_WATER_ACCEL: f32 = 70.0;
pub const HUMANOID_WATER_SPEED: f32 = 120.0;
pub const HUMANOID_CLIMB_ACCEL: f32 = 5.0;
pub const ROLL_SPEED: f32 = 17.0;
pub const CHARGE_SPEED: f32 = 20.0;
pub const GLIDE_ACCEL: f32 = 15.0;
pub const GLIDE_SPEED: f32 = 45.0;
pub const BLOCK_ACCEL: f32 = 30.0;
pub const BLOCK_SPEED: f32 = 75.0;
pub const TEMP_EQUIP_DELAY: u64 = 100;
// Gravity is 9.81 * 4, so this makes gravity equal to .15
pub const GLIDE_ANTIGRAV: f32 = crate::sys::phys::GRAVITY * 0.96;
pub const CLIMB_SPEED: f32 = 5.0;
pub const MOVEMENT_THRESHOLD_VEL: f32 = 3.0;
// Public interface, wires character states to their handlers.
use super::{
2019-12-26 18:01:19 +00:00
ActionState, ActionState::*, AttackKind::*, BlockKind::*, DodgeKind::*, EcsCharacterState,
EcsStateUpdate, MoveState, MoveState::*,
2019-12-26 14:43:59 +00:00
};
pub trait StateHandle {
2019-12-26 18:01:19 +00:00
fn handle(&self, ecs_data: &EcsCharacterState) -> EcsStateUpdate;
2019-12-26 14:43:59 +00:00
}
impl StateHandle for ActionState {
/// Passes handle to variant or subvariant handlers
2019-12-26 18:01:19 +00:00
fn handle(&self, ecs_data: &EcsCharacterState) -> EcsStateUpdate {
2019-12-26 14:43:59 +00:00
match self {
Attack(kind) => match kind {
BasicAttack(handler) => handler.handle(ecs_data),
Charge(handler) => handler.handle(ecs_data),
},
Block(kind) => match kind {
BasicBlock(handler) => handler.handle(ecs_data),
},
Dodge(kind) => match kind {
Roll(handler) => handler.handle(ecs_data),
},
Wield(handler) => handler.handle(ecs_data),
2019-12-26 18:01:19 +00:00
Idle => EcsStateUpdate {
2019-12-26 14:43:59 +00:00
character: *ecs_data.character,
pos: *ecs_data.pos,
vel: *ecs_data.vel,
ori: *ecs_data.ori,
},
// All states should be explicitly handled
// Do not use default match: _ => {},
}
}
}
impl StateHandle for MoveState {
/// Passes handle to variant handlers
2019-12-26 18:01:19 +00:00
fn handle(&self, ecs_data: &EcsCharacterState) -> EcsStateUpdate {
2019-12-26 14:43:59 +00:00
match self {
Stand(handler) => handler.handle(&ecs_data),
Run(handler) => handler.handle(&ecs_data),
Jump(handler) => handler.handle(&ecs_data),
Climb(handler) => handler.handle(&ecs_data),
Glide(handler) => handler.handle(&ecs_data),
Swim(handler) => handler.handle(&ecs_data),
Fall(handler) => handler.handle(&ecs_data),
Sit(handler) => handler.handle(&ecs_data),
// All states should be explicitly handled
// Do not use default match: _ => {},
}
}
}