From 1e1245fc1a9bf938bcd66784892620126fed48c4 Mon Sep 17 00:00:00 2001
From: NathanHarbour <nathanharbour@gmail.com>
Date: Fri, 19 Feb 2021 20:51:04 -0600
Subject: [PATCH] Settings for overriding rescue chance and search radius

---
 About/Manifest.xml                            |   4 +---
 Assemblies/CM_No_Pawn_Left_Behind.dll         | Bin 9728 -> 11264 bytes
 Changelog.txt                                 |   9 +++++++
 .../English/Keyed/CM_No_Pawn_Left_Behind.xml  |   8 +++++++
 .../CM_No_Pawn_Left_Behind/JobGiver_Rescue.cs |  21 +++++++++++++----
 .../RescueModSettings.cs                      |  22 ++++++++++++++++++
 6 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/About/Manifest.xml b/About/Manifest.xml
index 70b49d4..02f0e7a 100644
--- a/About/Manifest.xml
+++ b/About/Manifest.xml
@@ -1,14 +1,12 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <Manifest>
   <identifier>CaptainMuscles.NoPawnLeftBehind</identifier>
-  <version>1.0.0</version>
+  <version>1.0.1</version>
   <dependencies>
 	<li>Ludeon.RimWorld</li>
-	<li>brrainz.harmony</li>
   </dependencies>
   <loadAfter>
     <li>Ludeon.RimWorld</li>
-	  <li>brrainz.harmony</li>
   </loadAfter>
   <showCrossPromotions>true</showCrossPromotions>
   <downloadUri>https://github.com/CaptainMuscles/CM_No_Pawn_Left_Behind/releases</downloadUri>
