diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 76101c87..0956495e 100644 Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/Defs/PawnKinds/PawnKinds_Wula.xml b/1.6/Defs/PawnKinds/PawnKinds_Wula.xml index 5edc3128..dc6dabe2 100644 --- a/1.6/Defs/PawnKinds/PawnKinds_Wula.xml +++ b/1.6/Defs/PawnKinds/PawnKinds_Wula.xml @@ -30,7 +30,6 @@
  • Wula_Apparel_Init
  • -
  • WULA_EmergencyEnergyRestore
  • 0 0 @@ -74,7 +73,6 @@
  • Wula_Apparel_Init
  • -
  • WULA_EmergencyEnergyRestore
  • diff --git a/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml b/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml deleted file mode 100644 index 03f61d51..00000000 --- a/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml +++ /dev/null @@ -1,247 +0,0 @@ - - - - - WULA_ShieldBelt - - 乌拉帝国的个人护盾装置,可以产生动量排斥场来阻挡来袭的投射物。护盾可以通过能力按钮开关,并且具有可配置的护盾值和范围。 - Ultra - - WULA_Synth_Weapon_2_Stun_Technology - UnfinishedBelt - -
  • WULA_Cube_Productor_Energy
  • -
    - - 8 - -
    - - Things/Item/Equipment/WeaponMelee/Knife - Graphic_Single - - - 50 - 25 - 3 - 1 - - - 12000 - 1.2 - 0.4 - - -
  • Apparel
  • -
    - - -
  • Waist
  • -
    - Things/Pawn/Humanlike/Apparel/ShieldBelt/ShieldBelt - -
  • Belt
  • -
    - -
  • BeltDefensePop
  • -
    - -
  • Soldier
  • -
    -
    - -
  • - - 200 - - 3.0 - - true - - false - - false - - false - - (0.2, 0.6, 1.0) - - 5.0 - - 300 - - BulletShield_Ambience - - BulletShieldGenerator_Reactivate - - false - - true -
  • -
    -
    - - - - WULA_ShieldBelt_Advanced - - 乌拉帝国的高级个人护盾装置,具有更强的护盾值、更大的范围,并且可以抵抗近战攻击和EMP伤害。 - Ultra - - WULA_Synth_Weapon_2_Stun_Technology - UnfinishedBelt - -
  • WULA_Cube_Productor_Energy
  • -
    - - 10 - -
    - - Things/Item/Equipment/WeaponMelee/Knife - Graphic_Single - - - 100 - 50 - 6 - 2 - 10 - - - 20000 - 2.0 - 0.2 - - -
  • Apparel
  • -
    - - -
  • Waist
  • -
    - Things/Pawn/Humanlike/Apparel/ShieldBelt/ShieldBelt - -
  • Belt
  • -
    - -
  • BeltDefensePop
  • -
    - -
  • Soldier
  • -
    -
    - -
  • - - 400 - - 4.5 - - true - - true - - true - - true - - (1.0, 0.6, 0.2) - - 8.0 - - 180 - - BulletShield_Ambience - - BulletShieldGenerator_Reactivate - - false - - true -
  • -
    -
    - - - - WULA_ShieldBelt_Deflector - - 乌拉帝国的偏转型个人护盾装置,采用低角护盾技术,不会被破坏但只能偏转投射物。这种护盾永远不会过载,但也无法完全阻挡攻击。 - Ultra - - WULA_Synth_Weapon_2_Stun_Technology - UnfinishedBelt - -
  • WULA_Cube_Productor_Energy
  • -
    - - 6 - -
    - - Things/Item/Equipment/WeaponMelee/Knife - Graphic_Single - - - 30 - 15 - 2 - 1 - - - 8000 - 0.8 - 0.4 - - -
  • Apparel
  • -
    - - -
  • Waist
  • -
    - Things/Pawn/Humanlike/Apparel/ShieldBelt/ShieldBelt - -
  • Belt
  • -
    - -
  • BeltDefensePop
  • -
    - -
  • Soldier
  • -
    -
    - -
  • - - 100 - - 2.5 - - true - - false - - false - - false - - (0.6, 1.0, 0.6) - - 0 - - 0 - - BulletShield_Ambience - - BulletShieldGenerator_Reactivate - - true - - false -
  • -
    -
    - -
    \ No newline at end of file diff --git a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml index b7ca98e0..d0e7ff40 100644 --- a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml +++ b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml @@ -1,24 +1,492 @@ - + WULA_Humanlike - -
  • - 0.5 - 0.1 - 5.0 - 9.5 + + +
  • + +
  • + +
  • + SatisfyingNeeds + +
  • + +
  • +
    + + - + + +
  • + + +
  • + true +
  • + + +
  • + SatisfyingNeeds + +
  • + +
  • + +
  • + +
  • +
  • + +
  • + + + + +
  • + +
  • +
  • - Humanlike + Downed
  • -
  • - HumanlikeConstant + BurningResponse
  • +
  • + MentalStateCritical +
  • + + +
  • + Abilities_Escape +
  • + + +
  • + + +
  • + MentalStateNonCritical +
  • + + +
  • + RopedPawn +
  • + + +
  • + Humanlike_PostMentalState +
  • + + +
  • + + +
  • + +
  • + DraftedOrder + +
  • +
  • + +
  • + + + + +
  • + +
  • + +
  • + + +
  • + HighPriority + +
  • + LordDuty +
  • + + + + +
  • + Humanlike_PostDuty +
  • + + +
  • + true + + +
  • + true + + +
  • + Idle + +
  • + Deadly +
  • + + + + +
  • + Escaping + +
  • + +
  • + + + + +
  • + +
  • + Misc + +
  • + Walk +
  • + + + + + +
  • + RestingForMedicalReasons + +
  • + +
  • + +
  • + ChangingApparel + +
  • + +
  • + +
  • + SatisfyingNeeds + +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • + + + + +
  • + + +
  • + true + +
  • + Escaping + +
  • + +
  • + + + +
  • + Idle + +
  • + Deadly +
  • + + + + + +
  • + Idle + +
  • + Deadly +
  • + + + +
  • + +
  • + + +
  • + + +
  • + + +
  • +
  • + + +
  • + + +
  • + true + true +
  • + + +
  • + WULA_Energy + 0.5 + true + +
  • + SatisfyingNeeds + +
  • + true + 0.5 + 0.1 + 5 + 9.5 + 30 + 1 +
  • + + + + + + +
  • + Misc + +
  • + +
  • + +
  • + MediumPriority + +
  • + LordDuty +
  • + + + + +
  • + true +
  • + + +
  • + ChangingApparel + +
  • + true +
  • + + + + +
  • + +
  • + +
  • + + +
  • + + +
  • + TakeForInventoryStock + +
  • + true +
  • + + + + +
  • + UnloadingOwnInventory + +
  • + +
  • + + +
  • + WULA_Energy + 0.6 + true + +
  • + true + 0.6 + 2 +
  • + + + + + + +
  • + + +
  • + Humanlike_PreMain +
  • + + +
  • + +
  • + MainColonistBehaviorCore + true +
  • + + + +
  • + WildMan + +
  • + MainWildManBehaviorCore + true +
  • + + + + +
  • + Humanlike_PostMain +
  • + + +
  • + +
  • + Idle + + +
  • + Joy + 0.9 + true + +
  • + +
  • + + +
  • + None +
  • + + + + + + +
  • + WildMan + +
  • + Idle + + +
  • + Deadly + 120~240 +
  • + + + + + + +
  • + +
  • + +
  • + RestingForMedicalReasons + +
  • + +
  • + +
  • + Misc + +
  • + Walk +
  • + + + + + + + + +
  • + true + +
  • + Misc + +
  • + Walk +
  • + + + + + + +
  • + Idle + +
  • + Deadly +
  • + + + +
  • diff --git a/Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml b/Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml new file mode 100644 index 00000000..334455e6 --- /dev/null +++ b/Languages/ChineseSimplified (简体中文)/Keyed/WULA_SkillTrainer.xml @@ -0,0 +1,7 @@ + + + + {0}的{1}技能获得了经验。 + {0}的{1}技能经验减少了。 + + diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo index 695c7b1c..20a87eb6 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 47445392..5decc927 100644 --- a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json +++ b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json @@ -2,12 +2,28 @@ "Version": 1, "WorkspaceRootPath": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\", "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\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\\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\\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}", + "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}" }, { @@ -17,10 +33,6 @@ { "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}", "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:mechanitorpatch.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}" } ], "DocumentGroupContainers": [ @@ -30,15 +42,66 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 6, + "SelectedChildIndex": 2, "Children": [ { "$type": "Bookmark", "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "CompUseEffect_WulaSkillTrainer.cs", + "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\CompUseEffect_WulaSkillTrainer.cs", + "RelativeDocumentMoniker": "CompUseEffect_WulaSkillTrainer.cs", + "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\CompUseEffect_WulaSkillTrainer.cs", + "RelativeToolTip": "CompUseEffect_WulaSkillTrainer.cs", + "ViewState": "AQIAAEAAAAAAAAAAAAAUwFMAAAABAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-07-22T07:52:56.407Z", + "EditorCaption": "" + }, + { + "$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, + "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", + "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Building_Wula_DarkEnergy_Engine.cs", + "RelativeToolTip": "Building_Wula_DarkEnergy_Engine.cs", + "ViewState": "AQIAABUAAAAAAAAAAAAIwAAAAAAAAAAA", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-07-14T12:24:18.86Z" + }, + { + "$type": "Document", + "DocumentIndex": 5, "Title": "IngestPatch.cs", "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\IngestPatch.cs", "RelativeDocumentMoniker": "IngestPatch.cs", @@ -46,12 +109,11 @@ "RelativeToolTip": "IngestPatch.cs", "ViewState": "AQIAACEAAAAAAAAAAAAowEwAAAAAAAAA", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-07-20T17:09:27.916Z", - "EditorCaption": "" + "WhenOpened": "2025-07-20T17:09:27.916Z" }, { "$type": "Document", - "DocumentIndex": 2, + "DocumentIndex": 6, "Title": "HediffComp_RegenerateBackstory.cs", "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\HediffComp_RegenerateBackstory.cs", "RelativeDocumentMoniker": "HediffComp_RegenerateBackstory.cs", @@ -63,15 +125,16 @@ }, { "$type": "Document", - "DocumentIndex": 4, + "DocumentIndex": 3, "Title": "WulaFallenEmpireMod.cs", "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WulaFallenEmpireMod.cs", "RelativeDocumentMoniker": "WulaFallenEmpireMod.cs", "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\WulaFallenEmpireMod.cs", "RelativeToolTip": "WulaFallenEmpireMod.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAABQAAAAAAAAA", + "ViewState": "AQIAAAAAAAAAAAAAAAAAAA4AAAA+AAAA", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-07-18T10:23:17.898Z" + "WhenOpened": "2025-07-18T10:23:17.898Z", + "EditorCaption": "" }, { "$type": "Bookmark", @@ -79,7 +142,7 @@ }, { "$type": "Document", - "DocumentIndex": 3, + "DocumentIndex": 7, "Title": "MechanitorPatch.cs", "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\MechanitorPatch.cs", "RelativeDocumentMoniker": "MechanitorPatch.cs", @@ -88,19 +151,6 @@ "ViewState": "AQIAAAAAAAAAAAAAAAAAACEAAAAJAAAA", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "WhenOpened": "2025-07-18T10:20:31.368Z" - }, - { - "$type": "Document", - "DocumentIndex": 0, - "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", - "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Building_Wula_DarkEnergy_Engine.cs", - "RelativeToolTip": "Building_Wula_DarkEnergy_Engine.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-07-14T12:24:18.86Z", - "EditorCaption": "" } ] } diff --git a/Source/WulaFallenEmpire/CompProperties_WulaShieldBelt.cs b/Source/WulaFallenEmpire/CompProperties_WulaShieldBelt.cs deleted file mode 100644 index 6b926f1b..00000000 --- a/Source/WulaFallenEmpire/CompProperties_WulaShieldBelt.cs +++ /dev/null @@ -1,31 +0,0 @@ -using RimWorld; -using UnityEngine; -using Verse; -using Verse.Sound; - -namespace WulaFallenEmpire -{ - public class CompProperties_WulaShieldBelt : CompProperties - { - public int maxShieldHitPoints = 200; - public float shieldRadius = 3.0f; - public bool interceptGroundProjectiles = true; - public bool interceptAirProjectiles = false; - public bool interceptMeleeAttacks = false; - public bool empImmune = false; - public Color shieldColor = new Color(0.2f, 0.6f, 1.0f); - public float rechargeRate = 5.0f; - public int rechargeCooldownTicks = 300; - public SoundDef activeSound; - public EffecterDef reactivateEffect; - public bool startEnabled = false; - - // 护盾模式:true = 有生命值模式(可被破坏),false = 无生命值模式(类似低角护盾,只是偏转) - public bool useHitPointsMode = true; - - public CompProperties_WulaShieldBelt() - { - compClass = typeof(CompWulaShieldBelt); - } - } -} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/CompUseEffect_WulaSkillTrainer.cs b/Source/WulaFallenEmpire/CompUseEffect_WulaSkillTrainer.cs index c7a35a30..86fd91e6 100644 --- a/Source/WulaFallenEmpire/CompUseEffect_WulaSkillTrainer.cs +++ b/Source/WulaFallenEmpire/CompUseEffect_WulaSkillTrainer.cs @@ -58,7 +58,7 @@ namespace WulaFallenEmpire // 大火的技能掉得最少,保持默认值 skillRecord.Learn(-experienceLoss, true); // 减少经验 - Messages.Message("WULA_SkillTrainer_OtherSkillLost".Translate(usedBy.LabelShort, skillRecord.def.label), usedBy, MessageTypeDefOf.NegativeEvent); + Messages.Message("WULA_SkillTrainer_SkillLoss".Translate(usedBy.LabelShort, skillRecord.def.label), usedBy, MessageTypeDefOf.NegativeEvent); } } } diff --git a/Source/WulaFallenEmpire/CompWulaShieldBelt.cs b/Source/WulaFallenEmpire/CompWulaShieldBelt.cs deleted file mode 100644 index 7339e8f7..00000000 --- a/Source/WulaFallenEmpire/CompWulaShieldBelt.cs +++ /dev/null @@ -1,308 +0,0 @@ -using RimWorld; -using System.Collections.Generic; -using UnityEngine; -using Verse; -using Verse.Sound; - -namespace WulaFallenEmpire -{ - [StaticConstructorOnStartup] - public class CompWulaShieldBelt : ThingComp - { - private float shieldHitPoints; - private int ticksToReset = -1; - private int lastKeepDisplayTick = -9999; - private Vector3 impactAngleVect; - private int lastAbsorbDamageTick = -9999; - private Sustainer sustainer; - // 静态构造函数加载材质 - private static readonly Material BubbleMat = MaterialPool.MatFrom("Other/ShieldBubble", ShaderDatabase.Transparent, Color.white); - - public CompProperties_WulaShieldBelt Props => (CompProperties_WulaShieldBelt)props; - - public float ShieldHitPoints => shieldHitPoints; - public float ShieldMaxHitPoints => Props.maxShieldHitPoints; - - private bool ShouldDisplay - { - get - { - Pawn wearer = GetWearer(); - return wearer != null && wearer.Spawned && (wearer.Drafted || (wearer.Faction != null && wearer.Faction.IsPlayer) || Find.TickManager.TicksGame < lastKeepDisplayTick + 50); - } - } - - public override void PostExposeData() - { - base.PostExposeData(); - Scribe_Values.Look(ref shieldHitPoints, "shieldHitPoints", 0f); - Scribe_Values.Look(ref ticksToReset, "ticksToReset", -1); - } - - public override void PostSpawnSetup(bool respawningAfterLoad) - { - base.PostSpawnSetup(respawningAfterLoad); - if (!respawningAfterLoad) - { - shieldHitPoints = Props.maxShieldHitPoints; - } - } - - public override void CompTick() - { - base.CompTick(); - - Pawn wearer = GetWearer(); - if (wearer == null) return; - - if (sustainer == null && Props.activeSound != null) - { - sustainer = Props.activeSound.TrySpawnSustainer(SoundInfo.InMap(wearer, MaintenanceType.PerTick)); - } - sustainer?.Maintain(); - - if (ticksToReset > 0) - { - ticksToReset--; - if (ticksToReset <= 0) - { - Reset(); - } - } - else if (Props.useHitPointsMode && shieldHitPoints < Props.maxShieldHitPoints) - { - shieldHitPoints += Props.rechargeRate / 60f; // 每秒恢复 - if (shieldHitPoints > Props.maxShieldHitPoints) - { - shieldHitPoints = Props.maxShieldHitPoints; - } - } - } - - public override void PostDraw() - { - base.PostDraw(); - if (ShouldDisplay) - { - float num = Mathf.Lerp(1.2f, 1.55f, shieldHitPoints / Props.maxShieldHitPoints); - Vector3 drawPos = GetWearer().Drawer.DrawPos; - drawPos.y = AltitudeLayer.MoteOverhead.AltitudeFor(); - int num2 = Find.TickManager.TicksGame - lastAbsorbDamageTick; - if (num2 < 8) - { - float num3 = (8 - num2) / 8f * 0.05f; - drawPos += impactAngleVect * num3; - num -= num3; - } - - float alpha; - if (Props.useHitPointsMode) - { - // 生命值模式:透明度根据护盾生命值变化 - alpha = Mathf.Lerp(0.2f, 0.7f, shieldHitPoints / Props.maxShieldHitPoints); - } - else - { - // 偏转模式:固定透明度,稍微闪烁效果 - alpha = 0.4f + Mathf.Sin(Time.time * 2f) * 0.1f; - } - Color color = Props.shieldColor; - color.a = alpha; - - Matrix4x4 matrix = default(Matrix4x4); - matrix.SetTRS(drawPos, Quaternion.identity, Vector3.one * num * Props.shieldRadius); - Graphics.DrawMesh(MeshPool.plane10, matrix, BubbleMat, 0, null, 0, MaterialPropertyBlock); - } - } - - private MaterialPropertyBlock materialPropertyBlock; - private MaterialPropertyBlock MaterialPropertyBlock - { - get - { - if (materialPropertyBlock == null) - { - materialPropertyBlock = new MaterialPropertyBlock(); - } - materialPropertyBlock.SetColor(ShaderPropertyIDs.Color, Props.shieldColor); - return materialPropertyBlock; - } - } - - public bool CheckIntercept(Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos) - { - // 如果使用生命值模式且护盾已破坏,则不拦截 - if (Props.useHitPointsMode && shieldHitPoints <= 0f) - return false; - - Pawn wearer = GetWearer(); - if (wearer == null || !wearer.Spawned) - return false; - - if (!Props.interceptGroundProjectiles && !projectile.def.projectile.flyOverhead) - return false; - - if (!Props.interceptAirProjectiles && projectile.def.projectile.flyOverhead) - return false; - - Vector3 center = wearer.TrueCenter(); - float radius = Props.shieldRadius; - - // 简单检查:如果射线起点和终点都在圆外,且连线不穿过圆,则不相交 - float distanceFromLastPos = Vector3.Distance(lastExactPos, center); - float distanceFromNewPos = Vector3.Distance(newExactPos, center); - - if (distanceFromLastPos > radius && distanceFromNewPos > radius) - { - // 计算点到线段的最短距离 - Vector3 line = newExactPos - lastExactPos; - float lineLength = line.magnitude; - Vector3 lineDirection = line / lineLength; - float projection = Mathf.Clamp(Vector3.Dot(center - lastExactPos, lineDirection), 0f, lineLength); - Vector3 closestPoint = lastExactPos + lineDirection * projection; - float distanceToLine = Vector3.Distance(center, closestPoint); - - if (distanceToLine > radius) - return false; - } - - lastKeepDisplayTick = Find.TickManager.TicksGame + 40; - - // 根据模式处理伤害 - if (Props.useHitPointsMode) - { - // 生命值模式:吸收伤害并可能破坏护盾 - AbsorbDamage(projectile.DamageAmount, projectile.ExactPosition); - } - else - { - // 偏转模式:只是偏转,不消耗护盾生命值 - DeflectProjectile(projectile.ExactPosition); - } - - return true; - } - - public bool CheckMeleeIntercept(DamageInfo dinfo, Pawn attacker) - { - if (!Props.interceptMeleeAttacks || shieldHitPoints <= 0f) - return false; - - Pawn wearer = GetWearer(); - if (wearer == null || !wearer.Spawned) - return false; - - lastKeepDisplayTick = Find.TickManager.TicksGame + 40; - AbsorbDamage(dinfo.Amount, attacker.Position.ToVector3()); - return true; - } - - private void AbsorbDamage(float damage, Vector3 impactPos) - { - if (Props.empImmune && damage > 0f) - { - // EMP免疫时减少EMP伤害 - damage *= 0.1f; - } - - // 只有在生命值模式下才扣除护盾生命值 - if (Props.useHitPointsMode) - { - shieldHitPoints -= damage; - } - - lastAbsorbDamageTick = Find.TickManager.TicksGame; - - Pawn wearer = GetWearer(); - if (wearer != null) - { - impactAngleVect = Vector3Utility.HorizontalVectorFromAngle((impactPos - wearer.TrueCenter()).AngleFlat() + 180f); - } - - // 只有在生命值模式下才会破坏护盾 - if (Props.useHitPointsMode && shieldHitPoints <= 0f) - { - Break(); - } - } - - private void DeflectProjectile(Vector3 impactPos) - { - // 偏转模式:只显示视觉效果,不消耗护盾生命值 - lastAbsorbDamageTick = Find.TickManager.TicksGame; - - Pawn wearer = GetWearer(); - if (wearer != null) - { - impactAngleVect = Vector3Utility.HorizontalVectorFromAngle((impactPos - wearer.TrueCenter()).AngleFlat() + 180f); - - // 播放偏转特效 - FleckMaker.ThrowLightningGlow(impactPos, wearer.Map, 0.5f); - } - } - - private void Break() - { - shieldHitPoints = 0f; - ticksToReset = Props.rechargeCooldownTicks; - sustainer?.End(); - sustainer = null; - - Pawn wearer = GetWearer(); - if (wearer != null && wearer.Map != null) - { - FleckMaker.Static(wearer.TrueCenter(), wearer.Map, FleckDefOf.ExplosionFlash, 12f); - for (int i = 0; i < 6; i++) - { - FleckMaker.ThrowDustPuff(wearer.TrueCenter() + Vector3Utility.HorizontalVectorFromAngle(Rand.Range(0, 360)) * Rand.Range(0.3f, 0.6f), wearer.Map, Rand.Range(0.8f, 1.2f)); - } - } - } - - private void Reset() - { - if (parent.Spawned) - { - SoundDefOf.EnergyShield_Reset.PlayOneShot(new TargetInfo(parent.Position, parent.Map)); - FleckMaker.ThrowLightningGlow(GetWearer().TrueCenter(), parent.Map, 3f); - - if (Props.reactivateEffect != null) - { - Effecter effecter = Props.reactivateEffect.Spawn(parent.Position, parent.Map); - effecter.Trigger(new TargetInfo(parent.Position, parent.Map), TargetInfo.Invalid); - effecter.Cleanup(); - } - } - shieldHitPoints = Props.maxShieldHitPoints; - } - - - private Pawn GetWearer() - { - if (parent is Apparel apparel) - { - return apparel.Wearer; - } - return null; - } - - // 添加初始化方法,确保护盾值正确设置 - public override void Initialize(CompProperties props) - { - base.Initialize(props); - shieldHitPoints = ((CompProperties_WulaShieldBelt)props).maxShieldHitPoints; - } - - public override string CompInspectStringExtra() - { - if (Props.useHitPointsMode) - { - return $"护盾: {shieldHitPoints:F0} / {Props.maxShieldHitPoints} (生命值模式)"; - } - else - { - return "护盾: 激活 (偏转模式)"; - } - } - } -} diff --git a/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs b/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs index c3a50deb..371ba3b8 100644 --- a/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs +++ b/Source/WulaFallenEmpire/JobDriver_FeedWulaPatient.cs @@ -30,16 +30,41 @@ namespace WulaFallenEmpire protected override IEnumerable MakeNewToils() { - // 失败条件:如果食物来源或病患被摧毁、为空或被禁止 - this.FailOn(() => FoodSource.DestroyedOrNull() || !FoodSource.IngestibleNow); + // 失败条件:如果病患被摧毁、为空或不在床上 this.FailOn(() => Patient.DestroyedOrNull()); - this.FailOn(() => !Patient.InBed()); // 确保病患在床上 + this.FailOn(() => !Patient.InBed()); - // Toil 1: 前往食物来源 + // Toil 0: 检查医生库存中是否有能量核心 + Toil checkInventoryToil = ToilMaker.MakeToil("CheckInventory"); + checkInventoryToil.initAction = delegate + { + 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); + .FailOnDespawnedNullOrForbidden(FoodSourceInd) + .FailOn(() => !pawn.CanReserve(FoodSource, 1, -1, null, false)); // 在这里预留食物来源 - // Toil 2: 拾取食物来源 + // Toil 2: 拾取食物来源 (如果库存中没有,则执行此Toil) yield return Toils_Haul.StartCarryThing(FoodSourceInd); // 使用 StartCarryThing 拾取物品 // Toil 3: 前往病患 @@ -51,12 +76,17 @@ namespace WulaFallenEmpire feedToil.initAction = delegate { Pawn actor = feedToil.actor; - Thing food = actor.carryTracker.CarriedThing; // 医生携带的食物 + Thing food = actor.carryTracker.CarriedThing; // 医生携带的食物 (从地图拾取) + // 如果医生没有携带食物,检查是否在库存中 (从库存获取) if (food == null) { - actor.jobs.EndCurrentJob(JobCondition.Incompletable); - return; + food = job.GetTarget(FoodSourceInd).Thing; // 此时FoodSourceInd应该指向库存中的物品 + if (food == null || !actor.inventory.innerContainer.Contains(food)) + { + actor.jobs.EndCurrentJob(JobCondition.Incompletable); + return; + } } // 获取乌拉能量需求 @@ -79,10 +109,25 @@ namespace WulaFallenEmpire energyNeed.CurLevel += ext.energyAmount; // 消耗物品 - food.Destroy(DestroyMode.Vanish); // 销毁医生携带的物品 - - // 移除医生携带的物品 - actor.carryTracker.innerContainer.ClearAndDestroyContents(); + 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); diff --git a/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs b/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs index 457814fc..6afba9df 100644 --- a/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs +++ b/Source/WulaFallenEmpire/JobDriver_IngestWulaEnergy.cs @@ -10,21 +10,41 @@ namespace WulaFallenEmpire public class JobDriver_IngestWulaEnergy : JobDriver { private const TargetIndex IngestibleSourceInd = TargetIndex.A; + private bool eatingFromInventory; // 新增字段 + + private Toil chewing; // 新增咀嚼Toil字段 private Thing IngestibleSource => job.GetTarget(IngestibleSourceInd).Thing; + // 新增咀嚼时间乘数属性 + private float ChewDurationMultiplier + { + get + { + Thing ingestibleSource = IngestibleSource; + // 假设乌拉能量核心也有EatingSpeed属性影响咀嚼速度,或者固定为1f + return 1f / pawn.GetStatValue(StatDefOf.EatingSpeed); + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref eatingFromInventory, "eatingFromInventory", defaultValue: false); + } + 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)) { return false; } - job.count = maxAmountToPickup; // 更新job.count以匹配实际预留数量 + job.count = maxAmountToPickup; } return true; } @@ -34,30 +54,28 @@ namespace WulaFallenEmpire // 失败条件:如果能量核心被摧毁、为空或被禁止 this.FailOn(() => IngestibleSource.DestroyedOrNull() || !IngestibleSource.IngestibleNow); - // Toil 1: 前往能量核心 - yield return Toils_Goto.GotoThing(IngestibleSourceInd, PathEndMode.ClosestTouch) - .FailOnDespawnedNullOrForbidden(IngestibleSourceInd); + // 初始化 eatingFromInventory + eatingFromInventory = pawn.inventory != null && pawn.inventory.Contains(IngestibleSource); - // Toil 2: 拾取能量核心并放入carryTracker - yield return Toils_Haul.StartCarryThing(IngestibleSourceInd); + // 定义咀嚼Toil + chewing = 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 3: “摄取”能量核心 (模拟咀嚼过程,可以是一个简单的延迟) - Toil chewToil = ToilMaker.MakeToil("ChewWulaEnergy"); - chewToil.initAction = delegate + // 根据是否从背包摄入,选择不同的Toil序列 + foreach (Toil item in PrepareToIngestToils(chewing)) { - // 设定一个短暂的“咀嚼”时间 - pawn.jobs.curDriver.ticksLeftThisToil = 60; // 1秒 - }; - chewToil.defaultCompleteMode = ToilCompleteMode.Delay; - yield return chewToil; + yield return item; + } - // Toil 4: 最终处理能量摄取 + yield return chewing; + + // 最终处理能量摄取 Toil finalizeToil = ToilMaker.MakeToil("FinalizeWulaEnergyIngest"); finalizeToil.initAction = delegate { Pawn actor = finalizeToil.actor; - // 从Pawn的carryTracker中获取能量核心 - Thing thing = actor.carryTracker.CarriedThing; + Thing thing = actor.carryTracker.CarriedThing; // 从carryTracker获取,因为Toils_Ingest.ChewIngestible会处理携带 if (thing == null) { @@ -65,7 +83,6 @@ namespace WulaFallenEmpire return; } - // 获取乌拉能量需求 Need_WulaEnergy energyNeed = actor.needs.TryGetNeed(); if (energyNeed == null) { @@ -73,7 +90,6 @@ namespace WulaFallenEmpire return; } - // 检查食物来源是否有自定义能量扩展 ThingDefExtension_EnergySource ext = thing.def.GetModExtension(); if (ext == null) { @@ -81,17 +97,30 @@ namespace WulaFallenEmpire return; } - // 补充乌拉的能量 energyNeed.CurLevel += ext.energyAmount; - - // 消耗物品 thing.Destroy(DestroyMode.Vanish); - - // 记录能量摄入 (可选,如果需要类似 NutritionEaten 的记录) - // actor.records.AddTo(RecordDefOf.NutritionEaten, ext.energyAmount); }; finalizeToil.defaultCompleteMode = ToilCompleteMode.Instant; yield return finalizeToil; } + + // 辅助方法,根据情况返回不同的Toil序列 + private IEnumerable PrepareToIngestToils(Toil chewToil) + { + if (eatingFromInventory) + { + yield return Toils_Misc.TakeItemFromInventoryToCarrier(pawn, IngestibleSourceInd); + } + else + { + // 类似原版JobDriver_Ingest的ToolUser逻辑 + 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_WulaPackEnergy.cs b/Source/WulaFallenEmpire/JobGiverDefExtension_WulaPackEnergy.cs new file mode 100644 index 00000000..30c3cb98 --- /dev/null +++ b/Source/WulaFallenEmpire/JobGiverDefExtension_WulaPackEnergy.cs @@ -0,0 +1,10 @@ +using Verse; + +namespace WulaFallenEmpire +{ + public class JobGiverDefExtension_WulaPackEnergy : DefModExtension + { + public float packEnergyThreshold = 0.5f; // 默认打包能量阈值 + public int packEnergyCount = 10; // 默认打包数量 + } +} diff --git a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs index c75c56b4..02d844a9 100644 --- a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs +++ b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs @@ -11,6 +11,8 @@ namespace WulaFallenEmpire public float emergencyThreshold = 0.1f; public float normalPriority = 5f; public float emergencyPriority = 9.5f; + public float searchRadius = 20f; // 添加 searchRadius + public int ingestCount = 1; // 添加 ingestCount public override ThinkNode DeepCopy(bool resolve = true) { @@ -19,6 +21,8 @@ namespace WulaFallenEmpire obj.emergencyThreshold = emergencyThreshold; obj.normalPriority = normalPriority; obj.emergencyPriority = emergencyPriority; + obj.searchRadius = searchRadius; + obj.ingestCount = ingestCount; return obj; } @@ -58,14 +62,26 @@ namespace WulaFallenEmpire return null; } - // 寻找最佳能量核心 + // 优先检查小人背包中的能量核心 + foreach (Thing t in pawn.inventory.innerContainer) + { + 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; + } + } + + // 如果背包中没有,则寻找最佳能量核心 Thing bestEnergySource = GenClosest.ClosestThingReachable( pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), // 扫描所有可搬运的物品 PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), - 9999f, + searchRadius, // 使用类中的 searchRadius (Thing t) => { // 检查物品是否是能量核心 @@ -92,7 +108,7 @@ namespace WulaFallenEmpire { // 创建摄取能量核心的Job Job job = JobMaker.MakeJob(DefDatabase.GetNamed("WULA_IngestWulaEnergy"), bestEnergySource); - job.count = 1; // 每次摄取一个 + job.count = ingestCount; // 使用类中的 ingestCount return job; } diff --git a/Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs new file mode 100644 index 00000000..21706f63 --- /dev/null +++ b/Source/WulaFallenEmpire/JobGiver_WulaPackEnergy.cs @@ -0,0 +1,86 @@ +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.AI; +using RimWorld; // For JobDefOf, ThingDefOf, StatDefOf + +namespace WulaFallenEmpire +{ + public class JobGiver_WulaPackEnergy : ThinkNode_JobGiver + { + public float packEnergyThreshold = 0.5f; // 默认打包能量阈值 + public int packEnergyCount = 2; // 默认打包数量 + + // 定义乌拉能量核心的ThingDef + private static ThingDef WULA_Charge_Cube_Def => ThingDef.Named("WULA_Charge_Cube"); + + public override ThinkNode DeepCopy(bool resolve = true) + { + JobGiver_WulaPackEnergy obj = (JobGiver_WulaPackEnergy)base.DeepCopy(resolve); + obj.packEnergyThreshold = packEnergyThreshold; + obj.packEnergyCount = packEnergyCount; + return obj; + } + + protected override Job TryGiveJob(Pawn pawn) + { + if (pawn.inventory == null) + { + return null; + } + + // 检查背包中是否有足够的能量核心,这里可以根据Need_WulaEnergy的当前值来判断是否需要打包 + // 简化逻辑:如果能量低于某个阈值,并且背包中没有能量核心,则尝试打包 + Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed(); + if (energyNeed == null) + { + return null; + } + + // 只有当能量低于阈值,并且背包中能量核心数量少于2个时,才尝试打包 + if (energyNeed.CurLevelPercentage > packEnergyThreshold || pawn.inventory.innerContainer.TotalStackCountOfDef(WULA_Charge_Cube_Def) >= 2) + { + return null; + } + + // 检查是否超重 + if (MassUtility.IsOverEncumbered(pawn)) + { + return null; + } + + // 寻找地图上可触及的WULA_Charge_Cube + Thing thing = GenClosest.ClosestThing_Regionwise_ReachablePrioritized( + pawn.Position, + pawn.Map, + ThingRequest.ForDef(WULA_Charge_Cube_Def), // 只寻找WULA_Charge_Cube + PathEndMode.ClosestTouch, + TraverseParms.For(pawn), + 20f, // 搜索距离 + delegate(Thing t) + { + // 检查物品是否被禁止,是否可预留,是否社交得体 + return !t.IsForbidden(pawn) && pawn.CanReserve(t) && t.IsSociallyProper(pawn); + }, + (Thing x) => 0f // 优先级,这里可以根据距离或其他因素调整 + ); + + if (thing == null) + { + return null; + } + + // 计算需要打包的数量,限制在1到2个 + int countToTake = Mathf.Min(thing.stackCount, 2); // 限制为最多2个 + if (WULA_Charge_Cube_Def != null) + { + countToTake = Mathf.Min(countToTake, WULA_Charge_Cube_Def.stackLimit); + } + + // 创建TakeInventory Job + Job job = JobMaker.MakeJob(JobDefOf.TakeInventory, thing); + job.count = countToTake; + return job; + } + } +} diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 4bb48509..b389c7da 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -82,13 +82,12 @@ - - - + + diff --git a/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs b/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs index 41cb256b..cb6a4608 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs +++ b/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs @@ -13,9 +13,6 @@ namespace WulaFallenEmpire // 初始化Harmony var harmony = new Harmony("tourswen.wulafallenempire"); // 替换为您的唯一Mod ID harmony.PatchAll(Assembly.GetExecutingAssembly()); - - // 手动应用护盾腰带的近战拦截补丁 - WulaShieldBeltPatches.ApplyMeleePatch(harmony); Log.Message("[WulaFallenEmpire] Harmony patches applied."); } diff --git a/Source/WulaFallenEmpire/WulaShieldBeltPatches.cs b/Source/WulaFallenEmpire/WulaShieldBeltPatches.cs deleted file mode 100644 index 3b706712..00000000 --- a/Source/WulaFallenEmpire/WulaShieldBeltPatches.cs +++ /dev/null @@ -1,97 +0,0 @@ -using HarmonyLib; -using RimWorld; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using Verse; - -namespace WulaFallenEmpire -{ - public static class WulaShieldBeltPatches - { - // 拦截投射物 - [HarmonyPatch(typeof(Projectile), "CheckForFreeInterceptBetween")] - [HarmonyPrefix] - public static bool CheckForFreeInterceptBetween_Prefix(Projectile __instance, Vector3 lastExactPos, Vector3 newExactPos, ref bool __result) - { - var map = __instance.Map; - if (map == null) return true; - - // 检查所有穿戴护盾腰带的pawn - var pawns = map.mapPawns.AllPawnsSpawned; - foreach (var pawn in pawns) - { - if (pawn.apparel?.WornApparel == null) continue; - - foreach (var apparel in pawn.apparel.WornApparel) - { - var shieldComp = apparel.GetComp(); - if (shieldComp != null && shieldComp.CheckIntercept(__instance, lastExactPos, newExactPos)) - { - // 使用反射调用protected方法 - typeof(Projectile).GetMethod("Impact", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) - .Invoke(__instance, new object[] { null, true }); - __result = true; - return false; - } - } - } - - return true; - } - - // 拦截近战攻击 - 使用Harmony的手动补丁方式 - public static void ApplyMeleePatch(Harmony harmony) - { - // 获取Thing.TakeDamage方法 - var originalMethod = typeof(Thing).GetMethod("TakeDamage", - System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - - if (originalMethod != null) - { - // 获取我们的前缀方法 - var prefixMethod = typeof(WulaShieldBeltPatches).GetMethod("TakeDamage_Manual_Prefix", - System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); - - // 应用补丁 - harmony.Patch(originalMethod, new HarmonyMethod(prefixMethod)); - } - } - - // 手动补丁方法 - public static bool TakeDamage_Manual_Prefix(Thing __instance, DamageInfo dinfo, ref DamageWorker.DamageResult __result) - { - // 只有当实例是Pawn时才执行护盾腰带的逻辑 - if (__instance is Pawn pawn) - { - if (pawn.apparel?.WornApparel == null) return true; - - // 检查是否有护盾腰带可以拦截这次攻击 - foreach (var apparel in pawn.apparel.WornApparel) - { - var shieldComp = apparel.GetComp(); - if (shieldComp != null && dinfo.Instigator is Pawn attacker) - { - if (shieldComp.CheckMeleeIntercept(dinfo, attacker)) - { - __result = new DamageWorker.DamageResult(); - return false; - } - } - } - } - - return true; - } - - // 为护盾腰带添加投射物拦截器接口支持 - [HarmonyPatch(typeof(CompProjectileInterceptor), "CheckIntercept")] - [HarmonyPostfix] - public static void CheckIntercept_Postfix(CompProjectileInterceptor __instance, Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos, ref bool __result) - { - if (__result) return; // 如果已经被拦截了就不需要再检查 - - // 这个补丁确保我们的护盾系统与原版的投射物拦截系统兼容 - } - } -}