Set direction using character state

This commit is contained in:
Khalid Ali
2021-09-05 17:07:09 -05:00
parent ce0a7852bf
commit 871a1ccbfc

View File

@ -1814,44 +1814,12 @@ impl<'a> AgentData<'a> {
// Not all attacks may want their direction overwritten. // Not all attacks may want their direction overwritten.
// And this is quite hard to debug when you don't see it in actual // And this is quite hard to debug when you don't see it in actual
// attack handler. // attack handler.
if let Some(dir) = match tactic { if let Some(dir) = match self.char_state {
// FIXME: this code make Staff flamethrower aim flamethrower CharacterState::ChargedRanged(c)
// like a projectile. if dist_sqrd > 0.0 => {
Tactic::Bow let projectile_speed = c.static_data.initial_projectile_speed + 0.5 * c.static_data.scaled_projectile_speed;
| Tactic::FixedTurret
| Tactic::QuadLowRanged
| Tactic::QuadMedJump
| Tactic::RotatingTurret
| Tactic::Staff
| Tactic::Turret
if dist_sqrd > 0.0 =>
{
if matches!(self.char_state, CharacterState::ChargedRanged(_)) {
aim_projectile( aim_projectile(
175.0, projectile_speed,
Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset),
Vec3::new(
tgt_data.pos.0.x,
tgt_data.pos.0.y,
tgt_data.pos.0.z + tgt_eye_offset,
),
)
} else {
aim_projectile(
90.0, // + self.vel.0.magnitude(),
Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset),
Vec3::new(
tgt_data.pos.0.x,
tgt_data.pos.0.y,
tgt_data.pos.0.z + tgt_eye_offset,
),
)
}
}
Tactic::ClayGolem if matches!(self.char_state, CharacterState::BasicRanged(_)) => {
const ROCKET_SPEED: f32 = 30.0;
aim_projectile(
ROCKET_SPEED,
Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset), Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset),
Vec3::new( Vec3::new(
tgt_data.pos.0.x, tgt_data.pos.0.x,
@ -1860,10 +1828,10 @@ impl<'a> AgentData<'a> {
), ),
) )
}, },
Tactic::Yeti if matches!(self.char_state, CharacterState::BasicRanged(_)) => { CharacterState::BasicRanged(c) => {
const SNOWBALL_SPEED: f32 = 60.0; let projectile_speed = c.static_data.projectile_speed;
aim_projectile( aim_projectile(
SNOWBALL_SPEED, projectile_speed,
Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset), Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset),
Vec3::new( Vec3::new(
tgt_data.pos.0.x, tgt_data.pos.0.x,
@ -1872,52 +1840,31 @@ impl<'a> AgentData<'a> {
), ),
) )
}, },
Tactic::Harvester if matches!(self.char_state, CharacterState::BasicRanged(_)) => { CharacterState::LeapMelee(_)
const PUMPKIN_SPEED: f32 = 30.0; if matches!(tactic, Tactic::Hammer) || matches!(tactic, Tactic::Axe) => {
aim_projectile( let direction_weight = match tactic {
PUMPKIN_SPEED, Tactic::Hammer => 0.1,
Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset), Tactic::Axe => 0.3,
Vec3::new( _ => 0.0, // should not be called
tgt_data.pos.0.x, };
tgt_data.pos.0.y,
tgt_data.pos.0.z + tgt_eye_offset,
),
)
},
// 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 tgt_pos = tgt_data.pos.0;
let self_pos = self.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_x = (tgt_pos.x - self_pos.x) * direction_weight;
let delta_y = (tgt_pos.y - self_pos.y) * 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(delta_x, delta_y, -1.0))
}, },
Tactic::Axe if matches!(self.char_state, CharacterState::LeapMelee(_)) => { CharacterState::BasicBeam(_) => {
let tgt_pos = tgt_data.pos.0; let aim_from = self.body.map_or(self.pos.0, |body| {
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))
},
_ => {
let aim_from = match self.char_state {
CharacterState::BasicBeam(_) => self.body.map_or(self.pos.0, |body| {
self.pos.0 self.pos.0
+ basic_beam::beam_offsets( + basic_beam::beam_offsets(
body, body,
controller.inputs.look_dir, controller.inputs.look_dir,
self.ori.look_vec(), self.ori.look_vec(),
) )
}), });
_ => Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset),
};
let aim_to = Vec3::new( let aim_to = Vec3::new(
tgt_data.pos.0.x, tgt_data.pos.0.x,
tgt_data.pos.0.y, tgt_data.pos.0.y,
@ -1925,6 +1872,15 @@ impl<'a> AgentData<'a> {
); );
Dir::from_unnormalized(aim_to - aim_from) Dir::from_unnormalized(aim_to - aim_from)
}, },
_ => {
let aim_from = Vec3::new(self.pos.0.x, self.pos.0.y, self.pos.0.z + eye_offset);
let aim_to = Vec3::new(
tgt_data.pos.0.x,
tgt_data.pos.0.y,
tgt_data.pos.0.z + tgt_eye_offset,
);
Dir::from_unnormalized(aim_to - aim_from)
}
} { } {
controller.inputs.look_dir = dir; controller.inputs.look_dir = dir;
} }