From 15494e8a8e7a67364b255821b2c3c8ec4966fa8c Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Tue, 22 Jul 2025 19:07:21 +0800 Subject: [PATCH] =?UTF-8?q?=20=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/Assemblies/WulaFallenEmpire.dll | Bin 51200 -> 41984 bytes .../AbilityDefs/Abilities_WULA_Emergency.xml | 35 ----- 1.6/Defs/HediffDefs/Hediffs_WULA_Charging.xml | 25 ++++ .../HediffDefs/Hediffs_WULA_Emergency.xml | 31 ---- 1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml | 12 -- 1.6/Defs/ThingDefs/WULA_Item.xml | 9 +- 1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml | 12 +- 1.6/Defs/WorkGivers/Wula_WorkGivers.xml | 6 +- .../.vs/WulaFallenEmpire/v17/.suo | Bin 91648 -> 90624 bytes .../WulaFallenEmpire/v17/DocumentLayout.json | 93 ++++-------- ...ompAbilityEffect_EmergencyEnergyRestore.cs | 60 -------- ...roperties_AbilityEmergencyEnergyRestore.cs | 18 --- .../EmergencyAbilityPatches.cs | 122 ---------------- .../HediffComp_WulaCharging.cs | 65 +++++++++ .../Hediff_EmergencyEnergyRestore.cs | 71 ---------- .../JobDriver_CastEmergencyEnergyRestore.cs | 32 ----- .../JobDriver_FeedWulaPatient.cs | 122 +++------------- .../JobDriver_IngestWulaEnergy.cs | 80 +++-------- .../JobGiverDefExtension_WulaGetEnergy.cs | 12 -- .../JobGiver_WulaGetEnergy.cs | 105 ++++---------- Source/WulaFallenEmpire/Need_WulaEnergy.cs | 5 + .../WorkGiverDefExtension_FeedWula.cs | 3 +- .../WorkGiver_FeedWulaPatient.cs | 96 +++++-------- .../WorkGiver_Warden_DeliverEnergy.cs | 127 ++++------------- .../WorkGiver_Warden_FeedWula.cs | 134 ++++++------------ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 6 +- 26 files changed, 318 insertions(+), 963 deletions(-) delete mode 100644 1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml create mode 100644 1.6/Defs/HediffDefs/Hediffs_WULA_Charging.xml delete mode 100644 1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml delete mode 100644 1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml delete mode 100644 Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs delete mode 100644 Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs delete mode 100644 Source/WulaFallenEmpire/EmergencyAbilityPatches.cs create mode 100644 Source/WulaFallenEmpire/HediffComp_WulaCharging.cs delete mode 100644 Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs delete mode 100644 Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs delete mode 100644 Source/WulaFallenEmpire/JobGiverDefExtension_WulaGetEnergy.cs diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 0956495e4ab0eeeb2e58a1664f0e3e897bf975f8..5fdb18bb007a7b73893771eb55914205e4d62b75 100644 GIT binary patch literal 41984 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 YcX@tN{hh#%Uif$6_J5iDe@p}a4?-d~HUIzs literal 51200 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 - - - - 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 20a87eb67970806f069cc1387741da9799767e29..555d3d8c576b0ecbaa52b826b6a0ad31212f9010 100644 GIT binary patch delta 5799 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 delta 5875 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 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 @@ - - - - + -