diff --git a/Assemblies/CM_No_Pawn_Left_Behind.dll b/Assemblies/CM_No_Pawn_Left_Behind.dll
index dd5a0d947308dfc8b32050fb8ad72c6153fb3273..187418e2fa1781d164523d735504d30dfd0bac6f 100644
GIT binary patch
delta 4170
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
V%`+?eAN|GO8FMCo$VM8?e*<MAzJmY&

delta 3086
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
WR}CM&@zqy(NApmq{?9xx$^JKYzvd1A

diff --git a/Changelog.txt b/Changelog.txt
index 3279a1e..1c02515 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,12 @@
+## [1.0.1] - 2021-02-19
+
+### Added
+- Settings for overriding rescue chance and search radius
+
+### Changed
+- Clamped market value factor for priority calculation between 200 and 3000
+
+
 ## [1.0.0] - 2021-02-19
 
 ### Added
diff --git a/Languages/English/Keyed/CM_No_Pawn_Left_Behind.xml b/Languages/English/Keyed/CM_No_Pawn_Left_Behind.xml
index f83c297..8c8f287 100644
--- a/Languages/English/Keyed/CM_No_Pawn_Left_Behind.xml
+++ b/Languages/English/Keyed/CM_No_Pawn_Left_Behind.xml
@@ -2,5 +2,13 @@
 <LanguageData>
 
   <CM_No_Pawn_Left_Behind_Settings_Log_Priorities_Label>Log priority calculations in dev mode</CM_No_Pawn_Left_Behind_Settings_Log_Priorities_Label>
+  
+  <CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Override_Label>Override rescue chance</CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Override_Label>
+  <CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Override_Description>When enabled, will override rescue chance for all situations</CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Override_Description>
+  <CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Label>Rescue chance</CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Label>
+  
+  <CM_No_Pawn_Left_Behind_Settings_Search_Radius_Override_Label>Override rescue search radius</CM_No_Pawn_Left_Behind_Settings_Search_Radius_Override_Label>
+  <CM_No_Pawn_Left_Behind_Settings_Search_Radius_Override_Description>When enabled, will override search radius for all situations</CM_No_Pawn_Left_Behind_Settings_Search_Radius_Override_Description>
+  <CM_No_Pawn_Left_Behind_Settings_Search_Radius_Label>Rescue search radius</CM_No_Pawn_Left_Behind_Settings_Search_Radius_Label>
 
 </LanguageData>
\ No newline at end of file
diff --git a/Source/CM_No_Pawn_Left_Behind/JobGiver_Rescue.cs b/Source/CM_No_Pawn_Left_Behind/JobGiver_Rescue.cs
index e4c4485..d2d96ff 100644
--- a/Source/CM_No_Pawn_Left_Behind/JobGiver_Rescue.cs
+++ b/Source/CM_No_Pawn_Left_Behind/JobGiver_Rescue.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 
+using UnityEngine;
 using RimWorld;
 using Verse;
 using Verse.AI;
@@ -34,10 +35,14 @@ protected override Job TryGiveJob(Pawn pawn)
         {
             float random = Rand.Value;
 
+            float finalRescueChance = rescueChance;
+            if (RescueMod.settings.rescueChanceOverride)
+                finalRescueChance = RescueMod.settings.rescueChance;
+
             if (Prefs.DevMode && RescueMod.settings.logPriorities)
-                Log.Message(String.Format("{0} - checking rescue chance {1}/{2}", pawn, random, rescueChance));
+                Log.Message(String.Format("{0} - checking rescue chance {1}/{2}", pawn, random, finalRescueChance));
 
-            if (random > rescueChance)
+            if (random > finalRescueChance)
                 return null;
 
             if (pawn.AnimalOrWildMan() || pawn.Faction == Faction.OfPlayer || !RCellFinder.TryFindBestExitSpot(pawn, out var exitSpot))
@@ -62,9 +67,10 @@ private bool TryFindRescuableAlly(Pawn rescuer, out Pawn ally, List<Thing> disal
                 return false;
             }
 
-
-            // Multiply search radius by health
+            // Multiply search radius by health to make wounded people a little less bold in the face of danger
             float maxDist = searchRadius;
+            if (RescueMod.settings.searchRadiusOverride)
+                maxDist = RescueMod.settings.searchRadius;
             if (healthSearchDistanceWeight > 0.0f)
                 maxDist *= (healthSearchDistanceWeight * rescuer.health.summaryHealth.SummaryHealthPercent);
 
@@ -97,8 +103,13 @@ private bool TryFindRescuableAlly(Pawn rescuer, out Pawn ally, List<Thing> disal
 
                     priority *= (opinionPriorityWeight * opinionValue);
                 }
+
                 if (marketValuePriorityWeight > 0.0f)
-                    priority *= (marketValuePriorityWeight * pawn.MarketValue);
+                {
+                    float marketValue = Mathf.Clamp(pawn.MarketValue, 200.0f, 3000.0f);
+                    priority *= (marketValuePriorityWeight * marketValue);
+                }
+
                 if (distancePriorityWeight > 0.0f)
                     priority /= (distancePriorityWeight * (rescuer.Position.DistanceTo(pawn.Position) + 1.0f));
 
diff --git a/Source/CM_No_Pawn_Left_Behind/RescueModSettings.cs b/Source/CM_No_Pawn_Left_Behind/RescueModSettings.cs
index a39271c..df8f652 100644
--- a/Source/CM_No_Pawn_Left_Behind/RescueModSettings.cs
+++ b/Source/CM_No_Pawn_Left_Behind/RescueModSettings.cs
@@ -8,11 +8,23 @@ public class RescueModSettings : ModSettings
     {
         public bool logPriorities = false;
 
+        public bool rescueChanceOverride = false;
+        public float rescueChance = 1.0f;
+
+        public bool searchRadiusOverride = false;
+        public float searchRadius = 1.0f;
+
         public override void ExposeData()
         {
             base.ExposeData();
 
             Scribe_Values.Look(ref logPriorities, "logPriorities", false);
+
+            Scribe_Values.Look(ref rescueChanceOverride, "rescueChanceOverride", false);
+            Scribe_Values.Look(ref rescueChance, "rescueChance", 0.5f);
+
+            Scribe_Values.Look(ref searchRadiusOverride, "searchRadiusOverride", false);
+            Scribe_Values.Look(ref searchRadius, "searchRadius", 10.0f);
         }
 
         public void DoSettingsWindowContents(Rect inRect)
@@ -24,6 +36,16 @@ public void DoSettingsWindowContents(Rect inRect)
 
             listing_Standard.CheckboxLabeled("CM_No_Pawn_Left_Behind_Settings_Log_Priorities_Label".Translate(), ref logPriorities);
 
+            listing_Standard.CheckboxLabeled("CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Override_Label".Translate(), ref rescueChanceOverride, "CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Override_Description".Translate());
+            listing_Standard.Label("CM_No_Pawn_Left_Behind_Settings_Rescue_Chance_Label".Translate());
+            listing_Standard.Label(rescueChance.ToString("P0"));
+            rescueChance = listing_Standard.Slider(rescueChance, 0.0f, 2.0f);
+
+            listing_Standard.CheckboxLabeled("CM_No_Pawn_Left_Behind_Settings_Search_Radius_Override_Label".Translate(), ref searchRadiusOverride, "CM_No_Pawn_Left_Behind_Settings_Search_Radius_Override_Description".Translate());
+            listing_Standard.Label("CM_No_Pawn_Left_Behind_Settings_Search_Radius_Label".Translate());
+            listing_Standard.Label(searchRadius.ToString("F0"));
+            searchRadius = listing_Standard.Slider(searchRadius, 1.0f, 100.0f);
+
             listing_Standard.End();
         }