Skip to content

Commit 42af661

Browse files
committed
minor tweaks
1 parent 140ef80 commit 42af661

6 files changed

Lines changed: 41 additions & 40 deletions

File tree

code/ai/aicode.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10545,11 +10545,12 @@ static object *ai_find_nearby_mine_threat(object *from_objp, object *against_obj
1054510545
float dist_against = vm_vec_dist(&mine_objp->pos, &against_objp->pos);
1054610546

1054710547
// Mine must be within its own targetable range of the threatened ship
10548-
if (wip->mine_targetable_range >= 0.0f && dist_against > wip->mine_targetable_range)
10548+
if (dist_against > wip->mine_targetable_range)
1054910549
continue;
1055010550

10551-
// Imminent gate: only consider mines about to detonate on the threatened ship
10552-
if (imminent_only && wip->proximity_radius > 0.0f && dist_against > wip->proximity_radius * 1.5f)
10551+
// Imminent gate: only consider mines about to detonate on the threatened ship.
10552+
// proximity_radius is always > 0 for mines (parser enforces).
10553+
if (imminent_only && dist_against > wip->proximity_radius * 1.5f)
1055310554
continue;
1055410555

1055510556
float dist_from = (from_objp == against_objp) ? dist_against : vm_vec_dist(&mine_objp->pos, &from_objp->pos);
@@ -15368,10 +15369,8 @@ void ai_frame(int objnum)
1536815369
&& Ship_types[Ship_info[shipp->ship_info_index].class_type].flags[Ship::Type_Info_Flags::AI_auto_attacks]) {
1536915370
object *imminent_mine = ai_find_nearby_mine_threat(Pl_objp, nullptr, true);
1537015371
if (imminent_mine != nullptr && (target_objnum < 0 || &Objects[target_objnum] != imminent_mine)) {
15371-
int new_target = OBJ_INDEX(imminent_mine);
15372-
if (aip->target_objnum != new_target)
15373-
aip->aspect_locked_time = 0.0f;
15374-
target_objnum = set_target_objnum(aip, new_target);
15372+
aip->aspect_locked_time = 0.0f;
15373+
target_objnum = set_target_objnum(aip, OBJ_INDEX(imminent_mine));
1537515374
}
1537615375
}
1537715376

code/ai/aiturret.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ int valid_turret_enemy(object *objp, object *turret_parent)
480480
}
481481

482482
// Mines are only targetable within their configured detection range
483-
if (wip->is_mine() && wip->mine_targetable_range >= 0.0f) {
483+
if (wip->is_mine()) {
484484
if (vm_vec_dist(&objp->pos, &turret_parent->pos) > wip->mine_targetable_range)
485485
return 0;
486486
}

code/hud/hudtarget.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -478,15 +478,14 @@ int hud_target_invalid_awacs(object *objp)
478478
return 0;
479479
}
480480

481-
// Returns true if the weapon object can currently be targeted by the player.
481+
// Returns true if the weapon object can currently be targeted from source_objp.
482482
// For mines, uses range-based detection (mine_targetable_range). For other weapons, uses flags.
483-
static bool weapon_is_player_targetable(object *objp)
483+
static bool weapon_is_targetable_from(object *source_objp, object *objp)
484484
{
485485
weapon_info *wip = &Weapon_info[Weapons[objp->instance].weapon_info_index];
486486
if (wip->is_mine()) {
487-
if (wip->mine_targetable_range < 0.0f) return true; // infinite range
488-
Assertion(Player_obj != nullptr, "weapon_is_player_targetable called with no Player_obj");
489-
return vm_vec_dist(&Player_obj->pos, &objp->pos) <= wip->mine_targetable_range;
487+
Assertion(source_objp != nullptr, "weapon_is_targetable_from called with null source_objp");
488+
return vm_vec_dist(&source_objp->pos, &objp->pos) <= wip->mine_targetable_range;
490489
}
491490
return wip->wi_flags[Weapon::Info_Flags::Can_be_targeted] || wip->wi_flags[Weapon::Info_Flags::Bomb];
492491
}
@@ -1200,7 +1199,7 @@ void hud_target_common(int team_mask, int next_flag)
12001199
continue;
12011200

