Teach AI how to leap again

+ adjust hammer and axe AI timings
This commit is contained in:
juliancoffee 2021-07-14 04:40:56 +03:00
parent 56ab92fd05
commit 00a34da48b

View File

@ -266,12 +266,14 @@ impl<'a> System<'a> for Sys {
)
};
controller.reset();
let event_emitter = event_bus.emitter();
// Default to looking in orientation direction
// (can be overridden below)
controller.inputs.look_dir = ori.look_dir();
if !matches!(char_state, CharacterState::LeapMelee(_)) {
controller.reset();
controller.inputs.look_dir = ori.look_dir();
}
let scale = read_data.scales.get(entity).map_or(1.0, |Scale(s)| *s);
@ -1753,6 +1755,28 @@ impl<'a> AgentData<'a> {
),
)
},
// Leap into direction of the target
// TODO: test with different weapons/tactics
Tactic::Hammer if matches!(self.char_state, CharacterState::LeapMelee(_)) => {
let tgt_pos = tgt_data.pos.0;
let self_pos = self.pos.0;
let direction_weight = 0.1;
let delta_x = (tgt_pos.x - self_pos.x) * direction_weight;
let delta_y = (tgt_pos.y - self_pos.y) * direction_weight;
Dir::from_unnormalized(Vec3::new(delta_x, delta_y, -1.0))
},
Tactic::Axe if matches!(self.char_state, CharacterState::LeapMelee(_)) => {
let tgt_pos = tgt_data.pos.0;
let self_pos = self.pos.0;
let direction_weight = 0.3;
let delta_x = (tgt_pos.x - self_pos.x) * direction_weight;
let delta_y = (tgt_pos.y - self_pos.y) * direction_weight;
Dir::from_unnormalized(Vec3::new(delta_x, delta_y, -1.0))
},
_ => Dir::from_unnormalized(
Vec3::new(
tgt_data.pos.0.x,
@ -1966,22 +1990,28 @@ impl<'a> AgentData<'a> {
tgt_data: &TargetData,
read_data: &ReadData,
) {
let has_leap = || self.skill_set.has_skill(Skill::Axe(AxeSkill::UnlockLeap));
let has_energy = |need| self.energy.current() > need;
let use_leap = |controller: &mut Controller| {
controller
.actions
.push(ControlAction::basic_input(InputKind::Ability(0)));
};
if attack_data.in_min_range() && attack_data.angle < 45.0 {
controller.inputs.move_dir = Vec2::zero();
if agent.action_state.timer > 6.0 {
if agent.action_state.timer > 5.0 {
controller
.actions
.push(ControlAction::CancelInput(InputKind::Secondary));
agent.action_state.timer = 0.0;
} else if agent.action_state.timer > 4.0 && self.energy.current() > 10 {
} else if agent.action_state.timer > 2.5 && has_energy(10) {
controller
.actions
.push(ControlAction::basic_input(InputKind::Secondary));
agent.action_state.timer += read_data.dt.0;
} else if self.skill_set.has_skill(Skill::Axe(AxeSkill::UnlockLeap))
&& self.energy.current() > 800
&& thread_rng().gen_bool(0.5)
{
} else if has_leap() && has_energy(450) && thread_rng().gen_bool(0.5) {
controller
.actions
.push(ControlAction::basic_input(InputKind::Ability(0)));
@ -1994,6 +2024,18 @@ impl<'a> AgentData<'a> {
}
} else if attack_data.dist_sqrd < MAX_PATH_DIST.powi(2) {
self.path_toward_target(agent, controller, tgt_data, read_data, true, None);
if attack_data.dist_sqrd < 32.0f32.powi(2)
&& has_leap()
&& has_energy(500)
&& can_see_tgt(
&read_data.terrain,
self.pos,
tgt_data.pos,
attack_data.dist_sqrd,
)
{
use_leap(controller);
}
if self.body.map(|b| b.is_humanoid()).unwrap_or(false)
&& attack_data.dist_sqrd < 16.0f32.powi(2)
&& thread_rng().gen::<f32>() < 0.02
@ -2015,6 +2057,19 @@ impl<'a> AgentData<'a> {
tgt_data: &TargetData,
read_data: &ReadData,
) {
let has_leap = || {
self.skill_set
.has_skill(Skill::Hammer(HammerSkill::UnlockLeap))
};
let has_energy = |need| self.energy.current() > need;
let use_leap = |controller: &mut Controller| {
controller
.actions
.push(ControlAction::basic_input(InputKind::Ability(0)));
};
if attack_data.in_min_range() && attack_data.angle < 45.0 {
controller.inputs.move_dir = Vec2::zero();
if agent.action_state.timer > 4.0 {
@ -2022,20 +2077,13 @@ impl<'a> AgentData<'a> {
.actions
.push(ControlAction::CancelInput(InputKind::Secondary));
agent.action_state.timer = 0.0;
} else if agent.action_state.timer > 2.0 {
} else if agent.action_state.timer > 3.0 {
controller
.actions
.push(ControlAction::basic_input(InputKind::Secondary));
agent.action_state.timer += read_data.dt.0;
} else if self
.skill_set
.has_skill(Skill::Hammer(HammerSkill::UnlockLeap))
&& self.energy.current() > 700
&& thread_rng().gen_bool(0.9)
{
controller
.actions
.push(ControlAction::basic_input(InputKind::Ability(0)));
} else if has_leap() && has_energy(500) && thread_rng().gen_bool(0.9) {
use_leap(controller);
agent.action_state.timer += read_data.dt.0;
} else {
controller
@ -2044,27 +2092,18 @@ impl<'a> AgentData<'a> {
agent.action_state.timer += read_data.dt.0;
}
} else if attack_data.dist_sqrd < MAX_PATH_DIST.powi(2) {
if self.path_toward_target(agent, controller, tgt_data, read_data, true, None)
self.path_toward_target(agent, controller, tgt_data, read_data, true, None);
if attack_data.dist_sqrd < 32.0f32.powi(2)
&& has_leap()
&& has_energy(500)
&& can_see_tgt(
&*read_data.terrain,
&read_data.terrain,
self.pos,
tgt_data.pos,
attack_data.dist_sqrd,
)
&& attack_data.angle < 45.0
{
if self
.skill_set
.has_skill(Skill::Hammer(HammerSkill::UnlockLeap))
&& agent.action_state.timer > 5.0
{
controller
.actions
.push(ControlAction::basic_input(InputKind::Ability(0)));
agent.action_state.timer = 0.0;
} else {
agent.action_state.timer += read_data.dt.0;
}
use_leap(controller);
}
if self.body.map(|b| b.is_humanoid()).unwrap_or(false)
&& attack_data.dist_sqrd < 16.0f32.powi(2)