public static Func <AttackModifier> GetCommonModifierFactor(string factorId) { switch (factorId) { case "direction": return(() => { AttackDirection dir = Combat.HitLocation.GetAttackDirection(AttackPos, Target); if (Target is Mech mech) { if (mech.IsProne) { return new AttackModifier(); // Prone is another modifier } if (dir == AttackDirection.FromFront) { return new AttackModifier("FRONT ATTACK", Settings.ToHitMechFromFront); } if (dir == AttackDirection.FromLeft || dir == AttackDirection.FromRight) { return new AttackModifier("SIDE ATTACK", Settings.ToHitMechFromSide); } if (dir == AttackDirection.FromBack) { return new AttackModifier("REAR ATTACK", Settings.ToHitMechFromRear); } } else if (Target is Vehicle vehicle) { if (dir == AttackDirection.FromFront) { return new AttackModifier("FRONT ATTACK", Settings.ToHitVehicleFromFront); } if (dir == AttackDirection.FromLeft || dir == AttackDirection.FromRight) { return new AttackModifier("SIDE ATTACK", Settings.ToHitVehicleFromSide); } if (dir == AttackDirection.FromBack) { return new AttackModifier("REAR ATTACK", Settings.ToHitVehicleFromRear); } } return new AttackModifier(); }); case "inspired": return(() => new AttackModifier("INSPIRED", Math.Min(0f, Hit.GetAttackerAccuracyModifier(Attacker)))); case "jumped": return(() => new AttackModifier("JUMPED", RollModifier.GetJumpedModifier(Attacker))); case "selfheat": return(() => new AttackModifier("OVERHEAT", Hit.GetHeatModifier(Attacker))); case "selfstoodup": return(() => new AttackModifier("STOOD UP", Hit.GetStoodUpModifier(Attacker))); case "selfterrain": return(() => new AttackModifier("TERRAIN", Hit.GetSelfTerrainModifier(AttackPos, false))); case "selfterrainmelee": return(() => new AttackModifier("TERRAIN", Hit.GetSelfTerrainModifier(AttackPos, true))); case "sensorimpaired": return(() => new AttackModifier("SENSOR IMPAIRED", Math.Max(0f, Hit.GetAttackerAccuracyModifier(Attacker)))); case "sprint": return(() => new AttackModifier("SPRINTED", Hit.GetSelfSprintedModifier(Attacker))); case "targeteffect": return(() => new AttackModifier("TARGET EFFECTS", Hit.GetEnemyEffectModifier(Target))); case "targetsize": return(() => new AttackModifier("TARGET SIZE", Hit.GetTargetSizeModifier(Target))); case "targetterrain": return(() => new AttackModifier("TARGET TERRAIN", Hit.GetTargetTerrainModifier(Target, TargetPos, false))); case "targetterrainmelee": return(() => new AttackModifier("TARGET TERRAIN", Hit.GetTargetTerrainModifier(Target, TargetPos, true))); case "walked": return(() => new AttackModifier("MOVED", Hit.GetSelfSpeedModifier(Attacker))); case "weaponaccuracy": return(() => new AttackModifier("WEAPON ACCURACY", Hit.GetWeaponAccuracyModifier(Attacker, AttackWeapon))); } return(null); }