Skip to content

Commit d3db542

Browse files
authored
Expand collision avoidance to strafing (#6789)
Currently, the `$better combat collision avoidance for fightercraft:` flag only checks for possible big ship collisions when in normal chase mode (`AIM_CHASE`), but strafing a big ship is a separate AI mode (`AIM_STRAFE`). Per discussion with Asteroth, strafe attacking should also check for better collision avoidance, as the modder likely would expect that to fall under this AI flag. Also took the chance to make the collision avoidance check into a function to improve maintenance and usability.
1 parent 74beab5 commit d3db542

2 files changed

Lines changed: 40 additions & 23 deletions

File tree

code/ai/aibig.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ void ai_big_chase_ct()
864864
extern bool ai_select_secondary_weapon(object *objp, ship_weapon *swp, int priority1 = -1, int priority2 = -1);
865865
extern float set_secondary_fire_delay(ai_info *aip, ship *shipp, weapon_info *swip, bool burst);
866866
extern bool ai_choose_secondary_weapon(object *objp, ai_info *aip, object *en_objp);
867-
extern int maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d *goal_point, float delta_time, float time_scale = 1.f);
867+
extern bool maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d *goal_point, float delta_time, float time_scale = 1.f);
868868

869869
extern void maybe_cheat_fire_synaptic(object *objp);
870870

code/ai/aicode.cpp

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7678,7 +7678,7 @@ void mabs_pick_goal_point(object *objp, object *big_objp, vec3d *collision_point
76787678
/**
76797679
* Return true if a large ship is being ignored.
76807680
*/
7681-
int maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d *goal_point, float delta_time, float time_scale = 1.f)
7681+
bool maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d *goal_point, float delta_time, float time_scale = 1.f)
76827682
{
76837683
if (timestamp_elapsed(aip->avoid_check_timestamp)) {
76847684
float distance;
@@ -7713,10 +7713,30 @@ int maybe_avoid_big_ship(object *objp, object *ignore_objp, ai_info *aip, vec3d
77137713
if (ai_willing_to_afterburn_hard(aip) && dot > 0.99f)
77147714
ai_afterburn_hard(Pl_objp, aip);
77157715

7716-
return 1;
7716+
return true;
77177717
}
77187718

7719-
return 0;
7719+
return false;
7720+
}
7721+
7722+
/**
7723+
* Return true if small ship and it will likely collide with large ship
7724+
* developed by Asteroth
7725+
*/
7726+
bool better_collision_avoidance_triggered(bool flag_to_check, float avoidance_aggression, object* pl_objp, object* en_objp)
7727+
{
7728+
ship* shipp = &Ships[pl_objp->instance];
7729+
ship_info* sip = &Ship_info[shipp->ship_info_index];
7730+
7731+
if ((flag_to_check) && sip->is_small_ship()) {
7732+
vec3d collide_vec = pl_objp->phys_info.vel * (avoidance_aggression / (PI2 / sip->srotation_time));
7733+
float radius_contribution = (pl_objp->phys_info.speed + pl_objp->radius) / pl_objp->phys_info.speed;
7734+
collide_vec *= radius_contribution;
7735+
7736+
collide_vec += pl_objp->pos;
7737+
return (maybe_avoid_big_ship(pl_objp, en_objp, &Ai_info[shipp->ai_index], &collide_vec, 0.f, 0.1f));
7738+
}
7739+
return false;
77207740
}
77217741

77227742
/**
@@ -8941,14 +8961,11 @@ void ai_chase()
89418961
return;
89428962
}
89438963

8944-
if ((The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoidance]) && sip->is_small_ship()) {
8945-
vec3d collide_vec = Pl_objp->phys_info.vel * (The_mission.ai_profile->better_collision_avoid_aggression_combat / (PI2 / sip->srotation_time));
8946-
float radius_contribution = (Pl_objp->phys_info.speed + Pl_objp->radius) / Pl_objp->phys_info.speed;
8947-
collide_vec *= radius_contribution;
8948-
8949-
collide_vec += Pl_objp->pos;
8950-
if (maybe_avoid_big_ship(Pl_objp, En_objp, aip, &collide_vec, 0.f, 0.1f))
8951-
return;
8964+
if (better_collision_avoidance_triggered(
8965+
The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoidance],
8966+
The_mission.ai_profile->better_collision_avoid_aggression_combat,
8967+
Pl_objp, En_objp)) {
8968+
return;
89528969
}
89538970

89548971
if (enemy_sip_flags.any_set()) {
@@ -10862,16 +10879,11 @@ void ai_guard()
1086210879
return;
1086310880
}
1086410881

10865-
ship_info* sip = &Ship_info[shipp->ship_info_index];
10866-
if ((The_mission.ai_profile->flags[AI::Profile_Flags::Better_guard_collision_avoidance]) && sip->is_small_ship()) {
10867-
10868-
vec3d collide_vec = Pl_objp->phys_info.vel * (The_mission.ai_profile->better_collision_avoid_aggression_guard / (PI2 / sip->srotation_time));
10869-
float radius_contribution = (Pl_objp->phys_info.speed + Pl_objp->radius) / Pl_objp->phys_info.speed;
10870-
collide_vec *= radius_contribution;
10871-
10872-
collide_vec += Pl_objp->pos;
10873-
if (maybe_avoid_big_ship(Pl_objp, En_objp, aip, &collide_vec, 0.f, 0.1f))
10874-
return;
10882+
if (better_collision_avoidance_triggered(
10883+
The_mission.ai_profile->flags[AI::Profile_Flags::Better_guard_collision_avoidance],
10884+
The_mission.ai_profile->better_collision_avoid_aggression_guard,
10885+
Pl_objp, En_objp)) {
10886+
return;
1087510887
}
1087610888

1087710889
// handler for guard object with BIG radius
@@ -14153,7 +14165,12 @@ void ai_execute_behavior(ai_info *aip)
1415314165
case AIM_STRAFE:
1415414166
if (En_objp) {
1415514167
Assert(En_objp->type == OBJ_SHIP);
14156-
ai_big_strafe(); // strafe a big ship
14168+
if (!(better_collision_avoidance_triggered(
14169+
The_mission.ai_profile->flags[AI::Profile_Flags::Better_combat_collision_avoidance],
14170+
The_mission.ai_profile->better_collision_avoid_aggression_combat,
14171+
Pl_objp, En_objp))) {
14172+
ai_big_strafe(); // strafe a big ship
14173+
}
1415714174
} else {
1415814175
aip->mode = AIM_NONE;
1415914176
}

0 commit comments

Comments
 (0)