diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index bcc5bc6..90c25dc 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 c9159c6..0cec21f 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -1644,46 +1644,4 @@ - - ARA_Hibernate_Ability - - 阿拉克涅虫群用膜将自己包裹起来,转换为一个静态的活体组织,以降低蜂巢意志的负荷。进入休眠状态将清空休息条和饥饿条;不过在休眠状态下,虫族不需要进食。 - ArachnaeSwarm/UI/Abilities/ARA_Hibernate_Ability - 144000 - false - false - true - 9901 - - Verb_CastAbility - false - false - 5 - 19.9 - false - - True - - - -
  • - 饮食 - true - Food - 1 - 营养值不足,需要进食 -
  • -
  • - -
  • ARA_InsectCreep
  • -
  • ARA_InsectCreepTile
  • - - - -
  • - ARA_Hibernate_Sac -
  • -
    -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/NeedDefs/ARA_Needs.xml b/1.6/1.6/Defs/NeedDefs/ARA_Needs.xml index a1ddc69..382c74f 100644 --- a/1.6/1.6/Defs/NeedDefs/ARA_Needs.xml +++ b/1.6/1.6/Defs/NeedDefs/ARA_Needs.xml @@ -15,16 +15,6 @@ Baby, Child, Adult true false - - -
  • - - 1.25 - - - 1 -
  • -
    ARA_ChitinArmor diff --git a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml index 0f3e308..0d65b9f 100644 --- a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml +++ b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml @@ -161,7 +161,6 @@ false
  • ARA_Suicide_Ability
  • -
  • ARA_Hibernate_Ability
  • @@ -208,6 +207,8 @@ +
  • ARA_RaceBaseSwarmProduceOff
  • +
  • ARA_RaceBaseSwarmProduceOn
  • ARA_AcidSprayBurst
  • @@ -253,6 +254,10 @@ 0 + +
  • ARA_RaceBaseSwarmProduceOff
  • +
  • ARA_RaceBaseSwarmProduceOn
  • +
    ArachnaeNode_Race_Facehugger diff --git a/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects.xml b/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects.xml index 0fffede..7e3c684 100644 --- a/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects.xml +++ b/1.6/1.6/Defs/ResearchProjectDefs/ARA_ResearchProjects.xml @@ -80,6 +80,9 @@ 2.00 0.90 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Technology_6VXI
  • @@ -153,16 +156,28 @@ + + ARA_Technology_2HAG + + <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许阿拉克涅虫族建造一系列孵化池相关建筑,以开始孵化新虫族。 + 150 + 2.00 + 4.30 + ARA_ResearchBench + +
  • ARA_Technology_5ESS
  • +
    +
    ARA_Technology_1KYC <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许女皇种孵化新的虫族——战士种。\n\n阿拉克涅虫群所有需要蓝图的科技,其蓝图只能通过女皇种的基因试验卵获取。 150 - 1.00 - 5.40 + 3.00 + 4.80 ARA_ResearchBench -
  • ARA_Base_Technology
  • +
  • ARA_Technology_2HAG
  • @@ -170,11 +185,11 @@ <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许女皇种孵化新的虫族——原虫种,一种可以寄生在别的种族身上以控制它们的特殊督虫。\n\n阿拉克涅虫群所有需要蓝图的科技,其蓝图只能通过女皇种的基因试验卵获取。 200 - 1.00 - 4.90 + 3.00 + 4.30 ARA_ResearchBench -
  • ARA_Base_Technology
  • +
  • ARA_Technology_2HAG
  • @@ -185,6 +200,9 @@ 5.50 4.30 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Technology_1WMT
  • @@ -197,6 +215,9 @@ 5.50 4.80 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Technology_1WMT
  • @@ -209,6 +230,9 @@ 6.50 2.70 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Technology_1WMT
  • @@ -221,6 +245,9 @@ 10.00 3.80 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Technology_2WMT
  • @@ -233,6 +260,9 @@ 7.50 2.10 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Technology_2MED
  • @@ -246,6 +276,9 @@ 1.00 1.50 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Base_Technology
  • @@ -283,6 +316,9 @@ 1.00 0.30 ARA_ResearchBench + +
  • ARA_Technology_2HAG
  • +
  • ARA_Base_Technology
  • @@ -374,10 +410,10 @@ ARA_Technology_5ESS - <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许阿拉克涅虫群建造特殊的活体建筑,将俘虏投入以产出精华素。 - 250 + <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许阿拉克涅虫群建造特殊的活体建筑,将俘虏投入以产出精华素,同时建造阿拉克涅基因试验卵研发特殊虫群科技。 + 150 1.00 - 4.40 + 4.30 ARA_ResearchBench
  • ARA_Base_Technology
  • @@ -389,7 +425,7 @@ <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许虫族建造一种特殊的辅虫,可以将物品和虫族以空投的方式送到大地图上的其他地方,不需要燃料。 200 2.00 - 3.90 + 3.80 ARA_ResearchBench
  • ARA_Base_Technology
  • @@ -425,7 +461,7 @@ <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许虫族建造一种可以控制房间温度的特殊固定辅虫。 500 1.00 - 3.90 + 3.80 ARA_ResearchBench
  • ARA_Base_Technology
  • @@ -463,8 +499,8 @@
    ARA_Technology_2NPT - - <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许虫族建造用于存放和消化猎物的茧,溶解猎物为阿拉克涅营养供给塔网络提供额外的生物质传输效率和孵化速度。 + + <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许虫族建造用于存放多余虫族的茧,在里面的虫族将沉眠直到虫巢意志再次呼唤。 2000 13.00 2.10 @@ -498,16 +534,16 @@ - + ARA_Technology_8CPE - - <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许虫族在菌毯上种植一种食用作物,可以依靠菌毯和土地的营养成长,以供巢穴获取生物质。 - 250 - 1.00 + + <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许虫族在菌毯上种植一种作物,可以依靠菌毯和土地的营养成长,以供巢穴获取活化钜菌。 + 2500 + 10.00 2.70 ARA_ResearchBench -
  • ARA_Base_Technology
  • +
  • ARA_Technology_2WMT
  • @@ -571,8 +607,8 @@ <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许战士种进行定向进化,抛弃其战斗技能以换取其从殖民者、囚犯和奴隶身上抽取和注入基因的能力。\n\n阿拉克涅虫群所有需要蓝图的科技,其蓝图只能通过女皇种的基因试验卵获取。 500 - 2.00 - 5.40 + 4.00 + 4.80 ARA_ResearchBench
  • ARA_Technology_1KYC
  • @@ -721,7 +757,7 @@ <color=#887E78><i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径,它们奠定了虫群在生物学上的优越性。</i></color>\n\n允许实行新的阿拉克涅进化手术,使得阿拉克涅虫族获得更大的营养储存能力和更厚的甲壳。 250 2.00 - 4.40 + 4.80 ARA_ResearchBench
  • ARA_Technology_5ESS
  • diff --git a/1.6/1.6/Defs/Rooms/ARA_RoomRoles.xml b/1.6/1.6/Defs/Rooms/ARA_RoomRoles.xml index cd3cfbe..8593d11 100644 --- a/1.6/1.6/Defs/Rooms/ARA_RoomRoles.xml +++ b/1.6/1.6/Defs/Rooms/ARA_RoomRoles.xml @@ -6,7 +6,11 @@ ArachnaeSwarm.RoomRoleWorker_Incubator
  • Space
  • -
  • ARA_IncubatorQualityFactor
  • + + ARA_JellyVat_Room + + ArachnaeSwarm.RoomRoleWorker_JellyVat + diff --git a/1.6/1.6/Defs/Scenarios/ARA_Scenarios.xml b/1.6/1.6/Defs/Scenarios/ARA_Scenarios.xml index acff9c7..634b4b4 100644 --- a/1.6/1.6/Defs/Scenarios/ARA_Scenarios.xml +++ b/1.6/1.6/Defs/Scenarios/ARA_Scenarios.xml @@ -39,7 +39,7 @@
  • StartingThing_Defined ARA_InsectJelly - 300 + 500
  • StartingThing_Defined @@ -49,19 +49,30 @@
  • StartingThing_Defined ARA_InteractiveEggSac_Start - 4 + 6
  • StartingThing_Defined - ARA_Gene_Essence - 20 + ARA_Tumor + 2
  • - + ARA_MW_Bone_Sword + + Normal + +
  • + StartingThing_Defined + ARA_RW_Basic_Fist_Needle_Gun + 2 +
  • +
  • + StartingThing_Defined + ARA_Tumor + 6 +
  • ScatterThingsNearPlayerStart Steel diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml index be181ab..0e71be0 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml @@ -95,7 +95,7 @@ ArachnaeBase_Race_Scavenger - 阿拉克涅辅虫之一,智力低下,可以执行种植、收割、搬运和挖掘工作,注定在度过短暂的时光后死亡。 + 阿拉克涅辅虫之一,智力低下,可以执行种植、收割、搬运、清洁和挖掘工作,注定在度过短暂的时光后死亡。
  • ARA_Sowing
  • 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 34354e2..6e349d3 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml @@ -747,7 +747,7 @@ 5 - 1 + 5 100 @@ -766,8 +766,8 @@ - 4 - OmnivoreHuman,CarnivoreAnimal,OvivoreAnimal + 6 + OmnivoreHuman,CarnivoreAnimal,OvivoreAnimal,VegetarianRoughAnimal ArachnaeMyrmecocystus_Body @@ -802,7 +802,6 @@
  • -
  • ARA_RaceBaseSwarmProduceSwitchHediff
  • ARA_Myrmecocystus_Production_InsectJelly
  • 1.0 @@ -943,7 +942,6 @@
  • -
  • ARA_RaceBaseSwarmProduceSwitchHediff
  • ARA_ShieldHead_Base
  • 1.0 @@ -1068,6 +1066,12 @@
    +
  • + false + Crafting + 0 + true +
  • true ARA_RaceBaseSwarmProduceSwitchHediff @@ -1085,13 +1089,12 @@ CocoonDestroyed
  • -
  • +
  • ARA_Cycle_Suppression_Hediff ARA_LifespanHediff @@ -1424,7 +1427,6 @@
  • -
  • ARA_RaceBaseSwarmProduceSwitchHediff
  • ARA_Smokepop_Base
  • 1.0 @@ -1764,7 +1766,6 @@
  • -
  • ARA_RaceBaseSwarmProduceSwitchHediff
  • ARA_Psi_Master
  • PsychicAmplifier
  • diff --git a/1.6/1.6/Defs/Thing_Plant/ARA_Plant.xml b/1.6/1.6/Defs/Thing_Plant/ARA_Plant.xml index 418eb0f..aba0ee0 100644 --- a/1.6/1.6/Defs/Thing_Plant/ARA_Plant.xml +++ b/1.6/1.6/Defs/Thing_Plant/ARA_Plant.xml @@ -1,40 +1,5 @@ - - - ARA_CreepPlant - - 一种只能在阿拉克涅菌毯上生长的奇特植物,几乎不消耗肥力即可通过菌毯的营养管道茁壮生长,并担当虫群的食物来源之一。 - - 10 - 85 - 4 - 0.2 - - - ArachnaeSwarm/Plant/ARA_CreepPlant - Graphic_Single - - true - 10 - - 0.05 - 0.05 - 3 - 10 - ARA_CreepFungus - -
  • Ground
  • -
    - -
  • ARA_Creep
  • -
    - 0.3~0.8 - -
  • ARA_Technology_8CPE
  • -
    -
    -
    ARA_CreepFungus @@ -141,4 +106,40 @@ + + + + ARA_CreepPlant + + 一种只能在阿拉克涅菌毯上生长的奇特植物,虽然必须在黑暗中成长,但是几乎不消耗肥力,并产出虫群所需的活化钜菌。 + + 10 + 85 + 4 + 0.2 + + + ArachnaeSwarm/Plant/ARA_CreepPlant + Graphic_Single + + true + 10 + + 0.05 + 0.05 + 15 + 1 + ARA_Activated_Bacterium + +
  • Ground
  • +
    + +
  • ARA_Creep
  • +
    + 0.3~0.8 + +
  • ARA_Technology_8CPE
  • +
    +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/Thing_building/ARA_Building.xml b/1.6/1.6/Defs/Thing_building/ARA_Building.xml index 9e9a56b..1099980 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_Building.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_Building.xml @@ -624,14 +624,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
    @@ -694,14 +690,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • ResearchSpeedFactor @@ -770,14 +762,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • @@ -841,14 +829,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 3 @@ -916,14 +900,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 3 @@ -997,14 +977,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 7 @@ -1163,14 +1139,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 4 @@ -1219,14 +1191,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • diff --git a/1.6/1.6/Defs/Thing_building/ARA_DropPod.xml b/1.6/1.6/Defs/Thing_building/ARA_DropPod.xml index 1036fe0..e4140b8 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_DropPod.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_DropPod.xml @@ -48,14 +48,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 300 @@ -70,7 +66,6 @@
  • - ARA_ActiveDropPod diff --git a/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml b/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml index 8728141..5cd1b67 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_HiveShip.xml @@ -25,6 +25,7 @@ 800 5000 + ARA_Creep @@ -96,6 +97,7 @@ Things/Building/PilotConsole/PilotConsole (3.7, 2.6) + 150 50 @@ -150,6 +152,7 @@ (0,0,0) + 200 30 @@ -197,6 +200,7 @@ (1, 1, 2) + 250 0 diff --git a/1.6/1.6/Defs/Thing_building/ARA_NutrientNetworkBuilding.xml b/1.6/1.6/Defs/Thing_building/ARA_NutrientNetworkBuilding.xml index 06ee162..f9ab248 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_NutrientNetworkBuilding.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_NutrientNetworkBuilding.xml @@ -38,14 +38,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 7.0 @@ -58,7 +54,6 @@ -
  • ARA_GrowthVat
  • ARA_MorphableResearchBench
  • ARANutrientDispenser
  • ARA_WormholePortal_A
  • @@ -88,7 +83,6 @@
  • -
  • ARA_GrowthVat
  • @@ -110,129 +104,6 @@
  • ARA_Technology_1NPT
  • - - ARA_GrowthVat - - 阿拉克涅虫群用来存放和消化猎物的茧,那些被扔进茧中的倒霉鬼将逐渐被酸蚀溶解,从而为阿拉克涅营养供给塔网络提供额外的生物质传输效率和孵化速度,一个网络内最大可启用15个消化茧。 - ArachnaeSwarm.Building_NutrientVat - true - Normal - ArachnaeSwarm/Building/ARA_GrowthVat_Icon - - ArachnaeSwarm/Building/ARA_GrowthVat - Graphic_Multi - CutoutComplex - (2,2) - - (1.25, 0.2, 0.5) - (0,0,-0.45) - - - false - North - (2,2) - - 500 - 8000 - 30 - 0.5 - - - 30 - 10 - 5 - - Building - PassThroughOnly - 42 - true - MapMeshAndRealTime - 0.5 - false - ARA_Buildings - 2200 - true - (0,0,-1) - -
  • ITab_BiosculpterNutritionStorage
  • -
  • ITab_Genes
  • -
    - -
  • GrowthVats
  • -
    - - false - 120 - Laboratory - -
  • ARA_InsectCreep
  • -
    -
    - 4 - ARA_Creep - -
  • - 100 - 45 - 2 - 0.2 - 1800 - 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • - - - - -
  • - 5.0 - - -
  • ARA_InsectJelly
  • - - - 虫蜜 - true - true - - - -
  • - -
  • ARA_NutrientNetworkTower
  • - - 15 - 20 - - 0.05 - 0.1 - - - - -
  • - -
  • ARA_NutrientNetworkTower
  • - - - -
  • - ARA_InsectCreep - 6 -
  • -
    - -
  • - - ArachnaeSwarm/Building/ARA_GrowthVatTop - - Graphic_Multi -
  • -
    - -
  • ARA_Technology_2NPT
  • -
    -
    ARANutrientDispenser @@ -455,7 +326,7 @@ 2600 Item - Laboratory + ARA_JellyVat_Room 0.8
  • ARA_InsectCreep
  • @@ -467,14 +338,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • - @@ -553,7 +420,7 @@ true Freshwater Map/WaterDepth - 100 + 5 Water Misc 390 @@ -616,8 +483,6 @@ 2600 Item - Laboratory - 0.8
  • ARA_InsectCreep
  • @@ -674,21 +539,17 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
    ARA_Carapace_Column - 阿拉克涅的骨花通过催化尸体而转变得到的柱子,。 + 阿拉克涅的骨花通过催化尸体而转变得到的柱子,虫群可以将其拆除以得到甲壳素。 2040 Building PassThroughOnly @@ -698,7 +559,7 @@ (1.25,1.25) (0,0,0.2) - ArachnaeSwarm/Building/ARA_Column + ArachnaeSwarm/Building/ARA_HiveShip_Heart_Pedestal Graphic_Single CutoutComplex diff --git a/1.6/1.6/Defs/Thing_building/ARA_Ootheca.xml b/1.6/1.6/Defs/Thing_building/ARA_Ootheca.xml index bedcf8f..b269405 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_Ootheca.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_Ootheca.xml @@ -14,7 +14,7 @@ WaterShallow Map/WaterDepth Standable - 80 + 5 false false Freshwater @@ -27,11 +27,12 @@ true 3 SoakingWet - 180 - 18 TerrainWaterPolluted Terrain/Surfaces/MarshPollutionOverlay ARA_Buildings + +
  • ARA_Technology_2HAG
  • +
  • None
  • @@ -57,13 +58,14 @@ 10 + 1 ARA_Pawn_Ootheca - 一个脆弱、易燃、黏滑的囊状物,内含哺育一只新督虫所需的营养和遗传物质。它需要由阿拉克涅幼虫种进入以启动孵化进程。 + 一个脆弱、易燃、黏滑的囊状物,内含哺育一只新督虫所需的营养和遗传物质,一个宽敞、铺满阿拉克涅营养液的孵化间将是它最佳的放置场所。它需要由阿拉克涅幼虫种进入以启动孵化进程。 1000 @@ -90,6 +92,9 @@ (0, 0, 1) true + +
  • ARA_Technology_2HAG
  • +
    10 150 @@ -155,14 +160,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 5 @@ -383,7 +384,7 @@ ARA_Equipment_Ootheca - 如宝塔般的阿拉克涅活体结构,可以孵化出变态发育后的不完全个体——武装器官和织物。它需要由阿拉克涅幼虫种进入以启动孵化进程。 + 如宝塔般的阿拉克涅活体结构,可以孵化出变态发育后的不完全个体——武装器官和织物,也就是虫群的武器和衣服,它需要由阿拉克涅幼虫种进入以启动孵化进程。一个宽敞、铺满阿拉克涅营养液的孵化间将是它最佳的放置场所。\n\n在孵化过程中,阿拉克涅茧会不断吞噬附近的营养液,需要指派有建造能力的虫族不断修复。 1000 @@ -412,6 +413,9 @@ (0, 0, 1) true + +
  • ARA_Technology_2HAG
  • + 10 150 @@ -469,14 +473,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 3 @@ -503,7 +503,7 @@ ARA_InteractiveEggSac_Techprint - 一个内部近乎无序发育的卵,无法孵化任何虫族,主要用于实验变异方向,必须在零下环境中储存。\n\n需要蓝图的阿拉克涅科技只能由基因试验卵完成,完成时科技的基因信息会被储存在卵中,一旦所有储存同一科技的基因试验卵损坏,则该科技将丢失! + 一个内部近乎无序发育的卵,无法孵化任何虫族,主要用于实验变异方向。\n\n需要蓝图的阿拉克涅科技只能由基因试验卵完成,完成时科技的基因信息会被储存在卵中,一旦所有储存同一科技的基因试验卵损坏,则该科技将丢失! ArachnaeSwarm.Building_ResearchBlueprintReader ArachnaeSwarm/Building/ARA_InteractiveEggSac_Techprint @@ -522,12 +522,16 @@ false Normal ARA_Creep + +
  • ARA_Technology_5ESS
  • + 2000 250 1 + Laboratory false false @@ -542,7 +546,7 @@
  • - 1 + 0.5
  • @@ -550,23 +554,12 @@
  • CocoonDestroyed
  • -
  • - -200 - 0 - 0.00005 - 0.005 - 0.001 -
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
    diff --git a/1.6/1.6/Defs/Thing_building/ARA_SwarmTurret.xml b/1.6/1.6/Defs/Thing_building/ARA_SwarmTurret.xml index 1986723..9f59664 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_SwarmTurret.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_SwarmTurret.xml @@ -290,14 +290,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • @@ -439,14 +435,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • @@ -611,14 +603,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • nutrition diff --git a/1.6/1.6/Defs/Thing_building/ARA_RefuelingVat.xml b/1.6/1.6/Defs/Thing_building/ARA_Vat.xml similarity index 60% rename from 1.6/1.6/Defs/Thing_building/ARA_RefuelingVat.xml rename to 1.6/1.6/Defs/Thing_building/ARA_Vat.xml index 59e6a0b..f50d686 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_RefuelingVat.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_Vat.xml @@ -1,5 +1,85 @@ + + ARA_DormancyVat + + 阿拉克涅虫群用来存放多余虫族的特殊活体设施,存放在其中的虫族将陷入不老不死的休眠状态,以等待主巢的再次召唤。 + ArachnaeSwarm.Building_DormancyVat + true + Normal + ArachnaeSwarm/Building/ARA_GrowthVat_Icon + + ArachnaeSwarm/Building/ARA_GrowthVat + Graphic_Multi + CutoutComplex + (2,2) + + (1.25, 0.2, 0.5) + (0,0,-0.45) + + + false + North + (2,2) + + 500 + 8000 + 30 + 0.5 + + + 30 + 10 + 5 + + Building + PassThroughOnly + 42 + true + MapMeshAndRealTime + 0.5 + false + ARA_Buildings + 2200 + true + (0,0,-1) + +
  • ITab_BiosculpterNutritionStorage
  • +
  • ITab_Genes
  • + + +
  • GrowthVats
  • +
    + + false + 120 + +
  • ARA_InsectCreep
  • +
    +
    + 4 + ARA_Creep + +
  • + 100 + 30 + 2 + 0.2 + 0.5 +
  • +
    + +
  • + + ArachnaeSwarm/Building/ARA_GrowthVatTop + + Graphic_Multi +
  • +
    + +
  • ARA_Technology_2NPT
  • +
    +
    ARA_RefuelingVat @@ -65,14 +145,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • - diff --git a/1.6/1.6/Defs/Thing_building/ARA_WormholeDefs.xml b/1.6/1.6/Defs/Thing_building/ARA_WormholeDefs.xml index 44027c7..b329679 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_WormholeDefs.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_WormholeDefs.xml @@ -41,14 +41,10 @@
  • 100 - 45 + 30 2 0.2 - 1800 0.5 - -
  • ArachnaeNode_Race_WeaponSmith
  • -
  • 7.0 diff --git a/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml b/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml index 770dc9e..eba7fa5 100644 --- a/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml +++ b/1.6/1.6/Defs/ThinkTreeDefs/ARA_ThinkTrees.xml @@ -929,29 +929,6 @@
  • Humanlike_PreMain
  • - - -
  • - ArachnaeNode_Race_Myrmecocystus - -
  • - -
  • - -
  • - ARA_HiveMindMaster - 0~5 - -
  • - -
  • -
  • - ARA_HiveMindDrone - 0~5 - -
  • - -
  • @@ -963,14 +940,6 @@
  • - -
  • - ArachnaeNode_Race_Myrmecocystus - -
  • - -
  • -
  • WildMan diff --git a/1.6/1.6/Defs/WorkGiverDefs/ARA_WorkGivers.xml b/1.6/1.6/Defs/WorkGiverDefs/ARA_WorkGivers.xml index bfadaeb..048e65b 100644 --- a/1.6/1.6/Defs/WorkGiverDefs/ARA_WorkGivers.xml +++ b/1.6/1.6/Defs/WorkGiverDefs/ARA_WorkGivers.xml @@ -1,5 +1,19 @@ + + ARA_SwarmJob + 虫群工作 + 虫群 + 为虫群工作 + 所有关于阿拉克涅虫群的工作,包括维护虫群建筑、以蜜罐喂食、甲壳素剥离等。 + 为虫群工作 + 100 + true + +
  • AllWork
  • + + + ARA_Refuel_Nutrition @@ -25,4 +39,47 @@ false false + + ARA_SwarmMaintain + + ArachnaeSwarm.WorkGiver_SwarmMaintain + ARA_SwarmJob + 70 + 维护 + 维护于 + +
  • Manipulation
  • +
    +
    + + ARA_ExtractHoney + + ARA_SwarmJob + ArachnaeSwarm.WorkGiver_ExtractHoney + 125 + 排出虫蜜 + 排出虫蜜 + + + ARA_StripChitin + + ARA_SwarmJob + ArachnaeSwarm.WorkGiver_StripChitin + 150 + 剥离甲壳 + 剥离甲壳 + +
  • Manipulation
  • +
    +
    + + + ARA_FeedWithHoney + + ARA_SwarmJob + ArachnaeSwarm.WorkGiver_FeedWithHoney + 130 + 喂食 + 喂食 + \ No newline at end of file diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Building_DormancyVat.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Building_DormancyVat.xml new file mode 100644 index 0000000..6b8a388 --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Building_DormancyVat.xml @@ -0,0 +1,39 @@ + + + + 休眠茧已被占用 + 正在等待指定的虫族成员 + 只有虫族成员可以进入休眠茧 + 无法放入已死亡的虫族成员 + 在休眠茧中 + 类型 + 已休眠 + 健康状态 + 弹出虫族成员 + 将虫族成员从休眠茧中弹出 + 放入虫族成员 + 选择一个虫族成员放入休眠茧 + 没有可用的虫族成员 + 指派搬运虫族成员 + 指派一个虫族成员搬运另一个虫族成员到休眠茧 + 主宰 + 工蜂 + 工虫 + 未知 + 休眠茧 + 无法进入休眠茧 + 没有路径 + 进入休眠茧 + 没有可用的虫族搬运者 + 搬运者已指派 + + 小时 + 一个特殊的休眠装置,只允许虫族成员进入。它不会对里面的成员造成任何伤害,可以安全地存放虫族成员。 + 休眠茧弹出{0}时出错 + 正在搬运虫族成员到休眠茧。 + + + 殖民者 + 囚犯 + 奴隶 + \ No newline at end of file diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Building_ResearchBlueprintReader.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Building_ResearchBlueprintReader.xml new file mode 100644 index 0000000..2475c63 --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Building_ResearchBlueprintReader.xml @@ -0,0 +1,44 @@ + + + + 建筑已锁定储存科技,无法开始新研究 + 未满足前置科技条件 + 开始研究:{0}(已绑定) + 科技研究完成:{0} + 建筑已解锁:{0} + ARA_ResearchTab未找到 + 没有可用的科技项目 + 显示研究菜单时出错:{0} + 解锁建筑 + 释放储存的科技,允许重新研究 + 储存:{0} + 点击查看详细信息 + 此建筑储存着:{0}\n状态:{1}\n描述:{2} + 选择研究项目 + 选择要研究的科技项目(一旦选择将永久绑定) + 调试:强制完成 + 立即完成当前研究 + ✓ 已研究:{0} + 正在研究:{0} + 本建筑进度:{0:F0}/{1:F0}({2:F1}%) + 全球进度:{0:F0}/{1:F0} + 研究速度:{0:F1}/秒 + 已研究时间:{0}天 + 未选择研究项目 + 已完成 + 研究中 + 需要隐藏前置 + 需要前置条件 + 需要隐藏前置 + 缺失的前置科技 + 成本 + 所需蓝图数量 + 当前全球进度 + + + 科技已丢失:{0} + === 研究管理器状态 === + 所有建筑:{0} + 进行中研究:{0} + {0}:{1}个活跃建筑 / {2}个总建筑 + diff --git a/Content/Textures/ArachnaeSwarm/UI/Commands/ARA_InsertPawn.png b/Content/Textures/ArachnaeSwarm/UI/Commands/ARA_InsertPawn.png new file mode 100644 index 0000000..713e0c2 Binary files /dev/null and b/Content/Textures/ArachnaeSwarm/UI/Commands/ARA_InsertPawn.png differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo index 29a6ee6..e5b18dc 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 990db67..16de48a 100644 --- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json +++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json @@ -1,7 +1,148 @@ { "Version": 1, - "WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\", - "Documents": [], + "WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\needs\\need_honeyproduction.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:needs\\need_honeyproduction.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\workgivers\\workgiver_feedwithhoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:workgivers\\workgiver_feedwithhoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ara_hediffdefof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_hediffdefof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\workgivers\\workgiver_refuel_nutrition.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:workgivers\\workgiver_refuel_nutrition.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_feedwithhoney\\jobdriver_feedwithhoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_feedwithhoney\\jobdriver_feedwithhoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\workgivers\\workgiver_extracthoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:workgivers\\workgiver_extracthoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\workgivers\\workgiver_stripchitin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:workgivers\\workgiver_stripchitin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_feedwithhoney\\jobdriver_extracthoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_feedwithhoney\\jobdriver_extracthoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_feedwithhoney\\thinknode_jobgiver_extracthoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_feedwithhoney\\thinknode_jobgiver_extracthoney.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_swarmmaintain\\jobdriver_swarmmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_swarmmaintain\\jobdriver_swarmmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\verbs\\cleave\\compcleave.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:verbs\\cleave\\compcleave.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_swarmmaintenance\\comp_swarmmaintenance.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_swarmmaintenance\\comp_swarmmaintenance.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\needs\\need_chitinarmor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:needs\\need_chitinarmor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\workgivers\\workgiver_swarmmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:workgivers\\workgiver_swarmmaintain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_dormancyvat\\building_dormancyvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_dormancyvat\\building_dormancyvat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_researchblueprintreader\\building_researchblueprintreader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_researchblueprintreader\\building_researchblueprintreader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\roomrole\\roomroleworker_incubator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:roomrole\\roomroleworker_incubator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_stripchitin\\jobdriver_stripchitin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_stripchitin\\jobdriver_stripchitin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_stripchitin\\compproperties_chitinstripping.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_stripchitin\\compproperties_chitinstripping.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\jobs\\jobdriver_stripchitin\\comp_chitinstripping.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_stripchitin\\comp_chitinstripping.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\verbs\\verb_shootselfunderfoot.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:verbs\\verb_shootselfunderfoot.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\hediffs\\ara_hediffcomp_topturret\\hediffcomp_topturret.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_hediffcomp_topturret\\hediffcomp_topturret.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_compinteractiveproducer\\compresearchproducer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_compinteractiveproducer\\compresearchproducer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_corpseconverter\\compcorpseconverter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_corpseconverter\\compcorpseconverter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_corpseconverter\\compproperties_corpseconverter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_corpseconverter\\compproperties_corpseconverter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_terrainchanger\\compterrainchanger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_terrainchanger\\compterrainchanger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_terrainchanger\\compproperties_terrainchanger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_terrainchanger\\compproperties_terrainchanger.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\wula_mutifuelspawner\\comprefuelablenutrition_withkey.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\wula_mutifuelspawner\\comprefuelablenutrition_withkey.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_ootheca\\compproperties_incubatordata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_ootheca\\compproperties_incubatordata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_ootheca\\oothecaincubatorextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_ootheca\\oothecaincubatorextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_ootheca\\building_ootheca.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_ootheca\\building_ootheca.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_equipmentootheca\\compproperties_equipmentincubatordata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_equipmentootheca\\compproperties_equipmentincubatordata.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\buildings\\building_equipmentootheca\\building_equipmentootheca.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_equipmentootheca\\building_equipmentootheca.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], "DocumentGroupContainers": [ { "Orientation": 0, @@ -9,11 +150,433 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": -1, + "SelectedChildIndex": 1, "Children": [ { "$type": "Bookmark", "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "CompDelayedTerrainSpawn.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "RelativeToolTip": "Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "ViewState": "AgIAACMAAAAAAAAAAAAQwDoAAAAJAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T15:47:19.767Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "WorkGiver_Refuel_Nutrition.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_Refuel_Nutrition.cs", + "RelativeDocumentMoniker": "WorkGivers\\WorkGiver_Refuel_Nutrition.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_Refuel_Nutrition.cs", + "RelativeToolTip": "WorkGivers\\WorkGiver_Refuel_Nutrition.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:59:44.439Z" + }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "WorkGiver_FeedWithHoney.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_FeedWithHoney.cs", + "RelativeDocumentMoniker": "WorkGivers\\WorkGiver_FeedWithHoney.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_FeedWithHoney.cs", + "RelativeToolTip": "WorkGivers\\WorkGiver_FeedWithHoney.cs", + "ViewState": "AgIAAB0AAAAAAAAAAAAQwD0AAAAQAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:59:28.915Z" + }, + { + "$type": "Document", + "DocumentIndex": 7, + "Title": "WorkGiver_StripChitin.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_StripChitin.cs", + "RelativeDocumentMoniker": "WorkGivers\\WorkGiver_StripChitin.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_StripChitin.cs", + "RelativeToolTip": "WorkGivers\\WorkGiver_StripChitin.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAAZAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:33:53.307Z" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "WorkGiver_ExtractHoney.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_ExtractHoney.cs", + "RelativeDocumentMoniker": "WorkGivers\\WorkGiver_ExtractHoney.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_ExtractHoney.cs", + "RelativeToolTip": "WorkGivers\\WorkGiver_ExtractHoney.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAgwB0AAAAyAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:33:29.75Z" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "ARA_HediffDefOf.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_HediffDefOf.cs", + "RelativeDocumentMoniker": "ARA_HediffDefOf.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_HediffDefOf.cs", + "RelativeToolTip": "ARA_HediffDefOf.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvxIAAAAkAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-15T17:32:18.493Z" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "Need_HoneyProduction.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Needs\\Need_HoneyProduction.cs", + "RelativeDocumentMoniker": "Needs\\Need_HoneyProduction.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Needs\\Need_HoneyProduction.cs", + "RelativeToolTip": "Needs\\Need_HoneyProduction.cs", + "ViewState": "AgIAAGIAAAAAAAAAAAAkwG4AAAAJAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:17:51.898Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 8, + "Title": "JobDriver_ExtractHoney.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\JobDriver_ExtractHoney.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_FeedWithHoney\\JobDriver_ExtractHoney.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\JobDriver_ExtractHoney.cs", + "RelativeToolTip": "Jobs\\JobDriver_FeedWithHoney\\JobDriver_ExtractHoney.cs", + "ViewState": "AgIAAA8AAAAAAAAAAAAAwCYAAAAlAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:26:42.845Z" + }, + { + "$type": "Document", + "DocumentIndex": 9, + "Title": "ThinkNode_JobGiver_ExtractHoney.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\ThinkNode_JobGiver_ExtractHoney.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_FeedWithHoney\\ThinkNode_JobGiver_ExtractHoney.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\ThinkNode_JobGiver_ExtractHoney.cs", + "RelativeToolTip": "Jobs\\JobDriver_FeedWithHoney\\ThinkNode_JobGiver_ExtractHoney.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABQAAAAcAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:25:27.255Z" + }, + { + "$type": "Document", + "DocumentIndex": 10, + "Title": "JobDriver_SwarmMaintain.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs", + "RelativeToolTip": "Jobs\\JobDriver_SwarmMaintain\\JobDriver_SwarmMaintain.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvxcAAAAJAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:32:29.359Z" + }, + { + "$type": "Document", + "DocumentIndex": 5, + "Title": "JobDriver_FeedWithHoney.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\JobDriver_FeedWithHoney.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_FeedWithHoney\\JobDriver_FeedWithHoney.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FeedWithHoney\\JobDriver_FeedWithHoney.cs", + "RelativeToolTip": "Jobs\\JobDriver_FeedWithHoney\\JobDriver_FeedWithHoney.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAoAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:43:47.266Z" + }, + { + "$type": "Document", + "DocumentIndex": 11, + "Title": "CompCleave.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verbs\\Cleave\\CompCleave.cs", + "RelativeDocumentMoniker": "Verbs\\Cleave\\CompCleave.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verbs\\Cleave\\CompCleave.cs", + "RelativeToolTip": "Verbs\\Cleave\\CompCleave.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAkAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:40:25.528Z" + }, + { + "$type": "Document", + "DocumentIndex": 12, + "Title": "Comp_SwarmMaintenance.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_SwarmMaintenance\\Comp_SwarmMaintenance.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_SwarmMaintenance\\Comp_SwarmMaintenance.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_SwarmMaintenance\\Comp_SwarmMaintenance.cs", + "RelativeToolTip": "Building_Comps\\ARA_SwarmMaintenance\\Comp_SwarmMaintenance.cs", + "ViewState": "AgIAAKYAAAAAAAAAAAAQwH0AAAAQAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:35:29.771Z" + }, + { + "$type": "Document", + "DocumentIndex": 13, + "Title": "Need_ChitinArmor.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Needs\\Need_ChitinArmor.cs", + "RelativeDocumentMoniker": "Needs\\Need_ChitinArmor.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Needs\\Need_ChitinArmor.cs", + "RelativeToolTip": "Needs\\Need_ChitinArmor.cs", + "ViewState": "AgIAAAMAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:23:16.771Z" + }, + { + "$type": "Document", + "DocumentIndex": 14, + "Title": "WorkGiver_SwarmMaintain.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_SwarmMaintain.cs", + "RelativeDocumentMoniker": "WorkGivers\\WorkGiver_SwarmMaintain.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\WorkGivers\\WorkGiver_SwarmMaintain.cs", + "RelativeToolTip": "WorkGivers\\WorkGiver_SwarmMaintain.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAF0AAAAcAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T13:13:35.358Z" + }, + { + "$type": "Document", + "DocumentIndex": 15, + "Title": "Building_DormancyVat.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", + "RelativeDocumentMoniker": "Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", + "RelativeToolTip": "Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAOcAAAAjAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T11:50:41.189Z" + }, + { + "$type": "Document", + "DocumentIndex": 16, + "Title": "Building_ResearchBlueprintReader.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\Building_ResearchBlueprintReader.cs", + "RelativeDocumentMoniker": "Buildings\\Building_ResearchBlueprintReader\\Building_ResearchBlueprintReader.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_ResearchBlueprintReader\\Building_ResearchBlueprintReader.cs", + "RelativeToolTip": "Buildings\\Building_ResearchBlueprintReader\\Building_ResearchBlueprintReader.cs", + "ViewState": "AgIAAPQAAAAAAAAAAAAywAoBAABrAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-17T10:38:40.669Z" + }, + { + "$type": "Document", + "DocumentIndex": 18, + "Title": "JobDriver_StripChitin.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\JobDriver_StripChitin.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_StripChitin\\JobDriver_StripChitin.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\JobDriver_StripChitin.cs", + "RelativeToolTip": "Jobs\\JobDriver_StripChitin\\JobDriver_StripChitin.cs", + "ViewState": "AgIAAD4AAAAAAAAAAAAAAE0AAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T15:50:38.09Z" + }, + { + "$type": "Document", + "DocumentIndex": 20, + "Title": "Comp_ChitinStripping.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\Comp_ChitinStripping.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_StripChitin\\Comp_ChitinStripping.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\Comp_ChitinStripping.cs", + "RelativeToolTip": "Jobs\\JobDriver_StripChitin\\Comp_ChitinStripping.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAABWAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T15:49:51.675Z" + }, + { + "$type": "Document", + "DocumentIndex": 21, + "Title": "Verb_ShootSelfUnderfoot.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verbs\\Verb_ShootSelfUnderfoot.cs", + "RelativeDocumentMoniker": "Verbs\\Verb_ShootSelfUnderfoot.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verbs\\Verb_ShootSelfUnderfoot.cs", + "RelativeToolTip": "Verbs\\Verb_ShootSelfUnderfoot.cs", + "ViewState": "AgIAAJAAAAAAAAAAAAAcwJwAAAAoAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T15:07:22.127Z" + }, + { + "$type": "Document", + "DocumentIndex": 22, + "Title": "HediffComp_TopTurret.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffComp_TopTurret\\HediffComp_TopTurret.cs", + "RelativeDocumentMoniker": "Hediffs\\ARA_HediffComp_TopTurret\\HediffComp_TopTurret.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffComp_TopTurret\\HediffComp_TopTurret.cs", + "RelativeToolTip": "Hediffs\\ARA_HediffComp_TopTurret\\HediffComp_TopTurret.cs", + "ViewState": "AgIAACcBAAAAAAAAAAAkwD0BAAAjAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T14:52:46.325Z" + }, + { + "$type": "Document", + "DocumentIndex": 17, + "Title": "RoomRoleWorker_Incubator.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\RoomRole\\RoomRoleWorker_Incubator.cs", + "RelativeDocumentMoniker": "RoomRole\\RoomRoleWorker_Incubator.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\RoomRole\\RoomRoleWorker_Incubator.cs", + "RelativeToolTip": "RoomRole\\RoomRoleWorker_Incubator.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAABAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T14:32:31.389Z" + }, + { + "$type": "Document", + "DocumentIndex": 19, + "Title": "CompProperties_ChitinStripping.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\CompProperties_ChitinStripping.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_StripChitin\\CompProperties_ChitinStripping.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_StripChitin\\CompProperties_ChitinStripping.cs", + "RelativeToolTip": "Jobs\\JobDriver_StripChitin\\CompProperties_ChitinStripping.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAAtAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T15:50:04.277Z" + }, + { + "$type": "Document", + "DocumentIndex": 23, + "Title": "CompResearchProducer.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", + "RelativeToolTip": "Building_Comps\\ARA_CompInteractiveProducer\\CompResearchProducer.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvy0AAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T14:29:05.969Z" + }, + { + "$type": "Document", + "DocumentIndex": 24, + "Title": "CompCorpseConverter.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CorpseConverter\\CompCorpseConverter.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_CorpseConverter\\CompCorpseConverter.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CorpseConverter\\CompCorpseConverter.cs", + "RelativeToolTip": "Building_Comps\\ARA_CorpseConverter\\CompCorpseConverter.cs", + "ViewState": "AgIAABwDAAAAAAAAAAAIwCoDAAARAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T12:23:40.696Z" + }, + { + "$type": "Document", + "DocumentIndex": 25, + "Title": "CompProperties_CorpseConverter.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CorpseConverter\\CompProperties_CorpseConverter.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_CorpseConverter\\CompProperties_CorpseConverter.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_CorpseConverter\\CompProperties_CorpseConverter.cs", + "RelativeToolTip": "Building_Comps\\ARA_CorpseConverter\\CompProperties_CorpseConverter.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T12:23:39.636Z" + }, + { + "$type": "Document", + "DocumentIndex": 28, + "Title": "CompRefuelableNutrition_WithKey.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\WULA_MutiFuelSpawner\\CompRefuelableNutrition_WithKey.cs", + "RelativeDocumentMoniker": "Building_Comps\\WULA_MutiFuelSpawner\\CompRefuelableNutrition_WithKey.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\WULA_MutiFuelSpawner\\CompRefuelableNutrition_WithKey.cs", + "RelativeToolTip": "Building_Comps\\WULA_MutiFuelSpawner\\CompRefuelableNutrition_WithKey.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAACUAAABAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T10:38:33.135Z" + }, + { + "$type": "Document", + "DocumentIndex": 26, + "Title": "CompTerrainChanger.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_TerrainChanger\\CompTerrainChanger.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_TerrainChanger\\CompTerrainChanger.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_TerrainChanger\\CompTerrainChanger.cs", + "RelativeToolTip": "Building_Comps\\ARA_TerrainChanger\\CompTerrainChanger.cs", + "ViewState": "AgIAAK0CAAAAAAAAAAAcwPYCAAAMAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T10:30:16.921Z" + }, + { + "$type": "Document", + "DocumentIndex": 27, + "Title": "CompProperties_TerrainChanger.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_TerrainChanger\\CompProperties_TerrainChanger.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_TerrainChanger\\CompProperties_TerrainChanger.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_TerrainChanger\\CompProperties_TerrainChanger.cs", + "RelativeToolTip": "Building_Comps\\ARA_TerrainChanger\\CompProperties_TerrainChanger.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T10:30:15.601Z" + }, + { + "$type": "Document", + "DocumentIndex": 34, + "Title": "Building_RefuelingVat.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "RelativeToolTip": "Building_Comps\\ARA_Building_RefuelingVat\\Building_RefuelingVat.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T10:28:54.756Z" + }, + { + "$type": "Document", + "DocumentIndex": 29, + "Title": "CompProperties_IncubatorData.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\CompProperties_IncubatorData.cs", + "RelativeDocumentMoniker": "Buildings\\Building_Ootheca\\CompProperties_IncubatorData.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\CompProperties_IncubatorData.cs", + "RelativeToolTip": "Buildings\\Building_Ootheca\\CompProperties_IncubatorData.cs", + "ViewState": "AgIAANcAAAAAAAAAAIA1wPoAAAAxAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T04:37:03.042Z" + }, + { + "$type": "Document", + "DocumentIndex": 30, + "Title": "OothecaIncubatorExtension.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\OothecaIncubatorExtension.cs", + "RelativeDocumentMoniker": "Buildings\\Building_Ootheca\\OothecaIncubatorExtension.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\OothecaIncubatorExtension.cs", + "RelativeToolTip": "Buildings\\Building_Ootheca\\OothecaIncubatorExtension.cs", + "ViewState": "AgIAAAAAAAAAAAAAAADwvxUAAABBAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-16T04:36:59.394Z" + }, + { + "$type": "Document", + "DocumentIndex": 33, + "Title": "Building_EquipmentOotheca.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_EquipmentOotheca\\Building_EquipmentOotheca.cs", + "RelativeDocumentMoniker": "Buildings\\Building_EquipmentOotheca\\Building_EquipmentOotheca.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_EquipmentOotheca\\Building_EquipmentOotheca.cs", + "RelativeToolTip": "Buildings\\Building_EquipmentOotheca\\Building_EquipmentOotheca.cs", + "ViewState": "AgIAACcAAAAAAAAAAAAAADoDAABSAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-15T18:22:14.171Z" + }, + { + "$type": "Document", + "DocumentIndex": 31, + "Title": "Building_Ootheca.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "RelativeDocumentMoniker": "Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "RelativeToolTip": "Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "ViewState": "AgIAALcCAAAAAAAAAAAewNgCAAAVAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-15T18:22:12.217Z" + }, + { + "$type": "Document", + "DocumentIndex": 32, + "Title": "CompProperties_EquipmentIncubatorData.cs", + "DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_EquipmentOotheca\\CompProperties_EquipmentIncubatorData.cs", + "RelativeDocumentMoniker": "Buildings\\Building_EquipmentOotheca\\CompProperties_EquipmentIncubatorData.cs", + "ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_EquipmentOotheca\\CompProperties_EquipmentIncubatorData.cs", + "RelativeToolTip": "Buildings\\Building_EquipmentOotheca\\CompProperties_EquipmentIncubatorData.cs", + "ViewState": "AgIAAA4AAAAAAAAAAADwvyYAAAAaAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-15T17:55:40.041Z" } ] } diff --git a/Source/ArachnaeSwarm/ARA_HediffDefOf.cs b/Source/ArachnaeSwarm/ARA_HediffDefOf.cs index 1034789..7cd7218 100644 --- a/Source/ArachnaeSwarm/ARA_HediffDefOf.cs +++ b/Source/ArachnaeSwarm/ARA_HediffDefOf.cs @@ -21,6 +21,9 @@ namespace ArachnaeSwarm public static JobDef ARA_OperateIncubator; public static JobDef ARA_OperateEquipmentIncubator; public static JobDef ARA_SwarmMaintain; + public static JobDef ARA_ExtractHoney; + public static JobDef ARA_StripChitin; + public static JobDef ARA_FeedWithHoney; static ARA_JobDefOf() { diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index ec3ab3d..8ee48eb 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -114,6 +114,8 @@ + + @@ -131,6 +133,9 @@ + + + @@ -256,6 +261,8 @@ + + @@ -371,6 +378,8 @@ + + diff --git a/Source/ArachnaeSwarm/Building_Comps/ARA_BuildingTerrainSpawn/CompDelayedTerrainSpawn.cs b/Source/ArachnaeSwarm/Building_Comps/ARA_BuildingTerrainSpawn/CompDelayedTerrainSpawn.cs index 38c3e9c..390cb7d 100644 --- a/Source/ArachnaeSwarm/Building_Comps/ARA_BuildingTerrainSpawn/CompDelayedTerrainSpawn.cs +++ b/Source/ArachnaeSwarm/Building_Comps/ARA_BuildingTerrainSpawn/CompDelayedTerrainSpawn.cs @@ -64,7 +64,7 @@ namespace ArachnaeSwarm /// 如果地形有 ARA_Creep 标签则返回 true private bool HasCreepTag(TerrainDef terrain) { - return terrain.tags != null && terrain.tags.Contains("ARA_Creep"); + return terrain.tags != null && terrain.tags.Contains("ARA_Creep") || terrain.tags.Contains("ARA_Incubator_Nutrient_Solution"); } // NOTICE: There is NO CompTick() method here. This component does not perform any updates after it has spawned. diff --git a/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/CompProperties_SwarmMaintenance.cs b/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/CompProperties_SwarmMaintenance.cs index e33b6b8..c691c74 100644 --- a/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/CompProperties_SwarmMaintenance.cs +++ b/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/CompProperties_SwarmMaintenance.cs @@ -19,13 +19,10 @@ namespace ArachnaeSwarm // 维护度达到多少时开始显示警告(百分比) public float warningThreshold = 0.3f; - // 可维护的种族列表 - public List allowedRaces; + // 可维护的种族列表(现在由WorkGiver处理) + // public List allowedRaces; - // 检查分配工作的间隔(ticks) - public int assignJobCheckInterval = 600; // 10秒 - - // 维护度低于多少时开始寻找维护者(百分比) + // 维护度低于多少时开始需要维护工作(百分比) public float maintenanceThresholdForJob = 0.9f; public CompProperties_SwarmMaintenance() diff --git a/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/Comp_SwarmMaintenance.cs b/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/Comp_SwarmMaintenance.cs index 770cafd..4572354 100644 --- a/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/Comp_SwarmMaintenance.cs +++ b/Source/ArachnaeSwarm/Building_Comps/ARA_SwarmMaintenance/Comp_SwarmMaintenance.cs @@ -18,19 +18,14 @@ namespace ArachnaeSwarm // 上次更新维护度的时间 private int lastMaintenanceTick = -99999; - // 上次检查分配工作的时间 - private int lastJobCheckTick = -99999; - // 当维护度为0时,每秒受到的伤害计时器 private int nextDamageTick = -99999; - // 是否正在寻找维护者 - private bool seekingMaintainer = false; - - // 找不到维护者的提示信息 - private string noMaintainerWarning = ""; + // 警告计时器 private int lastWarningTick = -99999; - private const int WarningDuration = 2500; // 警告显示41.67秒 + private const int WarningInterval = 2500; // 警告间隔时间 + private const float CriticalWarningThreshold = 0.3f; // 警告阈值(百分比) + private bool lastWarningState = false; // 属性访问 public float CurrentMaintenance => currentMaintenance; @@ -46,7 +41,6 @@ namespace ArachnaeSwarm base.Initialize(props); currentMaintenance = Props.maxMaintenance; // 初始时满维护度 lastMaintenanceTick = Find.TickManager.TicksGame; - lastJobCheckTick = Find.TickManager.TicksGame; } // 序列化 @@ -55,11 +49,9 @@ namespace ArachnaeSwarm base.PostExposeData(); Scribe_Values.Look(ref currentMaintenance, "currentMaintenance", Props.maxMaintenance); Scribe_Values.Look(ref lastMaintenanceTick, "lastMaintenanceTick", -99999); - Scribe_Values.Look(ref lastJobCheckTick, "lastJobCheckTick", -99999); Scribe_Values.Look(ref nextDamageTick, "nextDamageTick", -99999); - Scribe_Values.Look(ref seekingMaintainer, "seekingMaintainer", false); - Scribe_Values.Look(ref noMaintainerWarning, "noMaintainerWarning", ""); Scribe_Values.Look(ref lastWarningTick, "lastWarningTick", -99999); + Scribe_Values.Look(ref lastWarningState, "lastWarningState", false); } // 每tick更新 @@ -76,11 +68,11 @@ namespace ArachnaeSwarm lastMaintenanceTick = currentTick; } - // 定期检查是否需要分配维护工作 - if (currentTick - lastJobCheckTick >= Props.assignJobCheckInterval) + // 检查是否需要显示警告 + if (currentTick - lastWarningTick >= WarningInterval) { - CheckAndAssignMaintenanceJob(); - lastJobCheckTick = currentTick; + CheckWarning(); + lastWarningTick = currentTick; } // 如果维护度为0,每秒造成伤害 @@ -89,12 +81,6 @@ namespace ArachnaeSwarm ApplyDamageWhenEmpty(); nextDamageTick = currentTick + 60; // 60ticks = 1秒 } - - // 更新警告信息显示时间 - if (currentTick - lastWarningTick >= WarningDuration) - { - noMaintainerWarning = ""; - } } // 更新维护度递减 @@ -112,6 +98,39 @@ namespace ArachnaeSwarm currentMaintenance = 0f; } + // 检查是否需要显示警告 + private void CheckWarning() + { + if (parent == null || parent.Destroyed || parent.Map == null) + return; + + bool isCritical = MaintenancePercentage <= CriticalWarningThreshold; + + // 如果状态改变,显示警告 + if (isCritical && !lastWarningState) + { + ShowMaintenanceWarning(); + lastWarningState = true; + } + else if (!isCritical && lastWarningState) + { + lastWarningState = false; + } + } + + // 显示维护警告 + private void ShowMaintenanceWarning() + { + if (parent == null) + return; + + // 添加警告标记 + if (parent.Spawned) + { + MoteMaker.ThrowText(parent.DrawPos, parent.Map, "ARA_SwarmMaintenance.NeedsMaintenance".Translate(), Color.yellow); + } + } + // 当维护度为0时应用伤害 private void ApplyDamageWhenEmpty() { @@ -130,188 +149,53 @@ namespace ArachnaeSwarm )); } - // 检查并分配维护工作 - private void CheckAndAssignMaintenanceJob() - { - if (parent == null || parent.Map == null || parent.Faction == null) - return; - - // 如果不需要维护,重置状态 - if (!NeedsMaintenance) - { - seekingMaintainer = false; - return; - } - - // 如果正在寻找维护者,尝试分配工作 - if (!seekingMaintainer) - { - seekingMaintainer = true; - } - - // 尝试寻找符合条件的Pawn - Pawn maintainer = FindAvailableMaintainer(); - - if (maintainer != null) - { - // 分配维护工作 - AssignMaintenanceJobTo(maintainer); - seekingMaintainer = false; - noMaintainerWarning = ""; - } - else - { - // 记录找不到维护者的警告 - if (noMaintainerWarning == "") - { - noMaintainerWarning = "ARA_SwarmMaintenance.NoMaintainerFound".Translate(); - lastWarningTick = Find.TickManager.TicksGame; - } - } - } - - // 寻找可用的维护者 - private Pawn FindAvailableMaintainer() - { - if (parent.Map == null || parent.Faction == null) - return null; - - // 查找地图中所有属于玩家阵营的Pawn - List allPawns = parent.Map.mapPawns.SpawnedPawnsInFaction(parent.Faction); - - foreach (Pawn pawn in allPawns) - { - if (CanPawnMaintain(pawn)) - { - return pawn; - } - } - - return null; - } - - // 判断Pawn是否可以维护 - private bool CanPawnMaintain(Pawn pawn) - { - if (pawn == null || pawn.Dead || pawn.Downed || pawn.InMentalState) - return false; - - // 检查种族是否在允许列表中 - if (Props.allowedRaces != null && Props.allowedRaces.Count > 0) - { - if (!Props.allowedRaces.Contains(pawn.def)) - return false; - } - - // 检查Pawn是否处于GotoWander或Wait_Wander状态 - if (!IsPawnWandering(pawn)) - return false; - - // 检查Pawn是否已经有维护工作 - if (HasMaintenanceJob(pawn)) - return false; - - return true; - } - - // 检查Pawn是否处于漫游状态 - private bool IsPawnWandering(Pawn pawn) - { - if (pawn.jobs == null || pawn.jobs.curJob == null) - return false; - - Job curJob = pawn.jobs.curJob; - - // 检查是否是漫游工作 - if (curJob.def == JobDefOf.GotoWander || curJob.def == JobDefOf.Wait_Wander) - { - return true; - } - - return false; - } - - // 检查Pawn是否已经有维护工作 - private bool HasMaintenanceJob(Pawn pawn) - { - if (pawn.jobs == null) - return false; - - // 检查当前工作是否是维护工作 - if (pawn.jobs.curJob != null && pawn.jobs.curJob.def == ARA_JobDefOf.ARA_SwarmMaintain) - { - return true; - } - - // 检查工作队列中是否有维护工作 - if (pawn.jobs.jobQueue != null && pawn.jobs.jobQueue.Count > 0) - { - foreach (QueuedJob queuedJob in pawn.jobs.jobQueue) - { - if (queuedJob.job.def == ARA_JobDefOf.ARA_SwarmMaintain) - { - return true; - } - } - } - - return false; - } - - // 为Pawn分配维护工作 - private void AssignMaintenanceJobTo(Pawn pawn) - { - if (pawn == null || pawn.jobs == null) - return; - - // 创建维护工作 - Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_SwarmMaintain, parent); - job.expiryInterval = 30000; // 工作过期时间 - job.ignoreForbidden = false; - - // 记录Pawn原来的工作以便恢复 - Job oldJob = pawn.jobs.curJob; - - // 将工作添加到队列末尾 - pawn.jobs.TryTakeOrderedJob(job, JobTag.MiscWork); - - // 如果Pawn原来在漫游,我们可以在维护工作完成后恢复漫游状态 - if (oldJob != null && (oldJob.def == JobDefOf.GotoWander || oldJob.def == JobDefOf.Wait_Wander)) - { - // 我们可以在维护工作完成后添加一个恢复漫游的工作 - // 这里暂时不做处理,因为维护工作完成后Pawn会回到空闲状态 - // 如果需要更精细的控制,可以在JobDriver_SwarmMaintain完成时添加漫游工作 - } - } - // 添加维护度 public void AddMaintenance(float amount) { currentMaintenance += amount; if (currentMaintenance > MaxMaintenance) currentMaintenance = MaxMaintenance; + + // 维护后重置警告状态 + lastWarningState = false; } // 重置维护度 public void ResetMaintenance() { currentMaintenance = MaxMaintenance; + lastWarningState = false; + } + + // 获取可维护的优先级(用于WorkGiver排序) + public float GetMaintenancePriority() + { + // 维护度越低,优先级越高 + return 1f - MaintenancePercentage; } // 在建筑信息面板中追加维护信息 public override string CompInspectStringExtra() { // 基础信息 - string text = "ARA_SwarmMaintenance.MaintenanceLevel".Translate(currentMaintenance.ToString("F1"), MaxMaintenance.ToString("F1"), MaintenancePercentage.ToString("P1")); + string text = "ARA_SwarmMaintenance.MaintenanceLevel".Translate( + currentMaintenance.ToString("F1"), + MaxMaintenance.ToString("F1"), + MaintenancePercentage.ToString("P1")); // 添加维护度递减信息 text += "\n" + "ARA_SwarmMaintenance.DailyDecay".Translate(Props.maintenanceDecayPerDay.ToString("F1")); - - // 显示找不到维护者的警告 - if (noMaintainerWarning != "") + // 显示维护状态 + if (NeedsMaintenance) { - text += "\n" + noMaintainerWarning + ""; + text += "\n" + "ARA_SwarmMaintenance.NeedsMaintenance".Translate(); + } + + // 显示警告信息 + if (IsCritical) + { + text += "\n" + "ARA_SwarmMaintenance.CriticalLevel".Translate() + ""; } return text; @@ -323,58 +207,9 @@ namespace ArachnaeSwarm // 只在玩家控制下显示 if (parent.Faction?.IsPlayer == true) { - // 调试按钮:手动触发寻找维护者 - 仅在GodMode下显示 + // 调试按钮 - 仅在GodMode下显示 if (DebugSettings.godMode) { - yield return new Command_Action - { - defaultLabel = "Debug: Find Maintainer", - action = () => - { - Pawn maintainer = FindAvailableMaintainer(); - if (maintainer != null) - { - Messages.Message($"找到维护者: {maintainer.LabelShort} (当前工作: {maintainer.jobs.curJob?.def.defName ?? "无"})", MessageTypeDefOf.PositiveEvent); - AssignMaintenanceJobTo(maintainer); - } - else - { - Messages.Message("未找到符合条件的空闲维护者", MessageTypeDefOf.NegativeEvent); - - // 列出所有符合条件的Pawn及其状态 - List allPawns = parent.Map.mapPawns.SpawnedPawnsInFaction(parent.Faction); - List pawnStatus = new List(); - - foreach (Pawn pawn in allPawns) - { - if (Props.allowedRaces != null && Props.allowedRaces.Count > 0 && !Props.allowedRaces.Contains(pawn.def)) - continue; - - string status = $"{pawn.LabelShort}: "; - if (pawn.Dead) status += "死亡"; - else if (pawn.Downed) status += "倒地"; - else if (pawn.InMentalState) status += "精神崩溃"; - else if (pawn.jobs?.curJob != null) - { - status += $"{pawn.jobs.curJob.def.defName}"; - if (HasMaintenanceJob(pawn)) status += " (已有维护工作)"; - } - else - { - status += "空闲"; - } - - pawnStatus.Add(status); - } - - if (pawnStatus.Count > 0) - { - Messages.Message("符合条件的Pawn状态:\n" + string.Join("\n", pawnStatus), MessageTypeDefOf.SilentInput); - } - } - } - }; - yield return new Command_Action { defaultLabel = "Debug: Reset Maintenance", @@ -392,6 +227,15 @@ namespace ArachnaeSwarm defaultLabel = "Debug: Reduce to 0", action = () => currentMaintenance = 0f }; + + yield return new Command_Action + { + defaultLabel = "Debug: Show Priority", + action = () => + { + Messages.Message($"维护优先级: {GetMaintenancePriority():F2}", MessageTypeDefOf.SilentInput); + } + }; } } } diff --git a/Source/ArachnaeSwarm/Buildings/Building_DormancyVat/Building_DormancyVat.cs b/Source/ArachnaeSwarm/Buildings/Building_DormancyVat/Building_DormancyVat.cs new file mode 100644 index 0000000..b3c6e5a --- /dev/null +++ b/Source/ArachnaeSwarm/Buildings/Building_DormancyVat/Building_DormancyVat.cs @@ -0,0 +1,459 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace ArachnaeSwarm +{ + [StaticConstructorOnStartup] + public class Building_DormancyVat : Building_Enterable, IThingHolder, IThingHolderWithDrawnPawn + { + private Graphic cachedTopGraphic; + + // IThingHolderWithDrawnPawn implementation + public float HeldPawnDrawPos_Y => DrawPos.y + 0.03658537f; + public float HeldPawnBodyAngle => base.Rotation.AsAngle; + public PawnPosture HeldPawnPosture => PawnPosture.LayingOnGroundFaceUp; + + private Graphic TopGraphic + { + get + { + if (cachedTopGraphic == null) + { + var modExtension = def.GetModExtension(); + if (modExtension != null && !modExtension.topGraphicPath.NullOrEmpty()) + { + cachedTopGraphic = GraphicDatabase.Get(modExtension.graphicClass, modExtension.topGraphicPath, ShaderDatabase.Transparent, def.graphicData.drawSize, Color.white, Color.white); + } + } + return cachedTopGraphic; + } + } + + public override Vector3 PawnDrawOffset => Vector3.zero; + + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + base.SpawnSetup(map, respawningAfterLoad); + } + + public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish) + { + if (mode != DestroyMode.WillReplace) + { + if (selectedPawn != null && innerContainer.Contains(selectedPawn)) + { + Finish(); // 弹出里面的pawn + } + } + base.DeSpawn(mode); + } + + protected override void Tick() + { + base.Tick(); + + if (selectedPawn != null && (selectedPawn.Destroyed || !innerContainer.Contains(selectedPawn))) + { + OnStop(); + return; + } + + if (base.Working && selectedPawn != null) + { + // 检查pawn是否死亡 + if (selectedPawn.Dead || selectedPawn.Destroyed) + { + Finish(); // 弹出死亡的pawn + return; + } + + // 休眠Vat不产生任何效果,只需保持pawn在里面 + } + } + + public override AcceptanceReport CanAcceptPawn(Pawn pawn) + { + if (base.Working) + { + return "DormancyVat_Occupied".Translate(); + } + if (selectedPawn != null && selectedPawn != pawn) + { + return "DormancyVat_WaitingForArachnae".Translate(selectedPawn.Named("PAWN")); + } + + // 只允许虫族成员进入 + bool isArachnaeMember = + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone); + + if (!isArachnaeMember) + { + return "DormancyVat_OnlyArachnaeAllowed".Translate(pawn.Named("PAWN")); + } + + // 不允许已经死亡的pawn + if (pawn.Dead) + { + return "DormancyVat_CannotAcceptDeadPawn".Translate(pawn.Named("PAWN")); + } + + // 允许殖民者、囚犯和奴隶,但必须是虫族成员 + bool isColonist = pawn.IsColonist; + bool isPrisoner = pawn.IsPrisonerOfColony; + bool isSlave = pawn.IsSlaveOfColony; + + return (isColonist || isPrisoner || isSlave) && !pawn.IsQuestLodger(); + } + + public override void TryAcceptPawn(Pawn pawn) + { + if (!CanAcceptPawn(pawn).Accepted) + { + return; + } + + selectedPawn = pawn; + bool deselected = pawn.DeSpawnOrDeselect(); + if (innerContainer.TryAddOrTransfer(pawn)) + { + startTick = Find.TickManager.TicksGame; + } + if (deselected) + { + Find.Selector.Select(pawn, playSound: false, forceDesignatorDeselect: false); + } + } + + private void Finish() + { + if (selectedPawn != null) + { + try + { + // 检查pawn是否还活着 + if (selectedPawn.Dead) + { + Notify_PawnRemoved(); + + // 对死亡的pawn,将其尸体弹出 + bool ejected = false; + + if (innerContainer.Contains(selectedPawn)) + { + ejected = innerContainer.TryDrop(selectedPawn, InteractionCell, base.Map, ThingPlaceMode.Near, 1, out var _); + } + + if (!ejected && innerContainer.Contains(selectedPawn)) + { + var adjacentCells = GenAdj.CellsAdjacent8Way(this).Where(c => c.Walkable(base.Map) && c.InBounds(base.Map)).ToList(); + if (adjacentCells.Count > 0) + { + IntVec3 randomCell = adjacentCells.RandomElement(); + ejected = innerContainer.TryDrop(selectedPawn, randomCell, base.Map, ThingPlaceMode.Direct, 1, out var _); + } + } + + if (!ejected && innerContainer.Contains(selectedPawn)) + { + innerContainer.Remove(selectedPawn); + GenPlace.TryPlaceThing(selectedPawn, this.Position, base.Map, ThingPlaceMode.Near); + } + } + else + { + Notify_PawnRemoved(); + + // 对活着的pawn,安全弹出 + bool ejected = false; + + if (innerContainer.Contains(selectedPawn)) + { + ejected = innerContainer.TryDrop(selectedPawn, InteractionCell, base.Map, ThingPlaceMode.Near, 1, out var _); + } + + if (!ejected && innerContainer.Contains(selectedPawn)) + { + var adjacentCells = GenAdj.CellsAdjacent8Way(this).Where(c => c.Walkable(base.Map) && c.InBounds(base.Map)).ToList(); + if (adjacentCells.Count > 0) + { + IntVec3 randomCell = adjacentCells.RandomElement(); + ejected = innerContainer.TryDrop(selectedPawn, randomCell, base.Map, ThingPlaceMode.Direct, 1, out var _); + } + } + + if (!ejected && innerContainer.Contains(selectedPawn)) + { + innerContainer.Remove(selectedPawn); + GenPlace.TryPlaceThing(selectedPawn, this.Position, base.Map, ThingPlaceMode.Near); + } + } + } + catch (Exception ex) + { + Log.Error("DormancyVat_ErrorEjecting".Translate(selectedPawn.Label) + ": " + ex.ToString()); + } + finally + { + OnStop(); + } + } + } + + private void OnStop() + { + if (selectedPawn != null) + { + if (innerContainer.Contains(selectedPawn)) + { + innerContainer.Remove(selectedPawn); + } + } + selectedPawn = null; + startTick = -1; + } + + private void Notify_PawnRemoved() + { + // 可以在这里添加音效 + // SoundDefOf.GrowthVat_Open.PlayOneShot(SoundInfo.InMap(this)); + } + + public override IEnumerable GetGizmos() + { + // 基础Gizmos + foreach (Gizmo gizmo in base.GetGizmos()) + { + yield return gizmo; + } + + if (base.Working) + { + // 休眠Vat工作时显示"弹出"按钮 + Command_Action ejectCommand = new Command_Action + { + defaultLabel = "DormancyVat_EjectButton".Translate(), + defaultDesc = "DormancyVat_EjectButtonDesc".Translate(), + icon = ContentFinder.Get("UI/Commands/Cancel", false), + action = () => Finish() + }; + yield return ejectCommand; + } + else + { + // 选择虫族成员的操作 + Command_Action command_Action = new Command_Action + { + defaultLabel = "DormancyVat_InsertButton".Translate() + "...", + defaultDesc = "DormancyVat_InsertButtonDesc".Translate(), + icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_InsertPawn", false), + action = () => + { + List list = new List(); + foreach (Pawn p in base.Map.mapPawns.AllPawnsSpawned) + { + if (CanAcceptPawn(p).Accepted) + { + string pawnType = ""; + if (p.IsColonist) pawnType = "DormancyVat_Colonist".Translate(); + else if (p.IsPrisoner) pawnType = "DormancyVat_Prisoner".Translate(); + else if (p.IsSlave) pawnType = "DormancyVat_Slave".Translate(); + + list.Add(new FloatMenuOption( + p.LabelCap + " (" + pawnType + ")", + () => SelectPawn(p), + p, + Color.white + )); + } + } + if (!list.Any()) + { + list.Add(new FloatMenuOption("DormancyVat_NoArachnaeAvailable".Translate(), null)); + } + Find.WindowStack.Add(new FloatMenu(list)); + } + }; + if (!base.AnyAcceptablePawns) + { + command_Action.Disable("DormancyVat_NoArachnaeAvailable".Translate()); + } + yield return command_Action; + } + } + + private string GetArachnaeType(Pawn pawn) + { + if (pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster)) + return "DormancyVat_ArachnaeType_Master".Translate(); + else if (pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone)) + return "DormancyVat_ArachnaeType_Drone".Translate(); + else if (pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker)) + return "DormancyVat_ArachnaeType_Worker".Translate(); + else + return "DormancyVat_ArachnaeType_Unknown".Translate(); + } + + public override string GetInspectString() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(base.GetInspectString()); + + if (base.Working && selectedPawn != null) + { + stringBuilder.AppendLineIfNotEmpty().Append("DormancyVat_Contains".Translate() + ": " + selectedPawn.NameShortColored.Resolve()); + stringBuilder.AppendLineIfNotEmpty().Append("DormancyVat_TypeLabel".Translate() + ": " + GetArachnaeType(selectedPawn)); + + // 显示休眠时间 + if (startTick > 0) + { + int ticksInVat = Find.TickManager.TicksGame - startTick; + int days = ticksInVat / 60000; + int hours = (ticksInVat % 60000) / 2500; + stringBuilder.AppendLineIfNotEmpty().Append("DormancyVat_DormancyTime".Translate() + $": {days}" + "DormancyVat_Days".Translate() + $"{hours}" + "DormancyVat_Hours".Translate()); + } + + // 显示健康状态 + stringBuilder.AppendLineIfNotEmpty().Append("DormancyVat_HealthStatus".Translate() + ": " + selectedPawn.health.summaryHealth.SummaryHealthPercent.ToStringPercent()); + } + else if (selectedPawn != null) + { + stringBuilder.AppendLineIfNotEmpty().Append("DormancyVat_WaitingForArachnae".Translate(selectedPawn.Named("PAWN")).Resolve()); + } + + return stringBuilder.ToString(); + } + + public override IEnumerable GetFloatMenuOptions(Pawn selPawn) + { + foreach (FloatMenuOption floatMenuOption in base.GetFloatMenuOptions(selPawn)) + { + yield return floatMenuOption; + } + if (!selPawn.CanReach(this, PathEndMode.InteractionCell, Danger.Deadly)) + { + yield return new FloatMenuOption("DormancyVat_CannotEnter".Translate(this) + ": " + "DormancyVat_NoPath".Translate().CapitalizeFirst(), null); + yield break; + } + AcceptanceReport acceptanceReport = CanAcceptPawn(selPawn); + if (acceptanceReport.Accepted) + { + yield return FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("DormancyVat_Enter".Translate(this), () => SelectPawn(selPawn)), selPawn, this); + } + else if (!acceptanceReport.Reason.NullOrEmpty()) + { + yield return new FloatMenuOption("DormancyVat_CannotEnter".Translate(this) + ": " + acceptanceReport.Reason.CapitalizeFirst(), null); + } + } + + public override void DynamicDrawPhaseAt(DrawPhase phase, Vector3 drawLoc, bool flip = false) + { + if (base.Working && selectedPawn != null && innerContainer.Contains(selectedPawn)) + { + selectedPawn.Drawer.renderer.DynamicDrawPhaseAt(phase, drawLoc + PawnDrawOffset, null, neverAimWeapon: true); + } + base.DynamicDrawPhaseAt(phase, drawLoc, flip); + } + + protected override void DrawAt(Vector3 drawLoc, bool flip = false) + { + base.DrawAt(drawLoc, flip); + // 绘制顶部图形(如果存在) + if (TopGraphic != null) + { + TopGraphic.Draw(DrawPos + Altitudes.AltIncVect * 2f, base.Rotation, this); + } + } + + public Job CreateCarryJobForMember(Pawn member, Pawn carrier) + { + if (member == null || carrier == null) + return null; + if (!CanAcceptPawn(member).Accepted) + return null; + + // 创建搬运工作定义 + JobDef carryJobDef = DefDatabase.GetNamed("ARA_CarryMemberToDormancyVat"); + if (carryJobDef == null) + return null; + Job job = JobMaker.MakeJob(carryJobDef, member, this); + job.count = 1; + return job; + } + + public IEnumerable GetAvailableCarriers() + { + foreach (Pawn pawn in base.Map.mapPawns.AllPawnsSpawned) + { + // 检查是否是虫群成员 + if (pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster)) + { + // 检查是否能够工作且不是囚犯 + if (pawn.workSettings != null && pawn.workSettings.WorkIsActive(WorkTypeDefOf.Hauling) && + !pawn.Downed && !pawn.IsPrisoner && pawn.CanReach(this, PathEndMode.InteractionCell, Danger.Some)) + { + yield return pawn; + } + } + } + } + + public void AssignCarrierForMember(Pawn member) + { + if (member == null) + return; + + // 获取可用的搬运者 + var availableCarriers = GetAvailableCarriers().ToList(); + + if (!availableCarriers.Any()) + { + Messages.Message("DormancyVat_NoAvailableCarriers".Translate(), MessageTypeDefOf.RejectInput); + return; + } + + // 创建浮动菜单选择搬运者 + List options = new List(); + + foreach (Pawn carrier in availableCarriers) + { + options.Add(new FloatMenuOption( + carrier.LabelCap + " (" + GetArachnaeType(carrier) + ")", + () => + { + Job carryJob = CreateCarryJobForMember(member, carrier); + if (carryJob != null) + { + carrier.jobs.TryTakeOrderedJob(carryJob, JobTag.MiscWork); + Messages.Message("DormancyVat_CarrierAssigned".Translate(carrier.LabelShort, member.LabelShort), MessageTypeDefOf.NeutralEvent); + } + }, + carrier, + Color.white + )); + } + + if (options.Any()) + { + Find.WindowStack.Add(new FloatMenu(options)); + } + else + { + Messages.Message("DormancyVat_NoAvailableCarriers".Translate(), MessageTypeDefOf.RejectInput); + } + } + + // 保存和加载数据 + public override void ExposeData() + { + base.ExposeData(); + } + } +} diff --git a/Source/ArachnaeSwarm/Buildings/Building_DormancyVat/DefModExtension_DormancyVat.cs b/Source/ArachnaeSwarm/Buildings/Building_DormancyVat/DefModExtension_DormancyVat.cs new file mode 100644 index 0000000..0190f65 --- /dev/null +++ b/Source/ArachnaeSwarm/Buildings/Building_DormancyVat/DefModExtension_DormancyVat.cs @@ -0,0 +1,11 @@ +using System; +using Verse; + +namespace ArachnaeSwarm +{ + public class DefModExtension_DormancyVat : DefModExtension + { + public string topGraphicPath; + public Type graphicClass = typeof(Graphic_Multi); // 如果在XML中没有指定,默认使用Graphic_Multi + } +} diff --git a/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs b/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs index 19fd260..8831d7d 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs @@ -1,4 +1,5 @@ // File: Buildings/Building_ResearchBlueprintReader.cs +using AlienRace; using RimWorld; using System; using System.Collections.Generic; @@ -150,7 +151,7 @@ namespace ArachnaeSwarm isResearching = false; // 发送消息 - Messages.Message($"科技研究完成: {storedResearch.LabelCap}", + Messages.Message("ResearchBlueprintReader_ResearchCompleted".Translate(storedResearch.LabelCap), MessageTypeDefOf.PositiveEvent); Log.Message($"[ResearchBlueprintReader] Research completed: {storedResearch.defName}"); @@ -174,7 +175,7 @@ namespace ArachnaeSwarm { if (IsLocked) { - Messages.Message("建筑已锁定储存科技,无法开始新研究", + Messages.Message("ResearchBlueprintReader_LockedBuilding".Translate(), MessageTypeDefOf.RejectInput); return; } @@ -185,7 +186,7 @@ namespace ArachnaeSwarm // 检查前置条件 if (!AreAllPrerequisitesCompleted(project)) { - Messages.Message("未满足前置科技条件", + Messages.Message("ResearchBlueprintReader_PrerequisitesNotMet".Translate(), MessageTypeDefOf.RejectInput); return; } @@ -202,7 +203,7 @@ namespace ArachnaeSwarm manager.RegisterResearch(this, project); } - Messages.Message($"开始研究: {project.LabelCap}(已绑定)", + Messages.Message("ResearchBlueprintReader_ResearchStarted".Translate(project.LabelCap), MessageTypeDefOf.NeutralEvent); } @@ -233,7 +234,7 @@ namespace ArachnaeSwarm isResearching = false; researchStartTime = 0; - Messages.Message($"建筑已解锁: {project.LabelCap}", + Messages.Message("ResearchBlueprintReader_BuildingUnlocked".Translate(project.LabelCap), MessageTypeDefOf.NeutralEvent); } } @@ -261,37 +262,23 @@ namespace ArachnaeSwarm if (IsLocked) { var unlockCmd = new Command_Action(); - unlockCmd.defaultLabel = "解锁建筑"; - unlockCmd.defaultDesc = "释放储存的科技,允许重新研究"; - unlockCmd.icon = ContentFinder.Get("UI/Designators/Unlock", false); + unlockCmd.defaultLabel = "ResearchBlueprintReader_UnlockBuilding".Translate(); + unlockCmd.defaultDesc = "ResearchBlueprintReader_UnlockBuildingDesc".Translate(); + unlockCmd.icon = ContentFinder.Get("ArachnaeSwarm/UI/Abilities/ARA_Ability_Morph", false); unlockCmd.action = delegate { UnlockBuilding(); }; yield return unlockCmd; - // 显示储存信息 - var infoCmd = new Command_Action(); - infoCmd.defaultLabel = $"储存: {storedResearch.LabelCap}"; - infoCmd.defaultDesc = "点击查看详细信息"; - infoCmd.icon = ContentFinder.Get("UI/Designators/Info", false); - infoCmd.action = delegate - { - Messages.Message($"此建筑储存着: {storedResearch.LabelCap}\n" + - $"状态: {(storedResearch.IsFinished ? "已完成" : "研究中")}\n" + - $"描述: {storedResearch.description.StripTags()}", - MessageTypeDefOf.NeutralEvent); - }; - yield return infoCmd; - yield break; // 锁定状态下不显示其他按钮 } // 选择研究按钮 var selectCmd = new Command_Action(); - selectCmd.defaultLabel = "选择研究项目"; - selectCmd.defaultDesc = "选择要研究的科技项目(一旦选择将永久绑定)"; - selectCmd.icon = ContentFinder.Get("UI/Designators/Research", false); + selectCmd.defaultLabel = "ResearchBlueprintReader_SelectProject".Translate(); + selectCmd.defaultDesc = "ResearchBlueprintReader_SelectProjectDesc".Translate(); + selectCmd.icon = ContentFinder.Get("ArachnaeSwarm/UI/Abilities/ARA_EggSpew_Techprint", false); selectCmd.action = delegate { ShowResearchMenu(); @@ -302,8 +289,8 @@ namespace ArachnaeSwarm if (DebugSettings.godMode && storedResearch != null && !storedResearch.IsFinished) { var debugCmd = new Command_Action(); - debugCmd.defaultLabel = "调试: 强制完成"; - debugCmd.defaultDesc = "立即完成当前研究"; + debugCmd.defaultLabel = "ResearchBlueprintReader_DebugComplete".Translate(); + debugCmd.defaultDesc = "ResearchBlueprintReader_DebugCompleteDesc".Translate(); debugCmd.icon = ContentFinder.Get("UI/Designators/Dev", false); debugCmd.action = delegate { @@ -320,7 +307,7 @@ namespace ArachnaeSwarm var araTab = DefDatabase.GetNamedSilentFail("ARA_ResearchTab"); if (araTab == null) { - Messages.Message("ARA_ResearchTab未找到", MessageTypeDefOf.RejectInput); + Messages.Message("ResearchBlueprintReader_TabNotFound".Translate(), MessageTypeDefOf.RejectInput); return; } @@ -330,7 +317,7 @@ namespace ArachnaeSwarm if (availableProjects.Count == 0) { - Messages.Message("没有可用的科技项目", MessageTypeDefOf.NeutralEvent); + Messages.Message("ResearchBlueprintReader_NoProjectsAvailable".Translate(), MessageTypeDefOf.NeutralEvent); return; } @@ -351,9 +338,9 @@ namespace ArachnaeSwarm { bool missingHidden = HasMissingHiddenPrerequisites(project); if (missingHidden) - label = $"{label} [需要隐藏前置]"; + label = $"{label} [{"ResearchBlueprintReader_HiddenPrerequisite".Translate()}]"; else - label = $"{label} [需要前置条件]"; + label = $"{label} [{"ResearchBlueprintReader_PrerequisitesNeeded".Translate()}]"; } var option = new FloatMenuOption(label, () => StartResearch(project)) @@ -373,7 +360,7 @@ namespace ArachnaeSwarm catch (Exception ex) { Log.Error($"[ResearchBlueprintReader] Error in ShowResearchMenu: {ex}"); - Messages.Message($"显示研究菜单时出错: {ex.Message}", + Messages.Message("ResearchBlueprintReader_MenuError".Translate(ex.Message), MessageTypeDefOf.NegativeEvent); } } @@ -423,9 +410,9 @@ namespace ArachnaeSwarm builder.AppendLine(project.description.StripTags()); builder.AppendLine(); - builder.AppendLine($"成本: {project.baseCost}"); - builder.AppendLine($"所需蓝图数量: {project.techprintCount}"); - builder.AppendLine($"当前全球进度: {Find.ResearchManager.GetProgress(project):F0}/{project.baseCost:F0}"); + builder.AppendLine("ResearchBlueprintReader_ProjectCost".Translate() + $": {project.baseCost}"); + builder.AppendLine("ResearchBlueprintReader_BlueprintCount".Translate() + $": {project.techprintCount}"); + builder.AppendLine("ResearchBlueprintReader_CurrentProgress".Translate() + $": {Find.ResearchManager.GetProgress(project):F0}/{project.baseCost:F0}"); // 检查所有未完成的前置(包括隐藏的) List missingPrereqs = new List(); @@ -453,7 +440,7 @@ namespace ArachnaeSwarm if (missingPrereqs.Count > 0) { builder.AppendLine(); - builder.AppendLine("缺失的前置科技:"); + builder.AppendLine("" + "ResearchBlueprintReader_MissingPrerequisites".Translate() + ":"); foreach (var prereq in missingPrereqs) { @@ -462,7 +449,7 @@ namespace ArachnaeSwarm project.hiddenPrerequisites.Contains(prereq); if (isHidden) - builder.AppendLine($" • {label} [隐藏前置]"); + builder.AppendLine($" • {label} [{"ResearchBlueprintReader_MissingHiddenPrerequisites".Translate()}]"); else builder.AppendLine($" • {label}"); } @@ -482,29 +469,31 @@ namespace ArachnaeSwarm { if (storedResearch.IsFinished) { - builder.AppendLine($"✓ 已研究: {storedResearch.LabelCap}"); + builder.AppendLine("" + "ResearchBlueprintReader_StatusCompleted".Translate(storedResearch.LabelCap) + ""); } else { - builder.AppendLine($"🔒 正在研究: {storedResearch.LabelCap}"); - builder.AppendLine($"本建筑进度: {progress:F0}/{storedResearch.baseCost:F0} ({(progress / storedResearch.baseCost * 100):F1}%)"); - builder.Append($"全球进度: {Find.ResearchManager.GetProgress(storedResearch):F0}/{storedResearch.baseCost:F0}"); + builder.AppendLine("" + "ResearchBlueprintReader_StatusResearching".Translate(storedResearch.LabelCap) + ""); + builder.AppendLine("ResearchBlueprintReader_BuildingProgress".Translate( + progress, storedResearch.baseCost, (progress / storedResearch.baseCost * 100))); + builder.Append("ResearchBlueprintReader_GlobalProgress".Translate( + Find.ResearchManager.GetProgress(storedResearch), storedResearch.baseCost)); // 显示研究速度 builder.AppendLine(); - builder.Append($"研究速度: {ResearchSpeed:F1}/秒"); + builder.Append("ResearchBlueprintReader_ResearchSpeed".Translate(ResearchSpeed)); if (researchStartTime > 0) { int days = (Find.TickManager.TicksGame - researchStartTime) / 60000; builder.AppendLine(); - builder.Append($"已研究时间: {days}天"); + builder.Append("ResearchBlueprintReader_ResearchTime".Translate(days)); } } } else { - builder.Append("未选择研究项目"); + builder.Append("ResearchBlueprintReader_NoProjectSelected".Translate()); } return builder.ToString().TrimEndNewlines(); diff --git a/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/ResearchBlueprintReaderManager.cs b/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/ResearchBlueprintReaderManager.cs index 6504180..adefff8 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/ResearchBlueprintReaderManager.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/ResearchBlueprintReaderManager.cs @@ -179,7 +179,7 @@ namespace ArachnaeSwarm Utilities.ResearchRemover.RemoveResearchProject(project, false); // 发送消息 - Messages.Message($"科技已丢失: {project.LabelCap}", + Messages.Message("ResearchManager_ResearchLost".Translate(project.LabelCap), MessageTypeDefOf.NegativeEvent); Log.Message($"[ResearchManager] Successfully removed research project: {project.defName}"); @@ -287,14 +287,15 @@ namespace ArachnaeSwarm return; } - Log.Message($"=== 研究管理器状态 ==="); - Log.Message($"所有建筑: {Instance.allReaders.Count}"); - Log.Message($"进行中研究: {Instance.researchBuildings.Count}"); + Log.Message("ResearchManager_StatusTitle".Translate()); + Log.Message("ResearchManager_TotalBuildings".Translate(Instance.allReaders.Count)); + Log.Message("ResearchManager_ActiveResearch".Translate(Instance.researchBuildings.Count)); foreach (var kvp in Instance.researchBuildings) { int activeBuildings = kvp.Value.Count(b => b != null && !b.Destroyed); - Log.Message($" {kvp.Key.defName}: {activeBuildings}个活跃建筑 / {kvp.Value.Count}个总建筑"); + Log.Message("ResearchManager_ProjectStatus".Translate( + kvp.Key.defName, activeBuildings, kvp.Value.Count)); } } diff --git a/Source/ArachnaeSwarm/HarmonyPatches/Patch_ResearchManager_AddRemoveMethod.cs b/Source/ArachnaeSwarm/HarmonyPatches/Patch_ResearchManager_AddRemoveMethod.cs index a378a44..50e56f8 100644 --- a/Source/ArachnaeSwarm/HarmonyPatches/Patch_ResearchManager_AddRemoveMethod.cs +++ b/Source/ArachnaeSwarm/HarmonyPatches/Patch_ResearchManager_AddRemoveMethod.cs @@ -132,12 +132,6 @@ namespace ArachnaeSwarm.Utilities // 7. 重新应用所有mod(取消该科技的效果) manager.ReapplyAllMods(); - // 8. 发送通知 - Messages.Message("ResearchRemovedMessage".Translate(projectDef.LabelCap), MessageTypeDefOf.NeutralEvent); - - // 9. 发送信号 - Find.SignalManager.SendSignal(new Signal("ResearchRemoved", projectDef.defName)); - Log.Message($"[ResearchRemover] Successfully removed research project: {projectDef.defName}"); return true; } diff --git a/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_ExtractHoney.cs b/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_ExtractHoney.cs index d1b0f97..6f44113 100644 --- a/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_ExtractHoney.cs +++ b/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_ExtractHoney.cs @@ -18,8 +18,9 @@ namespace ArachnaeSwarm public override bool TryMakePreToilReservations(bool errorOnFailed) { - // 只需要保留目标位置 - return pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed); + // 原地工作,不需要保留特定单元格 + // 我们只保留自己的位置作为工作位置 + return pawn.Reserve(pawn, job, 1, -1, null, errorOnFailed); } protected override IEnumerable MakeNewToils() @@ -27,15 +28,13 @@ namespace ArachnaeSwarm // 确保自身有蜜罐需求且达到挤出阈值 this.FailOn(() => HoneyNeed == null || !CanExtract(HoneyNeed)); - // Toil 1: 移动到目标位置 - yield return Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.Touch); - - // Toil 2: 执行挤出工作 + // Toil 1: 原地执行挤出工作 Toil extractToil = new Toil { initAction = delegate { // 初始化挤出动作 + pawn.pather.StopDead(); }, tickAction = delegate { @@ -45,7 +44,7 @@ namespace ArachnaeSwarm defaultDuration = ExtractDurationTicks }; - // 添加特效和音效 + // 添加特效和音效(在原地显示) extractToil.WithEffect(() => ExtractEffect, TargetIndex.A); extractToil.PlaySustainerOrSound(() => ExtractSound); @@ -55,12 +54,13 @@ namespace ArachnaeSwarm ExtractHoney(); }); + // 进度条显示在Pawn自己身上 extractToil.WithProgressBar(TargetIndex.A, () => extractToil.actor.jobs.curDriver.ticksLeftThisToil / (float)ExtractDurationTicks); yield return extractToil; - // Toil 3: 完成后的清理 + // Toil 2: 完成后的清理 yield return new Toil { initAction = delegate @@ -69,7 +69,8 @@ namespace ArachnaeSwarm // 如果蜜罐存量达到阈值,可以安排下一个挤出工作 if (HoneyNeed != null && CanExtract(HoneyNeed)) { - pawn.jobs.jobQueue.EnqueueLast(CreateExtractJob()); + // 不再创建新工作,让WorkGiver系统处理 + // 这样可以避免无限循环 } }, defaultCompleteMode = ToilCompleteMode.Instant @@ -121,36 +122,14 @@ namespace ArachnaeSwarm Thing jelly = ThingMaker.MakeThing(DefDatabase.GetNamed("ARA_InsectJelly")); jelly.stackCount = jellyCount; - // 尝试将虫蜜放在目标位置 - GenPlace.TryPlaceThing(jelly, job.targetA.Cell, pawn.Map, ThingPlaceMode.Near); + // 在Pawn当前位置放置虫蜜 + GenPlace.TryPlaceThing(jelly, pawn.Position, pawn.Map, ThingPlaceMode.Near); // 减少蜜罐存量 HoneyNeed.ExtractHoney(jellyCount); // 播放视觉反馈 - MoteMaker.ThrowText(job.targetA.Cell.ToVector3Shifted(), pawn.Map,"ARA_ExtractHoney_Message".Translate(jellyCount)); - } - - // 创建挤出工作的辅助方法 - private Job CreateExtractJob() - { - // 寻找最近的空地 - IntVec3 targetCell = FindNearestEmptyCell(pawn.Position, pawn.Map); - - Job job = JobMaker.MakeJob(DefDatabase.GetNamed("ARA_ExtractHoney"), targetCell); - return job; - } - - // 寻找最近的空单元格 - private IntVec3 FindNearestEmptyCell(IntVec3 from, Map map) - { - if (CellFinder.TryFindBestPawnStandCell(pawn, out IntVec3 cell, false)) - { - return cell; - } - - // 如果找不到最佳位置,使用原位置 - return from; + MoteMaker.ThrowText(pawn.DrawPos, pawn.Map, "ARA_ExtractHoney_Message".Translate(jellyCount)); } } } diff --git a/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_FeedWithHoney.cs b/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_FeedWithHoney.cs index bd56ad7..8de4fd2 100644 --- a/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_FeedWithHoney.cs +++ b/Source/ArachnaeSwarm/Jobs/JobDriver_FeedWithHoney/JobDriver_FeedWithHoney.cs @@ -12,16 +12,27 @@ namespace ArachnaeSwarm private const float FoodTransferPerTick = 0.01f; // 每tick传输的食物量 private Pawn TargetPawn => job.targetA.Pawn; - private Need_HoneyProduction HoneyNeed => pawn.needs?.TryGetNeed(); + + // 获取喂食者的蜜罐需求 + private Need_HoneyProduction FeederHoneyNeed => pawn.needs?.TryGetNeed(); + + // 获取目标的食物需求 private Need_Food TargetFoodNeed => TargetPawn.needs?.TryGetNeed(); - // 使用喂养效果 - 参考Toils_Ingest中的用法 + // 检查目标是否有蜜罐需求 + private Need_HoneyProduction TargetHoneyNeed => TargetPawn.needs?.TryGetNeed(); + + // 使用喂养效果 private static readonly EffecterDef FeedEffect = ARA_EffecterDefOf.EatVegetarian; private static readonly SoundDef FeedSound = SoundDefOf.RawMeat_Eat; public override bool TryMakePreToilReservations(bool errorOnFailed) { - if (TargetPawn == null || TargetFoodNeed == null || HoneyNeed == null) + if (TargetPawn == null || TargetFoodNeed == null || FeederHoneyNeed == null) + return false; + + // 检查目标是否有蜜罐需求,如果有则不能喂食 + if (TargetHoneyNeed != null) return false; // 保留目标pawn的位置,以便接近 @@ -32,13 +43,16 @@ namespace ArachnaeSwarm { // 确保目标有效 this.FailOnDespawnedOrNull(TargetIndex.A); - this.FailOn(() => TargetPawn.Dead || TargetFoodNeed == null || HoneyNeed == null); + this.FailOn(() => TargetPawn.Dead || TargetFoodNeed == null || FeederHoneyNeed == null); + + // 额外检查:目标不能有蜜罐需求 + this.FailOn(() => TargetHoneyNeed != null); // Toil 1: 移动到目标面前 yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch) .FailOnDespawnedOrNull(TargetIndex.A); - // Toil 2: 进行喂养工作(参考Toils_Ingest中的效果添加方式) + // Toil 2: 进行喂养工作 Toil feedToil = new Toil { initAction = delegate @@ -48,7 +62,7 @@ namespace ArachnaeSwarm tickAction = delegate { // 每tick检查是否还能继续喂养 - if (HoneyNeed.CurLevel <= 0 || TargetFoodNeed.CurLevelPercentage >= 1.0f) + if (FeederHoneyNeed.CurLevel <= 0 || TargetFoodNeed.CurLevelPercentage >= 1.0f) { ReadyForNextToil(); return; @@ -56,7 +70,7 @@ namespace ArachnaeSwarm // 计算本次tick传输的量 float transferAmount = FoodTransferPerTick; - float honeyAvailable = HoneyNeed.CurLevel; + float honeyAvailable = FeederHoneyNeed.CurLevel; // 确保不超过蜜罐存量 if (transferAmount > honeyAvailable) @@ -68,14 +82,14 @@ namespace ArachnaeSwarm transferAmount = targetFoodSpace; // 执行传输 - HoneyNeed.ExtractHoney(transferAmount); + FeederHoneyNeed.ExtractHoney(transferAmount); TargetFoodNeed.CurLevel += transferAmount; }, defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = FeedDurationTicks }; - // 添加特效和音效(参考Toils_Ingest.AddIngestionEffects) + // 添加特效和音效 feedToil.WithEffect(() => FeedEffect, TargetIndex.A); feedToil.PlaySustainerOrSound(() => FeedSound); @@ -91,12 +105,12 @@ namespace ArachnaeSwarm yield return feedToil; - // 修改:移除了第三个Toil中的提示消息,只剩下一个简单的完成Toil + // 完成Toil yield return new Toil { initAction = delegate { - // 这里可以放置任何清理代码,但不要显示消息 + // 清理代码 }, defaultCompleteMode = ToilCompleteMode.Instant }; diff --git a/Source/ArachnaeSwarm/Jobs/JobDriver_StripChitin/JobDriver_StripChitin.cs b/Source/ArachnaeSwarm/Jobs/JobDriver_StripChitin/JobDriver_StripChitin.cs index 71c0129..d969595 100644 --- a/Source/ArachnaeSwarm/Jobs/JobDriver_StripChitin/JobDriver_StripChitin.cs +++ b/Source/ArachnaeSwarm/Jobs/JobDriver_StripChitin/JobDriver_StripChitin.cs @@ -37,8 +37,8 @@ namespace ArachnaeSwarm public override bool TryMakePreToilReservations(bool errorOnFailed) { - // 只需要保留目标位置 - return pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed); + // 原地工作,不需要保留特定单元格 + return pawn.Reserve(pawn, job, 1, -1, null, errorOnFailed); } protected override IEnumerable MakeNewToils() @@ -49,15 +49,13 @@ namespace ArachnaeSwarm this.FailOn(() => !StripComp.CanStripNow(pawn)); this.FailOn(() => !StripComp.CanStripChitin); // 检查开关 - // Toil 1: 移动到目标位置 - yield return Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.Touch); - - // Toil 2: 执行剥离工作 + // Toil 1: 原地执行剥离工作 Toil stripToil = new Toil { initAction = delegate { // 初始化剥离动作 + pawn.pather.StopDead(); }, tickAction = delegate { @@ -77,13 +75,13 @@ namespace ArachnaeSwarm StripChitin(); }); + // 进度条显示在Pawn自己身上 stripToil.WithProgressBar(TargetIndex.A, - () => stripToil.actor.jobs.curDriver.ticksLeftThisToil / (float)StripDurationTicks, - interpolateBetweenActorAndTarget: true); + () => stripToil.actor.jobs.curDriver.ticksLeftThisToil / (float)StripDurationTicks); yield return stripToil; - // Toil 3: 完成后的清理 + // Toil 2: 完成后的清理 yield return new Toil { initAction = delegate @@ -91,11 +89,7 @@ namespace ArachnaeSwarm // 记录剥离时间 StripComp?.NotifyStripped(); - // 如果甲壳存量仍然达到阈值,可以安排下一个剥离工作 - if (ChitinNeed != null && StripComp != null && StripComp.CanStripNow(pawn)) - { - pawn.jobs.jobQueue.EnqueueLast(CreateStripJob()); - } + // 不再自动安排下一个工作,让WorkGiver系统处理 }, defaultCompleteMode = ToilCompleteMode.Instant }; @@ -124,37 +118,15 @@ namespace ArachnaeSwarm Thing carapace = ThingMaker.MakeThing(carapaceDef); carapace.stackCount = stripCount; - // 尝试将甲壳放在目标位置 - GenPlace.TryPlaceThing(carapace, job.targetA.Cell, pawn.Map, ThingPlaceMode.Near); + // 在Pawn当前位置放置甲壳 + GenPlace.TryPlaceThing(carapace, pawn.Position, pawn.Map, ThingPlaceMode.Near); // 减少甲壳存量 ChitinNeed.ReduceChitin(stripCount); // 播放视觉反馈 - MoteMaker.ThrowText(job.targetA.Cell.ToVector3Shifted(), pawn.Map, + MoteMaker.ThrowText(pawn.DrawPos, pawn.Map, "ARA_StripChitin_Message".Translate(stripCount)); } - - // 创建剥离工作的辅助方法 - private Job CreateStripJob() - { - // 寻找最近的空地 - IntVec3 targetCell = FindNearestEmptyCell(pawn.Position, pawn.Map); - - Job job = JobMaker.MakeJob(DefDatabase.GetNamed("ARA_StripChitin"), targetCell); - return job; - } - - // 寻找最近的空单元格 - private IntVec3 FindNearestEmptyCell(IntVec3 from, Map map) - { - if (CellFinder.TryFindBestPawnStandCell(pawn, out IntVec3 cell, false)) - { - return cell; - } - - // 如果找不到最佳位置,使用原位置 - return from; - } } } diff --git a/Source/ArachnaeSwarm/Jobs/JobDriver_SwarmMaintain/JobDriver_SwarmMaintain.cs b/Source/ArachnaeSwarm/Jobs/JobDriver_SwarmMaintain/JobDriver_SwarmMaintain.cs index 8f666cc..c5854fe 100644 --- a/Source/ArachnaeSwarm/Jobs/JobDriver_SwarmMaintain/JobDriver_SwarmMaintain.cs +++ b/Source/ArachnaeSwarm/Jobs/JobDriver_SwarmMaintain/JobDriver_SwarmMaintain.cs @@ -9,7 +9,7 @@ namespace ArachnaeSwarm public class JobDriver_SwarmMaintain : JobDriver { // 工作完成后增加的维护度 - public const float MaintenancePerWork = 25f; + public const float MaintenancePerWork = 100f; // 工作时间(ticks) private const int WorkDuration = 600; // 10秒 diff --git a/Source/ArachnaeSwarm/Needs/Need_HoneyProduction.cs b/Source/ArachnaeSwarm/Needs/Need_HoneyProduction.cs index a927dad..f25dee0 100644 --- a/Source/ArachnaeSwarm/Needs/Need_HoneyProduction.cs +++ b/Source/ArachnaeSwarm/Needs/Need_HoneyProduction.cs @@ -1,52 +1,16 @@ -// File: Need_HoneyProduction.cs using RimWorld; using UnityEngine; using Verse; namespace ArachnaeSwarm { - public class HoneyProductionExtension : DefModExtension - { - // 蜜罐生产的基础转化率(相对于食物流失的百分比) - public float baseConversionRate = 0.5f; - - // 最大蜜罐容量(可选,覆盖默认值) - public float maxHoneyCapacity = 1f; - - // 是否启用蜜罐生产 - public bool enableHoneyProduction = true; - - // 生产速率乘数(影响生产速度) - public float productionSpeedFactor = 1f; - - // 蜜罐类别对应的生产效率(可选,覆盖默认值) - public float fullProductionEfficiency = 1.5f; - public float highProductionEfficiency = 1.2f; - public float mediumProductionEfficiency = 1f; - public float lowProductionEfficiency = 0.5f; - public float emptyProductionEfficiency = 0f; - - // 生产间隔(ticks,可选覆盖默认值) - public int productionInterval = 150; - - public static HoneyProductionExtension Get(Pawn pawn) - { - if (pawn?.def?.GetModExtension() is HoneyProductionExtension ext) - return ext; - return null; - } - - // 获取转化率 - public float GetConversionRate() - { - return baseConversionRate * productionSpeedFactor; - } - } - public class Need_HoneyProduction : Need { + // 转化率:多少食物流失转换为蜂蜜 + public float ConversionRate = 10f; + // 基础流失速率(与食物需要对应) - private const float BaseHoneyGainPerTick = 2.6666667E-05f * 0.5f; // 食物流失速率的50%作为默认值 + private const float BaseHoneyGainPerTick = 2.6666667E-05f; // 用于存储对食物需要的引用 private Need_Food cachedFoodNeed; @@ -54,25 +18,8 @@ namespace ArachnaeSwarm // 当前类别 private HoneyProductionCategory curCategoryInt = HoneyProductionCategory.Empty; - // 上次满的时间点 - private int lastFullTick = -99999; - - // 缓存的ModExtension - private HoneyProductionExtension cachedExtension; - - // 蜜罐的最大容量 - 优先使用ModExtension的值 - public override float MaxLevel - { - get - { - var ext = GetExtension(); - if (ext != null && ext.maxHoneyCapacity > 0) - { - return ext.maxHoneyCapacity; - } - return FoodNeed?.MaxLevel ?? 1f; - } - } + // 最大容量 - 跟随食物需求的最大容量 + public override float MaxLevel => FoodNeed?.MaxLevel ?? 1f; // 当前类别 public HoneyProductionCategory CurCategory => curCategoryInt; @@ -83,72 +30,6 @@ namespace ArachnaeSwarm // 是否为空 public bool IsEmpty => CurCategory == HoneyProductionCategory.Empty; - // 当前类别对应的生产效率 - public float ProductionEfficiency - { - get - { - var ext = GetExtension(); - - // 如果有扩展定义,使用扩展的值 - if (ext != null) - { - switch (curCategoryInt) - { - case HoneyProductionCategory.Full: - return ext.fullProductionEfficiency; - case HoneyProductionCategory.High: - return ext.highProductionEfficiency; - case HoneyProductionCategory.Medium: - return ext.mediumProductionEfficiency; - case HoneyProductionCategory.Low: - return ext.lowProductionEfficiency; - case HoneyProductionCategory.Empty: - return ext.emptyProductionEfficiency; - default: - return 0f; - } - } - - // 默认值 - switch (curCategoryInt) - { - case HoneyProductionCategory.Full: - return 1.0f; - case HoneyProductionCategory.High: - return 0.8f; - case HoneyProductionCategory.Medium: - return 0.5f; - case HoneyProductionCategory.Low: - return 0.3f; - case HoneyProductionCategory.Empty: - return 0f; - default: - return 0f; - } - } - } - - // 获取扩展 - private HoneyProductionExtension GetExtension() - { - if (cachedExtension == null && pawn != null) - { - cachedExtension = pawn.def?.GetModExtension(); - } - return cachedExtension; - } - - // 是否启用蜜罐生产 - private bool IsEnabled - { - get - { - var ext = GetExtension(); - return ext == null || ext.enableHoneyProduction; // 默认启用 - } - } - // 获取食物需要的引用 private Need_Food FoodNeed { @@ -174,19 +55,9 @@ namespace ArachnaeSwarm }; } - public override void ExposeData() - { - base.ExposeData(); - Scribe_Values.Look(ref lastFullTick, "lastFullTick", -99999); - } - public override void NeedInterval() { - // 如果不启用,直接返回 - if (!IsEnabled) - return; - - // 检查是否需要冻结(与食物需要类似的条件) + // 检查是否需要冻结 if (IsFrozen) { return; @@ -195,17 +66,11 @@ namespace ArachnaeSwarm // 获取食物需要的流失速率 float foodFallRate = GetFoodFallRate(); - // 获取转化率(从ModExtension或使用默认值) - float conversionRate = GetExtension()?.GetConversionRate() ?? 0.5f; - // 蜜罐的增长速率 = 食物流失速率 × 转化率 - float honeyGainRate = foodFallRate * conversionRate; - - // 获取生产间隔 - int interval = GetExtension()?.productionInterval ?? 150; + float honeyGainRate = foodFallRate * ConversionRate; // 应用间隔 - CurLevel += honeyGainRate * interval; + CurLevel += honeyGainRate * 150; // 150 ticks间隔 // 确保不超过最大容量 if (CurLevel > MaxLevel) @@ -213,12 +78,6 @@ namespace ArachnaeSwarm // 更新类别 UpdateCategory(); - - // 记录满的时间 - if (IsFull) - { - lastFullTick = Find.TickManager.TicksGame; - } } // 获取食物流失速率 @@ -227,7 +86,7 @@ namespace ArachnaeSwarm if (FoodNeed == null) { // 如果没有食物需要,使用默认值 - return BaseHoneyGainPerTick / 0.5f; // 反向计算基础食物流失速率 + return BaseHoneyGainPerTick; } // 获取当前食物类别对应的流失速率 @@ -275,49 +134,6 @@ namespace ArachnaeSwarm curCategoryInt = HoneyProductionCategory.Empty; } - // 获取提示字符串 - public override string GetTipString() - { - string text = (LabelCap + ": " + CurLevelPercentage.ToStringPercent()).Colorize(ColoredText.TipSectionTitleColor); - text += "\n" + def.description; - text += $"\n{"ARA_HoneyProduction.Efficiency".Translate()} {ProductionEfficiency.ToStringPercent()}"; - - // 获取每tick的速率 - float foodFallPerTick = GetFoodFallRate(); - float conversionRate = GetExtension()?.GetConversionRate() ?? 0.5f; - float honeyGainPerTick = foodFallPerTick * conversionRate; - - // 转换为每秒:1秒 = 60tick - float foodFallPerSecond = foodFallPerTick * 60f; - float honeyGainPerSecond = honeyGainPerTick * 60f; - - text += $"\n{"ARA_HoneyProduction.FoodDrainRate".Translate()}: {foodFallPerSecond:0.#####}/ {"LetterSecond".Translate()}"; - text += $"\n{"ARA_HoneyProduction.HoneyGainRate".Translate()}: {honeyGainPerSecond:0.#####}/ {"LetterSecond".Translate()}"; - - // 显示转化率信息 - if (GetExtension() != null) - { - text += $"\n{"ARA_HoneyProduction.ConversionRate".Translate()}: {conversionRate:P1}"; - if (GetExtension().productionSpeedFactor != 1f) - { - text += $"\n{"ARA_HoneyProduction.SpeedFactor".Translate()}: {GetExtension().productionSpeedFactor:F2}"; - } - } - - if (IsFull) - { - text += $"\n\n{"ARA_HoneyProduction.FullWarning".Translate()}"; - } - - // 显示是否启用 - if (!IsEnabled) - { - text += $"\n\n{"ARA_HoneyProduction.Disabled".Translate()}"; - } - - return text; - } - // 获取类别标签 public string GetCategoryLabel() { @@ -338,24 +154,6 @@ namespace ArachnaeSwarm } } - // 在UI上绘制 - public override void DrawOnGUI(Rect rect, int maxThresholdMarkers = int.MaxValue, float customMargin = -1f, bool drawArrows = true, bool doTooltip = true, Rect? rectForTooltip = null, bool drawLabel = true) - { - // 如果不启用,不显示 - if (!IsEnabled) - return; - - if (threshPercents == null) - { - threshPercents = new System.Collections.Generic.List - { - 0.25f, 0.5f, 0.75f - }; - } - - base.DrawOnGUI(rect, maxThresholdMarkers, customMargin, false, doTooltip, rectForTooltip, drawLabel); - } - // 是否冻结 protected override bool IsFrozen { @@ -374,7 +172,7 @@ namespace ArachnaeSwarm } // GUI变化箭头(总是显示增长) - public override int GUIChangeArrow => IsEnabled ? 1 : 0; + public override int GUIChangeArrow => 1; // 调试调整百分比 protected override void OffsetDebugPercent(float offsetPercent) diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_SwarmMaintainer/CompProperties_SwarmMaintainer.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_SwarmMaintainer/CompProperties_SwarmMaintainer.cs new file mode 100644 index 0000000..715863c --- /dev/null +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_SwarmMaintainer/CompProperties_SwarmMaintainer.cs @@ -0,0 +1,28 @@ +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + public class CompProperties_SwarmMaintainer : CompProperties + { + // 是否在信息面板显示调试信息 + public bool showDebugInfo = false; + + // 维护工作的优先级(相对其他工作) + public int workPriority = 50; + + // 维护技能类型(可选) + public SkillDef relevantSkill = SkillDefOf.Construction; + + // 最小技能等级(可选) + public int minimumSkillLevel = 0; + + // 是否必须有虫群意识hediff + public bool requiresHiveMind = true; + + public CompProperties_SwarmMaintainer() + { + compClass = typeof(Comp_SwarmMaintainer); + } + } +} diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_SwarmMaintainer/Comp_SwarmMaintainer.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_SwarmMaintainer/Comp_SwarmMaintainer.cs new file mode 100644 index 0000000..735cb51 --- /dev/null +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_SwarmMaintainer/Comp_SwarmMaintainer.cs @@ -0,0 +1,55 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; + +namespace ArachnaeSwarm +{ + public class Comp_SwarmMaintainer : ThingComp + { + // 属性访问器 + public CompProperties_SwarmMaintainer Props => (CompProperties_SwarmMaintainer)props; + + // 简单的属性访问 + public bool CanMaintainSwarmBuildings => true; // 默认都可以维护 + + // 维护效率(可选) + public float MaintenanceEfficiency + { + get + { + // 可以根据Pawn的技能或其他属性调整效率 + if (parent is Pawn pawn) + { + // 如果有建造技能,效率更高 + if (pawn.skills != null) + { + return 1.0f + (pawn.skills.GetSkill(SkillDefOf.Construction).Level * 0.02f); + } + } + return 1.0f; // 默认效率 + } + } + + // 组件不需要复杂的逻辑,主要用于标记 + public override void PostSpawnSetup(bool respawningAfterLoad) + { + base.PostSpawnSetup(respawningAfterLoad); + } + + public override void PostExposeData() + { + base.PostExposeData(); + // 这个组件不需要保存额外数据 + } + + // 可选:提供一些简单的调试信息 + public override string CompInspectStringExtra() + { + if (Props.showDebugInfo && DebugSettings.godMode) + { + return $"虫群维护者 (效率: {MaintenanceEfficiency:P0})"; + } + return null; + } + } +} diff --git a/Source/ArachnaeSwarm/RoomRole/RoomRoleWorker_JellyVat.cs b/Source/ArachnaeSwarm/RoomRole/RoomRoleWorker_JellyVat.cs new file mode 100644 index 0000000..a29d39d --- /dev/null +++ b/Source/ArachnaeSwarm/RoomRole/RoomRoleWorker_JellyVat.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + public class RoomRoleWorker_JellyVat : RoomRoleWorker + { + // 孵化间的评分 - 比重很小,设为10分(实验室是60分) + private const float ScorePerJellyVat = 100f; + + // 最低分数要求 - 需要至少1个孵化器才能成为孵化间 + private const float MinimumScore = 10f; + + public override float GetScore(Room room) + { + int JellyVatCount = 0; + + // 检查房间内和相邻的所有建筑 + List containedAndAdjacentThings = room.ContainedAndAdjacentThings; + for (int i = 0; i < containedAndAdjacentThings.Count; i++) + { + Thing thing = containedAndAdjacentThings[i]; + + // 检查建筑的工作台房间角色是否为ARA_JellyVat_Room + if (thing.def.building?.workTableRoomRole != null && + thing.def.building.workTableRoomRole.defName == "ARA_JellyVat_Room") + { + JellyVatCount++; + } + } + + // 如果有孵化器,返回分数 + float score = ScorePerJellyVat * JellyVatCount; + + // 必须有至少一个孵化器才能成为孵化间 + return JellyVatCount > 0 ? score : 0f; + } + + public override float GetScoreDeltaIfBuildingPlaced(Room room, ThingDef buildingDef) + { + // 如果放置的建筑具有ARA_JellyVat_Room工作台房间角色,返回分数增量 + if (buildingDef.building?.workTableRoomRole != null && + buildingDef.building.workTableRoomRole.defName == "ARA_JellyVat_Room") + { + return ScorePerJellyVat; + } + return 0f; + } + } +} diff --git a/Source/ArachnaeSwarm/WorkGivers/WorkGiver_ExtractHoney.cs b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_ExtractHoney.cs new file mode 100644 index 0000000..d194bb3 --- /dev/null +++ b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_ExtractHoney.cs @@ -0,0 +1,117 @@ +using RimWorld; +using System.Collections.Generic; +using Verse; +using Verse.AI; + +namespace ArachnaeSwarm +{ + public class WorkGiver_ExtractHoney : WorkGiver_Scanner + { + public override PathEndMode PathEndMode => PathEndMode.Touch; + + public override Danger MaxPathDanger(Pawn pawn) + { + return Danger.None; + } + + // 扫描所有虫族成员,检查是否需要挤出蜂蜜 + public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn) + { + // 返回所有有蜂蜜需求的虫族Pawn + IReadOnlyList allPawns = pawn.Map.mapPawns.AllPawnsSpawned; + List workThings = new List(); + + foreach (Pawn potentialPawn in allPawns) + { + // 只检查玩家阵营的虫族成员 + if (potentialPawn.Faction == Faction.OfPlayer && + HasHoneyNeed(potentialPawn)) + { + workThings.Add(potentialPawn); + } + } + + return workThings; + } + + public override bool ShouldSkip(Pawn pawn, bool forced = false) + { + // 检查Pawn是否属于玩家阵营 + if (pawn.Faction != Faction.OfPlayer) + return true; + + // 检查Pawn是否是虫族成员 + if (!IsSwarmMember(pawn)) + return true; + + // 检查Pawn是否能够工作 + if (pawn.Dead || pawn.Downed || pawn.InMentalState) + return true; + + // 检查Pawn是否正在执行其他挤出工作 + if (pawn.CurJobDef == ARA_JobDefOf.ARA_ExtractHoney) + return true; + + return false; + } + + public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) + { + // 如果目标不是Pawn,返回false + if (t == null || !(t is Pawn targetPawn)) + return false; + + // 检查是否是挤出自己的蜂蜜 + if (targetPawn != pawn) + return false; // 只能挤出自己的蜂蜜 + + // 检查目标Pawn是否有蜂蜜需求 + Need_HoneyProduction honeyNeed = targetPawn.needs?.TryGetNeed(); + if (honeyNeed == null) + return false; + + // 检查是否可以挤出 + return CanExtractNow(honeyNeed); + } + + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (t == null || !(t is Pawn targetPawn) || targetPawn != pawn) + return null; + + // 创建挤出工作,使用Pawn自身作为目标 + Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_ExtractHoney, pawn); + job.count = 1; + return job; + } + + // 检查是否有蜂蜜需求 + private bool HasHoneyNeed(Pawn pawn) + { + return pawn.needs?.TryGetNeed() != null; + } + + // 检查是否可以立即挤出 + private bool CanExtractNow(Need_HoneyProduction honeyNeed) + { + // 如果MaxLevel大于1.5,需要超过80%储量才考虑挤蜜 + if (honeyNeed.MaxLevel > 1.5f) + { + return honeyNeed.CurLevelPercentage > 0.8f; + } + // 否则在大于1时挤蜜 + else + { + return honeyNeed.CurLevel >= 1.0f; + } + } + + // 检查是否是虫族成员 + private bool IsSwarmMember(Pawn pawn) + { + return pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker); + } + } +} diff --git a/Source/ArachnaeSwarm/WorkGivers/WorkGiver_FeedWithHoney.cs b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_FeedWithHoney.cs new file mode 100644 index 0000000..6ec7ed7 --- /dev/null +++ b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_FeedWithHoney.cs @@ -0,0 +1,171 @@ +using RimWorld; +using System.Collections.Generic; +using Verse; +using Verse.AI; + +namespace ArachnaeSwarm +{ + public class WorkGiver_FeedWithHoney : WorkGiver_Scanner + { + public override PathEndMode PathEndMode => PathEndMode.Touch; + + public override Danger MaxPathDanger(Pawn pawn) + { + return Danger.None; + } + + // 扫描所有需要喂食的Pawn(没有蜜罐需求但需要食物的虫族成员) + public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn) + { + IReadOnlyList allPawns = pawn.Map.mapPawns.AllPawnsSpawned; + List workThings = new List(); + + foreach (Pawn potentialPawn in allPawns) + { + // 只检查玩家阵营的Pawn + if (potentialPawn.Faction == Faction.OfPlayer && + !potentialPawn.Dead && + !potentialPawn.Downed && + !HasHoneyNeed(potentialPawn) && // 不能有蜜罐需求 + HasFoodNeed(potentialPawn) && // 必须有食物需求 + IsFeedingAllowed(potentialPawn)) // 其他条件检查 + { + workThings.Add(potentialPawn); + } + } + + return workThings; + } + + public override bool ShouldSkip(Pawn pawn, bool forced = false) + { + // 检查Pawn是否属于玩家阵营 + if (pawn.Faction != Faction.OfPlayer) + return true; + + // 检查Pawn是否是虫族成员 + if (!IsSwarmMember(pawn)) + return true; + + // 检查Pawn是否能够工作 + if (pawn.Dead || pawn.Downed || pawn.InMentalState) + return true; + + // 检查Pawn是否有蜂蜜需求 + if (!HasHoneyNeed(pawn)) + return true; + + // 检查Pawn的蜜罐是否有足够的蜂蜜 + Need_HoneyProduction honeyNeed = pawn.needs?.TryGetNeed(); + if (honeyNeed == null || honeyNeed.CurLevel <= 0.25) + return true; + + // 检查Pawn是否正在执行其他喂食工作 + if (pawn.CurJobDef == ARA_JobDefOf.ARA_FeedWithHoney) + return true; + + return false; + } + + public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) + { + // 如果目标不是Pawn,返回false + if (t == null || !(t is Pawn targetPawn)) + return false; + + // 检查目标是否有效 + if (targetPawn.Dead || targetPawn.Downed) + return false; + + // 检查目标是否是喂食者自己 + if (targetPawn == pawn) + return false; // 不能喂食自己 + + // 检查目标是否有蜜罐需求 + if (HasHoneyNeed(targetPawn)) + return false; // 不能喂食有蜜罐需求的目标 + + // 检查目标是否有食物需求 + Need_Food targetFoodNeed = targetPawn.needs?.TryGetNeed(); + if (targetFoodNeed == null) + return false; + + // 检查目标是否已经吃饱 + if (targetFoodNeed.CurLevelPercentage >= 0.95f) // 95%以上算吃饱 + return false; + + // 检查喂食者是否有蜂蜜需求 + Need_HoneyProduction feederHoneyNeed = pawn.needs?.TryGetNeed(); + if (feederHoneyNeed == null) + return false; + + // 检查喂食者是否有足够的蜂蜜 + if (feederHoneyNeed.CurLevel <= 0) + return false; + + // 检查Pawn是否可以到达目标 + if (!pawn.CanReserveAndReach(targetPawn, PathEndMode.Touch, pawn.NormalMaxDanger(), 1, -1, null, forced)) + return false; + + return true; + } + + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (t == null || !(t is Pawn targetPawn)) + return null; + + // 创建喂食工作 + Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_FeedWithHoney, targetPawn); + job.count = 1; + return job; + } + + // 检查是否有蜂蜜需求 + private bool HasHoneyNeed(Pawn pawn) + { + return pawn.needs?.TryGetNeed() != null; + } + + // 检查是否有食物需求 + private bool HasFoodNeed(Pawn pawn) + { + return pawn.needs?.TryGetNeed() != null; + } + + // 检查是否是虫族成员 + private bool IsSwarmMember(Pawn pawn) + { + return pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker); + } + + // 检查是否允许喂食 + private bool IsFeedingAllowed(Pawn pawn) + { + // 可以添加额外的条件,比如: + // - 是否处于特殊状态 + // - 是否有特殊的Hediff阻止喂食 + // - 是否正在被喂食等 + + // 检查是否正在被其他虫族喂食 + if (pawn.jobs?.curDriver is JobDriver_FeedWithHoney) + return false; + + // 检查是否有其他虫族正在向这个Pawn移动以喂食 + IReadOnlyList allPawns = pawn.Map.mapPawns.AllPawnsSpawned; + foreach (Pawn otherPawn in allPawns) + { + if (otherPawn != pawn && + otherPawn.CurJobDef == ARA_JobDefOf.ARA_FeedWithHoney && + otherPawn.CurJob.targetA.Thing == pawn) + { + return false; // 已经有人正在喂食这个Pawn + } + } + + return true; + } + } +} diff --git a/Source/ArachnaeSwarm/WorkGivers/WorkGiver_StripChitin.cs b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_StripChitin.cs new file mode 100644 index 0000000..32a239b --- /dev/null +++ b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_StripChitin.cs @@ -0,0 +1,95 @@ +using RimWorld; +using System.Collections.Generic; +using Verse; +using Verse.AI; + +namespace ArachnaeSwarm +{ + public class WorkGiver_StripChitin : WorkGiver_Scanner + { + public override PathEndMode PathEndMode => PathEndMode.Touch; + + public override Danger MaxPathDanger(Pawn pawn) + { + return Danger.None; + } + + // 扫描所有有甲壳剥离组件的虫族成员 + public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn) + { + IReadOnlyList allPawns = pawn.Map.mapPawns.AllPawnsSpawned; + List workThings = new List(); + + foreach (Pawn potentialPawn in allPawns) + { + // 检查是否有甲壳剥离组件 + if (potentialPawn.TryGetComp() != null && + potentialPawn.Faction == Faction.OfPlayer) + { + workThings.Add(potentialPawn); + } + } + + return workThings; + } + + public override bool ShouldSkip(Pawn pawn, bool forced = false) + { + // 检查Pawn是否属于玩家阵营 + if (pawn.Faction != Faction.OfPlayer) + return true; + + // 检查Pawn是否是虫族成员 + if (!IsSwarmMember(pawn)) + return true; + + // 检查Pawn是否能够工作 + if (pawn.Dead || pawn.Downed || pawn.InMentalState) + return true; + + // 检查Pawn是否正在执行其他剥离工作 + if (pawn.CurJobDef == ARA_JobDefOf.ARA_StripChitin) + return true; + + return false; + } + + public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) + { + // 如果目标不是Pawn,返回false + if (t == null || !(t is Pawn targetPawn)) + return false; + + // 检查是否是剥离自己的甲壳 + if (targetPawn != pawn) + return false; // 只能剥离自己的甲壳 + + // 获取剥离组件 + Comp_ChitinStripping stripComp = targetPawn.TryGetComp(); + if (stripComp == null) + return false; + + // 检查是否可以立即剥离 + return stripComp.CanStripNow(pawn) && stripComp.CanStripChitin; + } + + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (t == null || !(t is Pawn targetPawn) || targetPawn != pawn) + return null; + + // 创建剥离工作,使用Pawn自身作为目标 + Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_StripChitin, pawn); + job.count = 1; + return job; + } + + // 检查是否是虫族成员 + private bool IsSwarmMember(Pawn pawn) + { + return pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker); + } + } +} diff --git a/Source/ArachnaeSwarm/WorkGivers/WorkGiver_SwarmMaintain.cs b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_SwarmMaintain.cs new file mode 100644 index 0000000..70ec816 --- /dev/null +++ b/Source/ArachnaeSwarm/WorkGivers/WorkGiver_SwarmMaintain.cs @@ -0,0 +1,110 @@ +using RimWorld; +using System.Collections.Generic; +using Verse; +using Verse.AI; + +namespace ArachnaeSwarm +{ + public class WorkGiver_SwarmMaintain : WorkGiver_Scanner + { + public override PathEndMode PathEndMode => PathEndMode.Touch; + + public override Danger MaxPathDanger(Pawn pawn) + { + return Danger.Some; + } + + public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn) + { + // 获取所有需要维护的建筑 + List allThings = pawn.Map.listerThings.AllThings; + List maintenanceThings = new List(); + + foreach (Thing thing in allThings) + { + if (thing.TryGetComp() != null) + { + maintenanceThings.Add(thing); + } + } + + return maintenanceThings; + } + + public override bool ShouldSkip(Pawn pawn, bool forced = false) + { + // 检查Pawn是否属于玩家阵营 + if (pawn.Faction != Faction.OfPlayer) + return true; + + // 检查Pawn是否有虫群维护者组件 + var maintainerComp = pawn.TryGetComp(); + if (maintainerComp == null) + return true; + + // 检查组件配置要求 + var props = maintainerComp.Props; + if (props != null) + { + // 如果要求必须有虫群意识hediff + if (props.requiresHiveMind && !IsSwarmMember(pawn)) + return true; + + // 检查最小技能等级要求 + if (props.minimumSkillLevel > 0 && pawn.skills != null) + { + var skill = pawn.skills.GetSkill(props.relevantSkill); + if (skill == null || skill.Level < props.minimumSkillLevel) + return true; + } + } + + // 检查Pawn是否能够工作 + if (pawn.Dead || pawn.Downed || pawn.InMentalState) + return true; + + // 检查Pawn是否有能力进行维护工作 + if (pawn.WorkTagIsDisabled(WorkTags.ManualSkilled)) + return true; + + return false; + } + + public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (t == null || t.Destroyed || !t.Spawned) + return false; + + // 检查Pawn是否可以到达建筑 + if (!pawn.CanReserveAndReach(t, PathEndMode.Touch, pawn.NormalMaxDanger(), 1, -1, null, forced)) + return false; + + // 获取维护组件 + Comp_SwarmMaintenance comp = t.TryGetComp(); + if (comp == null) + return false; + + // 检查建筑是否需要维护 + return comp.NeedsMaintenance; + } + + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (t == null || t.Destroyed) + return null; + + // 创建维护工作 + Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_SwarmMaintain, t); + job.count = 1; + return job; + } + + private bool IsSwarmMember(Pawn pawn) + { + // 检查Pawn是否是虫群成员 + return pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) || + pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker); + } + } +} diff --git a/非公开资源/Content/Textures/Things/ARA_Slayer/Bodies/Naked_Thin_east.sai2 b/非公开资源/Content/Textures/Things/ARA_Slayer/Bodies/Naked_Thin_east.sai2 new file mode 100644 index 0000000..da35d95 Binary files /dev/null and b/非公开资源/Content/Textures/Things/ARA_Slayer/Bodies/Naked_Thin_east.sai2 differ diff --git a/非公开资源/Content/Textures/UI/Commands/ARA_InsertPawn.sai2 b/非公开资源/Content/Textures/UI/Commands/ARA_InsertPawn.sai2 new file mode 100644 index 0000000..ce0c304 Binary files /dev/null and b/非公开资源/Content/Textures/UI/Commands/ARA_InsertPawn.sai2 differ diff --git a/非公开资源/Content/Textures/UI/Commands/ARA_NodeSwarmIcon.sai2 b/非公开资源/Content/Textures/UI/Commands/ARA_NodeSwarmIcon.sai2 index 414dd53..15a2e62 100644 Binary files a/非公开资源/Content/Textures/UI/Commands/ARA_NodeSwarmIcon.sai2 and b/非公开资源/Content/Textures/UI/Commands/ARA_NodeSwarmIcon.sai2 differ