Taught adlet elder how to use leap

This commit is contained in:
Sam 2023-04-22 21:37:23 -04:00
parent 7739aaff78
commit fd3c377d1c
4 changed files with 37 additions and 14 deletions

View File

@ -22,6 +22,6 @@ LeapMelee(
))), ))),
), ),
forward_leap_strength: 30.0, forward_leap_strength: 30.0,
vertical_leap_strength: 25.0, vertical_leap_strength: 15.0,
specifier: Some(ElderLeap), specifier: Some(ElderLeap),
) )

View File

@ -1501,7 +1501,7 @@ impl<'a> AgentData<'a> {
abilities, abilities,
), ),
Tactic::AdletElder => { Tactic::AdletElder => {
self.handle_adlet_elder(agent, controller, &attack_data, tgt_data, read_data) self.handle_adlet_elder(agent, controller, &attack_data, tgt_data, read_data, rng)
}, },
} }
} }

View File

@ -4723,6 +4723,7 @@ impl<'a> AgentData<'a> {
attack_data: &AttackData, attack_data: &AttackData,
tgt_data: &TargetData, tgt_data: &TargetData,
read_data: &ReadData, read_data: &ReadData,
rng: &mut impl Rng,
) { ) {
const TRAP_TIMER: usize = 0; const TRAP_TIMER: usize = 0;
agent.action_state.timers[TRAP_TIMER] -= read_data.dt.0; agent.action_state.timers[TRAP_TIMER] -= read_data.dt.0;
@ -4731,6 +4732,10 @@ impl<'a> AgentData<'a> {
} }
let primary = self.extract_ability(AbilityInput::Primary); let primary = self.extract_ability(AbilityInput::Primary);
let secondary = self.extract_ability(AbilityInput::Secondary); let secondary = self.extract_ability(AbilityInput::Secondary);
let abilities = [
self.extract_ability(AbilityInput::Auxiliary(0)),
self.extract_ability(AbilityInput::Auxiliary(1)),
];
let could_use_input = |input| match input { let could_use_input = |input| match input {
InputKind::Primary => primary.as_ref().map_or(false, |p| { InputKind::Primary => primary.as_ref().map_or(false, |p| {
p.could_use(attack_data, self, tgt_data, read_data, 0.0) p.could_use(attack_data, self, tgt_data, read_data, 0.0)
@ -4738,6 +4743,9 @@ impl<'a> AgentData<'a> {
InputKind::Secondary => secondary.as_ref().map_or(false, |s| { InputKind::Secondary => secondary.as_ref().map_or(false, |s| {
s.could_use(attack_data, self, tgt_data, read_data, 0.0) s.could_use(attack_data, self, tgt_data, read_data, 0.0)
}), }),
InputKind::Ability(x) => abilities[x].as_ref().map_or(false, |a| {
a.could_use(attack_data, self, tgt_data, read_data, 0.0)
}),
_ => false, _ => false,
}; };
let move_forwards = if matches!(self.char_state, CharacterState::DashMelee(s) if s.stage_section != StageSection::Recover) let move_forwards = if matches!(self.char_state, CharacterState::DashMelee(s) if s.stage_section != StageSection::Recover)
@ -4750,13 +4758,25 @@ impl<'a> AgentData<'a> {
} else if could_use_input(InputKind::Primary) { } else if could_use_input(InputKind::Primary) {
controller.push_basic_input(InputKind::Primary); controller.push_basic_input(InputKind::Primary);
false false
} else if could_use_input(InputKind::Secondary) { } else if could_use_input(InputKind::Secondary) && rng.gen_bool(0.5) {
controller.push_basic_input(InputKind::Secondary); controller.push_basic_input(InputKind::Secondary);
false false
} else if could_use_input(InputKind::Ability(1)) {
controller.push_basic_input(InputKind::Ability(1));
false
} else { } else {
true true
}; };
if matches!(self.char_state, CharacterState::LeapMelee(_)) {
let tgt_vec = tgt_data.pos.0.xy() - self.pos.0.xy();
if tgt_vec.magnitude_squared() > 2_f32.powi(2) {
if let Some(look_dir) = Dir::from_unnormalized(Vec3::from(tgt_vec)) {
controller.inputs.look_dir = look_dir;
}
}
}
if move_forwards && attack_data.dist_sqrd > 2_f32.powi(2) { if move_forwards && attack_data.dist_sqrd > 2_f32.powi(2) {
self.path_toward_target( self.path_toward_target(
agent, agent,

View File

@ -603,23 +603,26 @@ impl AbilityData {
desired_energy: f32, desired_energy: f32,
) -> bool { ) -> bool {
let melee_check = |range: f32, angle, forced_movement: Option<ForcedMovement>| { let melee_check = |range: f32, angle, forced_movement: Option<ForcedMovement>| {
let range_inc = forced_movement.map_or(0.0, |fm| match fm { let (range_inc, min_mult) = forced_movement.map_or((0.0, 0.0), |fm| match fm {
ForcedMovement::Forward(speed) => speed * 15.0, ForcedMovement::Forward(speed) => (speed * 15.0, 1.0),
ForcedMovement::Reverse(speed) => -speed, ForcedMovement::Reverse(speed) => (-speed, 1.0),
ForcedMovement::Leap { ForcedMovement::Leap {
vertical, forward, .. vertical, forward, ..
} => { } => (
let dur = vertical * 2.0 / GRAVITY; {
// 0.75 factor to allow for fact that agent looks down as they approach, so let dur = vertical * 2.0 / GRAVITY;
// won't go as far // 0.75 factor to allow for fact that agent looks down as they approach, so
forward * dur * 0.75 // won't go as far
}, forward * dur * 0.75
_ => 0.0, },
0.0,
),
_ => (0.0, 0.0),
}); });
let body_rad = agent_data.body.map_or(0.0, |b| b.max_radius()); let body_rad = agent_data.body.map_or(0.0, |b| b.max_radius());
attack_data.dist_sqrd < (range + range_inc + body_rad).powi(2) attack_data.dist_sqrd < (range + range_inc + body_rad).powi(2)
&& attack_data.angle < angle && attack_data.angle < angle
&& attack_data.dist_sqrd > range_inc.powi(2) && attack_data.dist_sqrd > (range_inc * min_mult).powi(2)
}; };
let energy_check = |energy: f32| { let energy_check = |energy: f32| {
agent_data.energy.current() >= energy agent_data.energy.current() >= energy