diff --git a/code/ai/ai_profiles.cpp b/code/ai/ai_profiles.cpp index d65ba45ecfc..9210d056774 100644 --- a/code/ai/ai_profiles.cpp +++ b/code/ai/ai_profiles.cpp @@ -693,6 +693,14 @@ void parse_ai_profiles_tbl(const char *filename) stuff_float(&profile->strafe_max_unhit_time); } + if (optional_string("$strafe retreat collide time:")) { + stuff_float(&profile->strafe_retreat_collide_time); + } + + if (optional_string("$strafe retreat collide distance:")) { + stuff_float(&profile->strafe_retreat_collide_distance); + } + if (optional_string("$guard uses big-orbit for target radius above:")) { stuff_float(&profile->guard_big_orbit_above_target_radius); } @@ -858,6 +866,8 @@ void ai_profile_t::reset() standard_strafe_when_below_speed = 3.0f; strafe_retreat_box_dist = 300.0f; strafe_max_unhit_time = 20.0f; + strafe_retreat_collide_time = 2.0f; + strafe_retreat_collide_distance = 100.0f; guard_big_orbit_above_target_radius = 500.0f; guard_big_orbit_max_speed_percent = 1.0f; diff --git a/code/ai/ai_profiles.h b/code/ai/ai_profiles.h index 9f03bce4782..ecd6b22fe69 100644 --- a/code/ai/ai_profiles.h +++ b/code/ai/ai_profiles.h @@ -143,6 +143,8 @@ class ai_profile_t { float standard_strafe_when_below_speed; // Speed at which standard strafing large ships is possibly triggered float strafe_retreat_box_dist; // Distance beyond the bounding box to retreat to strafing point float strafe_max_unhit_time; // Maximum amount of time to stay in strafe mode if not hit + float strafe_retreat_collide_time; // When anticipated collision time is less than this, begin retreat from strafe + float strafe_retreat_collide_distance; // When perpendicular distance to *surface* is less than this, begin retreat from strafe // AI guard options --wookieejedi float guard_big_orbit_above_target_radius; // Radius of guardee that triggers ai_big_guard() diff --git a/code/ai/aibig.cpp b/code/ai/aibig.cpp index c532a3074ae..344e6d28cc5 100644 --- a/code/ai/aibig.cpp +++ b/code/ai/aibig.cpp @@ -40,9 +40,6 @@ // AI BIG MAGIC NUMBERS // Select strafing options are now exposed to modders --wookieejedi -#define STRAFE_RETREAT_COLLIDE_TIME 2.0 // when anticipated collision time is less than this, begin retreat -#define STRAFE_RETREAT_COLLIDE_DIST 100 // when perpendicular distance to *surface* is less than this, begin retreat - #define EVADE_BOX_BASE_DISTANCE 300 // standard distance to end evade submode #define EVADE_BOX_MIN_DISTANCE 200 // minimun distance to end evade submode, after long time @@ -1452,8 +1449,8 @@ static bool ai_big_strafe_maybe_retreat(const vec3d *target_pos) collide_time = false; collide_distance = false; } else { - collide_time = (dist_to_target / Pl_objp->phys_info.speed) < STRAFE_RETREAT_COLLIDE_TIME; - collide_distance = dist_to_target < (STRAFE_RETREAT_COLLIDE_DIST + speed_to_dist_penalty); + collide_time = (dist_to_target / Pl_objp->phys_info.speed) < (The_mission.ai_profile->strafe_retreat_collide_time); + collide_distance = dist_to_target < ((The_mission.ai_profile->strafe_retreat_collide_distance) + speed_to_dist_penalty); } } else { float dist_normal_to_target; @@ -1463,8 +1460,8 @@ static bool ai_big_strafe_maybe_retreat(const vec3d *target_pos) } else { dist_normal_to_target = 0.2f * dist_to_target; } - collide_time = (dist_normal_to_target / Pl_objp->phys_info.speed) < STRAFE_RETREAT_COLLIDE_TIME; - collide_distance = dist_normal_to_target < (STRAFE_RETREAT_COLLIDE_DIST + speed_to_dist_penalty); + collide_time = (dist_normal_to_target / Pl_objp->phys_info.speed) < (The_mission.ai_profile->strafe_retreat_collide_time); + collide_distance = dist_normal_to_target < ((The_mission.ai_profile->strafe_retreat_collide_distance) + speed_to_dist_penalty); } //if ((dot_to_enemy > 1.0f - 0.1f * En_objp->radius/(dist_to_enemy + 1.0f)) && (Pl_objp->phys_info.speed > dist_to_enemy/5.0f)) diff --git a/code/ai/aicode.cpp b/code/ai/aicode.cpp index 9136144dae1..f6ccbe0b7a1 100644 --- a/code/ai/aicode.cpp +++ b/code/ai/aicode.cpp @@ -7726,8 +7726,8 @@ void mabs_pick_goal_point(object *objp, object *big_objp, vec3d *collision_point } } - Assert(i != -1); - if (i != -1) { + Assert(min_index != -1); + if (min_index != -1) { *avoid_pos = goals[min_index].pos; return; } @@ -7801,7 +7801,7 @@ bool better_collision_avoidance_triggered(bool flag_to_check, float avoidance_ag collide_vec *= radius_contribution; collide_vec += pl_objp->pos; - return (maybe_avoid_big_ship(pl_objp, ignore_objp, &Ai_info[shipp->ai_index], &collide_vec, 0.f, 0.1f)); + return (maybe_avoid_big_ship(pl_objp, ignore_objp, &Ai_info[shipp->ai_index], &collide_vec, avoidance_aggression, 0.1f)); } return false; }