diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll
index a3f0eefe..83cc57b4 100644
Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/Defs/WorkGivers/Wula_WorkGivers.xml b/1.6/Defs/WorkGivers/Wula_WorkGivers.xml
index c719f7fd..4732068a 100644
--- a/1.6/Defs/WorkGivers/Wula_WorkGivers.xml
+++ b/1.6/Defs/WorkGivers/Wula_WorkGivers.xml
@@ -67,6 +67,7 @@
0.25
+ WULA_Charge_Cube
@@ -85,6 +86,7 @@
0.25
+ WULA_Charge_Cube
@@ -102,7 +104,8 @@
- 0.8
+ 0.35
+ WULA_Charge_Cube
diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo
index 5cc935d8..fb8809b8 100644
Binary files a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo and b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo differ
diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
index dab6315c..49f5745a 100644
--- a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
+++ b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
@@ -2,6 +2,14 @@
"Version": 1,
"WorkspaceRootPath": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\",
"Documents": [
+ {
+ "AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\workgiver_warden_deliverenergy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:workgiver_warden_deliverenergy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\workgiverdefextension_feedwula.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:workgiverdefextension_feedwula.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
{
"AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\compapparelinterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:compapparelinterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -42,15 +50,41 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 1,
+ "SelectedChildIndex": 0,
"Children": [
+ {
+ "$type": "Document",
+ "DocumentIndex": 0,
+ "Title": "WorkGiver_Warden_DeliverEnergy.cs",
+ "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WorkGiver_Warden_DeliverEnergy.cs",
+ "RelativeDocumentMoniker": "WorkGiver_Warden_DeliverEnergy.cs",
+ "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WorkGiver_Warden_DeliverEnergy.cs",
+ "RelativeToolTip": "WorkGiver_Warden_DeliverEnergy.cs",
+ "ViewState": "AQIAAAoAAAAAAAAAAAAxwCsAAAALAAAA",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-07-24T03:34:56.772Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 1,
+ "Title": "WorkGiverDefExtension_FeedWula.cs",
+ "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WorkGiverDefExtension_FeedWula.cs",
+ "RelativeDocumentMoniker": "WorkGiverDefExtension_FeedWula.cs",
+ "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WorkGiverDefExtension_FeedWula.cs",
+ "RelativeToolTip": "WorkGiverDefExtension_FeedWula.cs",
+ "ViewState": "AQIAAAAAAAAAAAAAAAAAAAcAAAAoAAAA",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-07-24T03:32:18.303Z",
+ "EditorCaption": ""
+ },
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
- "DocumentIndex": 0,
+ "DocumentIndex": 2,
"Title": "CompApparelInterceptor.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\CompApparelInterceptor.cs",
"RelativeDocumentMoniker": "CompApparelInterceptor.cs",
@@ -63,7 +97,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 1,
+ "DocumentIndex": 3,
"Title": "Projectile_Launch_Patch.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\HarmonyPatches\\Projectile_Launch_Patch.cs",
"RelativeDocumentMoniker": "HarmonyPatches\\Projectile_Launch_Patch.cs",
@@ -75,7 +109,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 3,
+ "DocumentIndex": 5,
"Title": "IngestPatch.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\IngestPatch.cs",
"RelativeDocumentMoniker": "IngestPatch.cs",
@@ -87,7 +121,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 2,
+ "DocumentIndex": 4,
"Title": "CompUseEffect_WulaSkillTrainer.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\CompUseEffect_WulaSkillTrainer.cs",
"RelativeDocumentMoniker": "CompUseEffect_WulaSkillTrainer.cs",
@@ -99,7 +133,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 4,
+ "DocumentIndex": 6,
"Title": "Building_Wula_DarkEnergy_Engine.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Building_Wula_DarkEnergy_Engine.cs",
"RelativeDocumentMoniker": "Building_Wula_DarkEnergy_Engine.cs",
@@ -111,7 +145,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 5,
+ "DocumentIndex": 7,
"Title": "HediffComp_RegenerateBackstory.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\HediffComp_RegenerateBackstory.cs",
"RelativeDocumentMoniker": "HediffComp_RegenerateBackstory.cs",
@@ -123,7 +157,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 6,
+ "DocumentIndex": 8,
"Title": "WulaFallenEmpireMod.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WulaFallenEmpireMod.cs",
"RelativeDocumentMoniker": "WulaFallenEmpireMod.cs",
@@ -135,7 +169,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 7,
+ "DocumentIndex": 9,
"Title": "MechanitorPatch.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\MechanitorPatch.cs",
"RelativeDocumentMoniker": "MechanitorPatch.cs",
diff --git a/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs b/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs
index e9883f20..b7e65643 100644
--- a/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs
+++ b/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs
@@ -5,5 +5,6 @@ namespace WulaFallenEmpire
public class WorkGiverDefExtension_FeedWula : DefModExtension
{
public float feedThreshold = 0.25f;
+ public ThingDef energySourceDef;
}
}
diff --git a/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs b/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs
index d0649821..1fe1bb8e 100644
--- a/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs
+++ b/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs
@@ -1,73 +1,112 @@
using RimWorld;
using Verse;
using Verse.AI;
-using System.Linq;
namespace WulaFallenEmpire
{
- public class WorkGiver_Warden_DeliverEnergy : WorkGiver_Warden
+ public class WorkGiver_Warden_DeliverEnergy : WorkGiver_Scanner
{
- public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
+ private WorkGiverDefExtension_FeedWula ext;
+
+ private WorkGiverDefExtension_FeedWula Ext
{
- if (!(t is Pawn prisoner) || !ShouldTakeCareOfPrisoner(pawn, prisoner))
+ get
{
- return null;
+ if (ext == null)
+ {
+ ext = def.GetModExtension();
+ }
+ return ext;
}
-
- Need_WulaEnergy wulaEnergyNeed = prisoner.needs.TryGetNeed();
- if (wulaEnergyNeed == null || wulaEnergyNeed.CurLevelPercentage > def.GetModExtension().feedThreshold)
- {
- return null;
- }
-
- if (EnergyAvailableInRoomTo(prisoner))
- {
- return null;
- }
-
- if (!TryFindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
- {
- return null;
- }
-
- Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, energySource, prisoner);
- job.count = 1;
- return job;
}
- private bool EnergyAvailableInRoomTo(Pawn prisoner)
+ public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForDef(ThingDef.Named("WulaSpecies"));
+
+ public override PathEndMode PathEndMode => PathEndMode.ClosestTouch;
+
+ public override Danger MaxPathDanger(Pawn pawn) => Danger.Deadly;
+
+ public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
{
- if (prisoner.GetRoom() == null)
+ Pawn prisoner = t as Pawn;
+
+ if (prisoner == null || prisoner == pawn || !prisoner.IsPrisonerOfColony || !prisoner.guest.CanBeBroughtFood)
{
return false;
}
-
- var allThings = prisoner.GetRoom().ContainedAndAdjacentThings;
- foreach (Thing thing in allThings)
+
+ Need_WulaEnergy energyNeed = prisoner.needs.TryGetNeed();
+ if (energyNeed == null)
{
- if (thing.def.GetModExtension() != null)
- {
- return true;
- }
+ return false;
}
- return false;
+
+ if (energyNeed.CurLevelPercentage > Ext.feedThreshold)
+ {
+ return false;
+ }
+
+ if (WardenFeedUtility.ShouldBeFed(prisoner))
+ {
+ return false;
+ }
+
+ if (!pawn.CanReserve(prisoner, 1, -1, null, forced))
+ {
+ return false;
+ }
+
+ if (Ext == null || Ext.energySourceDef == null)
+ {
+ Log.ErrorOnce("WorkGiver_Warden_DeliverEnergy is missing the DefModExtension with a valid energySourceDef.", def.GetHashCode());
+ return false;
+ }
+
+ if (!FindBestEnergySourceFor(pawn, prisoner, out _, out _))
+ {
+ JobFailReason.Is("NoFood".Translate());
+ return false;
+ }
+
+ return true;
}
- private bool TryFindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing energySource, out ThingDef energyDef)
+ public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
{
- energySource = null;
- energyDef = null;
-
- var allowedThings = getter.Map.listerThings.ThingsInGroup(ThingRequestGroup.HaulableEver)
- .Where(x => x.def.GetModExtension() != null);
-
- Thing thing = GenClosest.ClosestThing_Global(eater.Position, allowedThings, 99999f,
- t => t.IngestibleNow && !t.IsForbidden(getter) && getter.CanReserve(t));
-
- if (thing != null)
+ Pawn prisoner = (Pawn)t;
+ if (FindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
{
- energySource = thing;
- energyDef = thing.def;
+ Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, energySource, prisoner);
+ job.count = 1;
+ job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, energySource);
+ return job;
+ }
+ return null;
+ }
+
+ private bool FindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing foodSource, out ThingDef foodDef)
+ {
+ foodSource = null;
+ foodDef = null;
+
+ if (Ext == null || Ext.energySourceDef == null)
+ {
+ return false;
+ }
+
+ foodSource = GenClosest.ClosestThingReachable(
+ getter.Position,
+ getter.Map,
+ ThingRequest.ForDef(Ext.energySourceDef),
+ PathEndMode.OnCell,
+ TraverseParms.For(getter),
+ 9999f,
+ (Thing x) => !x.IsForbidden(getter) && getter.CanReserve(x) && x.GetRoom() != eater.GetRoom()
+ );
+
+ if (foodSource != null)
+ {
+ foodDef = foodSource.def;
return true;
}