diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index a51815b..12c871b 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml index ca0c8b3..e51fad1 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -1031,7 +1031,7 @@ ARA_Dissolver_Touch 在极近的范围内向目标泼洒溶脂强酸,目标的器官会快速分解,变成大量的虫蜜。因为准头很差,无法用于战场上,只能对不反抗的目标使用。 - ArachnaeSwarm/UI/Abilities/ARA_Fighter_Invisibility_jump + ArachnaeSwarm/UI/Abilities/ARA_Dissolver_Touch 1000 3 true @@ -1062,6 +1062,14 @@ 0.1 营养值不足,需要进食 +
  • + +
  • ARA_HiveMindMaster
  • +
  • ARA_HiveMindDrone
  • +
  • ARA_HiveMindWorker
  • + + ARA_BlacklistedHediff_Blocked +
  • CompAbilityEffect_GiveHediff ARA_Dissolver_Touch_Damage diff --git a/1.6/1.6/Defs/EvolutionDefs/ARA_Evolution.xml b/1.6/1.6/Defs/EvolutionDefs/ARA_Evolution.xml index 68eb296..12a4d5f 100644 --- a/1.6/1.6/Defs/EvolutionDefs/ARA_Evolution.xml +++ b/1.6/1.6/Defs/EvolutionDefs/ARA_Evolution.xml @@ -455,6 +455,7 @@
  • +
  • ARA_AcidSprayBurst
  • ARA_Dissolver_Touch
  • diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml index 890f454..087273d 100644 --- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml +++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml @@ -3,7 +3,7 @@ ARA_HiveMindMaster - 阿拉克涅女皇种是虫群意识的中心节点, 作为主脑统御整个阿拉克涅虫群。其体内拥有大量未分化的修复细胞,可以以常人无法想象的速度自行治愈所有的创伤。 + 阿拉克涅女皇种是虫巢的中心节点, 作为族群主脑统御阿拉克涅虫族。 HediffWithComps (0.8, 0.3, 0.8) @@ -21,6 +21,7 @@
  • Beauty
  • Comfort
  • Outdoors
  • +
  • Rest
  • ARA_ChitinArmor
  • @@ -64,7 +65,7 @@
  • Consciousness - 0.3 + 0.2
  • 0 diff --git a/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects_Titan.xml b/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects_Titan.xml index 8078c09..e3248a3 100644 --- a/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects_Titan.xml +++ b/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects_Titan.xml @@ -14,7 +14,7 @@ <color=#915A30><i>阿拉克涅虫群-泰坦触须\n泰坦触须是阿拉克涅虫群的主力军团,包含阿拉克涅虫群中最坚韧、最具有适应力的族群,承担在战场上维持战线的任务。这个分支下的虫群拥有均衡的攻防能力,擅长以硬碰硬的模式消灭对手。</i></color>\n\n允许女皇种孵化新的兽虫——暴屠种。\n\n阿拉克涅虫群 泰坦触须所有需要蓝图的科技,其研究只能通过基因试验卵进行。 3000 - 10.00 + 17.00 5.80
  • ARA_Technology_2HAG
  • @@ -29,8 +29,8 @@ <color=#915A30><i>阿拉克涅虫群-泰坦触须\n泰坦触须是阿拉克涅虫群的主力军团,包含阿拉克涅虫群中最坚韧、最具有适应力的族群,承担在战场上维持战线的任务。这个分支下的虫群拥有均衡的攻防能力,擅长以硬碰硬的模式消灭对手。</i></color>\n\n允许蜜罐种进行定向进化,抛弃孵化辅虫的能力,换取溶解囚犯和俘虏以快速换取虫蜜的溶脂强酸。\n\n阿拉克涅虫群 泰坦触须所有需要蓝图的科技,其研究只能通过基因试验卵进行。 500 - 10.00 - 5.80 + 17.00 + 0.30
  • ARA_Technology_7VXI
  • diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml index b9777ac..9e1eecc 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml @@ -1752,19 +1752,19 @@
  • ARA_Psi_Master
  • - - -
  • - PsychicAmplifier - Brain - 1 - false - true -
  • -
    + 1.0 + false + +
  • + +
  • PsychicAmplifier
  • + + Brain 1.0 false + First + true
  • 1.0 diff --git a/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Dissolver_Touch.png b/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Dissolver_Touch.png new file mode 100644 index 0000000..daa5b9b Binary files /dev/null and b/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Dissolver_Touch.png differ diff --git a/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Dissolver.png b/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Dissolver.png new file mode 100644 index 0000000..6d117f5 Binary files /dev/null and b/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Dissolver.png differ diff --git a/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Dissolver.sai2 b/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Dissolver.sai2 new file mode 100644 index 0000000..7fc87f8 Binary files /dev/null and b/Content/Textures/ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Dissolver.sai2 differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo index d991922..4043db4 100644 Binary files a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo and b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json index 4c51178..f9a668d 100644 --- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json +++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json @@ -3,80 +3,12 @@ "WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\", "Documents": [ { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\compabilityeffect_researchprereq.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\compabilityeffect_researchprereq.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\pawn_comps\\ara_comphediffgiver\\compproperties_hediffgiver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_comphediffgiver\\compproperties_hediffgiver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_spawner\\hediffcompproperties_spawner.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_spawner\\hediffcompproperties_spawner.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_spawner\\hediffcomp_spawner.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_spawner\\hediffcomp_spawner.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_gestaltnode\\hediffcomp_gestaltnode.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_gestaltnode\\hediffcomp_gestaltnode.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\pawn_comps\\ara_nodeswarmlifetime\\compnodeswarmlifetime.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_nodeswarmlifetime\\compnodeswarmlifetime.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\ara_launchmultiprojectile\\compproperties_abilitylaunchmultiprojectile.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_launchmultiprojectile\\compproperties_abilitylaunchmultiprojectile.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\ara_launchmultiprojectile\\compabilityeffect_launchmultiprojectile.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_launchmultiprojectile\\compabilityeffect_launchmultiprojectile.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ara_defof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_defof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\ara_launchmultiprojectile\\jobdriver_castabilitymaintainmultiprojectile.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_launchmultiprojectile\\jobdriver_castabilitymaintainmultiprojectile.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\ara_morphable\\compabilityeffect_transform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_morphable\\compabilityeffect_transform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\ara_psychicloadcost\\compabilityeffect_psychicloadcost.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_psychicloadcost\\compabilityeffect_psychicloadcost.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\ara_psychicloadcost\\compproperties_abilitypsychicloadcost.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_psychicloadcost\\compproperties_abilitypsychicloadcost.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\pawn_comps\\ara_pawnresearchblueprintreader\\gizmo_pawnresearchprogress.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_pawnresearchblueprintreader\\gizmo_pawnresearchprogress.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\pawn_comps\\ara_pawnresearchblueprintreader\\comp_pawnresearchblueprintreader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_pawnresearchblueprintreader\\comp_pawnresearchblueprintreader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_researchblueprintreader\\gizmo_researchprogress.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_researchblueprintreader\\gizmo_researchprogress.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\abilities\\psychicbrainburn\\compabilityeffect_psychicbrainburn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\psychicbrainburn\\compabilityeffect_psychicbrainburn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_researchblueprintreader\\researchblueprintdata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_researchblueprintreader\\researchblueprintdata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\pawn_comps\\ara_comphediffgiver\\comphediffgiver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_comphediffgiver\\comphediffgiver.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" } ], "DocumentGroupContainers": [ @@ -86,245 +18,36 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 0, + "SelectedChildIndex": 2, "Children": [ - { - "$type": "Document", - "DocumentIndex": 0, - "Title": "CompAbilityEffect_ResearchPrereq.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\CompAbilityEffect_ResearchPrereq.cs", - "RelativeDocumentMoniker": "Abilities\\CompAbilityEffect_ResearchPrereq.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\CompAbilityEffect_ResearchPrereq.cs", - "RelativeToolTip": "Abilities\\CompAbilityEffect_ResearchPrereq.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAABBAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T07:44:51.729Z", - "EditorCaption": "" - }, { "$type": "Bookmark", "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" }, - { - "$type": "Document", - "DocumentIndex": 2, - "Title": "HediffCompProperties_ProductionQueue.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "RelativeToolTip": "Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAARAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T07:21:19.792Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 4, - "Title": "HediffComp_ProductionQueue.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "RelativeToolTip": "Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAArAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T07:19:42.058Z", - "EditorCaption": "" - }, { "$type": "Document", "DocumentIndex": 1, - "Title": "HediffCompProperties_Spawner.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_Spawner\\HediffCompProperties_Spawner.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_Spawner\\HediffCompProperties_Spawner.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_Spawner\\HediffCompProperties_Spawner.cs", - "RelativeToolTip": "Hediffs\\ARA_Spawner\\HediffCompProperties_Spawner.cs", - "ViewState": "AgIAAFcAAAAAAAAAAADgv3gAAAApAAAAAAAAAA==", + "Title": "CompHediffGiver.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_CompHediffGiver\\CompHediffGiver.cs", + "RelativeDocumentMoniker": "Pawn_Comps\\ARA_CompHediffGiver\\CompHediffGiver.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_CompHediffGiver\\CompHediffGiver.cs", + "RelativeToolTip": "Pawn_Comps\\ARA_CompHediffGiver\\CompHediffGiver.cs", + "ViewState": "AgIAAFAAAAAAAAAAAAAQwBEAAAAAAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T07:09:01.203Z", + "WhenOpened": "2026-02-15T01:45:35.176Z" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "CompProperties_HediffGiver.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_CompHediffGiver\\CompProperties_HediffGiver.cs", + "RelativeDocumentMoniker": "Pawn_Comps\\ARA_CompHediffGiver\\CompProperties_HediffGiver.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_CompHediffGiver\\CompProperties_HediffGiver.cs", + "RelativeToolTip": "Pawn_Comps\\ARA_CompHediffGiver\\CompProperties_HediffGiver.cs", + "ViewState": "AgIAAAgAAAAAAAAAAAAAAC8AAAAWAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-02-15T01:43:54.125Z", "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 3, - "Title": "HediffComp_Spawner.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_Spawner\\HediffComp_Spawner.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_Spawner\\HediffComp_Spawner.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_Spawner\\HediffComp_Spawner.cs", - "RelativeToolTip": "Hediffs\\ARA_Spawner\\HediffComp_Spawner.cs", - "ViewState": "AgIAAFwAAAAAAAAAAAAvwHEAAAAoAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T07:08:13.475Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "CompNodeSwarmLifetime.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs", - "RelativeDocumentMoniker": "Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs", - "RelativeToolTip": "Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAANAAAAARAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T04:41:09.997Z" - }, - { - "$type": "Document", - "DocumentIndex": 5, - "Title": "HediffComp_GestaltNode.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs", - "RelativeToolTip": "Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs", - "ViewState": "AgIAABMAAAAAAAAAAAAAwBUAAAAVAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-14T02:36:39.249Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 9, - "Title": "ARA_DefOf.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_DefOf.cs", - "RelativeDocumentMoniker": "ARA_DefOf.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_DefOf.cs", - "RelativeToolTip": "ARA_DefOf.cs", - "ViewState": "AgIAAAYAAAAAAAAAAAAAACAAAAAkAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T08:26:42.851Z" - }, - { - "$type": "Document", - "DocumentIndex": 10, - "Title": "JobDriver_CastAbilityMaintainMultiProjectile.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_LaunchMultiProjectile\\JobDriver_CastAbilityMaintainMultiProjectile.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_LaunchMultiProjectile\\JobDriver_CastAbilityMaintainMultiProjectile.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_LaunchMultiProjectile\\JobDriver_CastAbilityMaintainMultiProjectile.cs", - "RelativeToolTip": "Abilities\\ARA_LaunchMultiProjectile\\JobDriver_CastAbilityMaintainMultiProjectile.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAA9AAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T08:25:54.467Z" - }, - { - "$type": "Document", - "DocumentIndex": 7, - "Title": "CompProperties_AbilityLaunchMultiProjectile.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_LaunchMultiProjectile\\CompProperties_AbilityLaunchMultiProjectile.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_LaunchMultiProjectile\\CompProperties_AbilityLaunchMultiProjectile.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_LaunchMultiProjectile\\CompProperties_AbilityLaunchMultiProjectile.cs", - "RelativeToolTip": "Abilities\\ARA_LaunchMultiProjectile\\CompProperties_AbilityLaunchMultiProjectile.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAABQAAAAsAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T08:25:52.233Z" - }, - { - "$type": "Document", - "DocumentIndex": 11, - "Title": "CompAbilityEffect_Transform.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_Morphable\\CompAbilityEffect_Transform.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_Morphable\\CompAbilityEffect_Transform.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_Morphable\\CompAbilityEffect_Transform.cs", - "RelativeToolTip": "Abilities\\ARA_Morphable\\CompAbilityEffect_Transform.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAXAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T08:25:48.115Z" - }, - { - "$type": "Document", - "DocumentIndex": 8, - "Title": "CompAbilityEffect_LaunchMultiProjectile.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_LaunchMultiProjectile\\CompAbilityEffect_LaunchMultiProjectile.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_LaunchMultiProjectile\\CompAbilityEffect_LaunchMultiProjectile.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_LaunchMultiProjectile\\CompAbilityEffect_LaunchMultiProjectile.cs", - "RelativeToolTip": "Abilities\\ARA_LaunchMultiProjectile\\CompAbilityEffect_LaunchMultiProjectile.cs", - "ViewState": "AgIAADEAAAAAAAAAAAASwKgAAAAWAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T08:25:25.05Z" - }, - { - "$type": "Document", - "DocumentIndex": 13, - "Title": "CompProperties_AbilityPsychicLoadCost.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_PsychicLoadCost\\CompProperties_AbilityPsychicLoadCost.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_PsychicLoadCost\\CompProperties_AbilityPsychicLoadCost.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_PsychicLoadCost\\CompProperties_AbilityPsychicLoadCost.cs", - "RelativeToolTip": "Abilities\\ARA_PsychicLoadCost\\CompProperties_AbilityPsychicLoadCost.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T07:48:29.02Z" - }, - { - "$type": "Document", - "DocumentIndex": 14, - "Title": "Gizmo_PawnResearchProgress.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Gizmo_PawnResearchProgress.cs", - "RelativeDocumentMoniker": "Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Gizmo_PawnResearchProgress.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Gizmo_PawnResearchProgress.cs", - "RelativeToolTip": "Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Gizmo_PawnResearchProgress.cs", - "ViewState": "AgIAAOoAAAAAAAAAAAAAAP8AAAAzAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T07:41:00.755Z" - }, - { - "$type": "Document", - "DocumentIndex": 12, - "Title": "CompAbilityEffect_PsychicLoadCost.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_PsychicLoadCost\\CompAbilityEffect_PsychicLoadCost.cs", - "RelativeDocumentMoniker": "Abilities\\ARA_PsychicLoadCost\\CompAbilityEffect_PsychicLoadCost.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_PsychicLoadCost\\CompAbilityEffect_PsychicLoadCost.cs", - "RelativeToolTip": "Abilities\\ARA_PsychicLoadCost\\CompAbilityEffect_PsychicLoadCost.cs", - "ViewState": "AgIAAFYAAAAAAAAAAAAcwGQAAAAJAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T07:04:17.954Z" - }, - { - "$type": "Document", - "DocumentIndex": 17, - "Title": "CompAbilityEffect_PsychicBrainburn.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\PsychicBrainburn\\CompAbilityEffect_PsychicBrainburn.cs", - "RelativeDocumentMoniker": "Abilities\\PsychicBrainburn\\CompAbilityEffect_PsychicBrainburn.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\PsychicBrainburn\\CompAbilityEffect_PsychicBrainburn.cs", - "RelativeToolTip": "Abilities\\PsychicBrainburn\\CompAbilityEffect_PsychicBrainburn.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAABTAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T07:04:16.513Z" - }, - { - "$type": "Document", - "DocumentIndex": 16, - "Title": "Gizmo_ResearchProgress.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\Gizmo_ResearchProgress.cs", - "RelativeDocumentMoniker": "Buildings\\Building_ResearchBlueprintReader\\Gizmo_ResearchProgress.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\Gizmo_ResearchProgress.cs", - "RelativeToolTip": "Buildings\\Building_ResearchBlueprintReader\\Gizmo_ResearchProgress.cs", - "ViewState": "AgIAACIAAAAAAAAAAAAswDAAAAAwAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T07:03:24.516Z" - }, - { - "$type": "Document", - "DocumentIndex": 18, - "Title": "ResearchBlueprintData.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\ResearchBlueprintData.cs", - "RelativeDocumentMoniker": "Buildings\\Building_ResearchBlueprintReader\\ResearchBlueprintData.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\ResearchBlueprintData.cs", - "RelativeToolTip": "Buildings\\Building_ResearchBlueprintReader\\ResearchBlueprintData.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T07:03:24.054Z" - }, - { - "$type": "Document", - "DocumentIndex": 15, - "Title": "Comp_PawnResearchBlueprintReader.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Comp_PawnResearchBlueprintReader.cs", - "RelativeDocumentMoniker": "Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Comp_PawnResearchBlueprintReader.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Comp_PawnResearchBlueprintReader.cs", - "RelativeToolTip": "Pawn_Comps\\ARA_PawnResearchBlueprintReader\\Comp_PawnResearchBlueprintReader.cs", - "ViewState": "AgIAADEDAAAAAAAAAAAEwAIDAAB4AAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-02-13T03:53:59.347Z" } ] } diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index efd4f06..a525b19 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -34,6 +34,8 @@ 4 + + diff --git a/Source/ArachnaeSwarm/HarmonyPatches/Faction_ShouldHaveLeader_Patch.cs b/Source/ArachnaeSwarm/HarmonyPatches/Faction_ShouldHaveLeader_Patch.cs new file mode 100644 index 0000000..992171b --- /dev/null +++ b/Source/ArachnaeSwarm/HarmonyPatches/Faction_ShouldHaveLeader_Patch.cs @@ -0,0 +1,19 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + [HarmonyPatch(typeof(Faction), "get_ShouldHaveLeader")] + public static class Faction_ShouldHaveLeader_Patch + { + [HarmonyPostfix] + public static void Postfix(Faction __instance, ref bool __result) + { + if (__instance.def?.defName == "ARA_Hostile_Hive") + { + __result = false; + } + } + } +} diff --git a/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs b/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs index 6a612d2..c2eb63f 100644 --- a/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs +++ b/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs @@ -18,7 +18,7 @@ namespace ArachnaeSwarm private Pawn_GestaltTracker tracker; private bool wasConnected = false; // 缓存连接状态,避免每帧都调整严重性 - // === 新增字段 === + // === 延迟初始化字段 === /// /// 生成时间戳(ticks),用于延迟计算 /// @@ -34,6 +34,7 @@ namespace ArachnaeSwarm /// private const int DELAY_TICKS = 60; + // === 动态过渡系统字段 === /// /// 过渡开始时间(ticks) /// @@ -45,7 +46,12 @@ namespace ArachnaeSwarm private const int TRANSITION_DURATION = 300; // 5秒 /// - /// 过渡后的目标严重性 + /// 过渡开始时的严重性 + /// + private float transitionStartSeverity = 0.5f; + + /// + /// 过渡结束时的目标严重性 /// private float targetSeverityAfterTransition = 1.0f; @@ -54,6 +60,11 @@ namespace ArachnaeSwarm /// private bool isTransitioning = false; + /// + /// 上一次更新严重性的时间(ticks) + /// + private int lastSeverityUpdateTick = -1; + // === 属性 === /// @@ -125,6 +136,27 @@ namespace ArachnaeSwarm } } + /// + /// 获取每秒变化速率 + /// + public float SeverityChangePerSecond + { + get + { + // 根据过渡类型计算不同的变化速率 + if (targetSeverityAfterTransition > transitionStartSeverity) + { + // 连接状态,从0.5到1.5,总共1.0的变化量,5秒内完成 + return 0.2f; // 1.0 / 5.0 = 0.2 + } + else + { + // 断开状态,从1.5到0.5,总共-1.0的变化量,5秒内完成 + return -0.2f; // -1.0 / 5.0 = -0.2 + } + } + } + /// /// 获取 GestaltTracker /// @@ -161,13 +193,11 @@ namespace ArachnaeSwarm // 记录生成时间戳 spawnTimestamp = Find.TickManager.TicksGame; - // 如果是HiveNode,初始化时设置较低的严重性,延迟后再计算 if (NodeType == GestaltNodeType.HiveNode) { - // 设置初始严重性为0.5(未连接状态) if (parent != null) { - parent.Severity = 0.5f; + parent.Severity = 1.5f; } } else @@ -200,13 +230,13 @@ namespace ArachnaeSwarm InitializeAfterDelay(); } - // 检查过渡状态 - UpdateTransitionState(); + // 检查过渡状态,并更新严重性变化 + UpdateTransitionStateWithRate(); // 正常的Tick逻辑 if (NodeType == GestaltNodeType.HiveNode) { - // 定期更新严重性(如果不在过渡中) + // 定期检查连接状态(如果不在过渡中) if (!IsInTransition && Find.TickManager.TicksGame % 60 == 0) // 每60tick检查一次 { UpdateSeverityBasedOnConnection(); @@ -252,9 +282,9 @@ namespace ArachnaeSwarm } /// - /// 更新过渡状态 + /// 带速率变化的过渡状态更新 /// - private void UpdateTransitionState() + private void UpdateTransitionStateWithRate() { // 检查Pawn是否死亡或无效 var pawn = Pawn; @@ -262,69 +292,152 @@ namespace ArachnaeSwarm { isTransitioning = false; transitionStartTick = -1; + lastSeverityUpdateTick = -1; return; } + // 如果不在过渡中,重置并返回 if (!isTransitioning || transitionStartTick < 0) + { + lastSeverityUpdateTick = -1; return; - - // 检查是否过渡完成 + } + + // 检查过渡是否已经完成 if (!IsInTransition) { - // 过渡完成,设置目标严重性 - if (parent != null && Mathf.Abs(parent.Severity - targetSeverityAfterTransition) > 0.01f) - { - parent.Severity = targetSeverityAfterTransition; - - // 通知Pawn状态改变(使用方法开头声明的pawn变量) - if (pawn?.health != null) - { - pawn.health.Notify_HediffChanged(parent); - } - - ArachnaeLog.Debug($"[GestaltNode] {pawn?.LabelShort} 过渡完成,严重性: {targetSeverityAfterTransition}"); - } + // 过渡完成,确保设置到目标严重性 + CompleteTransition(); + return; + } + + // 检查是否应该更新严重性(每秒更新一次) + int currentTick = Find.TickManager.TicksGame; + if (lastSeverityUpdateTick < 0 || currentTick - lastSeverityUpdateTick >= 60) // 60ticks = 1秒 + { + UpdateSeverityWithRate(currentTick); + lastSeverityUpdateTick = currentTick; + } + } + + /// + /// 使用速率更新严重性 + /// + private void UpdateSeverityWithRate(int currentTick) + { + var pawn = Pawn; + if (pawn == null || parent == null) + return; - // 重置过渡状态 - transitionStartTick = -1; - isTransitioning = false; + // 计算经过的时间(秒) + float elapsedSeconds = (currentTick - transitionStartTick) / 60f; + + // 计算新的严重性 + float newSeverity; + + // 方法1:线性插值 + // newSeverity = Mathf.Lerp(transitionStartSeverity, targetSeverityAfterTransition, + // Mathf.Clamp01(elapsedSeconds / (TRANSITION_DURATION / 60f))); + + // 方法2:使用速率计算(更符合要求) + float changeAmount = SeverityChangePerSecond * (currentTick - transitionStartTick) / 60f; + newSeverity = transitionStartSeverity + changeAmount; + + // 确保严重性在合理范围内 + if (targetSeverityAfterTransition > transitionStartSeverity) + { + // 连接过程,严重性增加 + newSeverity = Mathf.Clamp(newSeverity, transitionStartSeverity, targetSeverityAfterTransition); } else { - // 在过渡中,保持中间态严重性1 - if (parent != null && Mathf.Abs(parent.Severity - 1.0f) > 0.01f) + // 断开过程,严重性减少 + newSeverity = Mathf.Clamp(newSeverity, targetSeverityAfterTransition, transitionStartSeverity); + } + + // 应用新的严重性 + if (Mathf.Abs(parent.Severity - newSeverity) > 0.001f) + { + parent.Severity = newSeverity; + + // 通知Pawn状态改变 + if (pawn?.health != null) { - parent.Severity = 1.0f; + pawn.health.Notify_HediffChanged(parent); + } + + // 调试信息 + if (Find.TickManager.TicksGame % 120 == 0) // 每2秒记录一次 + { + ArachnaeLog.Debug($"[GestaltNode] {pawn.LabelShort} 过渡中: {parent.Severity:F2} -> {targetSeverityAfterTransition:F2} " + + $"(进度: {TransitionProgress:P0}, 速率: {SeverityChangePerSecond:F2}/秒)"); } } } /// - /// 开始过渡 + /// 完成过渡 /// - private void StartTransition(bool isConnecting) + private void CompleteTransition() { - // 设置目标严重性 - targetSeverityAfterTransition = isConnecting ? 1.5f : 0.5f; - - // 记录过渡开始时间 - transitionStartTick = Find.TickManager.TicksGame; - isTransitioning = true; - - // 立即设置到中间态(严重性1) - if (parent != null) + var pawn = Pawn; + if (pawn == null || parent == null) { - parent.Severity = 1.0f; + ResetTransition(); + return; + } + + // 确保最终严重性准确 + if (Mathf.Abs(parent.Severity - targetSeverityAfterTransition) > 0.01f) + { + parent.Severity = targetSeverityAfterTransition; - // 通知Pawn状态改变 - var pawn = Pawn; if (pawn?.health != null) { pawn.health.Notify_HediffChanged(parent); } } - ArachnaeLog.Debug($"[GestaltNode] {Pawn?.LabelShort} 开始过渡,目标: {(isConnecting ? "连接" : "断开")} ({targetSeverityAfterTransition})"); + ArachnaeLog.Debug($"[GestaltNode] {pawn.LabelShort} 过渡完成: {targetSeverityAfterTransition:F2}"); + + // 重置过渡状态 + ResetTransition(); + } + + /// + /// 重置过渡状态 + /// + private void ResetTransition() + { + transitionStartTick = -1; + isTransitioning = false; + lastSeverityUpdateTick = -1; + transitionStartSeverity = 0.5f; + targetSeverityAfterTransition = 1.0f; + } + + /// + /// 开始带速率变化的过渡 + /// + private void StartRateBasedTransition(bool isConnecting) + { + var pawn = Pawn; + if (pawn == null || parent == null) + return; + + // 设置目标严重性 + targetSeverityAfterTransition = isConnecting ? 1.5f : 0.5f; + + // 记录过渡开始时的严重性 + transitionStartSeverity = parent.Severity; + + // 记录过渡开始时间 + transitionStartTick = Find.TickManager.TicksGame; + isTransitioning = true; + lastSeverityUpdateTick = transitionStartTick; + + ArachnaeLog.Debug($"[GestaltNode] {pawn.LabelShort} 开始速率过渡: {transitionStartSeverity:F2} -> {targetSeverityAfterTransition:F2} " + + $"({(isConnecting ? "连接" : "断开")}, 速率: {SeverityChangePerSecond:F2}/秒)"); } /// @@ -346,8 +459,8 @@ namespace ArachnaeSwarm // 检查连接状态是否改变 if (isConnected != wasConnected) { - // 连接状态改变,开始过渡 - StartTransition(isConnected); + // 连接状态改变,开始带速率变化的过渡 + StartRateBasedTransition(isConnected); wasConnected = isConnected; } @@ -475,8 +588,7 @@ namespace ArachnaeSwarm base.CompPostPostRemoved(); // 清理过渡状态 - isTransitioning = false; - transitionStartTick = -1; + ResetTransition(); // 当Hediff被移除时,如果连接到Overlord,需要断开连接 if (NodeType == GestaltNodeType.HiveNode && IsConnectedToOverlord()) @@ -503,8 +615,7 @@ namespace ArachnaeSwarm base.Notify_PawnDied(dinfo, culprit); // 清理过渡状态 - isTransitioning = false; - transitionStartTick = -1; + ResetTransition(); ArachnaeLog.Debug($"[GestaltNode] {Pawn?.LabelShort} 死亡,清理过渡状态"); } @@ -519,8 +630,10 @@ namespace ArachnaeSwarm Scribe_Values.Look(ref spawnTimestamp, "spawnTimestamp", -1); Scribe_Values.Look(ref isInitialized, "isInitialized", false); Scribe_Values.Look(ref transitionStartTick, "transitionStartTick", -1); + Scribe_Values.Look(ref transitionStartSeverity, "transitionStartSeverity", 0.5f); Scribe_Values.Look(ref targetSeverityAfterTransition, "targetSeverityAfterTransition", 1.0f); Scribe_Values.Look(ref isTransitioning, "isTransitioning", false); + Scribe_Values.Look(ref lastSeverityUpdateTick, "lastSeverityUpdateTick", -1); // 加载后,如果已经过了延迟期,标记为已初始化 if (Scribe.mode == LoadSaveMode.PostLoadInit && spawnTimestamp >= 0) @@ -542,8 +655,12 @@ namespace ArachnaeSwarm { parent.Severity = targetSeverityAfterTransition; } - transitionStartTick = -1; - isTransitioning = false; + ResetTransition(); + } + else + { + // 过渡未完成,恢复过渡 + ArachnaeLog.Debug($"[GestaltNode] 恢复未完成的过渡: {transitionStartSeverity:F2} -> {targetSeverityAfterTransition:F2}"); } } } @@ -561,11 +678,16 @@ namespace ArachnaeSwarm string transitionInfo = "无"; if (IsInTransition) { - transitionInfo = $"过渡中,进度: {TransitionProgress:P0},目标: {targetSeverityAfterTransition}"; + float rate = SeverityChangePerSecond; + string direction = rate > 0 ? "增加" : "减少"; + transitionInfo = $"过渡中,进度: {TransitionProgress:P0}\n" + + $"从: {transitionStartSeverity:F2} 到: {targetSeverityAfterTransition:F2}\n" + + $"速率: {Mathf.Abs(rate):F2}/秒 ({direction})\n" + + $"当前: {parent?.Severity:F2}"; } else if (isTransitioning) { - transitionInfo = $"过渡完成,目标: {targetSeverityAfterTransition}"; + transitionInfo = $"过渡完成,目标: {targetSeverityAfterTransition:F2}"; } return $"NodeType: {NodeType}\n" + @@ -575,7 +697,7 @@ namespace ArachnaeSwarm $"WasConnected: {wasConnected}\n" + $"IsConnected: {IsConnectedToOverlord()}\n" + $"Transition: {transitionInfo}\n" + - $"CurrentSeverity: {parent?.Severity ?? 0f}"; + $"CurrentSeverity: {parent?.Severity ?? 0f:F2}"; } } diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs index 5c433d8..9415b5e 100644 --- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs @@ -59,31 +59,31 @@ namespace ArachnaeSwarm if (!Props.allowDuplicates && pawn.health.hediffSet.HasHediff(hediffDef)) continue; - // === 新增:获取应应用的部位 === - BodyPartDef bodyPartDef = Props.GetBodyPartForHediff(hediffDef); - List bodyParts = GetBodyPartsForHediff(pawn, hediffDef, bodyPartDef); + // === 简化的身体部位处理 === + // 参考CompUseEffect_InstallImplant的实现方式 + BodyPartRecord bodyPartRecord = GetBodyPartRecordForHediff(pawn, hediffDef); - // 如果没有指定部位,或者没有找到匹配部位,则添加到全身 - if (bodyParts == null || bodyParts.Count == 0) + // 如果指定了部位但找不到,根据配置决定是否跳过 + if (Props.bodyPart != null && bodyPartRecord == null) { - AddHediffToPawn(pawn, hediffDef, null); - continue; + if (Props.skipIfPartMissing) + { + ArachnaeLog.Debug($"Skipping hediff {hediffDef.defName} for {pawn.Label} - body part {Props.bodyPart.defName} not found"); + continue; + } + // 如果不跳过,则添加到全身(null表示不指定部位) } - // 根据选择规则添加hediff到相应部位 - foreach (var bodyPart in bodyParts) - { - AddHediffToPawn(pawn, hediffDef, bodyPart); - } + AddHediffToPawn(pawn, hediffDef, bodyPartRecord); // 记录应用到的部位 - if (bodyParts.Count > 0) + if (bodyPartRecord != null) { if (!appliedHediffParts.ContainsKey(hediffDef)) { appliedHediffParts[hediffDef] = new List(); } - appliedHediffParts[hediffDef].AddRange(bodyParts); + appliedHediffParts[hediffDef].Add(bodyPartRecord); } } @@ -96,6 +96,30 @@ namespace ArachnaeSwarm } } + /// + /// 简化的身体部位获取方法,参考CompUseEffect_InstallImplant + /// + private BodyPartRecord GetBodyPartRecordForHediff(Pawn pawn, HediffDef hediffDef) + { + if (pawn?.RaceProps?.body == null) + return null; + + // 使用指定的身体部位(如果有) + if (Props.bodyPart != null) + { + return pawn.RaceProps.body.GetPartsWithDef(Props.bodyPart).FirstOrFallback(); + } + + // 否则使用hediff的默认安装部位(如果有) + if (hediffDef?.defaultInstallPart != null) + { + return pawn.RaceProps.body.GetPartsWithDef(hediffDef.defaultInstallPart).FirstOrFallback(); + } + + // 都没有,则返回null(添加到全身) + return null; + } + /// /// 添加hediff到pawn的指定部位 /// @@ -103,19 +127,43 @@ namespace ArachnaeSwarm { try { - Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn, bodyPart); + // 参考CompUseEffect_InstallImplant的实现 + Hediff existingHediff = GetExistingHediffOnPart(pawn, hediffDef, bodyPart); - // 设置严重度(如果有指定) - if (Props.initialSeverity >= 0f) + if (existingHediff == null || Props.canUpgrade) { - hediff.Severity = Props.initialSeverity; + Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn, bodyPart); + + // 设置严重度(如果有指定) + if (Props.initialSeverity >= 0f) + { + hediff.Severity = Props.initialSeverity; + } + else if (Props.minSeverity > 0f && Props.maxSeverity > 0f) + { + // 如果有min/max严重度,则随机一个值 + hediff.Severity = Rand.Range(Props.minSeverity, Props.maxSeverity); + } + + // 添加hediff + pawn.health.AddHediff(hediff, bodyPart); + + // 如果是可升级的hediff,设置等级 + if (Props.canUpgrade && existingHediff != null && existingHediff is Hediff_Level existingLevel) + { + // 注意:这里实际上会创建新的hediff,所以升级逻辑在CompProperties_HediffGiver中处理 + // 如果是升级,应该使用existingHediff的ChangeLevel方法 + // 这里简化处理,直接添加新hediff,因为旧hediff会被覆盖 + } + + ArachnaeLog.Debug($"Added hediff {hediffDef.defName} to {pawn.Label} " + + $"{(bodyPart != null ? $"on {bodyPart.def.defName}" : "to whole body")} " + + $"with severity {hediff.Severity:F2}"); + } + else + { + ArachnaeLog.Debug($"Hediff {hediffDef.defName} already exists on {pawn.Label}, skipping"); } - - // 添加hediff - pawn.health.AddHediff(hediff); - - ArachnaeLog.Debug($"Added hediff {hediffDef.defName} to {pawn.Label} " + - $"{(bodyPart != null ? $"on {bodyPart.def.defName}" : "to whole body")}"); } catch (Exception ex) { @@ -124,231 +172,99 @@ namespace ArachnaeSwarm } /// - /// 获取hediff应应用的身体部位列表 + /// 检查指定部位是否已有相同的hediff(参考CompUseEffect_InstallImplant.GetExistingImplant) /// - private List GetBodyPartsForHediff(Pawn pawn, HediffDef hediffDef, BodyPartDef bodyPartDef) + private Hediff GetExistingHediffOnPart(Pawn pawn, HediffDef hediffDef, BodyPartRecord bodyPart) { - if (pawn == null || pawn.RaceProps?.body == null) + if (pawn?.health?.hediffSet?.hediffs == null) return null; - // 如果没有指定身体部位,返回空列表 - if (bodyPartDef == null) - return null; - - try + // 如果bodyPart为null,检查全身 + if (bodyPart == null) { - // 获取所有匹配的身体部位 - List allMatchingParts = pawn.RaceProps.body.GetPartsWithDef(bodyPartDef); - - if (allMatchingParts == null || allMatchingParts.Count == 0) + return pawn.health.hediffSet.GetFirstHediffOfDef(hediffDef); + } + + // 检查指定部位 + foreach (Hediff hediff in pawn.health.hediffSet.hediffs) + { + if (hediff.def == hediffDef && hediff.Part == bodyPart) { - // 如果没有找到匹配部位,检查是否有备用部位 - var mapping = Props.GetMappingForHediff(hediffDef); - if (mapping != null && mapping.fallbackToDefault) + return hediff; + } + } + + return null; + } + + /// + /// 检查是否可以为指定Pawn添加hediff(参考CompUseEffect_InstallImplant.CanBeUsedBy) + /// + public AcceptanceReport CanAddHediffToPawn(Pawn pawn) + { + if (pawn == null || Props.hediffs == null) + return false; + + // 检查是否需要特定身体部位 + if (Props.bodyPart != null) + { + var bodyPartRecord = pawn.RaceProps.body.GetPartsWithDef(Props.bodyPart).FirstOrFallback(); + if (bodyPartRecord == null) + { + return "InstallImplantNoBodyPart".Translate() + ": " + Props.bodyPart.LabelShort; + } + } + + // 检查是否已有hediff(如果不允许重复) + if (!Props.allowDuplicates) + { + foreach (HediffDef hediffDef in Props.hediffs) + { + if (pawn.health.hediffSet.HasHediff(hediffDef)) { - // 使用默认方式添加(全身) - return null; + return "InstallImplantAlreadyInstalled".Translate(); } - return new List(); } - - // 检查部位有效性 - if (Props.checkPartValidity) + } + + // 检查是否需要现有hediff才能升级 + if (Props.requiresExistingHediff) + { + foreach (HediffDef hediffDef in Props.hediffs) { - allMatchingParts = allMatchingParts.Where(part => IsBodyPartValid(pawn, part)).ToList(); - } - - if (allMatchingParts.Count == 0) - { - return new List(); - } - - // 获取选择规则 - BodyPartSelectionRule rule = Props.GetPartSelectionRuleForHediff(hediffDef); - var mappingConfig = Props.GetMappingForHediff(hediffDef); - - // 根据规则选择部位 - List selectedParts = new List(); - - if (rule == null) - { - // 默认规则:使用第一个匹配的部位 - selectedParts.Add(allMatchingParts[0]); - } - else - { - // 根据规则选择部位 - switch (rule.mode) + var existingHediff = GetExistingHediffOnPart(pawn, hediffDef, + Props.bodyPart != null ? + pawn.RaceProps.body.GetPartsWithDef(Props.bodyPart).FirstOrFallback() : + null); + + if (existingHediff == null) { - case BodyPartSelectionMode.First: - selectedParts.Add(allMatchingParts[0]); - break; - - case BodyPartSelectionMode.Random: - int count = Math.Min(rule.maxParts, allMatchingParts.Count); - selectedParts = allMatchingParts.InRandomOrder().Take(count).ToList(); - break; - - case BodyPartSelectionMode.All: - selectedParts = allMatchingParts; - break; - - case BodyPartSelectionMode.MostDamaged: - var mostDamaged = allMatchingParts.OrderByDescending(p => GetPartDamage(pawn, p)).FirstOrDefault(); - if (mostDamaged != null) selectedParts.Add(mostDamaged); - break; - - case BodyPartSelectionMode.LeastDamaged: - var leastDamaged = allMatchingParts.OrderBy(p => GetPartDamage(pawn, p)).FirstOrDefault(); - if (leastDamaged != null) selectedParts.Add(leastDamaged); - break; + return "InstallImplantHediffRequired".Translate(hediffDef.label); } - // 如果配置了随机选择部位 - if (mappingConfig != null && mappingConfig.chooseRandomPart) + // 检查是否可以升级 + if (Props.canUpgrade && existingHediff is Hediff_Level existingLevel) { - selectedParts = allMatchingParts.InRandomOrder().Take(1).ToList(); - } - - // 处理对称性 - if (rule.symmetrical && selectedParts.Count > 0) - { - selectedParts = GetSymmetricalParts(pawn, selectedParts[0], allMatchingParts); - } - } - - return selectedParts; - } - catch (Exception) - { - return null; - } - } - - /// - /// 获取对称的身体部位 - /// - private List GetSymmetricalParts(Pawn pawn, BodyPartRecord referencePart, List allParts) - { - List symmetricalParts = new List { referencePart }; - - // 查找对称部位(如左臂对应的右臂) - foreach (var part in allParts) - { - if (part != referencePart && part.def == referencePart.def) - { - // 简单的对称检测:检查部位标签或名称 - if (IsSymmetricalPart(referencePart, part)) - { - symmetricalParts.Add(part); + if ((float)existingLevel.level >= existingLevel.def.maxSeverity) + { + return "InstallImplantAlreadyMaxLevel".Translate(); + } + + if (Props.maxSeverity <= (float)existingLevel.level) + { + return "InstallImplantAlreadyMaxLevel".Translate() + " " + Props.maxSeverity.ToString(); + } + + if (Props.minSeverity > (float)existingLevel.level) + { + return "InstallImplantMinLevel".Translate(Props.minSeverity); + } } } } - return symmetricalParts; - } - - /// - /// 检查两个部位是否对称 - /// 使用 MCP 验证的 RimWorld 1.6 API - /// - private bool IsSymmetricalPart(BodyPartRecord part1, BodyPartRecord part2) - { - if (part1 == null || part2 == null || part1 == part2) - return false; - - // 方法1:使用 BodyPartDef.IsMirroredPart(MCP验证:tags.Contains(BodyPartTagDefOf.Mirrored)) - // 镜像部位通常有左右之分 - if (part1.def.IsMirroredPart && part2.def.IsMirroredPart && part1.def == part2.def) - { - // 同类型的镜像部位,检查是否是相反侧 - if (AreOppositeMirroredParts(part1, part2)) - return true; - } - - // 方法2:通过 customLabel 检测(如 "left arm", "right arm") - string label1 = part1.customLabel ?? part1.def.label; - string label2 = part2.customLabel ?? part2.def.label; - - if (!string.IsNullOrEmpty(label1) && !string.IsNullOrEmpty(label2)) - { - // 检查左右对称(使用翻译键支持本地化) - bool part1Left = label1.Contains("Left") || label1.Contains("left"); - bool part1Right = label1.Contains("Right") || label1.Contains("right"); - bool part2Left = label2.Contains("Left") || label2.Contains("left"); - bool part2Right = label2.Contains("Right") || label2.Contains("right"); - - if ((part1Left && part2Right) || (part1Right && part2Left)) - return true; - - // 检查前后对称 - bool part1Front = label1.Contains("Front") || label1.Contains("front"); - bool part1Back = label1.Contains("Back") || label1.Contains("back"); - bool part2Front = label2.Contains("Front") || label2.Contains("front"); - bool part2Back = label2.Contains("Back") || label2.Contains("back"); - - if ((part1Front && part2Back) || (part1Back && part2Front)) - return true; - } - - return false; - } - - /// - /// 检查两个镜像部位是否是相反侧 - /// - private bool AreOppositeMirroredParts(BodyPartRecord part1, BodyPartRecord part2) - { - // 检查是否在同一层级(相同的父部位) - if (part1.parent != part2.parent) - return false; - - // 检查索引是否不同(左右部位通常是相邻的) - if (part1.Index == part2.Index) - return false; - - // 对于镜像部位,如果它们有相同的 BodyPartDef 但不同的 Index,通常是对称的 - // 这是一个合理的假设,因为 RimWorld 的身体定义中镜像部位通常是成对出现的 - return true; - } - - /// - /// 检查身体部位是否有效 - /// - private bool IsBodyPartValid(Pawn pawn, BodyPartRecord part) - { - if (part == null) - return false; - - // 检查部位是否已完全损坏 - if (pawn.health.hediffSet.PartIsMissing(part)) - return false; - - // 检查部位是否被覆盖(如被装备遮挡) - // 这里可以添加更多有效性检查 - return true; } - - /// - /// 获取部位的伤害值 - /// - private float GetPartDamage(Pawn pawn, BodyPartRecord part) - { - if (part == null) - return 0f; - - float totalDamage = 0f; - foreach (var hediff in pawn.health.hediffSet.hediffs) - { - if (hediff.Part == part && hediff is Hediff_Injury injury) - { - totalDamage += injury.Severity; - } - } - - return totalDamage; - } // 序列化hediffsApplied标记 public override void PostExposeData() diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs index 1aef7f9..b9d2d7c 100644 --- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs @@ -5,50 +5,8 @@ using Verse; namespace ArachnaeSwarm { /// - /// Hediff与身体部位的映射关系,用于XML序列化 + /// 简化的身体部位选择模式 /// - public class HediffBodyPartMapping - { - public HediffDef hediff; - public BodyPartDef bodyPart; - - /// - /// 可选:优先级(数值越大优先级越高,默认1) - /// - public int priority = 1; - - /// - /// 可选:是否随机选择多个部位(如果pawn有多个相同部位) - /// - public bool chooseRandomPart = false; - - /// - /// 可选:如果找不到指定部位,是否使用默认添加方式 - /// - public bool fallbackToDefault = true; - } - - /// - /// 身体部位选择规则 - /// - public class BodyPartSelectionRule - { - /// - /// 选择模式:First(第一个匹配的)、Random(随机一个)、All(所有匹配的) - /// - public BodyPartSelectionMode mode = BodyPartSelectionMode.First; - - /// - /// 仅当mode为Random时有效:最多选择多少个部位 - /// - public int maxParts = 1; - - /// - /// 是否对称(如果pawn有左右对称的相同部位) - /// - public bool symmetrical = false; - } - public enum BodyPartSelectionMode { First, // 第一个匹配的部位 @@ -69,140 +27,74 @@ namespace ArachnaeSwarm // 是否允许重复添加相同的hediff public bool allowDuplicates = false; - // === 新增:优先应用部位设置 === - public bool useDefaultInstallPart = true; + // === 简化的身体部位设置 === + /// + /// 要安装到的身体部位(参考CompUseEffect_InstallImplant) + /// + public BodyPartDef bodyPart = null; - // === 新增:自定义部位映射(使用List替代Dictionary) === - public List customBodyPartMapping = null; + /// + /// 如果指定部位不存在,是否跳过添加 + /// + public bool skipIfPartMissing = false; - // === 新增:全局身体部位选择规则 === - public BodyPartSelectionRule globalPartSelectionRule = null; + /// + /// 身体部位选择模式 + /// + public BodyPartSelectionMode partSelectionMode = BodyPartSelectionMode.First; - // === 新增:按hediff分类的身体部位选择规则 === - public List hediffPartSelectionRules = null; + /// + /// 仅当partSelectionMode为Random时有效:最多选择多少个部位 + /// + public int maxParts = 1; - // === 新增:添加hediff时的严重度设置 === + /// + /// 是否对称(如果pawn有左右对称的相同部位) + /// + public bool symmetrical = false; + + // === Hediff升级相关设置(参考CompUseEffect_InstallImplant)=== + /// + /// 是否可以升级已有的hediff + /// + public bool canUpgrade = false; + + /// + /// 是否需要已有的hediff才能安装 + /// + public bool requiresExistingHediff = false; + + /// + /// 最小严重度(用于升级检查) + /// + public float minSeverity = 0f; + + /// + /// 最大严重度(用于升级检查) + /// + public float maxSeverity = 1f; + + // === 添加hediff时的严重度设置 === public float initialSeverity = -1f; // 负数表示使用hediff默认值 - // === 新增:是否检查部位有效性(是否存在、是否已损坏等) === + // === 是否检查部位有效性(是否存在、是否已损坏等)=== public bool checkPartValidity = true; - // === 新增:如果指定部位不存在时的备用部位 === - public BodyPartDef fallbackBodyPart = null; - - // === 新增:添加hediff时的效果 === + // === 添加hediff时的效果 === public EffecterDef applicationEffect = null; - // === 新增:是否在添加时显示消息 === + // === 是否在添加时显示消息 === public bool showApplicationMessage = false; - // === 新增:添加消息的翻译键 === + // === 添加消息的翻译键 === public string applicationMessageKey = null; - // === 新增:添加hediff时的声音 === + // === 添加hediff时的声音 === public SoundDef applicationSound = null; public CompProperties_HediffGiver() { this.compClass = typeof(CompHediffGiver); } - - /// - /// 根据hediff获取对应的身体部位定义 - /// - public BodyPartDef GetBodyPartForHediff(HediffDef hediffDef) - { - if (hediffDef == null) - return null; - - // 1. 首先检查自定义映射 - if (customBodyPartMapping != null) - { - // 查找优先级最高的映射 - HediffBodyPartMapping bestMapping = null; - int highestPriority = int.MinValue; - - foreach (var mapping in customBodyPartMapping) - { - if (mapping.hediff == hediffDef) - { - if (mapping.priority > highestPriority) - { - bestMapping = mapping; - highestPriority = mapping.priority; - } - } - } - - if (bestMapping != null) - { - return bestMapping.bodyPart; - } - } - - // 2. 然后检查默认安装部位 - if (useDefaultInstallPart && hediffDef.defaultInstallPart != null) - { - return hediffDef.defaultInstallPart; - } - - // 3. 最后检查备用部位 - return fallbackBodyPart; - } - - /// - /// 获取hediff对应的身体部位选择规则 - /// - public BodyPartSelectionRule GetPartSelectionRuleForHediff(HediffDef hediffDef) - { - if (hediffDef == null) - return globalPartSelectionRule; - - // 1. 首先检查hediff特定的规则 - if (hediffPartSelectionRules != null) - { - var rule = hediffPartSelectionRules.FirstOrDefault(r => r.hediff == hediffDef); - if (rule != null) - { - return rule.selectionRule; - } - } - - // 2. 返回全局规则 - return globalPartSelectionRule; - } - - /// - /// 获取hediff对应的映射配置 - /// - public HediffBodyPartMapping GetMappingForHediff(HediffDef hediffDef) - { - if (hediffDef == null || customBodyPartMapping == null) - return null; - - // 查找优先级最高的映射 - HediffBodyPartMapping bestMapping = null; - int highestPriority = int.MinValue; - - foreach (var mapping in customBodyPartMapping) - { - if (mapping.hediff == hediffDef && mapping.priority > highestPriority) - { - bestMapping = mapping; - highestPriority = mapping.priority; - } - } - - return bestMapping; - } - } - - /// - /// Hediff与部位选择规则的映射 - /// - public class HediffPartSelectionRule - { - public HediffDef hediff; - public BodyPartSelectionRule selectionRule; } } diff --git a/非公开资源/Content/Textures/UI/Abilities/ARA_Dissolver_Touch.sai2 b/非公开资源/Content/Textures/UI/Abilities/ARA_Dissolver_Touch.sai2 new file mode 100644 index 0000000..12bf793 Binary files /dev/null and b/非公开资源/Content/Textures/UI/Abilities/ARA_Dissolver_Touch.sai2 differ diff --git a/非公开资源/Content/Textures/UI/Abilities/ARA_Queen_Upgrade_1_Stage.sai2 b/非公开资源/Content/Textures/UI/Abilities/ARA_Queen_Upgrade_1_Stage.sai2 index af0c82f..5f2e3e0 100644 Binary files a/非公开资源/Content/Textures/UI/Abilities/ARA_Queen_Upgrade_1_Stage.sai2 and b/非公开资源/Content/Textures/UI/Abilities/ARA_Queen_Upgrade_1_Stage.sai2 differ