2019-08-23 10:11:37 +00:00
|
|
|
use specs::{Component, FlaggedStorage, HashMapStorage};
|
2019-09-04 23:03:49 +00:00
|
|
|
//use specs_idvs::IDVStorage;
|
2019-08-23 10:11:37 +00:00
|
|
|
use std::time::Duration;
|
|
|
|
|
2019-08-18 09:01:57 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
|
2019-08-23 10:11:37 +00:00
|
|
|
pub enum MovementState {
|
|
|
|
Stand,
|
|
|
|
Run,
|
|
|
|
Jump,
|
|
|
|
Glide,
|
|
|
|
Roll { time_left: Duration },
|
|
|
|
//Swim,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl MovementState {
|
|
|
|
pub fn is_roll(&self) -> bool {
|
|
|
|
if let Self::Roll { .. } = self {
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-18 09:01:57 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
|
2019-08-23 10:11:37 +00:00
|
|
|
pub enum ActionState {
|
|
|
|
Idle,
|
|
|
|
Wield { time_left: Duration },
|
|
|
|
Attack { time_left: Duration, applied: bool },
|
2019-08-24 16:38:59 +00:00
|
|
|
Block { time_left: Duration },
|
2019-08-23 10:11:37 +00:00
|
|
|
//Carry,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ActionState {
|
|
|
|
pub fn is_wield(&self) -> bool {
|
|
|
|
if let Self::Wield { .. } = self {
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn is_attack(&self) -> bool {
|
|
|
|
if let Self::Attack { .. } = self {
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
2019-08-24 16:38:59 +00:00
|
|
|
|
|
|
|
pub fn is_block(&self) -> bool {
|
|
|
|
if let Self::Block { .. } = self {
|
|
|
|
true
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
2019-08-23 10:11:37 +00:00
|
|
|
}
|
|
|
|
|
2019-08-18 09:01:57 +00:00
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
|
2019-08-23 10:11:37 +00:00
|
|
|
pub struct CharacterState {
|
|
|
|
pub movement: MovementState,
|
|
|
|
pub action: ActionState,
|
|
|
|
}
|
|
|
|
|
2019-08-30 18:40:22 +00:00
|
|
|
impl CharacterState {
|
|
|
|
pub fn is_same_movement(&self, other: &Self) -> bool {
|
|
|
|
// Check if enum item is the same without looking at the inner data
|
|
|
|
std::mem::discriminant(&self.movement) == std::mem::discriminant(&other.movement)
|
|
|
|
}
|
|
|
|
pub fn is_same_action(&self, other: &Self) -> bool {
|
|
|
|
// Check if enum item is the same without looking at the inner data
|
|
|
|
std::mem::discriminant(&self.action) == std::mem::discriminant(&other.action)
|
|
|
|
}
|
|
|
|
pub fn is_same_state(&self, other: &Self) -> bool {
|
|
|
|
self.is_same_movement(other) && self.is_same_action(other)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-23 10:11:37 +00:00
|
|
|
impl Default for CharacterState {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
movement: MovementState::Jump,
|
|
|
|
action: ActionState::Idle,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Component for CharacterState {
|
|
|
|
type Storage = FlaggedStorage<Self, HashMapStorage<Self>>;
|
|
|
|
}
|