diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll
index 0956495e..5fdb18bb 100644
Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml b/1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml
deleted file mode 100644
index 25e4b4a1..00000000
--- a/1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- WULA_EmergencyEnergyRestore
-
- 激活紧急能量协议,暂时将能量需求锁定在100%,持续10秒后恢复到原来的能量水平。只能在倒地时使用。
- UI/Abilities/MetalbloodInjection
- 72000
- true
- true
- false
- false
- false
-
- Verb_CastAbility
- 0
- 1
- Psycast_Skip_Entry
-
- true
- false
- false
-
-
-
-
- 600
- WULA_EmergencyEnergyRestore_Hediff
- true
-
-
-
-
-
diff --git a/1.6/Defs/HediffDefs/Hediffs_WULA_Charging.xml b/1.6/Defs/HediffDefs/Hediffs_WULA_Charging.xml
new file mode 100644
index 00000000..59340b7c
--- /dev/null
+++ b/1.6/Defs/HediffDefs/Hediffs_WULA_Charging.xml
@@ -0,0 +1,25 @@
+
+
+
+ WULA_ChargingHediff
+
+ 乌拉正在从能量核心中持续吸收能量。
+ HediffWithComps
+ (0.5, 0.5, 0.9)
+ false
+
+
+
+ 600
+
+ 0.02
+
+
+
+
+
+ 0
+
+
+
+
diff --git a/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml b/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml
deleted file mode 100644
index dfe9031e..00000000
--- a/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
- WULA_EmergencyEnergyRestore_Hediff
-
- 紧急能量协议激活中,能量需求被暂时锁定在100%。
- WulaFallenEmpire.Hediff_EmergencyEnergyRestore
- (0.2, 0.8, 1.0)
- false
- 1.0
- false
-
-
- 600
- true
-
-
-
-
-
-
- Consciousness
- 1.0
-
-
-
-
-
-
-
diff --git a/1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml b/1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml
deleted file mode 100644
index 619ddd3d..00000000
--- a/1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- WULA_CastEmergencyEnergyRestore
- WulaFallenEmpire.JobDriver_CastEmergencyEnergyRestore
- activating emergency energy restore.
- false
- true
-
-
-
diff --git a/1.6/Defs/ThingDefs/WULA_Item.xml b/1.6/Defs/ThingDefs/WULA_Item.xml
index 6755d54e..f6a92017 100644
--- a/1.6/Defs/ThingDefs/WULA_Item.xml
+++ b/1.6/Defs/ThingDefs/WULA_Item.xml
@@ -17,17 +17,24 @@
1
+ 270
MealSimple
-1000
-1000
EatVegetarian
MechResurrectCast
+
+
+ WULA_ChargingHediff
+ 1.0
+
+
200
None
- 1.0
+ 12.0
diff --git a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
index d0e7ff40..248dfafd 100644
--- a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
+++ b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
@@ -184,7 +184,10 @@
-
+
+ 0.3
+ 0.9
+
@@ -272,12 +275,11 @@
true
- 0.5
- 0.1
- 5
- 9.5
30
1
+ 0.3
+ 0.9
+ 9.5
diff --git a/1.6/Defs/WorkGivers/Wula_WorkGivers.xml b/1.6/Defs/WorkGivers/Wula_WorkGivers.xml
index fd5b99b1..c719f7fd 100644
--- a/1.6/Defs/WorkGivers/Wula_WorkGivers.xml
+++ b/1.6/Defs/WorkGivers/Wula_WorkGivers.xml
@@ -66,7 +66,7 @@
- WULA_Charge_Cube
+ 0.25
@@ -84,7 +84,7 @@
- WULA_Charge_Cube
+ 0.25
@@ -102,7 +102,7 @@
- WULA_Charge_Cube
+ 0.8
diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo
index 20a87eb6..555d3d8c 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 5decc927..225913d5 100644
--- a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
+++ b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
@@ -3,32 +3,24 @@
"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\\jobgiver_wulapackenergy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:jobgiver_wulapackenergy.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\\ingestpatch.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:ingestpatch.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\\jobgiver_wulagetenergy.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:jobgiver_wulagetenergy.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\\compuseeffect_wulaskilltrainer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:compuseeffect_wulaskilltrainer.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\\wulafallenempiremod.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:wulafallenempiremod.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\\hediffcomp_regeneratebackstory.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:hediffcomp_regeneratebackstory.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\\building_wula_darkenergy_engine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:building_wula_darkenergy_engine.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\\ingestpatch.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:ingestpatch.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\\compuseeffect_wulaskilltrainer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:compuseeffect_wulaskilltrainer.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\\hediffcomp_regeneratebackstory.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:hediffcomp_regeneratebackstory.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\\wulafallenempiremod.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:wulafallenempiremod.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\\mechanitorpatch.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
@@ -42,7 +34,7 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 2,
+ "SelectedChildIndex": 1,
"Children": [
{
"$type": "Bookmark",
@@ -50,7 +42,20 @@
},
{
"$type": "Document",
- "DocumentIndex": 2,
+ "DocumentIndex": 0,
+ "Title": "IngestPatch.cs",
+ "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\IngestPatch.cs",
+ "RelativeDocumentMoniker": "IngestPatch.cs",
+ "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\IngestPatch.cs",
+ "RelativeToolTip": "IngestPatch.cs",
+ "ViewState": "AQIAACUAAAAAAAAAAAAAwEcAAAAJAAAA",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-07-20T17:09:27.916Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 3,
"Title": "CompUseEffect_WulaSkillTrainer.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\CompUseEffect_WulaSkillTrainer.cs",
"RelativeDocumentMoniker": "CompUseEffect_WulaSkillTrainer.cs",
@@ -58,38 +63,11 @@
"RelativeToolTip": "CompUseEffect_WulaSkillTrainer.cs",
"ViewState": "AQIAAEAAAAAAAAAAAAAUwFMAAAABAAAA",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-07-22T07:52:56.407Z",
- "EditorCaption": ""
+ "WhenOpened": "2025-07-22T07:52:56.407Z"
},
{
"$type": "Document",
- "DocumentIndex": 0,
- "Title": "JobGiver_WulaPackEnergy.cs",
- "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\JobGiver_WulaPackEnergy.cs",
- "RelativeDocumentMoniker": "JobGiver_WulaPackEnergy.cs",
- "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\JobGiver_WulaPackEnergy.cs",
- "RelativeToolTip": "JobGiver_WulaPackEnergy.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAAAAgAAAAoAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-07-22T07:19:52.552Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "JobGiver_WulaGetEnergy.cs",
- "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\JobGiver_WulaGetEnergy.cs",
- "RelativeDocumentMoniker": "JobGiver_WulaGetEnergy.cs",
- "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\JobGiver_WulaGetEnergy.cs",
- "RelativeToolTip": "JobGiver_WulaGetEnergy.cs",
- "ViewState": "AQIAADsAAAAAAAAAAAAUwGEAAAAlAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-07-22T07:19:46.094Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
+ "DocumentIndex": 2,
"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",
@@ -101,19 +79,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 5,
- "Title": "IngestPatch.cs",
- "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\IngestPatch.cs",
- "RelativeDocumentMoniker": "IngestPatch.cs",
- "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\IngestPatch.cs",
- "RelativeToolTip": "IngestPatch.cs",
- "ViewState": "AQIAACEAAAAAAAAAAAAowEwAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-07-20T17:09:27.916Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
+ "DocumentIndex": 1,
"Title": "HediffComp_RegenerateBackstory.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\HediffComp_RegenerateBackstory.cs",
"RelativeDocumentMoniker": "HediffComp_RegenerateBackstory.cs",
@@ -125,7 +91,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 3,
+ "DocumentIndex": 4,
"Title": "WulaFallenEmpireMod.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WulaFallenEmpireMod.cs",
"RelativeDocumentMoniker": "WulaFallenEmpireMod.cs",
@@ -133,8 +99,7 @@
"RelativeToolTip": "WulaFallenEmpireMod.cs",
"ViewState": "AQIAAAAAAAAAAAAAAAAAAA4AAAA+AAAA",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-07-18T10:23:17.898Z",
- "EditorCaption": ""
+ "WhenOpened": "2025-07-18T10:23:17.898Z"
},
{
"$type": "Bookmark",
@@ -142,7 +107,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 7,
+ "DocumentIndex": 5,
"Title": "MechanitorPatch.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\MechanitorPatch.cs",
"RelativeDocumentMoniker": "MechanitorPatch.cs",
diff --git a/Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs
deleted file mode 100644
index c9ceb91c..00000000
--- a/Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using RimWorld;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class CompAbilityEffect_EmergencyEnergyRestore : CompAbilityEffect
- {
- public new CompProperties_AbilityEmergencyEnergyRestore Props => (CompProperties_AbilityEmergencyEnergyRestore)props;
-
- public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
- {
- Log.Message($"[EmergencyEnergyRestore] Apply method called for {parent.pawn?.LabelShort}");
- base.Apply(target, dest);
-
- Pawn caster = parent.pawn;
- if (caster == null) return;
-
- // 检查是否是乌拉族
- if (!IsWulaRace(caster))
- {
- Messages.Message("只有乌拉族才能使用紧急能量恢复", MessageTypeDefOf.RejectInput, false);
- return;
- }
-
- // 检查是否倒地(如果需要的话)
- if (Props.requireDowned && !caster.Downed)
- {
- Messages.Message("只能在倒地时使用紧急能量恢复", MessageTypeDefOf.RejectInput, false);
- return;
- }
-
- // 添加Hediff
- if (Props.hediffDef != null)
- {
- var hediff = HediffMaker.MakeHediff(Props.hediffDef, caster);
- caster.health.AddHediff(hediff);
-
- Messages.Message($"{caster.LabelShort}激活了紧急能量恢复协议", MessageTypeDefOf.PositiveEvent, false);
-
- if (Prefs.DevMode)
- {
- Log.Message($"[EmergencyEnergyRestore] Applied to {caster.LabelShort}");
- }
- }
- }
-
- public override bool CanApplyOn(LocalTargetInfo target, LocalTargetInfo dest)
- {
- Log.Message($"[EmergencyEnergyRestore] CanApplyOn called. Pawn: {parent.pawn?.LabelShort}");
- // 暂时强制返回true,以排除CanApplyOn的限制
- return true;
- }
-
- private bool IsWulaRace(Pawn pawn)
- {
- if (pawn?.def == null) return false;
- return pawn.def.defName == "WulaSpecies";
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs
deleted file mode 100644
index 08345e63..00000000
--- a/Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using RimWorld;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class CompProperties_AbilityEmergencyEnergyRestore : CompProperties_AbilityEffect
- {
- public int durationTicks = 600; // 默认10秒
- public HediffDef hediffDef;
- public bool requireDowned = true; // 是否需要倒地才能使用
- public SoundDef soundCast;
-
- public CompProperties_AbilityEmergencyEnergyRestore()
- {
- compClass = typeof(CompAbilityEffect_EmergencyEnergyRestore);
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs b/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs
deleted file mode 100644
index e0dbfefe..00000000
--- a/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using HarmonyLib;
-using RimWorld;
-using System; // Added for Type
-using System.Collections.Generic;
-using System.Reflection;
-using System.Reflection.Emit;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- [HarmonyPatch]
- public static class EmergencyAbilityPatches
- {
- // 修复倒地时无法使用能力的问题
- [HarmonyPatch(typeof(Ability), "get_CanCast")]
- [HarmonyPostfix]
- public static void CanCast_Postfix(Ability __instance, ref AcceptanceReport __result)
- {
- if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
- {
- var comp = __instance.CompOfType();
- if (comp != null && comp.Props.requireDowned)
- {
- if (!__instance.pawn.Downed)
- {
- __result = new AcceptanceReport("只能在倒地时使用");
- }
- else
- {
- __result = true;
- }
- }
- }
- }
-
- // 修复倒地时无法显示能力按钮的问题
- [HarmonyPatch(typeof(Pawn_AbilityTracker), "get_AllAbilitiesForReading")]
- [HarmonyPostfix]
- public static void GetAbilitiesForDisplay_Postfix(Pawn_AbilityTracker __instance, ref List __result)
- {
- // 检查pawn是否倒地
- if (__instance.pawn.Downed)
- {
- // 添加紧急能量恢复能力,即使pawn倒地
- foreach (Ability ability in __instance.abilities)
- {
- if (ability.def.defName == "WULA_EmergencyEnergyRestore" && !__result.Contains(ability))
- {
- __result.Add(ability);
- }
- }
- }
- }
-
- // 修复倒地时无法使用能力的UI限制 - 直接修补Ability.GizmoDisabled方法
- [HarmonyPatch(typeof(Ability), "GizmoDisabled")]
- [HarmonyPostfix]
- public static void Ability_GizmoDisabled_Postfix(Ability __instance, ref bool __result, ref string reason)
- {
- if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
- {
- if (__result)
- {
- // 检查是否是因为倒地而被禁用
- if (__instance.pawn.Downed && reason != null &&
- (reason.Contains("失去知觉") || reason.Contains("unconscious") || reason.Contains("CommandDisabledUnconscious")))
- {
- // 对于紧急能量恢复能力,我们允许在倒地时使用
- __result = false;
- reason = null;
- }
- }
- }
- }
-
- // 额外的安全措施:修复Command_Ability的禁用检查
- [HarmonyPatch(typeof(Command_Ability), "get_Disabled")]
- [HarmonyPostfix]
- public static void Command_Ability_GizmoDisabled_Postfix(Command_Ability __instance, ref bool __result)
- {
- var ability = (Ability)typeof(Command_Ability).GetField("ability", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
- if (ability.def.defName == "WULA_EmergencyEnergyRestore")
- {
- if (__result && ability.pawn.Downed)
- {
- // 对于紧急能量恢复能力,我们允许在倒地时使用
- __result = false;
- }
- }
- }
-
- // 新增补丁:检查ApparelPreventsShooting是否阻止了施法
- [HarmonyPatch(typeof(Verb), "ApparelPreventsShooting")]
- [HarmonyPostfix]
- public static void ApparelPreventsShooting_Postfix(Verb __instance, ref bool __result)
- {
- if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
- {
- }
- }
-
- // 最终诊断补丁:检查Verb.TryStartCastOn是否被调用
- [HarmonyPatch(typeof(Verb), "TryStartCastOn", new Type[] { typeof(LocalTargetInfo), typeof(LocalTargetInfo), typeof(bool), typeof(bool), typeof(bool), typeof(bool) })]
- [HarmonyPrefix]
- public static void TryStartCastOn_DiagnosticPrefix(Verb __instance, LocalTargetInfo castTarg, LocalTargetInfo destTarg, ref bool __result)
- {
- if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
- {
- }
- }
-
- // 诊断补丁:检查Verb_CastAbility.TryCastShot是否被调用
- [HarmonyPatch(typeof(Verb_CastAbility), "TryCastShot")]
- [HarmonyPrefix]
- public static void TryCastShot_DiagnosticPrefix(Verb_CastAbility __instance, ref bool __result)
- {
- if (__instance.ability?.def.defName == "WULA_EmergencyEnergyRestore")
- {
- }
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/HediffComp_WulaCharging.cs b/Source/WulaFallenEmpire/HediffComp_WulaCharging.cs
new file mode 100644
index 00000000..deeaa6ba
--- /dev/null
+++ b/Source/WulaFallenEmpire/HediffComp_WulaCharging.cs
@@ -0,0 +1,65 @@
+using Verse;
+using RimWorld;
+
+namespace WulaFallenEmpire
+{
+ public class HediffCompProperties_WulaCharging : HediffCompProperties
+ {
+ public float energyPerTick = 0.001f; // 每tick补充的能量量
+ public int durationTicks = 600; // 持续时间,例如600ticks = 10秒
+
+ public HediffCompProperties_WulaCharging()
+ {
+ this.compClass = typeof(HediffComp_WulaCharging);
+ }
+ }
+
+ public class HediffComp_WulaCharging : HediffComp
+ {
+ public HediffCompProperties_WulaCharging Props => (HediffCompProperties_WulaCharging)this.props;
+
+ private int ticksPassed = 0;
+ private Thing sourceThing; // 新增字段,用于存储能量核心物品
+
+ public void SetSourceThing(Thing thing)
+ {
+ this.sourceThing = thing;
+ }
+
+ public override void CompPostTick(ref float severityAdjustment)
+ {
+ base.CompPostTick(ref severityAdjustment);
+
+ ticksPassed++;
+ if (ticksPassed >= Props.durationTicks)
+ {
+ // 持续时间结束,移除Hediff
+ this.parent.pawn.health.RemoveHediff(this.parent);
+ return;
+ }
+
+ Need_WulaEnergy energyNeed = this.parent.pawn.needs.TryGetNeed();
+ if (energyNeed != null)
+ {
+ // 从sourceThing的ThingDefExtension_EnergySource获取能量量
+ ThingDefExtension_EnergySource ext = sourceThing?.def.GetModExtension();
+ if (ext != null)
+ {
+ energyNeed.CurLevel += ext.energyAmount / Props.durationTicks; // 将总能量量分摊到每个tick
+ }
+ else
+ {
+ // 如果没有找到能量来源扩展,则使用默认的energyPerTick
+ energyNeed.CurLevel += Props.energyPerTick;
+ }
+ }
+ }
+
+ public override void CompExposeData()
+ {
+ base.CompExposeData();
+ Scribe_Values.Look(ref ticksPassed, "ticksPassed", 0);
+ Scribe_References.Look(ref sourceThing, "sourceThing"); // 保存sourceThing
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs
deleted file mode 100644
index e24bf57b..00000000
--- a/Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using RimWorld;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class Hediff_EmergencyEnergyRestore : HediffWithComps
- {
- private float originalEnergyLevel = 0f;
- private bool hasStoredOriginalLevel = false;
-
- public override void PostAdd(DamageInfo? dinfo)
- {
- base.PostAdd(dinfo);
-
- // 存储原始能量水平
- var energyNeed = pawn.needs?.TryGetNeed();
- if (energyNeed != null)
- {
- originalEnergyLevel = energyNeed.CurLevel;
- hasStoredOriginalLevel = true;
-
- // 立即将能量设置为100%
- energyNeed.CurLevel = 1.0f;
-
- if (Prefs.DevMode)
- {
- Log.Message($"[EmergencyEnergyRestore] Stored original energy: {originalEnergyLevel:F2}, set to 1.0");
- }
- }
- }
-
- public override void PostRemoved()
- {
- base.PostRemoved();
-
- // 恢复原始能量水平
- if (hasStoredOriginalLevel)
- {
- var energyNeed = pawn.needs?.TryGetNeed();
- if (energyNeed != null)
- {
- energyNeed.CurLevel = originalEnergyLevel;
-
- if (Prefs.DevMode)
- {
- Log.Message($"[EmergencyEnergyRestore] Restored energy to: {originalEnergyLevel:F2}");
- }
- }
- }
- }
-
- public override void Tick()
- {
- base.Tick();
-
- // 确保能量保持在100%
- var energyNeed = pawn.needs?.TryGetNeed();
- if (energyNeed != null && energyNeed.CurLevel < 1.0f)
- {
- energyNeed.CurLevel = 1.0f;
- }
- }
-
- public override void ExposeData()
- {
- base.ExposeData();
- Scribe_Values.Look(ref originalEnergyLevel, "originalEnergyLevel", 0f);
- Scribe_Values.Look(ref hasStoredOriginalLevel, "hasStoredOriginalLevel", false);
- }
- }
-}
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs
deleted file mode 100644
index 4f9bcf4b..00000000
--- a/Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System.Collections.Generic;
-using Verse;
-using Verse.AI;
-using RimWorld; // Added for AbilityDef
-
-namespace WulaFallenEmpire
-{
- public class JobDriver_CastEmergencyEnergyRestore : JobDriver
- {
- public override bool TryMakePreToilReservations(bool errorOnFailed)
- {
- return true;
- }
-
- protected override IEnumerable MakeNewToils()
- {
- this.FailOnDespawnedOrNull(TargetIndex.A);
- yield return new Toil
- {
- initAction = delegate
- {
- var ability = pawn.abilities.GetAbility(DefDatabase.GetNamed("WULA_EmergencyEnergyRestore"));
- if (ability != null)
- {
- ability.Activate(pawn.Position, pawn);
- }
- },
- defaultCompleteMode = ToilCompleteMode.Instant
- };
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs b/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs
index 371ba3b8..03143dfd 100644
--- a/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs
+++ b/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using UnityEngine;
using Verse;
using Verse.AI;
using RimWorld;
@@ -11,17 +10,16 @@ namespace WulaFallenEmpire
private const TargetIndex FoodSourceInd = TargetIndex.A;
private const TargetIndex PatientInd = TargetIndex.B;
- private Thing FoodSource => job.GetTarget(FoodSourceInd).Thing;
- private Pawn Patient => (Pawn)job.GetTarget(PatientInd).Thing;
+ protected Thing Food => job.GetTarget(FoodSourceInd).Thing;
+ protected Pawn Patient => (Pawn)job.GetTarget(PatientInd).Thing;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
- // 预留食物来源和病患
- if (!pawn.Reserve(FoodSource, job, 1, -1, null, errorOnFailed))
+ if (!pawn.Reserve(Patient, job, 1, -1, null, errorOnFailed))
{
return false;
}
- if (!pawn.Reserve(Patient, job, 1, -1, null, errorOnFailed))
+ if (!pawn.Reserve(Food, job, 1, -1, null, errorOnFailed))
{
return false;
}
@@ -30,110 +28,22 @@ namespace WulaFallenEmpire
protected override IEnumerable MakeNewToils()
{
- // 失败条件:如果病患被摧毁、为空或不在床上
- this.FailOn(() => Patient.DestroyedOrNull());
- this.FailOn(() => !Patient.InBed());
+ this.FailOnDespawnedNullOrForbidden(PatientInd);
+ this.FailOn(() => !FeedPatientUtility.ShouldBeFed(Patient));
- // Toil 0: 检查医生库存中是否有能量核心
- Toil checkInventoryToil = ToilMaker.MakeToil("CheckInventory");
- checkInventoryToil.initAction = delegate
+ if (pawn.inventory != null && pawn.inventory.Contains(Food))
{
- Thing inventoryFood = null;
- foreach (Thing t in pawn.inventory.innerContainer)
- {
- ThingDefExtension_EnergySource energySourceExt = t.def.GetModExtension();
- if (energySourceExt != null && t.IngestibleNow)
- {
- inventoryFood = t;
- break;
- }
- }
-
- if (inventoryFood != null)
- {
- // 如果库存中有食物,则将Job的目标设置为库存食物,并跳过拾取步骤,直接前往病患
- job.SetTarget(FoodSourceInd, inventoryFood);
- pawn.jobs.curDriver.JumpToToil(Toils_Goto.GotoThing(PatientInd, PathEndMode.Touch)); // 跳转到前往病患的Toil
- }
- // 如果库存中没有,则继续执行下一个Toil(前往地图上的食物来源)
- };
- yield return checkInventoryToil;
-
- // Toil 1: 前往食物来源 (如果库存中没有,则执行此Toil)
- yield return Toils_Goto.GotoThing(FoodSourceInd, PathEndMode.ClosestTouch)
- .FailOnDespawnedNullOrForbidden(FoodSourceInd)
- .FailOn(() => !pawn.CanReserve(FoodSource, 1, -1, null, false)); // 在这里预留食物来源
-
- // Toil 2: 拾取食物来源 (如果库存中没有,则执行此Toil)
- yield return Toils_Haul.StartCarryThing(FoodSourceInd); // 使用 StartCarryThing 拾取物品
-
- // Toil 3: 前往病患
- yield return Toils_Goto.GotoThing(PatientInd, PathEndMode.Touch)
- .FailOnDespawnedOrNull(PatientInd);
-
- // Toil 4: 喂食病患
- Toil feedToil = ToilMaker.MakeToil("FeedWulaPatient");
- feedToil.initAction = delegate
+ yield return Toils_Misc.TakeItemFromInventoryToCarrier(pawn, FoodSourceInd);
+ }
+ else
{
- Pawn actor = feedToil.actor;
- Thing food = actor.carryTracker.CarriedThing; // 医生携带的食物 (从地图拾取)
+ yield return Toils_Goto.GotoThing(FoodSourceInd, PathEndMode.ClosestTouch).FailOnForbidden(FoodSourceInd);
+ yield return Toils_Ingest.PickupIngestible(FoodSourceInd, pawn);
+ }
- // 如果医生没有携带食物,检查是否在库存中 (从库存获取)
- if (food == null)
- {
- food = job.GetTarget(FoodSourceInd).Thing; // 此时FoodSourceInd应该指向库存中的物品
- if (food == null || !actor.inventory.innerContainer.Contains(food))
- {
- actor.jobs.EndCurrentJob(JobCondition.Incompletable);
- return;
- }
- }
-
- // 获取乌拉能量需求
- Need_WulaEnergy energyNeed = Patient.needs.TryGetNeed();
- if (energyNeed == null)
- {
- actor.jobs.EndCurrentJob(JobCondition.Errored);
- return;
- }
-
- // 检查食物来源是否有自定义能量扩展
- ThingDefExtension_EnergySource ext = food.def.GetModExtension();
- if (ext == null)
- {
- actor.jobs.EndCurrentJob(JobCondition.Errored);
- return;
- }
-
- // 补充乌拉的能量
- energyNeed.CurLevel += ext.energyAmount;
-
- // 消耗物品
- if (actor.carryTracker.CarriedThing == food) // 如果是携带的物品
- {
- food.Destroy(DestroyMode.Vanish); // 销毁医生携带的物品
- actor.carryTracker.innerContainer.ClearAndDestroyContents(); // 移除医生携带的物品
- }
- else if (actor.inventory.innerContainer.Contains(food)) // 如果是库存中的物品
- {
- food.stackCount--; // 减少库存物品数量
- if (food.stackCount <= 0)
- {
- food.Destroy(DestroyMode.Vanish); // 如果数量为0,销毁物品
- }
- }
- else
- {
- // 理论上不应该发生
- actor.jobs.EndCurrentJob(JobCondition.Errored);
- return;
- }
-
- // 记录能量摄入 (可选)
- // Patient.records.AddTo(RecordDefOf.NutritionEaten, ext.energyAmount);
- };
- feedToil.defaultCompleteMode = ToilCompleteMode.Instant;
- yield return feedToil;
+ yield return Toils_Goto.GotoThing(PatientInd, PathEndMode.Touch);
+ yield return Toils_Ingest.ChewIngestible(Patient, 1.5f, FoodSourceInd, TargetIndex.None).FailOnCannotTouch(PatientInd, PathEndMode.Touch);
+ yield return Toils_Ingest.FinalizeIngest(Patient, FoodSourceInd);
}
}
}
diff --git a/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs b/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs
index 6afba9df..d149644c 100644
--- a/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs
+++ b/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs
@@ -1,29 +1,28 @@
using System.Collections.Generic;
-using System.Linq; // Added for FirstOrDefault
-using UnityEngine;
using Verse;
using Verse.AI;
-using RimWorld; // For ThingDefOf, StatDefOf, etc.
+using RimWorld;
namespace WulaFallenEmpire
{
public class JobDriver_IngestWulaEnergy : JobDriver
{
- private const TargetIndex IngestibleSourceInd = TargetIndex.A;
- private bool eatingFromInventory; // 新增字段
+ private bool eatingFromInventory;
- private Toil chewing; // 新增咀嚼Toil字段
+ private const TargetIndex IngestibleSourceInd = TargetIndex.A;
private Thing IngestibleSource => job.GetTarget(IngestibleSourceInd).Thing;
- // 新增咀嚼时间乘数属性
private float ChewDurationMultiplier
{
get
{
Thing ingestibleSource = IngestibleSource;
- // 假设乌拉能量核心也有EatingSpeed属性影响咀嚼速度,或者固定为1f
- return 1f / pawn.GetStatValue(StatDefOf.EatingSpeed);
+ if (ingestibleSource.def.ingestible != null)
+ {
+ return 1f / pawn.GetStatValue(StatDefOf.EatingSpeed);
+ }
+ return 1f;
}
}
@@ -33,12 +32,17 @@ namespace WulaFallenEmpire
Scribe_Values.Look(ref eatingFromInventory, "eatingFromInventory", defaultValue: false);
}
+ public override void Notify_Starting()
+ {
+ base.Notify_Starting();
+ eatingFromInventory = pawn.inventory != null && pawn.inventory.Contains(IngestibleSource);
+ }
+
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
if (pawn.Faction != null)
{
Thing ingestibleSource = IngestibleSource;
- // 使用FoodUtility.GetMaxAmountToPickup
int maxAmountToPickup = FoodUtility.GetMaxAmountToPickup(ingestibleSource, pawn, job.count);
if (!pawn.Reserve(ingestibleSource, job, 10, maxAmountToPickup, null, errorOnFailed))
{
@@ -51,60 +55,21 @@ namespace WulaFallenEmpire
protected override IEnumerable MakeNewToils()
{
- // 失败条件:如果能量核心被摧毁、为空或被禁止
- this.FailOn(() => IngestibleSource.DestroyedOrNull() || !IngestibleSource.IngestibleNow);
+ this.FailOn(() => !IngestibleSource.Destroyed && !IngestibleSource.IngestibleNow);
- // 初始化 eatingFromInventory
- eatingFromInventory = pawn.inventory != null && pawn.inventory.Contains(IngestibleSource);
-
- // 定义咀嚼Toil
- chewing = Toils_Ingest.ChewIngestible(pawn, ChewDurationMultiplier, IngestibleSourceInd, TargetIndex.None)
+ Toil chew = Toils_Ingest.ChewIngestible(pawn, ChewDurationMultiplier, IngestibleSourceInd, TargetIndex.None)
.FailOn((Toil x) => !IngestibleSource.Spawned && (pawn.carryTracker == null || pawn.carryTracker.CarriedThing != IngestibleSource))
.FailOnCannotTouch(IngestibleSourceInd, PathEndMode.Touch);
- // 根据是否从背包摄入,选择不同的Toil序列
- foreach (Toil item in PrepareToIngestToils(chewing))
+ foreach (Toil item in PrepareToIngestToils(chew))
{
yield return item;
}
- yield return chewing;
-
- // 最终处理能量摄取
- Toil finalizeToil = ToilMaker.MakeToil("FinalizeWulaEnergyIngest");
- finalizeToil.initAction = delegate
- {
- Pawn actor = finalizeToil.actor;
- Thing thing = actor.carryTracker.CarriedThing; // 从carryTracker获取,因为Toils_Ingest.ChewIngestible会处理携带
-
- if (thing == null)
- {
- actor.jobs.EndCurrentJob(JobCondition.Incompletable);
- return;
- }
-
- Need_WulaEnergy energyNeed = actor.needs.TryGetNeed();
- if (energyNeed == null)
- {
- actor.jobs.EndCurrentJob(JobCondition.Errored);
- return;
- }
-
- ThingDefExtension_EnergySource ext = thing.def.GetModExtension();
- if (ext == null)
- {
- actor.jobs.EndCurrentJob(JobCondition.Errored);
- return;
- }
-
- energyNeed.CurLevel += ext.energyAmount;
- thing.Destroy(DestroyMode.Vanish);
- };
- finalizeToil.defaultCompleteMode = ToilCompleteMode.Instant;
- yield return finalizeToil;
+ yield return chew;
+ yield return Toils_Ingest.FinalizeIngest(pawn, IngestibleSourceInd);
}
- // 辅助方法,根据情况返回不同的Toil序列
private IEnumerable PrepareToIngestToils(Toil chewToil)
{
if (eatingFromInventory)
@@ -113,14 +78,9 @@ namespace WulaFallenEmpire
}
else
{
- // 类似原版JobDriver_Ingest的ToolUser逻辑
- yield return Toils_Goto.GotoThing(IngestibleSourceInd, PathEndMode.ClosestTouch)
- .FailOnDespawnedNullOrForbidden(IngestibleSourceInd);
+ yield return Toils_Goto.GotoThing(IngestibleSourceInd, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(IngestibleSourceInd);
yield return Toils_Ingest.PickupIngestible(IngestibleSourceInd, pawn);
}
- // 不处理FindAdjacentEatSurface,因为乌拉能量核心可能不需要“吃表面”
- // 也不处理takeExtraIngestibles,因为乌拉能量核心通常是单次消耗
- yield break; // 确保迭代器结束
}
}
}
diff --git a/Source/WulaFallenEmpire/JobGiverDefExtension_WulaGetEnergy.cs b/Source/WulaFallenEmpire/JobGiverDefExtension_WulaGetEnergy.cs
deleted file mode 100644
index 466491e3..00000000
--- a/Source/WulaFallenEmpire/JobGiverDefExtension_WulaGetEnergy.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class JobGiverDefExtension_WulaGetEnergy : DefModExtension
- {
- public float minEnergyLevelPercentage = 0.3f;
- public float emergencyThreshold = 0.1f;
- public float normalPriority = 5f;
- public float emergencyPriority = 9.5f;
- }
-}
diff --git a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
index 02d844a9..9051470d 100644
--- a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
+++ b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
@@ -1,118 +1,75 @@
using RimWorld;
using Verse;
using Verse.AI;
-using System.Linq; // For FirstOrDefault
namespace WulaFallenEmpire
{
public class JobGiver_WulaGetEnergy : ThinkNode_JobGiver
{
public float minEnergyLevelPercentage = 0.3f;
- public float emergencyThreshold = 0.1f;
- public float normalPriority = 5f;
+ public float maxEnergyLevelPercentage = 0.9f;
public float emergencyPriority = 9.5f;
- public float searchRadius = 20f; // 添加 searchRadius
- public int ingestCount = 1; // 添加 ingestCount
-
- public override ThinkNode DeepCopy(bool resolve = true)
- {
- JobGiver_WulaGetEnergy obj = (JobGiver_WulaGetEnergy)base.DeepCopy(resolve);
- obj.minEnergyLevelPercentage = minEnergyLevelPercentage;
- obj.emergencyThreshold = emergencyThreshold;
- obj.normalPriority = normalPriority;
- obj.emergencyPriority = emergencyPriority;
- obj.searchRadius = searchRadius;
- obj.ingestCount = ingestCount;
- return obj;
- }
public override float GetPriority(Pawn pawn)
{
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed();
- if (energyNeed == null)
+ if (energyNeed == null || pawn.health.hediffSet.HasHediff(DefDatabase.GetNamed("WULA_ChargingHediff")))
{
return 0f;
}
- // 如果能量充足,则不需要寻找能量核心
- if (energyNeed.CurLevelPercentage > minEnergyLevelPercentage)
- {
- return 0f;
- }
-
- // 如果能量非常低,给予高优先级
- if (energyNeed.CurLevelPercentage < emergencyThreshold)
+ if (energyNeed.CurLevelPercentage < minEnergyLevelPercentage)
{
return emergencyPriority;
}
-
- // 否则,给予中等优先级
- return normalPriority;
+ return 0f;
}
protected override Job TryGiveJob(Pawn pawn)
{
- if (pawn.Downed)
+ if (pawn.health.hediffSet.HasHediff(DefDatabase.GetNamed("WULA_ChargingHediff")))
{
return null;
}
+
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed();
- if (energyNeed == null || energyNeed.CurLevelPercentage > minEnergyLevelPercentage)
+ if (energyNeed == null || energyNeed.CurLevelPercentage >= maxEnergyLevelPercentage)
{
return null;
}
- // 优先检查小人背包中的能量核心
- foreach (Thing t in pawn.inventory.innerContainer)
+ if (!TryFindBestEnergySourceFor(pawn, out Thing energySource))
{
- ThingDefExtension_EnergySource energySourceExt = t.def.GetModExtension();
- if (energySourceExt != null && t.IngestibleNow)
- {
- Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_IngestWulaEnergy"), t);
- job.count = ingestCount;
- return job;
- }
+ return null;
}
- // 如果背包中没有,则寻找最佳能量核心
- Thing bestEnergySource = GenClosest.ClosestThingReachable(
+ Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_IngestWulaEnergy"), energySource);
+ job.count = 1;
+ return job;
+ }
+
+ private bool TryFindBestEnergySourceFor(Pawn pawn, out Thing energySource)
+ {
+ // 优先从背包中寻找
+ Thing thing = pawn.inventory.innerContainer.FirstOrFallback(t => t.def.GetModExtension() != null && t.IngestibleNow);
+ if (thing != null)
+ {
+ energySource = thing;
+ return true;
+ }
+
+ // 否则,在地图上寻找
+ energySource = GenClosest.ClosestThingReachable(
pawn.Position,
pawn.Map,
- ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), // 扫描所有可搬运的物品
+ ThingRequest.ForGroup(ThingRequestGroup.HaulableEver),
PathEndMode.ClosestTouch,
- TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false),
- searchRadius, // 使用类中的 searchRadius
- (Thing t) =>
- {
- // 检查物品是否是能量核心
- ThingDefExtension_EnergySource energySourceExt = t.def.GetModExtension();
- if (energySourceExt == null)
- {
- return false;
- }
- // 检查物品是否可摄取
- if (!t.IngestibleNow)
- {
- return false;
- }
- // 检查物品是否被禁止或无法预留
- if (t.IsForbidden(pawn) || !pawn.CanReserve(t, 1, -1, null, false))
- {
- return false;
- }
- return true;
- }
+ TraverseParms.For(pawn),
+ 9999f,
+ t => t.def.GetModExtension() != null && t.IngestibleNow && !t.IsForbidden(pawn) && pawn.CanReserve(t)
);
- if (bestEnergySource != null)
- {
- // 创建摄取能量核心的Job
- Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_IngestWulaEnergy"), bestEnergySource);
- job.count = ingestCount; // 使用类中的 ingestCount
- return job;
- }
-
- return null;
+ return energySource != null;
}
}
}
diff --git a/Source/WulaFallenEmpire/Need_WulaEnergy.cs b/Source/WulaFallenEmpire/Need_WulaEnergy.cs
index 068514da..941cd00a 100644
--- a/Source/WulaFallenEmpire/Need_WulaEnergy.cs
+++ b/Source/WulaFallenEmpire/Need_WulaEnergy.cs
@@ -108,5 +108,10 @@ namespace WulaFallenEmpire
threshPercents.Clear();
base.DrawOnGUI(rect, maxThresholdMarkers, customMargin, drawArrows, doTooltip, rectForTooltip, drawLabel);
}
+
+ public override void ExposeData()
+ {
+ base.ExposeData();
+ }
}
}
diff --git a/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs b/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs
index 4debc7c1..e9883f20 100644
--- a/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs
+++ b/Source/WulaFallenEmpire/WorkGiverDefExtension_FeedWula.cs
@@ -4,7 +4,6 @@ namespace WulaFallenEmpire
{
public class WorkGiverDefExtension_FeedWula : DefModExtension
{
- // The ThingDef of the item to be used as energy source.
- public ThingDef energySourceDef;
+ public float feedThreshold = 0.25f;
}
}
diff --git a/Source/WulaFallenEmpire/WorkGiver_FeedWulaPatient.cs b/Source/WulaFallenEmpire/WorkGiver_FeedWulaPatient.cs
index dd20caf6..bdadd0db 100644
--- a/Source/WulaFallenEmpire/WorkGiver_FeedWulaPatient.cs
+++ b/Source/WulaFallenEmpire/WorkGiver_FeedWulaPatient.cs
@@ -1,28 +1,14 @@
using RimWorld;
-using System.Collections.Generic;
-using System.Linq;
using Verse;
using Verse.AI;
+using System.Collections.Generic;
+using System.Linq;
namespace WulaFallenEmpire
{
public class WorkGiver_FeedWulaPatient : WorkGiver_Scanner
{
- private WorkGiverDefExtension_FeedWula ext;
-
- private WorkGiverDefExtension_FeedWula Ext
- {
- get
- {
- if (ext == null)
- {
- ext = def.GetModExtension();
- }
- return ext;
- }
- }
-
- public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForDef(ThingDef.Named("WulaSpecies"));
+ public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.Pawn);
public override PathEndMode PathEndMode => PathEndMode.ClosestTouch;
@@ -30,52 +16,47 @@ namespace WulaFallenEmpire
public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn)
{
- // Mimic vanilla: Scan all pawns in bed.
- return pawn.Map.mapPawns.AllPawns.Where(p => p.InBed());
+ return pawn.Map.mapPawns.AllPawns.Where(p => p.needs.TryGetNeed() != null && FeedPatientUtility.ShouldBeFed(p));
}
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
{
- Pawn patient = t as Pawn;
-
- // Basic validation, similar to vanilla
- if (patient == null || patient == pawn || !patient.InBed() || patient.def.defName != "WulaSpecies")
+ if (!(t is Pawn patient) || patient == pawn)
+ {
+ return false;
+ }
+
+ // 如果病患正在充能,则不需要喂食
+ if (patient.health.hediffSet.HasHediff(DefDatabase.GetNamed("WULA_ChargingHediff")))
{
return false;
}
- // Our custom check: Is the Wula in shutdown?
Need_WulaEnergy energyNeed = patient.needs.TryGetNeed();
- if (energyNeed == null || !energyNeed.IsShutdown)
+ var extension = def.GetModExtension();
+ if (energyNeed == null || energyNeed.CurLevelPercentage >= extension.feedThreshold)
{
return false;
}
- // CRITICAL vanilla check: If the patient is a prisoner, this is a warden's job, not a doctor's.
- // This prevents conflicts between two different work types trying to do the same thing.
+ if (!FeedPatientUtility.ShouldBeFed(patient))
+ {
+ return false;
+ }
+
if (WardenFeedUtility.ShouldBeFed(patient))
{
return false;
}
- // CRITICAL vanilla check: Can the doctor reserve the patient?
- // This prevents multiple doctors from trying to feed the same patient at the same time.
if (!pawn.CanReserve(patient, 1, -1, null, forced))
{
return false;
}
- // Check for our energy source
- if (Ext == null || Ext.energySourceDef == null)
+ if (!TryFindBestEnergySourceFor(pawn, patient, out _, out _))
{
- Log.ErrorOnce("WorkGiver_FeedWulaPatient is missing the DefModExtension with a valid energySourceDef.", def.GetHashCode());
- return false;
- }
-
- if (!FindBestEnergySourceFor(pawn, patient, out _, out _))
- {
- // Mimic vanilla: Provide a reason for failure.
- JobFailReason.Is("NoFood".Translate()); // Using vanilla translation key for simplicity
+ JobFailReason.Is("NoWulaEnergyToFeed".Translate(patient.LabelShort, patient));
return false;
}
@@ -85,39 +66,30 @@ namespace WulaFallenEmpire
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
{
Pawn patient = (Pawn)t;
- if (FindBestEnergySourceFor(pawn, patient, out Thing energySource, out _))
+ if (TryFindBestEnergySourceFor(pawn, patient, out Thing energySource, out _))
{
Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_FeedWulaPatient"), energySource, patient);
- job.count = 1; // Energy cores are single-use.
+ job.count = 1;
return job;
}
return null;
}
- private bool FindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing foodSource, out ThingDef foodDef)
+ private bool TryFindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing energySource, out ThingDef energyDef)
{
- foodSource = null;
- foodDef = null;
+ energySource = null;
+ energyDef = null;
- if (Ext == null || Ext.energySourceDef == 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)
{
- return false;
- }
-
- // CRITICAL vanilla check is embedded here: CanReserve(x) on the food source itself.
- 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)
- );
-
- if (foodSource != null)
- {
- foodDef = foodSource.def;
+ energySource = thing;
+ energyDef = thing.def;
return true;
}
diff --git a/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs b/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs
index 1059a476..ceac6c22 100644
--- a/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs
+++ b/Source/WulaFallenEmpire/WorkGiver_Warden_DeliverEnergy.cs
@@ -1,115 +1,50 @@
using RimWorld;
using Verse;
using Verse.AI;
+using System.Linq;
namespace WulaFallenEmpire
{
- public class WorkGiver_Warden_DeliverEnergy : WorkGiver_Scanner
+ public class WorkGiver_Warden_DeliverEnergy : WorkGiver_Warden
{
- private WorkGiverDefExtension_FeedWula ext;
-
- private WorkGiverDefExtension_FeedWula Ext
- {
- get
- {
- if (ext == null)
- {
- ext = def.GetModExtension();
- }
- return ext;
- }
- }
-
- 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)
- {
- Pawn prisoner = t as Pawn;
-
- if (prisoner == null || prisoner == pawn || !prisoner.IsPrisonerOfColony || !prisoner.guest.CanBeBroughtFood)
- {
- return false;
- }
-
- Need_WulaEnergy energyNeed = prisoner.needs.TryGetNeed();
- if (energyNeed == null)
- {
- return false;
- }
-
- NeedDefExtension_Energy ext = energyNeed.def.GetModExtension();
- float threshold = (ext != null) ? ext.deliverEnergyThreshold : 0.5f;
-
- if (energyNeed.CurLevelPercentage > threshold)
- {
- 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;
- }
-
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
{
- Pawn prisoner = (Pawn)t;
- if (FindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
+ if (!(t is Pawn prisoner) || !ShouldTakeCareOfPrisoner(pawn, prisoner))
{
- Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, energySource, prisoner);
- job.count = 1;
- job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, energySource);
- return job;
+ return null;
}
- return null;
+
+ if (!WardenFeedUtility.ShouldBeFed(prisoner) || prisoner.health.hediffSet.HasHediff(DefDatabase.GetNamed("WULA_ChargingHediff")))
+ {
+ return null;
+ }
+
+ if (!TryFindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
+ {
+ return null;
+ }
+
+ Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, energySource, prisoner);
+ job.count = 1;
+ job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, energySource);
+ return job;
}
- private bool FindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing foodSource, out ThingDef foodDef)
+ private bool TryFindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing energySource, out ThingDef energyDef)
{
- foodSource = null;
- foodDef = null;
+ energySource = null;
+ energyDef = null;
- if (Ext == null || Ext.energySourceDef == 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)
{
- 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;
+ energySource = thing;
+ energyDef = thing.def;
return true;
}
diff --git a/Source/WulaFallenEmpire/WorkGiver_Warden_FeedWula.cs b/Source/WulaFallenEmpire/WorkGiver_Warden_FeedWula.cs
index 500b13ea..c5f0caad 100644
--- a/Source/WulaFallenEmpire/WorkGiver_Warden_FeedWula.cs
+++ b/Source/WulaFallenEmpire/WorkGiver_Warden_FeedWula.cs
@@ -1,111 +1,61 @@
using RimWorld;
using Verse;
using Verse.AI;
+using System.Linq;
namespace WulaFallenEmpire
{
- public class WorkGiver_Warden_FeedWula : WorkGiver_Scanner
+ public class WorkGiver_Warden_FeedWula : WorkGiver_Warden
{
- private WorkGiverDefExtension_FeedWula ext;
-
- private WorkGiverDefExtension_FeedWula Ext
- {
- get
- {
- if (ext == null)
- {
- ext = def.GetModExtension();
- }
- return ext;
- }
- }
-
- 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)
- {
- Pawn prisoner = t as Pawn;
-
- // Basic validation, similar to vanilla's WorkGiver_Warden_Feed
- if (prisoner == null || prisoner == pawn || !prisoner.IsPrisonerOfColony || !prisoner.guest.CanBeBroughtFood)
- {
- return false;
- }
-
- // Our custom check: Is the Wula in shutdown?
- Need_WulaEnergy energyNeed = prisoner.needs.TryGetNeed();
- if (energyNeed == null || !energyNeed.IsShutdown)
- {
- return false;
- }
-
- // Vanilla check: Is the prisoner unable to feed themselves?
- if (!WardenFeedUtility.ShouldBeFed(prisoner))
- {
- return false;
- }
-
- // CRITICAL vanilla check: Can the warden reserve the prisoner?
- if (!pawn.CanReserve(prisoner, 1, -1, null, forced))
- {
- return false;
- }
-
- // Check for our energy source
- if (Ext == null || Ext.energySourceDef == null)
- {
- Log.ErrorOnce("WorkGiver_Warden_FeedWula 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;
- }
-
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
{
- Pawn prisoner = (Pawn)t;
- if (FindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
+ if (!(t is Pawn prisoner) || !ShouldFeed(pawn, prisoner))
{
- Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_FeedWulaPatient"), energySource, prisoner);
- job.count = 1;
- return job;
+ return null;
}
- return null;
+
+ Need_WulaEnergy energyNeed = prisoner.needs.TryGetNeed();
+ var extension = def.GetModExtension();
+ if (energyNeed == null || energyNeed.CurLevelPercentage >= extension.feedThreshold)
+ {
+ return null;
+ }
+
+ if (prisoner.health.hediffSet.HasHediff(DefDatabase.GetNamed("WULA_ChargingHediff")))
+ {
+ return null;
+ }
+
+ if (!TryFindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
+ {
+ return null;
+ }
+
+ Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_FeedWulaPatient"), energySource, prisoner);
+ job.count = 1;
+ return job;
}
- private bool FindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing foodSource, out ThingDef foodDef)
+ private bool ShouldFeed(Pawn warden, Pawn prisoner)
{
- foodSource = null;
- foodDef = null;
+ return prisoner.IsPrisonerOfColony && prisoner.guest.CanBeBroughtFood && prisoner.needs.TryGetNeed() != null;
+ }
- if (Ext == null || Ext.energySourceDef == null)
+ private bool TryFindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing energySource, out ThingDef energyDef)
+ {
+ 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)
{
- 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)
- );
-
- if (foodSource != null)
- {
- foodDef = foodSource.def;
+ energySource = thing;
+ energyDef = thing.def;
return true;
}
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index b389c7da..7f3f35ce 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -79,13 +79,9 @@
-
-
-
-
+
-