Skip to content

Commit d42789d

Browse files
authored
Add new option for 'better combat collision avoidance' (#7036)
The `$better combat collision avoidance for fightercraft:` flag is incredibly useful in preventing AI from hitting large ships while attacking, and the ability to tune the collision avoidance aggression factor further helps mods tune behavior based on their ship speeds (tuning that value is via `+combat collision avoidance aggression for fightercraft:` ). Nevertheless, the improve collision avoidance still is not performed for that actual fightercraft's actual target, so there can be situations where a fast fighter attacks a large ship with high speed, and then when that fighter break off from the attack they turn directly into the large ship's hull. Allowing the target to be incorporated into the `better_collision_avoidance_triggered` check prevents this from happening. To allow the target to be a part of the checks we just simply need to not pass an 'ignor_ship` argument to `maybe_avoid_big_ship`. This PR adds that ability via flag. This new flag is tested and works as expected. For example, without the flag a squadron of TIEs in FotG would literally ram themselves to death attacking some of our larger capital ships because they would break off attack too late, but with this flag they no longer accidentally collide at all. In discussion with Asteroth it was decided to make this enhanced behavior behind a flag, too. This PR also fixes a small oversight from the original #2810 where `next_check_time` was never actually used within the `else` block of `maybe_avoid_big_ship`.
1 parent a32c318 commit d42789d

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

code/ai/ai_flags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ namespace AI {
142142
Fightercraft_nonshielded_ships_can_manage_ets,
143143
Ships_playing_dead_dont_manage_ets,
144144
Better_combat_collision_avoidance,
145+
Better_combat_collision_avoid_includes_target,
145146
Better_guard_collision_avoidance,
146147
Require_exact_los,
147148
Improved_missile_avoidance,

code/ai/ai_profiles.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,8 @@ void parse_ai_profiles_tbl(const char *filename)
588588
stuff_float(&profile->better_collision_avoid_aggression_combat);
589589
}
590590

591+
set_flag(profile, "+combat collision avoidance for fightercraft includes target:", AI::Profile_Flags::Better_combat_collision_avoid_includes_target);
592+
591593
set_flag(profile, "$better guard collision avoidance for fightercraft:", AI::Profile_Flags::Better_guard_collision_avoidance);
592594

593595
if (optional_string("+guard collision avoidance aggression for fightercraft:")) {

code/ai/aicode.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7711,7 +7711,7 @@ bool maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d
77117711
aip->ai_flags.remove(AI::AI_Flags::Avoiding_small_ship);
77127712
aip->avoid_ship_num = -1;
77137713
next_check_time = (int) (1500 * time_scale);
7714-
aip->avoid_check_timestamp = timestamp(1500);
7714+
aip->avoid_check_timestamp = timestamp(next_check_time);
77157715
}
77167716
}
77177717

@@ -7737,7 +7737,7 @@ bool maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d
77377737
* Return true if small ship and it will likely collide with large ship
77387738
* developed by Asteroth
77397739
*/
7740-
bool better_collision_avoidance_triggered(bool flag_to_check, float avoidance_aggression, object* pl_objp, object* en_objp)
7740+
bool better_collision_avoidance_triggered(bool flag_to_check, float avoidance_aggression, object* pl_objp, object* ignore_objp)
77417741
{
77427742
ship* shipp = &Ships[pl_objp->instance];
77437743
ship_info* sip = &Ship_info[shipp->ship_info_index];
@@ -7748,7 +7748,7 @@ bool better_collision_avoidance_triggered(bool flag_to_check, float avoidance_ag
77487748
collide_vec *= radius_contribution;
77497749

77507750
collide_vec += pl_objp->pos;
7751-
return (maybe_avoid_big_ship(pl_objp, en_objp, &Ai_info[shipp->ai_index], &collide_vec, 0.f, 0.1f));
7751+
return (maybe_avoid_big_ship(pl_objp, ignore_objp, &Ai_info[shipp->ai_index], &collide_vec, 0.f, 0.1f));
77527752
}
77537753
return false;
77547754
}
@@ -8978,7 +8978,8 @@ void ai_chase()
89788978
if (better_collision_avoidance_triggered(
89798979
The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoidance],
89808980
The_mission.ai_profile->better_collision_avoid_aggression_combat,
8981-
Pl_objp, En_objp)) {
8981+
Pl_objp,
8982+
The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoid_includes_target] ? nullptr : En_objp)) {
89828983
return;
89838984
}
89848985

@@ -10896,7 +10897,8 @@ void ai_guard()
1089610897
if (better_collision_avoidance_triggered(
1089710898
The_mission.ai_profile->flags[AI::Profile_Flags::Better_guard_collision_avoidance],
1089810899
The_mission.ai_profile->better_collision_avoid_aggression_guard,
10899-
Pl_objp, En_objp)) {
10900+
Pl_objp,
10901+
En_objp)) {
1090010902
return;
1090110903
}
1090210904

@@ -14190,7 +14192,8 @@ void ai_execute_behavior(ai_info *aip)
1419014192
if (!(better_collision_avoidance_triggered(
1419114193
The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoidance],
1419214194
The_mission.ai_profile->better_collision_avoid_aggression_combat,
14193-
Pl_objp, En_objp))) {
14195+
Pl_objp,
14196+
The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoid_includes_target] ? nullptr : En_objp))) {
1419414197
ai_big_strafe(); // strafe a big ship
1419514198
}
1419614199
} else {

0 commit comments

Comments
 (0)