Initial implementation of new dash melee.

This commit is contained in:
Sam 2020-09-09 21:58:28 -05:00
parent abcd0af1e3
commit 04af75bf8d
10 changed files with 318 additions and 169 deletions

View File

@ -3,7 +3,7 @@ use crate::{
item::{armor::Protection, Item, ItemKind}, item::{armor::Protection, Item, ItemKind},
Body, CharacterState, EnergySource, Gravity, LightEmitter, Projectile, StateUpdate, Body, CharacterState, EnergySource, Gravity, LightEmitter, Projectile, StateUpdate,
}, },
states::*, states::{utils::StageSection, *},
sys::character_behavior::JoinData, sys::character_behavior::JoinData,
}; };
use arraygen::Arraygen; use arraygen::Arraygen;
@ -72,9 +72,19 @@ pub enum CharacterAbility {
}, },
DashMelee { DashMelee {
energy_cost: u32, energy_cost: u32,
buildup_duration: Duration,
recover_duration: Duration,
base_damage: u32, base_damage: u32,
max_damage: u32,
base_knockback: f32,
max_knockback: f32,
range: f32,
angle: f32,
energy_drain: u32,
forward_speed: f32,
buildup_duration: Duration,
charge_duration: Duration,
infinite_charge: bool,
swing_duration: Duration,
recover_duration: Duration,
}, },
BasicBlock, BasicBlock,
Roll, Roll,
@ -310,15 +320,36 @@ impl From<&CharacterAbility> for CharacterState {
}), }),
CharacterAbility::DashMelee { CharacterAbility::DashMelee {
energy_cost: _, energy_cost: _,
buildup_duration,
recover_duration,
base_damage, base_damage,
max_damage,
base_knockback,
max_knockback,
range,
angle,
energy_drain,
forward_speed,
buildup_duration,
charge_duration,
infinite_charge,
swing_duration,
recover_duration,
} => CharacterState::DashMelee(dash_melee::Data { } => CharacterState::DashMelee(dash_melee::Data {
initialize: true,
exhausted: false,
buildup_duration: *buildup_duration,
recover_duration: *recover_duration,
base_damage: *base_damage, base_damage: *base_damage,
max_damage: *max_damage,
base_knockback: *base_knockback,
max_knockback: *max_knockback,
range: *range,
angle: *angle,
energy_drain: *energy_drain,
forward_speed: *forward_speed,
buildup_duration: *buildup_duration,
charge_duration: *charge_duration,
charge_duration_attained: Duration::default(),
infinite_charge: *infinite_charge,
swing_duration: *swing_duration,
recover_duration: *recover_duration,
timer: Duration::default(),
stage_section: StageSection::Buildup,
}), }),
CharacterAbility::BasicBlock => CharacterState::BasicBlock, CharacterAbility::BasicBlock => CharacterState::BasicBlock,
CharacterAbility::Roll => CharacterState::Roll(roll::Data { CharacterAbility::Roll => CharacterState::Roll(roll::Data {
@ -341,7 +372,7 @@ impl From<&CharacterAbility> for CharacterState {
energy_increase: *energy_increase, energy_increase: *energy_increase,
combo_duration: *combo_duration, combo_duration: *combo_duration,
timer: Duration::default(), timer: Duration::default(),
stage_section: wielding::StageSection::Buildup, stage_section: StageSection::Buildup,
next_stage: false, next_stage: false,
}), }),
CharacterAbility::LeapMelee { CharacterAbility::LeapMelee {

View File

@ -121,9 +121,9 @@ impl Tool {
stage_data: vec![ stage_data: vec![
combo_melee::Stage { combo_melee::Stage {
stage: 1, stage: 1,
base_damage: 30, base_damage: (30.0 * self.base_power()) as u32,
max_damage: 50, max_damage: (50.0 * self.base_power()) as u32,
damage_increase: 10, damage_increase: (10.0 * self.base_power()) as u32,
knockback: 5.0, knockback: 5.0,
range: 3.5, range: 3.5,
angle: 45.0, angle: 45.0,
@ -134,9 +134,9 @@ impl Tool {
}, },
combo_melee::Stage { combo_melee::Stage {
stage: 2, stage: 2,
base_damage: 50, base_damage: (50.0 * self.base_power()) as u32,
max_damage: 80, max_damage: (80.0 * self.base_power()) as u32,
damage_increase: 15, damage_increase: (15.0 * self.base_power()) as u32,
knockback: 5.0, knockback: 5.0,
range: 3.5, range: 3.5,
angle: 45.0, angle: 45.0,
@ -147,9 +147,9 @@ impl Tool {
}, },
combo_melee::Stage { combo_melee::Stage {
stage: 3, stage: 3,
base_damage: 70, base_damage: (70.0 * self.base_power()) as u32,
max_damage: 110, max_damage: (110.0 * self.base_power()) as u32,
damage_increase: 20, damage_increase: (20.0 * self.base_power()) as u32,
knockback: 5.0, knockback: 5.0,
range: 3.5, range: 3.5,
angle: 45.0, angle: 45.0,
@ -165,10 +165,20 @@ impl Tool {
combo_duration: Duration::from_millis(10), combo_duration: Duration::from_millis(10),
}, },
DashMelee { DashMelee {
energy_cost: 700, energy_cost: 100,
buildup_duration: Duration::from_millis(500), base_damage: (60.0 * self.base_power()) as u32,
recover_duration: Duration::from_millis(500), max_damage: (180.0 * self.base_power()) as u32,
base_damage: (120.0 * self.base_power()) as u32, base_knockback: 5.0,
max_knockback: 10.0,
range: 5.0,
angle: 45.0,
energy_drain: 100,
forward_speed: 2.5,
buildup_duration: Duration::from_millis(250),
charge_duration: Duration::from_millis(2000),
infinite_charge: true,
swing_duration: Duration::from_millis(100),
recover_duration: Duration::from_millis(300),
}, },
], ],
Axe(_) => vec![ Axe(_) => vec![
@ -254,23 +264,14 @@ impl Tool {
max_projectile_speed: 500.0, max_projectile_speed: 500.0,
}, },
], ],
Dagger(_) => vec![ Dagger(_) => vec![BasicMelee {
BasicMelee {
energy_cost: 0, energy_cost: 0,
buildup_duration: Duration::from_millis(100), buildup_duration: Duration::from_millis(100),
recover_duration: Duration::from_millis(400), recover_duration: Duration::from_millis(400),
base_healthchange: (-50.0 * self.base_power()) as i32, base_healthchange: (-50.0 * self.base_power()) as i32,
knockback: 0.0,
range: 3.5, range: 3.5,
max_angle: 20.0, max_angle: 20.0,
}, }],
DashMelee {
energy_cost: 700,
buildup_duration: Duration::from_millis(500),
recover_duration: Duration::from_millis(500),
base_damage: (100.0 * self.base_power()) as u32,
},
],
Staff(kind) => { Staff(kind) => {
if kind == "Sceptre" { if kind == "Sceptre" {
vec![ vec![

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
comp::{Attacking, CharacterState, EnergySource, StateUpdate}, comp::{Attacking, CharacterState, EnergySource, StateUpdate},
states::{utils::*, wielding::StageSection}, states::utils::{StageSection, *},
sys::character_behavior::{CharacterBehavior, JoinData}, sys::character_behavior::{CharacterBehavior, JoinData},
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -109,7 +109,12 @@ impl CharacterBehavior for Data {
&& self.timer < self.stage_data[stage_index].base_swing_duration && self.timer < self.stage_data[stage_index].base_swing_duration
{ {
// Forward movement // Forward movement
forward_move(data, &mut update, 0.1, self.stage_data[stage_index].forward_movement * 3.0); forward_move(
data,
&mut update,
0.1,
self.stage_data[stage_index].forward_movement,
);
// Swings // Swings
update.character = CharacterState::ComboMelee(Data { update.character = CharacterState::ComboMelee(Data {
@ -197,54 +202,7 @@ impl CharacterBehavior for Data {
next_stage: self.next_stage, next_stage: self.next_stage,
}); });
} }
} /*else if self.stage_section == StageSection::Recover { } else if self.next_stage {
update.character = CharacterState::ComboMelee(Data {
stage: self.stage,
num_stages: self.num_stages,
combo: self.combo,
stage_data: self.stage_data.clone(),
initial_energy_gain: self.initial_energy_gain,
max_energy_gain: self.max_energy_gain,
energy_increase: self.energy_increase,
combo_duration: self.combo_duration,
timer: Duration::default(),
stage_section: StageSection::Combo,
next_stage: self.next_stage,
});
} else if self.stage_section == StageSection::Combo && self.timer < self.combo_duration {
if data.inputs.primary.is_pressed() {
update.character = CharacterState::ComboMelee(Data {
stage: (self.stage % self.num_stages) + 1,
num_stages: self.num_stages,
combo: self.combo + 1,
stage_data: self.stage_data.clone(),
initial_energy_gain: self.initial_energy_gain,
max_energy_gain: self.max_energy_gain,
energy_increase: self.energy_increase,
combo_duration: self.combo_duration,
timer: Duration::default(),
stage_section: StageSection::Buildup,
next_stage: self.next_stage,
});
} else {
update.character = CharacterState::ComboMelee(Data {
stage: self.stage,
num_stages: self.num_stages,
combo: self.combo,
stage_data: self.stage_data.clone(),
initial_energy_gain: self.initial_energy_gain,
max_energy_gain: self.max_energy_gain,
energy_increase: self.energy_increase,
combo_duration: self.combo_duration,
timer: self
.timer
.checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
stage_section: self.stage_section,
next_stage: self.next_stage,
});
}
}*/ else if self.next_stage {
// Transitions to buildup section of next stage // Transitions to buildup section of next stage
update.character = CharacterState::ComboMelee(Data { update.character = CharacterState::ComboMelee(Data {
stage: (self.stage % self.num_stages) + 1, stage: (self.stage % self.num_stages) + 1,

View File

@ -1,88 +1,242 @@
use crate::{ use crate::{
comp::{Attacking, CharacterState, StateUpdate}, comp::{Attacking, CharacterState, EnergySource, StateUpdate},
states::utils::*, states::utils::{StageSection, *},
sys::character_behavior::*, sys::character_behavior::*,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
use vek::Vec3;
const DASH_SPEED: f32 = 19.0; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub struct Data { pub struct Data {
/// How much damage the attack initially does
pub base_damage: u32,
/// How much damage the attack does at max charge distance
pub max_damage: u32,
/// How much the attack knocks the target back initially
pub base_knockback: f32,
/// How much knockback happens at max charge distance
pub max_knockback: f32,
/// Range of the attack
pub range: f32,
/// Angle of the attack
pub angle: f32,
/// Rate of energy drain
pub energy_drain: u32,
/// How quickly dasher moves forward
pub forward_speed: f32,
/// How long until state should deal damage /// How long until state should deal damage
pub buildup_duration: Duration, pub buildup_duration: Duration,
/// How long the state charges for until it reaches max damage
pub charge_duration: Duration,
/// How high timer got while in charge potion
pub charge_duration_attained: Duration,
/// Whether state keeps charging after reaching max charge duration
pub infinite_charge: bool,
/// How long the state swings for
pub swing_duration: Duration,
/// How long the state has until exiting /// How long the state has until exiting
pub recover_duration: Duration, pub recover_duration: Duration,
/// Base damage /// Timer for each stage
pub base_damage: u32, pub timer: Duration,
/// Whether the attack can deal more damage /// What section the character stage is in
pub exhausted: bool, pub stage_section: StageSection,
pub initialize: bool,
} }
impl CharacterBehavior for Data { impl CharacterBehavior for Data {
fn behavior(&self, data: &JoinData) -> StateUpdate { fn behavior(&self, data: &JoinData) -> StateUpdate {
let mut update = StateUpdate::from(data); let mut update = StateUpdate::from(data);
if self.initialize { handle_orientation(data, &mut update, 1.0);
update.vel.0 = *data.inputs.look_dir * 20.0; handle_move(data, &mut update, 0.1);
if let Some(dir) = Vec3::from(data.inputs.look_dir.xy()).try_normalized() {
update.ori.0 = dir.into();
}
}
if self.buildup_duration != Duration::default() && data.physics.touch_entities.is_empty() {
// Build up (this will move you forward)
update.vel.0 = Vec3::new(0.0, 0.0, update.vel.0.z)
+ (update.vel.0 * Vec3::new(1.0, 1.0, 0.0)
+ 1.5 * data.inputs.move_dir.try_normalized().unwrap_or_default())
.try_normalized()
.unwrap_or_default()
* DASH_SPEED;
if self.stage_section == StageSection::Buildup && self.timer < self.buildup_duration {
// Build up
update.character = CharacterState::DashMelee(Data { update.character = CharacterState::DashMelee(Data {
buildup_duration: self
.buildup_duration
.checked_sub(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
recover_duration: self.recover_duration,
base_damage: self.base_damage, base_damage: self.base_damage,
exhausted: false, max_damage: self.max_damage,
initialize: false, base_knockback: self.base_knockback,
max_knockback: self.max_knockback,
range: self.range,
angle: self.angle,
energy_drain: self.energy_drain,
forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration,
charge_duration: self.charge_duration,
charge_duration_attained: self.charge_duration_attained,
infinite_charge: self.infinite_charge,
swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: self
.timer
.checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
stage_section: self.stage_section,
})
} else if self.stage_section == StageSection::Buildup {
// Transitions to charge section of stage
update.character = CharacterState::DashMelee(Data {
base_damage: self.base_damage,
max_damage: self.max_damage,
base_knockback: self.base_knockback,
max_knockback: self.max_knockback,
range: self.range,
angle: self.angle,
energy_drain: self.energy_drain,
forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration,
charge_duration: self.charge_duration,
charge_duration_attained: self.charge_duration_attained,
infinite_charge: self.infinite_charge,
swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: Duration::default(),
stage_section: StageSection::Charge,
})
} else if self.stage_section == StageSection::Charge /*&& data.physics.touch_entities.is_empty()*/ && ((self.timer < self.charge_duration && !self.infinite_charge) || (data.inputs.secondary.is_pressed() && self.infinite_charge)) && update.energy.current() > 0
{
// Forward movement
forward_move(data, &mut update, 0.1, self.forward_speed);
// Charges
update.character = CharacterState::DashMelee(Data {
base_damage: self.base_damage,
max_damage: self.max_damage,
base_knockback: self.base_knockback,
max_knockback: self.max_knockback,
range: self.range,
angle: self.angle,
energy_drain: self.energy_drain,
forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration,
charge_duration: self.charge_duration,
charge_duration_attained: self.charge_duration_attained,
infinite_charge: self.infinite_charge,
swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: self
.timer
.checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
stage_section: self.stage_section,
}); });
} else if !self.exhausted {
// Consumes energy if there's enough left and charge has not stopped
update.energy.change_by(
-(self.energy_drain as f32 * data.dt.0) as i32,
EnergySource::Ability,
);
} else if self.stage_section == StageSection::Charge {
// Transitions to swing section of stage
update.character = CharacterState::DashMelee(Data {
base_damage: self.base_damage,
max_damage: self.max_damage,
base_knockback: self.base_knockback,
max_knockback: self.max_knockback,
range: self.range,
angle: self.angle,
energy_drain: self.energy_drain,
forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration,
charge_duration: self.charge_duration,
charge_duration_attained: self.charge_duration_attained,
infinite_charge: self.infinite_charge,
swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: Duration::default(),
stage_section: StageSection::Swing,
})
} else if self.stage_section == StageSection::Swing && self.timer < self.swing_duration {
// Swings
let charge_attained = if self.timer > self.charge_duration_attained {
if self.timer > self.charge_duration_attained {
self.charge_duration
} else {
self.timer
}
} else {
self.charge_duration_attained
};
update.character = CharacterState::DashMelee(Data {
base_damage: self.base_damage,
max_damage: self.max_damage,
base_knockback: self.base_knockback,
max_knockback: self.max_knockback,
range: self.range,
angle: self.angle,
energy_drain: self.energy_drain,
forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration,
charge_duration: self.charge_duration,
charge_duration_attained: charge_attained,
infinite_charge: self.infinite_charge,
swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: self
.timer
.checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
stage_section: self.stage_section,
})
} else if self.stage_section == StageSection::Swing {
// Hit attempt // Hit attempt
let charge_frac =
(self.charge_duration_attained.as_secs_f32() / self.charge_duration.as_secs_f32()).min(1.0);
let damage = (self.max_damage as f32 - self.base_damage as f32) * charge_frac
+ self.base_damage as f32;
let knockback =
(self.max_knockback - self.base_knockback) * charge_frac + self.base_knockback;
data.updater.insert(data.entity, Attacking { data.updater.insert(data.entity, Attacking {
base_healthchange: -(self.base_damage as i32), base_healthchange: -damage as i32,
range: 3.5, range: self.range,
max_angle: 45_f32.to_radians(), max_angle: self.angle.to_radians(),
applied: false, applied: false,
hit_count: 0, hit_count: 0,
knockback: 0.0, knockback,
}); });
// Transitions to recover section of stage
update.character = CharacterState::DashMelee(Data { update.character = CharacterState::DashMelee(Data {
buildup_duration: Duration::default(),
recover_duration: self.recover_duration,
base_damage: self.base_damage, base_damage: self.base_damage,
exhausted: true, max_damage: self.max_damage,
initialize: false, base_knockback: self.base_knockback,
}); max_knockback: self.max_knockback,
} else if self.recover_duration != Duration::default() { range: self.range,
// Recovery angle: self.angle,
handle_move(data, &mut update, 0.7); energy_drain: self.energy_drain,
update.character = CharacterState::DashMelee(Data { forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration, buildup_duration: self.buildup_duration,
recover_duration: self charge_duration: self.charge_duration,
.recover_duration charge_duration_attained: self.charge_duration_attained,
.checked_sub(Duration::from_secs_f32(data.dt.0)) infinite_charge: self.infinite_charge,
.unwrap_or_default(), swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: Duration::default(),
stage_section: StageSection::Recover,
})
} else if self.stage_section == StageSection::Recover && self.timer < self.recover_duration
{
// Recover
update.character = CharacterState::DashMelee(Data {
base_damage: self.base_damage, base_damage: self.base_damage,
exhausted: true, max_damage: self.max_damage,
initialize: false, base_knockback: self.base_knockback,
}); max_knockback: self.max_knockback,
range: self.range,
angle: self.angle,
energy_drain: self.energy_drain,
forward_speed: self.forward_speed,
buildup_duration: self.buildup_duration,
charge_duration: self.charge_duration,
charge_duration_attained: self.charge_duration_attained,
infinite_charge: self.infinite_charge,
swing_duration: self.swing_duration,
recover_duration: self.recover_duration,
timer: self
.timer
.checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
stage_section: self.stage_section,
})
} else { } else {
// Done // Done
update.character = CharacterState::Wielding; update.character = CharacterState::Wielding;

View File

@ -8,6 +8,7 @@ use crate::{
sys::{character_behavior::JoinData, phys::GRAVITY}, sys::{character_behavior::JoinData, phys::GRAVITY},
util::Dir, util::Dir,
}; };
use serde::{Deserialize, Serialize};
use vek::*; use vek::*;
pub const MOVEMENT_THRESHOLD_VEL: f32 = 3.0; pub const MOVEMENT_THRESHOLD_VEL: f32 = 3.0;
@ -97,10 +98,12 @@ pub fn forward_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32,
BASE_HUMANOID_AIR_ACCEL BASE_HUMANOID_AIR_ACCEL
}; };
update.vel.0 = update.vel.0 = update.vel.0
update.vel.0 + Vec2::broadcast(data.dt.0) * data.inputs.move_dir * accel * efficiency + (*update.ori.0).xy() * forward; + Vec2::broadcast(data.dt.0)
* accel
* (data.inputs.move_dir * efficiency + (*update.ori.0).xy() * forward);
handle_orientation(data, update, data.body.base_ori_rate()); handle_orientation(data, update, data.body.base_ori_rate() * efficiency);
} }
pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, rate: f32) { pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, rate: f32) {
@ -344,3 +347,14 @@ pub fn unwrap_tool_data<'a>(data: &'a JoinData) -> Option<&'a Tool> {
None None
} }
} }
/// Determines what portion a state is in. Used in all attacks (eventually). Is
/// used to control aspects of animation code, as well as logic within the
/// character states.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum StageSection {
Buildup,
Swing,
Recover,
Charge,
}

View File

@ -3,7 +3,6 @@ use crate::{
comp::{CharacterState, StateUpdate}, comp::{CharacterState, StateUpdate},
sys::character_behavior::{CharacterBehavior, JoinData}, sys::character_behavior::{CharacterBehavior, JoinData},
}; };
use serde::{Deserialize, Serialize};
pub struct Data; pub struct Data;
@ -58,14 +57,3 @@ impl CharacterBehavior for Data {
update update
} }
} }
/// Determines what portion a state is in. Used in all attacks (eventually). Is
/// used to control aspects of animation code, as well as logic within the
/// character states.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum StageSection {
Buildup,
Swing,
Recover,
Combo,
}

View File

@ -4,7 +4,7 @@ use super::{
}; };
use common::{ use common::{
comp::item::{Hands, ToolKind}, comp::item::{Hands, ToolKind},
states::wielding::StageSection, states::utils::StageSection,
}; };
use std::f32::consts::PI; use std::f32::consts::PI;
@ -119,7 +119,7 @@ impl Animation for AlphaAnimation {
// next.torso.orientation = Quaternion::rotation_z(test2 // next.torso.orientation = Quaternion::rotation_z(test2
// * 7.2); // * 7.2);
}, },
StageSection::Recover | StageSection::Combo => { StageSection::Recover => {
//println!("{:.3} recover", anim_time); //println!("{:.3} recover", anim_time);
next.control.position = Vec3::new(-7.0, 7.0, 2.0); next.control.position = Vec3::new(-7.0, 7.0, 2.0);
next.control.orientation = Quaternion::rotation_x(0.0) next.control.orientation = Quaternion::rotation_x(0.0)
@ -131,6 +131,7 @@ impl Animation for AlphaAnimation {
next.head.orientation = next.head.orientation =
Quaternion::rotation_y(0.0) * Quaternion::rotation_z(1.57); Quaternion::rotation_y(0.0) * Quaternion::rotation_z(1.57);
}, },
_ => {},
} }
} }
} }

View File

@ -4,7 +4,7 @@ use super::{
}; };
use common::{ use common::{
comp::item::{Hands, ToolKind}, comp::item::{Hands, ToolKind},
states::wielding::StageSection, states::utils::StageSection,
}; };
pub struct BetaAnimation; pub struct BetaAnimation;
@ -98,7 +98,7 @@ impl Animation for BetaAnimation {
next.head.orientation = Quaternion::rotation_y(0.1) next.head.orientation = Quaternion::rotation_y(0.1)
* Quaternion::rotation_z(-1.2 + test * -0.5); * Quaternion::rotation_z(-1.2 + test * -0.5);
}, },
StageSection::Recover | StageSection::Combo => { StageSection::Recover => {
next.control.position = Vec3::new(10.0 + movement * -5.0, 8.0, 6.0); next.control.position = Vec3::new(10.0 + movement * -5.0, 8.0, 6.0);
next.control.orientation = Quaternion::rotation_x(-1.57) next.control.orientation = Quaternion::rotation_x(-1.57)
* Quaternion::rotation_y(2.0) * Quaternion::rotation_y(2.0)
@ -108,6 +108,7 @@ impl Animation for BetaAnimation {
next.head.orientation = next.head.orientation =
Quaternion::rotation_y(0.1) * Quaternion::rotation_z(-1.5); Quaternion::rotation_y(0.1) * Quaternion::rotation_z(-1.5);
}, },
_ => {},
} }
} }
} }

