Skip to content

Commit 58ac0df

Browse files
authored
Merge pull request #4043 from Goober5000/fix_keep_safe_distance
fix the keep-safe-distance AI mode
2 parents 97eb72b + 6496059 commit 58ac0df

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

code/ai/ai_flags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ namespace AI {
143143
Fighterbay_arrivals_use_carrier_orient,
144144
Fighterbay_departures_use_carrier_orient,
145145
Prevent_negative_turret_ammo,
146+
Fix_keep_safe_distance,
146147

147148
NUM_VALUES
148149
};

code/ai/ai_profiles.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,8 @@ void parse_ai_profiles_tbl(const char *filename)
596596

597597
set_flag(profile, "$prevent negative turret ammo:", AI::Profile_Flags::Prevent_negative_turret_ammo);
598598

599+
set_flag(profile, "$fix keep-safe-distance:", AI::Profile_Flags::Fix_keep_safe_distance);
600+
599601

600602
// if we've been through once already and are at the same place, force a move
601603
if (saved_Mp && (saved_Mp == Mp))
@@ -762,5 +764,6 @@ void ai_profile_t::reset()
762764
if (mod_supports_version(22, 0, 0)) {
763765
flags.set(AI::Profile_Flags::Fighterbay_arrivals_use_carrier_orient);
764766
flags.set(AI::Profile_Flags::Prevent_negative_turret_ammo);
767+
flags.set(AI::Profile_Flags::Fix_keep_safe_distance);
765768
}
766769
}

code/ai/aicode.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4229,15 +4229,13 @@ int get_enemy_team_range(object *my_objp, float range, int enemy_team_mask, vec3
42294229
if (count == 0) {
42304230
*min_vec = objp->pos;
42314231
*max_vec = objp->pos;
4232-
count++;
4233-
}
4234-
else {
4232+
} else {
42354233
update_min_max(objp->pos.xyz.x, &min_vec->xyz.x, &max_vec->xyz.x);
42364234
update_min_max(objp->pos.xyz.y, &min_vec->xyz.y, &max_vec->xyz.y);
42374235
update_min_max(objp->pos.xyz.z, &min_vec->xyz.z, &max_vec->xyz.z);
42384236
}
4237+
count++;
42394238
}
4240-
42414239
}
42424240
}
42434241

@@ -4253,7 +4251,7 @@ void ai_safety_pick_spot(object *objp)
42534251
int objnum;
42544252
int enemy_team_mask;
42554253
vec3d min_vec, max_vec;
4256-
vec3d vec_to_center, center;
4254+
vec3d fvec_from_center, center;
42574255
vec3d goal_pos;
42584256

42594257
objnum = OBJ_INDEX(objp);
@@ -4262,9 +4260,9 @@ void ai_safety_pick_spot(object *objp)
42624260

42634261
if (get_enemy_team_range(objp, 1000.0f, enemy_team_mask, &min_vec, &max_vec)) {
42644262
vm_vec_avg(&center, &min_vec, &max_vec);
4265-
vm_vec_normalized_dir(&vec_to_center, &center, &objp->pos);
4263+
vm_vec_normalized_dir(&fvec_from_center, &objp->pos, &center);
42664264

4267-
vm_vec_scale_add(&goal_pos, &center, &vec_to_center, 2000.0f);
4265+
vm_vec_scale_add(&goal_pos, &center, &fvec_from_center, 2000.0f);
42684266
} else
42694267
vm_vec_scale_add(&goal_pos, &objp->pos, &objp->orient.vec.fvec, 100.0f);
42704268

@@ -4293,6 +4291,11 @@ float ai_safety_goto_spot(object *objp)
42934291
} else
42944292
set_accel_for_target_speed(objp, sip->max_speed * dot_val * (dist/200.0f + 0.2f));
42954293

4294+
if (The_mission.ai_profile->flags[AI::Profile_Flags::Fix_keep_safe_distance]) {
4295+
// hey, let's try actually aiming toward our goal!
4296+
turn_towards_point(objp, &aip->goal_point, nullptr, 0.0f);
4297+
}
4298+
42964299
return dist;
42974300
}
42984301

0 commit comments

Comments
 (0)