veloren/common/src/comp/character_state.rs

148 lines
4.1 KiB
Rust
Raw Normal View History

2019-12-26 14:43:59 +00:00
use crate::{
comp::{Energy, Ori, Pos, Vel},
2020-02-03 10:54:50 +00:00
event::{LocalEvent, ServerEvent},
states::*,
sys::character_behavior::JoinData,
2019-12-26 14:43:59 +00:00
};
use serde::{Deserialize, Serialize};
use specs::{Component, FlaggedStorage, VecStorage};
use specs_idvs::IdvStorage;
2020-03-14 21:17:27 +00:00
use std::collections::VecDeque;
2019-12-26 14:43:59 +00:00
2020-03-07 18:15:02 +00:00
/// Data returned from character behavior fn's to Character Behavior System.
2019-12-28 16:10:39 +00:00
pub struct StateUpdate {
2019-12-26 14:43:59 +00:00
pub character: CharacterState,
pub pos: Pos,
pub vel: Vel,
pub ori: Ori,
2020-02-24 18:17:16 +00:00
pub energy: Energy,
pub swap_loadout: bool,
2020-02-03 10:54:50 +00:00
pub local_events: VecDeque<LocalEvent>,
pub server_events: VecDeque<ServerEvent>,
2019-12-26 14:43:59 +00:00
}
impl From<&JoinData<'_>> for StateUpdate {
fn from(data: &JoinData) -> Self {
StateUpdate {
pos: *data.pos,
vel: *data.vel,
ori: *data.ori,
energy: *data.energy,
swap_loadout: false,
character: data.character.clone(),
local_events: VecDeque::new(),
server_events: VecDeque::new(),
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum CharacterState {
2020-03-14 15:40:29 +00:00
Idle,
Climb,
2020-03-14 21:17:27 +00:00
Sit,
2020-05-27 06:41:55 +00:00
Dance,
2020-03-14 15:40:29 +00:00
Glide,
GlideWield,
2020-03-07 18:15:02 +00:00
/// A basic blocking state
2020-03-14 15:40:29 +00:00
BasicBlock,
2020-03-14 21:17:27 +00:00
/// Player is busy equipping or unequipping weapons
Equipping(equipping::Data),
/// Player is holding a weapon and can perform other actions
Wielding,
2020-03-14 21:17:27 +00:00
/// A dodge where player can roll
Roll(roll::Data),
/// A basic melee attack (e.g. sword)
BasicMelee(basic_melee::Data),
/// A basic ranged attack (e.g. bow)
BasicRanged(basic_ranged::Data),
/// A force will boost you into a direction for some duration
Boost(boost::Data),
2020-03-16 15:34:53 +00:00
/// Dash forward and then attack
DashMelee(dash_melee::Data),
2020-03-12 14:25:06 +00:00
/// A three-stage attack where each attack pushes player forward
/// and successive attacks increase in damage, while player holds button.
2020-03-14 21:17:27 +00:00
TripleStrike(triple_strike::Data),
/// A leap followed by a small aoe ground attack
LeapMelee(leap_melee::Data),
}
impl CharacterState {
pub fn is_wield(&self) -> bool {
match self {
CharacterState::Wielding
| CharacterState::BasicMelee(_)
| CharacterState::BasicRanged(_)
| CharacterState::DashMelee(_)
2020-03-20 14:05:40 +00:00
| CharacterState::TripleStrike(_)
| CharacterState::BasicBlock
| CharacterState::LeapMelee(_) => true,
_ => false,
}
}
pub fn is_attack(&self) -> bool {
match self {
CharacterState::BasicMelee(_)
| CharacterState::BasicRanged(_)
| CharacterState::DashMelee(_)
| CharacterState::TripleStrike(_)
| CharacterState::LeapMelee(_) => true,
2019-12-26 14:43:59 +00:00
_ => false,
}
}
2020-05-18 22:40:28 +00:00
pub fn is_aimed(&self) -> bool {
match self {
CharacterState::BasicMelee(_)
| CharacterState::BasicRanged(_)
| CharacterState::DashMelee(_)
| CharacterState::TripleStrike(_)
| CharacterState::BasicBlock
| CharacterState::LeapMelee(_) => true,
2020-05-18 22:40:28 +00:00
_ => false,
}
}
pub fn is_block(&self) -> bool {
2019-12-26 14:43:59 +00:00
match self {
2020-03-14 21:17:27 +00:00
CharacterState::BasicBlock => true,
2019-12-26 14:43:59 +00:00
_ => false,
}
}
pub fn is_dodge(&self) -> bool {
2019-12-26 14:43:59 +00:00
match self {
2020-03-14 21:17:27 +00:00
CharacterState::Roll(_) => true,
2019-12-26 14:43:59 +00:00
_ => false,
}
}
2020-01-08 19:31:42 +00:00
2020-01-22 12:48:55 +00:00
/// Compares for shallow equality (does not check internal struct equality)
pub fn same_variant(&self, other: &Self) -> bool {
2020-01-08 19:31:42 +00:00
// Check if state is the same without looking at the inner data
2020-01-22 12:48:55 +00:00
std::mem::discriminant(self) == std::mem::discriminant(other)
}
}
impl Default for CharacterState {
2020-03-14 21:17:27 +00:00
fn default() -> Self { Self::Idle }
}
impl Component for CharacterState {
type Storage = FlaggedStorage<Self, IdvStorage<Self>>;
}
2020-02-11 15:42:17 +00:00
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
2020-02-11 15:42:17 +00:00
pub struct Attacking {
2020-03-24 21:03:11 +00:00
pub base_healthchange: i32,
pub range: f32,
pub max_angle: f32,
pub applied: bool,
pub hit_count: u32,
pub knockback: f32,
2020-02-11 15:42:17 +00:00
}
impl Component for Attacking {
type Storage = VecStorage<Self>;
}