View File

@ -4,7 +4,7 @@ use super::{
}; };
use common::{ use common::{
comp::item::{Hands, ToolKind}, comp::item::{Hands, ToolKind},
states::wielding::StageSection, states::utils::StageSection,
}; };
use std::f32::consts::PI; use std::f32::consts::PI;
@ -104,7 +104,7 @@ impl Animation for SpinAnimation {
next.shorts.orientation = Quaternion::rotation_z(test2 * 1.5); next.shorts.orientation = Quaternion::rotation_z(test2 * 1.5);
next.torso.orientation = Quaternion::rotation_z(test2 * 7.2); next.torso.orientation = Quaternion::rotation_z(test2 * 7.2);
}, },
StageSection::Recover | StageSection::Combo => { StageSection::Recover => {
//println!("{:.3} recover", anim_time); //println!("{:.3} recover", anim_time);
next.control.position = Vec3::new( next.control.position = Vec3::new(
-8.0, -8.0,
@ -119,6 +119,7 @@ impl Animation for SpinAnimation {
next.head.orientation = Quaternion::rotation_y(movement * 0.1) next.head.orientation = Quaternion::rotation_y(movement * 0.1)
* Quaternion::rotation_z(movement * -0.1); * Quaternion::rotation_z(movement * -0.1);
}, },
_ => {},
} }
} }
} }

View File

@ -30,7 +30,7 @@ use common::{
}, },
span, span,
state::{DeltaTime, State}, state::{DeltaTime, State},
states::wielding::StageSection, states::utils::StageSection,
terrain::TerrainChunk, terrain::TerrainChunk,
vol::RectRasterableVol, vol::RectRasterableVol,
}; };
@ -946,7 +946,7 @@ impl FigureMgr {
.base_recover_duration .base_recover_duration
.as_secs_f64() .as_secs_f64()
}, },
StageSection::Combo => stage_time / s.combo_duration.as_secs_f64(), _ => 0.0,
}; };
match s.stage { match s.stage {
1 => anim::character::AlphaAnimation::update_skeleton( 1 => anim::character::AlphaAnimation::update_skeleton(