From 12053fd7fbf64cce01ff028c67906d7721bfa283 Mon Sep 17 00:00:00 2001
From: OBilo <54061981+Keshash@users.noreply.github.com>
Date: Sun, 15 Feb 2026 22:49:38 +0200
Subject: [PATCH 1/2] Add shooting skill comparison to sway stat page
---
Defs/Stats/Stats_Weapons_Ranged.xml | 1 +
Languages/English/Keyed/Stats.xml | 1 +
.../StatWorkers/StatWorker_SwayFactor.cs | 41 +++++++++++++++++++
3 files changed, 43 insertions(+)
create mode 100644 Source/CombatExtended/CombatExtended/StatWorkers/StatWorker_SwayFactor.cs
diff --git a/Defs/Stats/Stats_Weapons_Ranged.xml b/Defs/Stats/Stats_Weapons_Ranged.xml
index 9b4c307a2a..b1d4d448de 100644
--- a/Defs/Stats/Stats_Weapons_Ranged.xml
+++ b/Defs/Stats/Stats_Weapons_Ranged.xml
@@ -98,6 +98,7 @@
FloatTwo
false
894
+ CombatExtended.StatWorker_SwayFactor
diff --git a/Languages/English/Keyed/Stats.xml b/Languages/English/Keyed/Stats.xml
index f609818007..d78fc9571a 100644
--- a/Languages/English/Keyed/Stats.xml
+++ b/Languages/English/Keyed/Stats.xml
@@ -11,5 +11,6 @@
Long range radio
Picks the lowest value of available
Picks the highest value of available
+ Baseline shooting skill needed to reduce {0} sway to {1} degrees of error:
\ No newline at end of file
diff --git a/Source/CombatExtended/CombatExtended/StatWorkers/StatWorker_SwayFactor.cs b/Source/CombatExtended/CombatExtended/StatWorkers/StatWorker_SwayFactor.cs
new file mode 100644
index 0000000000..f83c510c90
--- /dev/null
+++ b/Source/CombatExtended/CombatExtended/StatWorkers/StatWorker_SwayFactor.cs
@@ -0,0 +1,41 @@
+using System.Drawing;
+using System.Text;
+using Verse;
+using RimWorld;
+
+namespace CombatExtended;
+
+public class StatWorker_SwayFactor : StatWorker
+{
+ private float CalculateRequiredSkill(float swayFactor, float benchmarkSwayAmplitude, out float weaponHandling)
+ {
+ weaponHandling = -((benchmarkSwayAmplitude / swayFactor) - 4.5f);
+
+ float shootingPoints = StatDefOf.ShootingAccuracyPawn.postProcessCurve.EvaluateInverted(weaponHandling);
+
+ if (StatDefOf.ShootingAccuracyPawn.skillNeedOffsets.Find(x => x is SkillNeed_BaseBonus) is SkillNeed_BaseBonus baseStats)
+ {
+ return (shootingPoints - baseStats.baseValue) / baseStats.bonusPerLevel;
+ }
+
+ return 0f;
+ }
+
+
+ public override string GetExplanationFinalizePart(StatRequest req, ToStringNumberSense numberSense, float finalVal)
+ {
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.Append(base.GetExplanationFinalizePart(req, numberSense, finalVal));
+
+ float benchmarkSwayAmplitude = 3.0f;
+ float weaponHandling = 0f;
+ float skillLevel = CalculateRequiredSkill(finalVal, benchmarkSwayAmplitude, out weaponHandling);
+ stringBuilder.AppendLine("\n\n" + "CE_StatWorker_Sway_Explanation".Translate(finalVal.ToStringByStyle(ToStringStyle.FloatTwo),
+ benchmarkSwayAmplitude)
+ + "\n" + skillLevel.ToStringByStyle(ToStringStyle.FloatOne)
+ + " (" + weaponHandling.ToStringByStyle(ToStringStyle.PercentZero) + " " +
+ StatDefOf.ShootingAccuracyPawn.label + ")");
+
+ return stringBuilder.ToString().TrimEndNewlines();
+ }
+}
From eb463fbd0f4b159c8543809c514778b8d5283aef Mon Sep 17 00:00:00 2001
From: n7huntsman
Date: Tue, 17 Feb 2026 21:09:03 -0500
Subject: [PATCH 2/2] caps
---
Languages/English/Keyed/Stats.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Languages/English/Keyed/Stats.xml b/Languages/English/Keyed/Stats.xml
index d78fc9571a..0f56457b1f 100644
--- a/Languages/English/Keyed/Stats.xml
+++ b/Languages/English/Keyed/Stats.xml
@@ -11,6 +11,6 @@
Long range radio
Picks the lowest value of available
Picks the highest value of available
- Baseline shooting skill needed to reduce {0} sway to {1} degrees of error:
+ Baseline Shooting skill needed to reduce {0} sway to {1} degrees of error:
\ No newline at end of file