From 6b534729be99ce4670be35025350380e2c66a974 Mon Sep 17 00:00:00 2001 From: jiminycrick Date: Sun, 15 Nov 2020 20:35:22 -0800 Subject: [PATCH] Initial AI for quad low --- .../abilities/unique/quadlowquick/dash.ron | 6 +- .../abilities/unique/quadlowtail/charged.ron | 4 +- .../abilities/unique/quadmedjump/leap.ron | 4 +- common/src/sys/agent.rs | 90 ++++++++++++++++--- 4 files changed, 83 insertions(+), 21 deletions(-) diff --git a/assets/common/abilities/unique/quadlowquick/dash.ron b/assets/common/abilities/unique/quadlowquick/dash.ron index cacca5b549..292cfb22b7 100644 --- a/assets/common/abilities/unique/quadlowquick/dash.ron +++ b/assets/common/abilities/unique/quadlowquick/dash.ron @@ -7,11 +7,11 @@ DashMelee( range: 2.0, angle: 45.0, energy_drain: 0, - forward_speed: 1.5, - buildup_duration: 1200, + forward_speed: 2.0, + buildup_duration: 500, charge_duration: 300, swing_duration: 100, recover_duration: 500, infinite_charge: true, is_interruptible: true, -) \ No newline at end of file +) diff --git a/assets/common/abilities/unique/quadlowtail/charged.ron b/assets/common/abilities/unique/quadlowtail/charged.ron index e50f80e2db..215dde8add 100644 --- a/assets/common/abilities/unique/quadlowtail/charged.ron +++ b/assets/common/abilities/unique/quadlowtail/charged.ron @@ -6,9 +6,9 @@ ChargedMelee( initial_knockback: 10.0, max_knockback: 30.0, range: 6.0, - max_angle: 30.0, + max_angle: 90.0, speed: 1.0, charge_duration: 1200, swing_duration: 700, recover_duration: 1200, -) \ No newline at end of file +) diff --git a/assets/common/abilities/unique/quadmedjump/leap.ron b/assets/common/abilities/unique/quadmedjump/leap.ron index ae96cc2146..34aec8ec1f 100644 --- a/assets/common/abilities/unique/quadmedjump/leap.ron +++ b/assets/common/abilities/unique/quadmedjump/leap.ron @@ -1,6 +1,6 @@ LeapMelee( energy_cost: 0, - buildup_duration: 500, + buildup_duration: 200, movement_duration: 200, swing_duration: 200, recover_duration: 200, @@ -10,4 +10,4 @@ LeapMelee( max_angle: 30.0, forward_leap_strength: 28.0, vertical_leap_strength: 8.0, -) \ No newline at end of file +) diff --git a/common/src/sys/agent.rs b/common/src/sys/agent.rs index 65c8f84284..079a3e2b23 100644 --- a/common/src/sys/agent.rs +++ b/common/src/sys/agent.rs @@ -334,7 +334,11 @@ impl<'a> System<'a> for Sys { Staff, StoneGolemBoss, Wolf, - Maneater, + QuadLowRanged, + TailSlap, + QuadLowQuick, + QuadLowBasic, + QuadMedJump, } let tactic = match loadout.active_item.as_ref().and_then(|ic| { @@ -353,8 +357,17 @@ impl<'a> System<'a> for Sys { Tactic::StoneGolemBoss }, Some(ToolKind::Unique(UniqueKind::QuadMedQuick)) => Tactic::Wolf, - Some(ToolKind::Unique(UniqueKind::QuadLowRanged)) => Tactic::Maneater, - + Some(ToolKind::Unique(UniqueKind::QuadMedJump)) => Tactic::QuadMedJump, + Some(ToolKind::Unique(UniqueKind::QuadLowRanged)) => { + Tactic::QuadLowRanged + }, + Some(ToolKind::Unique(UniqueKind::QuadLowTail)) => Tactic::TailSlap, + Some(ToolKind::Unique(UniqueKind::QuadLowQuick)) => { + Tactic::QuadLowQuick + }, + Some(ToolKind::Unique(UniqueKind::QuadLowBasic)) => { + Tactic::QuadLowBasic + }, _ => Tactic::Melee, }; @@ -368,6 +381,7 @@ impl<'a> System<'a> for Sys { .unwrap_or(Alignment::Wild), ), ) { + // Wield the weapon as running towards the target controller.actions.push(ControlAction::Wield); let eye_offset = body.map_or(0.0, |b| b.eye_height()); @@ -378,10 +392,13 @@ impl<'a> System<'a> for Sys { let distance_offset = match tactic { Tactic::Bow => 0.0004 * pos.0.distance_squared(tgt_pos.0), Tactic::Staff => 0.0015 * pos.0.distance_squared(tgt_pos.0), - Tactic::Maneater => 0.05 * pos.0.distance_squared(tgt_pos.0), + Tactic::QuadLowRanged => 0.05 * pos.0.distance_squared(tgt_pos.0), _ => 0.0, }; + // Apply the distance and eye offsets to make the + // look_dir the vector from projectile launch to + // target point if let Some(dir) = Dir::from_unnormalized( Vec3::new( tgt_pos.0.x, @@ -440,12 +457,14 @@ impl<'a> System<'a> for Sys { } else { do_idle = true; } - } else if (tactic == Tactic::Staff + } else if ((tactic == Tactic::Staff || tactic == Tactic::QuadMedJump) && dist_sqrd < (5.0 * MIN_ATTACK_DIST * scale).powf(2.0)) - || (tactic == Tactic::Maneater + || (tactic == Tactic::QuadLowRanged && dist_sqrd < (4.0 * MIN_ATTACK_DIST * scale).powf(2.0)) || (tactic == Tactic::Wolf && dist_sqrd < (3.0 * MIN_ATTACK_DIST * scale).powf(2.0)) + || ((tactic == Tactic::TailSlap || tactic == Tactic::QuadLowBasic) + && dist_sqrd < (1.5 * MIN_ATTACK_DIST * scale).powf(2.0)) || dist_sqrd < (MIN_ATTACK_DIST * scale).powf(2.0) { controller.actions.push(ControlAction::Wield); @@ -459,12 +478,24 @@ impl<'a> System<'a> for Sys { .try_normalized() .unwrap_or(Vec2::unit_y()); }, - Tactic::Maneater => { + Tactic::QuadLowRanged => { inputs.move_dir = (tgt_pos.0 - pos.0) .xy() .try_normalized() .unwrap_or(Vec2::unit_y()); }, + Tactic::TailSlap => { + inputs.move_dir = Vec2::zero(); + }, + Tactic::QuadLowQuick => { + inputs.move_dir = Vec2::zero(); + }, + Tactic::QuadLowBasic => { + inputs.move_dir = Vec2::zero(); + }, + Tactic::QuadMedJump => { + inputs.move_dir = Vec2::zero(); + }, _ => { inputs.move_dir = (tgt_pos.0 - pos.0) .xy() @@ -524,12 +555,38 @@ impl<'a> System<'a> for Sys { *powerup += dt.0; } }, - Tactic::Maneater => inputs.secondary.set_state(true), Tactic::Bow => inputs.roll.set_state(true), Tactic::Melee => inputs.primary.set_state(true), + // Animal attacks + Tactic::TailSlap => { + if *powerup > 4.0 { + inputs.primary.set_state(false); + *powerup = 0.0; + } else if *powerup > 2.0 { + inputs.primary.set_state(true); + *powerup += dt.0; + } else { + inputs.secondary.set_state(true); + *powerup += dt.0; + } + }, + Tactic::QuadLowRanged => inputs.primary.set_state(true), + Tactic::QuadLowBasic => { + if *powerup > 5.0 { + *powerup = 0.0; + } else if *powerup > 2.0 { + inputs.secondary.set_state(true); + *powerup += dt.0; + } else { + inputs.primary.set_state(true); + *powerup += dt.0; + } + }, + Tactic::QuadLowQuick => inputs.secondary.set_state(true), + Tactic::QuadMedJump => inputs.primary.set_state(true), _ => {}, } - } else if matches!(tactic, Tactic::Wolf) + } else if tactic == Tactic::Wolf && dist_sqrd < (4.0 * MIN_ATTACK_DIST * scale).powf(2.0) && dist_sqrd > (3.0 * MIN_ATTACK_DIST * scale).powf(2.0) { @@ -560,12 +617,17 @@ impl<'a> System<'a> for Sys { } else { *powerup = 0.0; } + } else if tactic == Tactic::QuadLowQuick + && dist_sqrd < (3.0 * MIN_ATTACK_DIST * scale).powf(2.0) + && dist_sqrd > (2.0 * MIN_ATTACK_DIST * scale).powf(2.0) + { + inputs.primary.set_state(true); } else if dist_sqrd < MAX_CHASE_DIST.powf(2.0) || (dist_sqrd < SIGHT_DIST.powf(2.0) && (!*been_close || !matches!(tactic, Tactic::Melee))) { let can_see_tgt = match tactic { - Tactic::Maneater => { + Tactic::QuadLowRanged => { terrain .ray(pos.0 + Vec3::unit_z(), tgt_pos.0 + Vec3::unit_z()) .until(Block::is_opaque) @@ -634,8 +696,8 @@ impl<'a> System<'a> for Sys { *powerup += dt.0; } }, - Tactic::Maneater => { - inputs.primary.set_state(true); + Tactic::QuadLowRanged => { + inputs.secondary.set_state(true); }, _ => {}, } @@ -674,13 +736,13 @@ impl<'a> System<'a> for Sys { .unwrap_or(Vec2::zero()) * speed; }, - Tactic::Maneater => { + Tactic::QuadLowRanged => { if *powerup > 5.0 { *powerup = 0.0; } else if *powerup > 2.5 { inputs.move_dir = bearing .xy() - .rotated_z(-0.25 * PI) + .rotated_z(1.75 * PI) .try_normalized() .unwrap_or(Vec2::zero()) * speed;