12021201
if (A->type == OBJ_WEAPON) {
1203-
if (!weapon_is_player_targetable(A))
1202+
if (!weapon_is_targetable_from(Player_obj, A))
12041203
continue;
12051204

12061205
if (Weapons[A->instance].lssm_stage == 3)
@@ -1517,7 +1516,7 @@ void hud_target_hostile_bomb_or_bomber(object* source_obj, int next_flag, bool t
15171516
weapon* wp = &Weapons[A->instance];
15181517

15191518
// only allow targeting of bombs/targetable weapons/mines in range
1520-
if (!weapon_is_player_targetable(A))
1519+
if (!weapon_is_targetable_from(source_obj, A))
15211520
continue;
15221521

15231522
if (wp->lssm_stage == 3)
@@ -2509,7 +2508,7 @@ void hud_target_in_reticle_new()
25092508
}
25102509

25112510
if ( A->type == OBJ_WEAPON ) {
2512-
if (!weapon_is_player_targetable(A))
2511+
if (!weapon_is_targetable_from(Player_obj, A))
25132512
continue;
25142513
if (Weapons[A->instance].lssm_stage==3){
25152514
continue;
@@ -2615,7 +2614,7 @@ void hud_target_in_reticle_old()
26152614
}
26162615

26172616
if ( A->type == OBJ_WEAPON ) {
2618-
if (!weapon_is_player_targetable(A))
2617+
if (!weapon_is_targetable_from(Player_obj, A))
26192618
continue;
26202619

26212620
if (Weapons[A->instance].lssm_stage==3){
@@ -4193,7 +4192,7 @@ void HudGaugeLeadIndicator::renderLeadCurrentTarget(bool config)
41934192

41944193
// only allow bombs to have lead indicator displayed
41954194
if ( targetp->type == OBJ_WEAPON ) {
4196-
if (!weapon_is_player_targetable(targetp))
4195+
if (!weapon_is_targetable_from(Player_obj, targetp))
41974196
return;
41984197
}
41994198

@@ -4365,7 +4364,7 @@ void HudGaugeLeadIndicator::renderLeadQuick(vec3d *target_world_pos, object *tar
43654364

43664365
// only allow bombs to have lead indicator displayed
43674366
if ( targetp->type == OBJ_WEAPON ) {
4368-
if (!weapon_is_player_targetable(targetp))
4367+
if (!weapon_is_targetable_from(Player_obj, targetp))
43694368
return;
43704369
}
43714370

code/radar/radarsetup.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ void radar_plot_object( object *objp )
301301
if (objp->type == OBJ_WEAPON) {
302302
weapon_info *wip = &Weapon_info[Weapons[objp->instance].weapon_info_index];
303303
if (wip->is_mine()) {
304-
mine_in_targetable_range = (wip->mine_targetable_range < 0.0f || dist <= wip->mine_targetable_range);
305-
bool in_sensors = (wip->mine_sensors_range < 0.0f || dist <= wip->mine_sensors_range);
304+
mine_in_targetable_range = (dist <= wip->mine_targetable_range);
305+
bool in_sensors = (dist <= wip->mine_sensors_range);
306306
if (!mine_in_targetable_range && !in_sensors)
307307
return; // beyond all detection ranges
308308
}

code/weapon/weapon.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,8 +467,8 @@ struct weapon_info
467467
uint8_t proximity_relation_mask; // bitmask of Weapon::Proximity::Relation_Flags; 0 = any relation
468468
float proximity_detonate_chance; // probability [0,1] that a proximity contact actually triggers detonation; default 1.0
469469
float proximity_stealth_multiplier; // scale factor applied to proximity_radius for stealth ships; 0.0 = undetectable, 1.0 = normal range; default 1.0
470-
float mine_sensors_range; // range at which mine shows as a distorted blip; -1.0f = always, 0.0f = never
471-
float mine_targetable_range; // range at which mine is fully targetable; -1.0f = always, 0.0f = never
470+
float mine_sensors_range; // range at which mine shows as a distorted blip; 0.0f = never. Always finite for mines after parsing.
471+
float mine_targetable_range; // range at which mine is fully targetable; 0.0f = never. Always finite for mines after parsing.
472472
float mine_chase_duration; // seconds mine chases the triggering ship after proximity contact; 0.0 = detonate immediately (default)
473473
bool mine_detonates_on_chase_timeout; // if true, detonate when chase timer expires; if false, give up and return to stationary; default true
474474
float mine_chase_cooldown; // seconds after a chase ends before proximity scanning re-enables; default 5.0

code/weapon/weapons.cpp

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,12 +1443,27 @@ int parse_weapon(int subtype, bool replace, const char *filename)
14431443

14441444
if (optional_string("+Sensors Range:")) {
14451445
stuff_float(&wip->mine_sensors_range);
1446+
if (wip->mine_sensors_range < 0.0f) {
1447+
wip->mine_sensors_range = 0.0f;
1448+
Warning(LOCATION, "Mine weapon '%s': +Sensors Range cannot be negative. Setting to 0.\n", wip->name);
1449+
}
14461450
}
14471451

14481452
if (optional_string("+Targetable Range:")) {
14491453
stuff_float(&wip->mine_targetable_range);
1454+
if (wip->mine_targetable_range < 0.0f) {
1455+
wip->mine_targetable_range = 0.0f;
1456+
Warning(LOCATION, "Mine weapon '%s': +Targetable Range cannot be negative. Setting to 0.\n", wip->name);
1457+
}
14501458
}
14511459

1460+
// Mines must have finite detection ranges. Defaults scale off proximity_radius so a tiny
1461+
// proximity radius doesn't accidentally produce a galaxy-spanning blip.
1462+
if (wip->mine_sensors_range < 0.0f)
1463+
wip->mine_sensors_range = wip->proximity_radius * 60.0f;
1464+
if (wip->mine_targetable_range < 0.0f)
1465+
wip->mine_targetable_range = wip->proximity_radius * 30.0f;
1466+
14521467
if (optional_string("+Hitpoints:")) {
14531468
stuff_int(&wip->weapon_hitpoints);
14541469
} else if (first_time) {
@@ -1481,15 +1496,9 @@ int parse_weapon(int subtype, bool replace, const char *filename)
14811496
}
14821497

14831498
// Warn if targetable range makes sensors range unreachable
1484-
bool targetable_infinite = (wip->mine_targetable_range < 0.0f);
1485-
bool sensors_infinite = (wip->mine_sensors_range < 0.0f);
1486-
if (!sensors_infinite) {
1487-
if (targetable_infinite) {
1488-
Warning(LOCATION, "Mine weapon '%s': +Targetable Range is infinite but +Sensors Range is finite. The distorted blip state will never occur.\n", wip->name);
1489-
} else if (wip->mine_targetable_range >= wip->mine_sensors_range) {
1490-
Warning(LOCATION, "Mine weapon '%s': +Targetable Range (%.1f) >= +Sensors Range (%.1f). The distorted blip state will never occur.\n",
1491-
wip->name, wip->mine_targetable_range, wip->mine_sensors_range);
1492-
}
1499+
if (wip->mine_targetable_range >= wip->mine_sensors_range) {
1500+
Warning(LOCATION, "Mine weapon '%s': +Targetable Range (%.1f) >= +Sensors Range (%.1f). The distorted blip state will never occur.\n",
1501+
wip->name, wip->mine_targetable_range, wip->mine_sensors_range);
14931502
}
14941503
}
14951504

@@ -5120,10 +5129,7 @@ void weapon_post_ship_init()
51205129

51215130
for (const auto& entry : Pending_proximity_type_names) {
51225131
const int wi_index = entry.first;
5123-
if (wi_index < 0 || wi_index >= num_weapons) {
5124-
Warning(LOCATION, "Proximity types: stale weapon_info index %d. Entries dropped.\n", wi_index);
5125-
continue;
5126-
}
5132+
Assertion(wi_index >= 0 && wi_index < num_weapons, "Pending proximity type entry has out-of-range weapon_info index %d (num_weapons=%d).", wi_index, num_weapons);
51275133
weapon_info& wip = Weapon_info[wi_index];
51285134
for (const SCP_string& type_name : entry.second) {
51295135
int idx = ship_type_name_lookup(type_name.c_str());
@@ -5136,10 +5142,7 @@ void weapon_post_ship_init()
51365142

51375143
for (const auto& entry : Pending_proximity_class_names) {
51385144
const int wi_index = entry.first;
5139-
if (wi_index < 0 || wi_index >= num_weapons) {
5140-
Warning(LOCATION, "Proximity classes: stale weapon_info index %d. Entries dropped.\n", wi_index);
5141-
continue;
5142-
}
5145+
Assertion(wi_index >= 0 && wi_index < num_weapons, "Pending proximity class entry has out-of-range weapon_info index %d (num_weapons=%d).", wi_index, num_weapons);
51435146
weapon_info& wip = Weapon_info[wi_index];
51445147
for (const SCP_string& class_name : entry.second) {
51455148
int idx = ship_info_lookup(class_name.c_str());

0 commit comments

Comments
 (0)