Skip to content

Commit 5ba92d4

Browse files
committed
- One-shot weapons will only fire if the chance to hit is > mod.config.weights.OneShotMinimumToHit
1 parent 3e32d02 commit 5ba92d4

3 files changed

Lines changed: 49 additions & 1 deletion

File tree

CleverGirl/CleverGirl/Helper/AEHelper.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,51 @@ public static bool MeleeDamageOutweighsRisk(Mech attacker, ICombatant target)
284284
return meleeDamageRatio > meleeDamageRatioCap;
285285
}
286286

287+
// Make multiple sets of ranged weapons, to allow for selection of the optimal set based on range
288+
public static List<List<CondensedWeapon>> MakeRangedWeaponSets(List<CondensedWeapon> potentialWeapons,
289+
ICombatant target, Vector3 attackPosition)
290+
{
291+
// First, filter weapons that won't fire
292+
List<CondensedWeapon> weaponsToFire = new List<CondensedWeapon>();
293+
float distance = (attackPosition - target.CurrentPosition).magnitude;
294+
foreach (CondensedWeapon cWeap in potentialWeapons)
295+
{
296+
Weapon wep = cWeap.First;
297+
if (distance > wep.MaxRange)
298+
{
299+
Mod.Log.Debug?.Write($" Skipping {wep.UIName} in ranged set as distance: {distance} > maxRange: {wep.MaxRange}");
300+
continue;
301+
}
302+
if (distance < wep.MinRange)
303+
{
304+
Mod.Log.Debug?.Write($" Skipping {wep.UIName} in ranged set as distance: {distance} < minRange: {wep.MinRange}");
305+
continue;
306+
}
307+
308+
// Check one-shot weapons for accuracy
309+
if (wep.weaponDef.StartingAmmoCapacity == wep.weaponDef.ShotsWhenFired)
310+
{
311+
float toHitFromPosition = cWeap.First.GetToHitFromPosition(target, 1, attackPosition, target.CurrentPosition, true, true, false);
312+
if (toHitFromPosition < Mod.Config.Weights.OneShotMinimumToHit)
313+
{
314+
Mod.Log.Debug?.Write($" Skipping {wep.UIName} in ranged set as toHitFromPosition: {toHitFromPosition} is below OneShotMinimumToHit: {Mod.Config.Weights.OneShotMinimumToHit}");
315+
continue;
316+
}
317+
}
318+
319+
if (!wep.CanFire)
320+
{
321+
Mod.Log.Debug?.Write($" Skipping {wep.UIName} in ranged set it cannot fire (out of ammo, damaged, etc)");
322+
continue;
323+
}
324+
325+
weaponsToFire.Add(cWeap);
326+
}
327+
328+
return MakeWeaponSets(weaponsToFire);
329+
330+
}
331+
287332
// === CLONE METHODS BELOW ==
288333

289334
// CLONE OF HBS CODE - LIKELY BRITTLE!

CleverGirl/CleverGirl/Helper/AOHelper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public static float MakeAttackOrderForTarget(AbstractActor attackerAA, ICombatan
5151
// Mod.Log.Debug?.Write($"Checking non-evasive target.");
5252
// weaponSetsByAttackType[0] = AEHelper.MakeWeaponSets(candidateWeapons.RangedWeapons);
5353
//}
54-
weaponSetsByAttackType[0] = AEHelper.MakeWeaponSets(candidateWeapons.RangedWeapons);
54+
55+
weaponSetsByAttackType[0] = AEHelper.MakeRangedWeaponSets(candidateWeapons.RangedWeapons, target, attackerAA.CurrentPosition);
5556

5657
// Evaluate melee attacks
5758
string cannotEngageInMeleeMsg = "";

CleverGirl/CleverGirl/ModConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public class DecisionWeights {
1313
public float FriendlyDamageMulti = 2.0f;
1414

1515
public float PunchbotDamageMulti = 2.0f;
16+
17+
public float OneShotMinimumToHit = 0.4f;
1618
}
1719
public DecisionWeights Weights = new DecisionWeights();
1820

0 commit comments

Comments
 (0)