@@ -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