diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index dca9f11..6a637c8 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 cc37f12..be69e9f 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -395,42 +395,6 @@ - - ARA_BaseRace_Skyhive_Launcher - - 将三只阿拉克涅天巢种辅虫发射到目标身上,天巢种将附着到敌人身上撕咬,脱落后仍然能继续对敌人展开攻击。 - ArachnaeSwarm/UI/Abilities/ARA_BaseRace_Launcher - 5000 - true - 300 - false - AcidSpray_Warmup - 3 - true - - Verb_CastAbility - 24 - 1 - AcidSpray_Resolve - false - - True - - - -
  • - Bullet_ARA_RW_Basic_SkyHive_Gun - 3 -
  • -
  • - 饮食 - true - Food - 0.2 - 营养值不足,需要进食 -
  • -
    -
    ARA_Skyraider_jump @@ -1580,17 +1544,17 @@ ARA_Locust_Needle_Fire - - 阿拉克涅督虫使用可以喷射剧毒尾针的毒针腺对敌方进行一轮射击。 + + 阿拉克涅蝗虫种使用可以喷射剧毒尾针的毒针腺对敌方进行一轮射击。 True False - 120 + 90 true ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire Verb_CastAbility 24 - 1 + 0 Heatspikes_Shot Heatspikes_Tail @@ -1598,9 +1562,8 @@ -
  • +
  • Bullet_ARA_RW_Basic_Fist_Needle_Gun - 1
  • diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml index 880750d..909c836 100644 --- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml +++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml @@ -4,7 +4,7 @@ ARA_Possession 这个生物的身体被阿拉克涅原虫所夺取了,这具身体原本的主人已经没有可能再回来了。 - ArachnaeSwarm.Hediff_Possession + ArachnaeSwarm.Hediff_Possession (0.6, 0.4, 0.8) false false diff --git a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml index 5ad130c..f8cc1cb 100644 --- a/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml +++ b/1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml @@ -340,7 +340,6 @@ -
  • ARA_BaseRace_Skyhive_Launcher
  • ARA_Skyraider_jump
  • @@ -629,7 +628,7 @@ ArachnaeBase_Race_Locust - + ArachnaeBase_Race_Locust
  • diff --git a/1.6/1.6/Defs/Stats/ARA_Stats.xml b/1.6/1.6/Defs/Stats/ARA_Stats.xml index dec460a..b1333a7 100644 --- a/1.6/1.6/Defs/Stats/ARA_Stats.xml +++ b/1.6/1.6/Defs/Stats/ARA_Stats.xml @@ -21,7 +21,6 @@ 8000 - ARA_Incubation_StatCategory @@ -70,4 +69,35 @@ 2200 false + + + + ARA_GestaltNetwork + + 110 + + + ARA_GestaltBandwidth + + 阿拉克涅虫群格式塔网络的最大节点限制,每一只阿拉克涅督虫都会影响网络的负荷,一些虫族会分担网络压力,另一些则会增加负载。当负载过大时,阿拉克涅女皇种的思维将遭到压迫,导致其心情和意识降低。 + ARA_GestaltNetwork + 0 + Integer + 0 + 0 + 2200 + false + + + ARA_GestaltBandwidthCost + + 阿拉克涅督虫对格式塔网络产生的负荷,如果为负数,则代表此督虫会为格式塔网络分担压力。 + ARA_GestaltNetwork + 0 + Integer + 0 + -999 + 2201 + false + \ No newline at end of file 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 e1afbb2..5179525 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceBaseSwarm.xml @@ -222,7 +222,7 @@ ArachnaeBase_Race_Longpincer - 阿拉克涅辅虫之一,拥有一对相较于其体型来说过于巨大的颚部,可以执行搬运、挖掘工作,如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 + 阿拉克涅辅虫之一,拥有一对相较于其体型来说过于巨大的颚部,可以执行搬运、挖掘工作。如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 5.5 0.45 @@ -386,7 +386,7 @@ ArachnaeBase_Race_Acidcut - 阿拉克涅辅虫之一,智力低下,依靠带酸液的颚撕咬敌军,因为身体结构简单而易于孕育,如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 + 阿拉克涅辅虫之一,智力低下,依靠带酸液的颚撕咬敌军,因为身体结构简单而易于孕育。如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 ARA_Insect_Acidcut_Thinktree 0.3 @@ -458,7 +458,7 @@ ArachnaeBase_Race_Baneling - 阿拉克涅辅虫之一,一般以自杀式袭击的方式伤害敌军,靠近敌人后就会引爆酸囊产生危险的酸性雾气,并留下菌毯以供后续虫族部队前进,如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 + 阿拉克涅辅虫之一,一般以自杀式袭击的方式伤害敌军,靠近敌人后就会引爆酸囊产生危险的酸性雾气,并留下菌毯以供后续虫族部队前进。如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 ARA_Insect_Baneling_Thinktree 0.35 @@ -527,7 +527,7 @@ ArachnaeBase_Race_Empsuicider - 阿拉克涅辅虫之一,智力低下,一般以自杀式袭击的方式伤害敌军,靠近敌人后就会释放EMP瘫痪附加的机械族,如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 + 阿拉克涅辅虫之一,智力低下,一般以自杀式袭击的方式伤害敌军,靠近敌人后就会释放EMP瘫痪附加的机械族。如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 ARA_Insect_Baneling_Thinktree 0.35 @@ -595,7 +595,7 @@ ArachnaeBase_Race_Skyhive - 阿拉克涅辅虫之一,拥有贴地飞行的能力,无论是攻击还是移动速度非常快。 + 阿拉克涅辅虫之一,拥有贴地飞行的能力,无论是攻击还是移动速度非常快。如果其监管者督虫处于征召状态,则会跟随督虫一起行动。 ARA_Insect_Skyhive_Thinktree 0.3 @@ -678,8 +678,8 @@ ArachnaeBase_Race_Locust - - 阿拉克涅辅虫之一,拥有贴地飞行的能力,无论是攻击还是移动速度非常快。 + + 阿拉克涅辅虫之一,是少数拥有高智能的辅虫单位,可以自行躲避危险,并使用毒针腺体向敌群射击。如果其监管者督虫处于征召状态,则会跟随督虫一起行动,但是会更倾向于保护其督虫而非主动上前迎敌。 ARA_Insect_Locust_Thinktree 0.36 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 3060580..34e9a43 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml @@ -537,7 +537,7 @@ -3000 3000 - 1 + 1 @@ -1723,6 +1723,8 @@ 0 + + -3 diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml index f057a0f..c7a1932 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml @@ -614,7 +614,7 @@ 0 - 8 + 15 1 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 1b6a34a..1a4b2f1 100644 --- a/1.6/1.6/Defs/Thing_building/ARA_Ootheca.xml +++ b/1.6/1.6/Defs/Thing_building/ARA_Ootheca.xml @@ -352,7 +352,6 @@ Laboratory false - false ARA_Gene_Essence diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo index c1923e1..3fd2768 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 dafd83a..2fa4da9 100644 --- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json +++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json @@ -3,40 +3,36 @@ "WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\", "Documents": [ { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_corpsevat\\building_corpsevat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_corpsevat\\building_corpsevat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\jobs\\jobdriver_plant\\jobgiver_grower.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_plant\\jobgiver_grower.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_corpsevat\\jobdriver_haulcorpsetovat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_corpsevat\\jobdriver_haulcorpsetovat.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\jobs\\jobdriver_clean\\jobgiver_cleaner.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_clean\\jobgiver_cleaner.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_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|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\ara_huggingface\\hediff_possession.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_huggingface\\hediff_possession.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\buildings\\building_corpsevat\\corpsevatextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:buildings\\building_corpsevat\\corpsevatextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\ara_huggingface\\compabilityeffect_possess.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_huggingface\\compabilityeffect_possess.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\jobs\\jobdriver_followproducer\\thinknode_conditionalnotproducedbymechcarrier.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_followproducer\\thinknode_conditionalnotproducedbymechcarrier.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\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|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\pawn_comps\\ara_flight\\pawn_flighttrackerpatches.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_flight\\pawn_flighttrackerpatches.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_hediffterrainspawn\\compproperties_hediffterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_hediffterrainspawn\\compproperties_hediffterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\pawn_comps\\ara_flight\\compproperties_pawnflight.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_flight\\compproperties_pawnflight.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_hediffterrainspawn\\comphediffterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_hediffterrainspawn\\comphediffterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_productionqueue\\hediffcompproperties_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\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}" } ], "DocumentGroupContainers": [ @@ -46,125 +42,115 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 2, + "SelectedChildIndex": 1, "Children": [ - { - "$type": "Document", - "DocumentIndex": 3, - "Title": "CorpseVatExtension.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\CorpseVatExtension.cs", - "RelativeDocumentMoniker": "Buildings\\Building_CorpseVat\\CorpseVatExtension.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\CorpseVatExtension.cs", - "RelativeToolTip": "Buildings\\Building_CorpseVat\\CorpseVatExtension.cs", - "ViewState": "AgIAAAYAAAAAAAAAAAAAABkAAAAIAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-23T04:01:21.774Z", - "EditorCaption": "" - }, { "$type": "Document", "DocumentIndex": 1, - "Title": "JobDriver_HaulCorpseToVat.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs", - "RelativeDocumentMoniker": "Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs", - "RelativeToolTip": "Buildings\\Building_CorpseVat\\JobDriver_HaulCorpseToVat.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAA0AAAAAAAAAA==", + "Title": "JobGiver_Cleaner.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_Clean\\JobGiver_Cleaner.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_Clean\\JobGiver_Cleaner.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_Clean\\JobGiver_Cleaner.cs", + "RelativeToolTip": "Jobs\\JobDriver_Clean\\JobGiver_Cleaner.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAABwAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-23T04:01:20.292Z", + "WhenOpened": "2026-01-23T08:51:58.899Z", "EditorCaption": "" }, { "$type": "Document", "DocumentIndex": 0, - "Title": "Building_CorpseVat.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\Building_CorpseVat.cs", - "RelativeDocumentMoniker": "Buildings\\Building_CorpseVat\\Building_CorpseVat.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_CorpseVat\\Building_CorpseVat.cs", - "RelativeToolTip": "Buildings\\Building_CorpseVat\\Building_CorpseVat.cs", - "ViewState": "AgIAAEYBAAAAAAAAAAAawFgBAAAMAAAAAAAAAA==", + "Title": "JobGiver_Grower.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_Plant\\JobGiver_Grower.cs", + "RelativeDocumentMoniker": "Jobs\\JobDriver_Plant\\JobGiver_Grower.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_Plant\\JobGiver_Grower.cs", + "RelativeToolTip": "Jobs\\JobDriver_Plant\\JobGiver_Grower.cs", + "ViewState": "AgIAAFMAAAAAAAAAAAAQwGEAAAAvAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-23T04:01:18.535Z", + "WhenOpened": "2026-01-23T08:51:03.439Z", "EditorCaption": "" }, { "$type": "Document", "DocumentIndex": 2, - "Title": "Building_DormancyVat.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", - "RelativeDocumentMoniker": "Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", - "RelativeToolTip": "Buildings\\Building_DormancyVat\\Building_DormancyVat.cs", - "ViewState": "AgIAACUAAAAAAAAAAIA8wDcAAAAAAAAAAAAAAA==", + "Title": "Hediff_Possession.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_HuggingFace\\Hediff_Possession.cs", + "RelativeDocumentMoniker": "Abilities\\ARA_HuggingFace\\Hediff_Possession.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_HuggingFace\\Hediff_Possession.cs", + "RelativeToolTip": "Abilities\\ARA_HuggingFace\\Hediff_Possession.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAAAAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-23T03:49:32.234Z", + "WhenOpened": "2026-01-23T08:50:05.221Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "CompAbilityEffect_Possess.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", + "RelativeDocumentMoniker": "Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", + "RelativeToolTip": "Abilities\\ARA_HuggingFace\\CompAbilityEffect_Possess.cs", + "ViewState": "AgIAAHcAAAAAAAAAAAAAAIkAAAA5AAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-01-23T08:50:01.549Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "CompDelayedTerrainSpawn.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "RelativeDocumentMoniker": "Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "RelativeToolTip": "Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", + "ViewState": "AgIAAFEAAAAAAAAAAAAAAF8AAAA+AAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-01-23T08:46:06.784Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 5, + "Title": "CompProperties_HediffTerrainSpawn.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffTerrainSpawn\\CompProperties_HediffTerrainSpawn.cs", + "RelativeDocumentMoniker": "Hediffs\\ARA_HediffTerrainSpawn\\CompProperties_HediffTerrainSpawn.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffTerrainSpawn\\CompProperties_HediffTerrainSpawn.cs", + "RelativeToolTip": "Hediffs\\ARA_HediffTerrainSpawn\\CompProperties_HediffTerrainSpawn.cs", + "ViewState": "AgIAAAUAAAAAAAAAAAAtwBkAAAAxAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-01-23T08:44:14.682Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "CompHediffTerrainSpawn.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffTerrainSpawn\\CompHediffTerrainSpawn.cs", + "RelativeDocumentMoniker": "Hediffs\\ARA_HediffTerrainSpawn\\CompHediffTerrainSpawn.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_HediffTerrainSpawn\\CompHediffTerrainSpawn.cs", + "RelativeToolTip": "Hediffs\\ARA_HediffTerrainSpawn\\CompHediffTerrainSpawn.cs", + "ViewState": "AgIAAKIAAAAAAAAAAAAawLQAAAAMAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-01-23T08:44:10.075Z", "EditorCaption": "" }, { "$type": "Bookmark", "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" }, - { - "$type": "Document", - "DocumentIndex": 4, - "Title": "ThinkNode_ConditionalNotProducedByMechCarrier.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs", - "RelativeDocumentMoniker": "Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs", - "RelativeToolTip": "Jobs\\JobDriver_FollowProducer\\ThinkNode_ConditionalNotProducedByMechCarrier.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAoAAAA+AAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-23T02:44:35.619Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 5, - "Title": "Pawn_FlightTrackerPatches.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs", - "RelativeDocumentMoniker": "Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs", - "RelativeToolTip": "Pawn_Comps\\ARA_Flight\\Pawn_FlightTrackerPatches.cs", - "ViewState": "AgIAAB0AAAAAAAAAAAAuwEsAAAAfAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-22T14:03:17.973Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "CompProperties_PawnFlight.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs", - "RelativeDocumentMoniker": "Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs", - "RelativeToolTip": "Pawn_Comps\\ARA_Flight\\CompProperties_PawnFlight.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAeAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-22T14:02:45.434Z" - }, - { - "$type": "Document", - "DocumentIndex": 8, - "Title": "HediffComp_ProductionQueue.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "RelativeToolTip": "Hediffs\\ARA_ProductionQueue\\HediffComp_ProductionQueue.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAB8AAAAMAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-22T10:31:06.201Z" - }, { "$type": "Document", "DocumentIndex": 7, - "Title": "HediffCompProperties_ProductionQueue.cs", - "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "RelativeDocumentMoniker": "Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "RelativeToolTip": "Hediffs\\ARA_ProductionQueue\\HediffCompProperties_ProductionQueue.cs", - "ViewState": "AgIAAB8AAAAAAAAAAAAewEoAAAApAAAAAAAAAA==", + "Title": "Building_Ootheca.cs", + "DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "RelativeDocumentMoniker": "Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "RelativeToolTip": "Buildings\\Building_Ootheca\\Building_Ootheca.cs", + "ViewState": "AgIAALwAAAAAAAAAAAAowC4BAAAAAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-01-22T09:30:17.721Z" + "WhenOpened": "2026-01-23T08:31:14.555Z", + "EditorCaption": "" } ] } diff --git a/Source/ArachnaeSwarm/ARA_DefOf.cs b/Source/ArachnaeSwarm/ARA_DefOf.cs index 49fc22b..4676146 100644 --- a/Source/ArachnaeSwarm/ARA_DefOf.cs +++ b/Source/ArachnaeSwarm/ARA_DefOf.cs @@ -85,4 +85,16 @@ namespace ArachnaeSwarm DefOfHelper.EnsureInitializedInCtor(typeof(ARA_ThoughtDefOf)); } } + + [DefOf] + public static class ARA_StatDefOf + { + public static StatDef ARA_GestaltBandwidth; + public static StatDef ARA_GestaltBandwidthCost; + + static ARA_StatDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(ARA_StatDefOf)); + } + } } \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Abilities/ARA_HuggingFace/Hediff_Possession.cs b/Source/ArachnaeSwarm/Abilities/ARA_HuggingFace/Hediff_Possession.cs index 9211f4c..d8675dc 100644 --- a/Source/ArachnaeSwarm/Abilities/ARA_HuggingFace/Hediff_Possession.cs +++ b/Source/ArachnaeSwarm/Abilities/ARA_HuggingFace/Hediff_Possession.cs @@ -4,7 +4,7 @@ using Verse; namespace ArachnaeSwarm { - public class Hediff_Possession : HediffWithComps, IThingHolder + public class Hediff_Possession : Hediff_High, IThingHolder { public ThingOwner casterContainer; public OriginalPawnData originalHostData; diff --git a/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/Building_CorpseVat.cs b/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/Building_CorpseVat.cs index 5e53a66..1a0cf05 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/Building_CorpseVat.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/Building_CorpseVat.cs @@ -21,6 +21,9 @@ namespace ArachnaeSwarm // 工作定义 private static readonly JobDef HaulCorpseToVatJobDef = DefDatabase.GetNamedSilentFail("ARA_HaulCorpseToVat"); private const int MaxDistanceForAutoAssignment = 30; // 自动分配工作的最大距离 + + // 反射缓存 + private static System.Reflection.MethodInfo corpseDrawAtMethod; #endregion #region 字段和属性 @@ -28,7 +31,6 @@ namespace ArachnaeSwarm private Corpse selectedCorpse; private int startTick = -1; private Graphic cachedTopGraphic; - private CompPowerTrader powerComp; private CorpseVatExtension vatExtension; // 绘制相关 @@ -41,7 +43,6 @@ namespace ArachnaeSwarm public bool HasCorpse => selectedCorpse != null && innerContainer.Contains(selectedCorpse); public virtual bool IsContentsSuspended => true; public ThingOwner SearchableContents => innerContainer; - public CompPowerTrader PowerComp => powerComp ??= GetComp(); // 扩展属性 public CorpseVatExtension VatExtension => vatExtension ??= def.GetModExtension(); @@ -65,6 +66,14 @@ namespace ArachnaeSwarm return cachedTopGraphic; } } + + // 静态构造函数 + static Building_CorpseVat() + { + // 使用反射获取DrawAt方法 + corpseDrawAtMethod = typeof(Corpse).GetMethod("DrawAt", + System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + } #endregion #region 构造函数 @@ -136,12 +145,6 @@ namespace ArachnaeSwarm return "CorpseVat_Occupied".Translate(); } - // 检查是否有电源需求且是否供电 - if (VatExtension != null && VatExtension.requiresPower && (PowerComp == null || !PowerComp.PowerOn)) - { - return "CorpseVat_NoPower".Translate(); - } - // 检查尸体是否有效 if (corpse == null || corpse.Destroyed) { @@ -239,10 +242,6 @@ namespace ArachnaeSwarm { VatExtension.ejectSound.PlayOneShot(new TargetInfo(Position, Map)); } - - // 发送消息 - Messages.Message("CorpseVat_CorpseEjected".Translate(droppedCorpse.InnerPawn?.LabelShortCap ?? "Unknown"), - MessageTypeDefOf.NeutralEvent); } } } @@ -505,7 +504,8 @@ namespace ArachnaeSwarm if (Map == null) yield break; - foreach (Thing thing in Map.listerThings.ThingsOfDef(ThingDefOf.Corpse)) + // 使用 ThingRequestGroup.Corpse 获取所有尸体 + foreach (Thing thing in Map.listerThings.ThingsInGroup(ThingRequestGroup.Corpse)) { Corpse corpse = thing as Corpse; if (corpse != null && CanAcceptCorpse(corpse).Accepted) @@ -551,17 +551,6 @@ namespace ArachnaeSwarm { base.Tick(); - // 检查电源 - if (VatExtension != null && VatExtension.requiresPower && (PowerComp == null || !PowerComp.PowerOn)) - { - if (HasCorpse) - { - Messages.Message("CorpseVat_PowerLost".Translate(), MessageTypeDefOf.CautionInput); - EjectContents(); - } - return; - } - // 检查尸体状态 if (HasCorpse && (selectedCorpse.Destroyed || !innerContainer.Contains(selectedCorpse))) { @@ -617,10 +606,23 @@ namespace ArachnaeSwarm // 调整高度 corpseDrawPos.y += Altitudes.AltIncVect.y * 3f; - // 绘制尸体 - // 注意:由于尸体在容器中,其正常绘制方法可能不会自动调用 - // 我们需要手动调用绘制方法 - selectedCorpse.DrawAt(corpseDrawPos); + // 绘制尸体 - 使用反射调用受保护的DrawAt方法 + if (corpseDrawAtMethod != null) + { + try + { + corpseDrawAtMethod.Invoke(selectedCorpse, new object[] { corpseDrawPos, false }); + } + catch (Exception ex) + { + Log.Error($"Failed to draw corpse: {ex.Message}"); + } + } + else + { + // 如果反射失败,使用替代方法绘制 + DrawCorpseAlternative(corpseDrawPos); + } // 如果需要特殊的绘制效果,可以在这里添加 if (VatExtension != null && VatExtension.drawPreservationEffect) @@ -629,6 +631,26 @@ namespace ArachnaeSwarm } } + /// + /// 替代的绘制尸体方法 + /// + private void DrawCorpseAlternative(Vector3 position) + { + if (selectedCorpse == null) + return; + + // 尝试使用公开的方法绘制 + try + { + // 使用DynamicDrawPhaseAt方法 + selectedCorpse.DynamicDrawPhaseAt(DrawPhase.Draw, position); + } + catch (Exception ex) + { + Log.Error($"Failed to draw corpse (alternative): {ex.Message}"); + } + } + /// /// 绘制保存效果 /// @@ -650,24 +672,6 @@ namespace ArachnaeSwarm if (sb.Length > 0) sb.AppendLine(); - // 电源状态 - if (VatExtension != null && VatExtension.requiresPower) - { - if (PowerComp == null) - { - sb.Append("CorpseVat_NoPowerComp".Translate()); - } - else if (!PowerComp.PowerOn) - { - sb.Append("CorpseVat_PowerOff".Translate()); - } - else - { - sb.Append("CorpseVat_PowerOn".Translate()); - } - sb.AppendLine(); - } - // 内容状态 if (HasCorpse) { @@ -677,15 +681,6 @@ namespace ArachnaeSwarm sb.Append("CorpseVat_Contains".Translate(innerPawn.LabelCap)); sb.AppendLine(); - // 显示保存时间 - if (startTick > 0) - { - int ticksInVat = Find.TickManager.TicksGame - startTick; - string timeStr = ticksInVats.ToStringTicksToPeriod(); - sb.Append("CorpseVat_PreservationTime".Translate(timeStr)); - sb.AppendLine(); - } - // 显示腐烂状态 CompRottable rottable = selectedCorpse.TryGetComp(); if (rottable != null) @@ -752,7 +747,6 @@ namespace ArachnaeSwarm sb.AppendLine($"是否有尸体: {HasCorpse}"); sb.AppendLine($"是否工作中: {Working}"); sb.AppendLine($"开始Tick: {startTick}"); - sb.AppendLine($"电源: {(PowerComp?.PowerOn == true ? "开启" : "关闭")}"); if (HasCorpse) { @@ -764,36 +758,12 @@ namespace ArachnaeSwarm sb.AppendLine($"扩展配置: {(VatExtension != null ? "已加载" : "未找到")}"); if (VatExtension != null) { - sb.AppendLine($"需要电源: {VatExtension.requiresPower}"); sb.AppendLine($"减缓腐烂: {VatExtension.slowDecayRate}"); sb.AppendLine($"顶部贴图: {VatExtension.topGraphicPath}"); } return sb.ToString(); } - - /// - /// 获取所有可用尸体的统计信息 - /// - public string GetAvailableCorpsesInfo() - { - StringBuilder sb = new StringBuilder(); - var corpses = GetAvailableCorpses().ToList(); - - sb.AppendLine("=== 可用尸体列表 ==="); - sb.AppendLine($"总计: {corpses.Count}"); - sb.AppendLine(); - - foreach (Corpse corpse in corpses) - { - sb.AppendLine(GetCorpseLabel(corpses)); - sb.AppendLine($" 位置: {corpse.Position}"); - sb.AppendLine($" 距离: {corpse.Position.DistanceTo(Position):F0}m"); - sb.AppendLine(); - } - - return sb.ToString(); - } #endregion } } diff --git a/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/CorpseVatExtension.cs b/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/CorpseVatExtension.cs index e15ecc1..55e2fe2 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/CorpseVatExtension.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/CorpseVatExtension.cs @@ -21,7 +21,6 @@ namespace ArachnaeSwarm public bool drawPreservationEffect = true; // 是否绘制保存效果 // ===== 功能配置 ===== - public bool requiresPower = true; // 是否需要电源 public float slowDecayRate = 0.1f; // 腐烂减缓率(0-1,0=完全停止腐烂,1=正常腐烂) // ===== 音效配置 ===== @@ -32,7 +31,6 @@ namespace ArachnaeSwarm { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.AppendLine("=== CorpseVat 配置摘要 ==="); - sb.AppendLine($"需要电源: {requiresPower}"); sb.AppendLine($"减缓腐烂: {(slowDecayRate * 100):F0}%"); sb.AppendLine($"顶部贴图: {topGraphicPath ?? "无"}"); sb.AppendLine($"绘制偏移: {corpseDrawOffset}"); diff --git a/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/JobDriver_HaulCorpseToVat.cs b/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/JobDriver_HaulCorpseToVat.cs index 5cfd19d..592108a 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/JobDriver_HaulCorpseToVat.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_CorpseVat/JobDriver_HaulCorpseToVat.cs @@ -1,4 +1,6 @@ using RimWorld; +using System.Collections.Generic; +using UnityEngine; using Verse; using Verse.AI; @@ -7,66 +9,230 @@ namespace ArachnaeSwarm /// /// 自定义的搬运尸体工作驱动 /// - public class JobDriver_HaulCorpseToVat : JobDriver_HaulToContainer + public class JobDriver_HaulCorpseToVat : JobDriver_HaulToContainer, IBuildableDriver { - protected override Toil CarryToContainerToil() + // 自定义工作效果器 + private Effecter workEffecter; + + // 工作间隔(tick) + private const int WorkEffectInterval = 80; + + /// + /// 获取要搬运的尸体 + /// + private Corpse CorpseToCarry => job.targetA.Thing as Corpse; + + /// + /// 获取尸体保存罐 + /// + private Building_CorpseVat CorpseVat => job.targetB.Thing as Building_CorpseVat; + + /// + /// 构建工作流程 + /// + protected override IEnumerable MakeNewToils() { - Toil toil = base.CarryToContainerToil(); + // 添加失败条件 + this.FailOn(() => CorpseToCarry == null || CorpseToCarry.Destroyed); + this.FailOn(() => CorpseVat == null || CorpseVat.Destroyed); - // 添加自定义行为 - toil.AddPreTickAction(() => + // 添加自定义失败条件:检查尸体是否仍然可以被接受 + this.FailOn(() => { - Corpse corpse = TargetThingA as Corpse; - Building_CorpseVat vat = TargetThingB as Building_CorpseVat; - - if (corpse != null && vat != null && pawn != null) - { - // 检查距离,如果太远可以取消工作 - float distance = corpse.Position.DistanceTo(vat.Position); - if (distance > 100f) // 最大距离限制 - { - pawn.jobs.EndCurrentJob(JobCondition.Incompletable); - } - } + if (CorpseToCarry == null || CorpseVat == null) + return true; + + AcceptanceReport report = CorpseVat.CanAcceptCorpse(CorpseToCarry); + return !report.Accepted; }); - return toil; - } - - protected override Toil FindCarryToCellToil() - { - Toil toil = base.FindCarryToCellToil(); - - // 添加额外条件检查 - toil.AddFailCondition(() => + // 添加自定义失败条件:检查距离是否过远 + this.FailOn(() => { - Corpse corpse = TargetThingA as Corpse; - Building_CorpseVat vat = TargetThingB as Building_CorpseVat; - - if (corpse == null || corpse.Destroyed || vat == null || vat.Destroyed) - { + if (CorpseToCarry == null || CorpseVat == null) return true; + + float distance = CorpseToCarry.Position.DistanceTo(CorpseVat.Position); + return distance > 100f; // 最大距离100格 + }); + + // 调用基类的工作流程 + foreach (Toil toil in base.MakeNewToils()) + { + // 我们可以对每个toil进行自定义修改 + if (toil.defaultCompleteMode == ToilCompleteMode.Delay) + { + // 这是等待/工作toil,添加自定义效果 + toil.AddPreTickAction(() => + { + UpdateWorkEffecter(toil); + }); + + toil.AddFinishAction(() => + { + CleanupWorkEffecter(); + }); } - // 检查尸体是否仍然可以被接受 + yield return toil; + } + } + + /// + /// 更新工作效果器 + /// + private void UpdateWorkEffecter(Toil toil) + { + if (CorpseVat == null || !pawn.IsHashIntervalTick(WorkEffectInterval)) + return; + + // 创建或更新效果器 + if (workEffecter == null && WorkEffecter != null) + { + workEffecter = WorkEffecter.Spawn(); + workEffecter.Trigger(CorpseVat, CorpseVat); + } + + workEffecter?.EffectTick(CorpseVat, CorpseVat); + } + + /// + /// 清理工作效果器 + /// + private void CleanupWorkEffecter() + { + workEffecter?.Cleanup(); + workEffecter = null; + } + + /// + /// 重写报告字符串 + /// + public override string GetReport() + { + if (CorpseToCarry == null || CorpseVat == null) + return "ReportHaulingUnknown".Translate(); + + Pawn innerPawn = CorpseToCarry.InnerPawn; + string pawnName = innerPawn?.LabelCap ?? "Unknown"; + + return "CorpseVat_ReportHauling".Translate(pawnName, CorpseVat.LabelShort); + } + + /// + /// 重写预留方法 + /// + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + // 调用基类预留 + bool result = base.TryMakePreToilReservations(errorOnFailed); + + if (result && Prefs.DevMode) + { + Log.Message($"JobDriver_HaulCorpseToVat: 成功预留 {CorpseToCarry?.LabelCap ?? "null"} 到 {CorpseVat?.LabelCap ?? "null"}"); + } + + return result; + } + + /// + /// 添加自定义准备步骤 + /// + protected override void ModifyPrepareToil(Toil toil) + { + base.ModifyPrepareToil(toil); + + // 添加自定义准备步骤 + toil.AddPreInitAction(() => + { + if (CorpseToCarry != null && CorpseVat != null) + { + // 记录开始时间 + Log.Message($"开始搬运尸体 {CorpseToCarry.InnerPawn?.LabelCap ?? "Unknown"} 到 {CorpseVat.LabelCap}"); + } + }); + } + + /// + /// 获取调试信息 + /// + public string GetDebugInfo() + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + sb.AppendLine("=== JobDriver_HaulCorpseToVat 调试信息 ==="); + sb.AppendLine($"Pawn: {pawn?.LabelCap ?? "null"}"); + sb.AppendLine($"Corpse: {CorpseToCarry?.InnerPawn?.LabelCap ?? "null"}"); + sb.AppendLine($"Vat: {CorpseVat?.LabelCap ?? "null"}"); + sb.AppendLine($"工作状态: {(CorpseToCarry != null && CorpseVat != null ? "有效" : "无效")}"); + + if (CorpseToCarry != null && CorpseVat != null) + { + float distance = CorpseToCarry.Position.DistanceTo(CorpseVat.Position); + sb.AppendLine($"距离: {distance:F1} 格"); + + AcceptanceReport report = CorpseVat.CanAcceptCorpse(CorpseToCarry); + sb.AppendLine($"尸体是否可接受: {report.Accepted}"); + if (!report.Accepted) + sb.AppendLine($"原因: {report.Reason}"); + } + + return sb.ToString(); + } + } + + /// + /// 简化的搬运尸体工作驱动(如果需要更简单的版本) + /// + public class JobDriver_HaulCorpseToVatSimple : JobDriver_HaulToContainer + { + protected override IEnumerable MakeNewToils() + { + // 基本工作流程 + this.FailOnDestroyedOrNull(TargetIndex.A); + this.FailOnDestroyedOrNull(TargetIndex.B); + this.FailOnForbidden(TargetIndex.B); + + // 获取尸体和建筑 + Corpse corpse = TargetThingA as Corpse; + Building_CorpseVat vat = TargetThingB as Building_CorpseVat; + + // 添加自定义失败条件 + this.FailOn(() => + { + if (corpse == null || vat == null) + return true; + + // 检查是否仍然可以接受 AcceptanceReport report = vat.CanAcceptCorpse(corpse); return !report.Accepted; }); - return toil; + // 检查距离 + this.FailOn(() => + { + if (corpse == null || vat == null) + return true; + + float distance = corpse.Position.DistanceTo(vat.Position); + return distance > 100f; + }); + + // 调用基类工作流程 + foreach (Toil toil in base.MakeNewToils()) + { + yield return toil; + } } public override bool TryMakePreToilReservations(bool errorOnFailed) { - // 为尸体和建筑预留 - if (!pawn.Reserve(TargetA, job, 1, -1, null, errorOnFailed)) - { + // 简单预留:只预留尸体和建筑 + if (!pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed)) return false; - } - if (!pawn.Reserve(TargetB, job, 1, -1, null, errorOnFailed)) - { + + if (!pawn.Reserve(job.targetB, job, 1, -1, null, errorOnFailed)) return false; - } + return true; } } diff --git a/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Building_Ootheca.cs b/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Building_Ootheca.cs index 870e5d8..fb6b038 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Building_Ootheca.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Building_Ootheca.cs @@ -1,6 +1,7 @@ // File: Building_Ootheca.cs using RimWorld; using System.Collections.Generic; +using System.Linq; using System.Text; using UnityEngine; using Verse; @@ -199,24 +200,107 @@ namespace ArachnaeSwarm builder.AppendLine(config.pawnKind.LabelCap); return builder.ToString().TrimEndNewlines(); } - // === 幼虫交互 === public void CallLarva() { + // 检查是否已经有幼虫在操作或正在孵化 if (isIncubating || assignedLarva != null) return; + + // 获取当前选中的所有同类建筑 + var selectedOothecas = GetSelectedOothecas(); + + // 如果选择了多个,检查是否有其他卵已经启动召唤 + if (selectedOothecas.Count > 1) + { + // 检查是否有其他卵已经分配了幼虫 + foreach (var ootheca in selectedOothecas) + { + if (ootheca != this && ootheca.assignedLarva != null) + { + // 已经有其他卵开始召唤幼虫了,跳过 + return; + } + } + + // 检查是否有其他卵已经处于孵化状态 + foreach (var ootheca in selectedOothecas) + { + if (ootheca != this && ootheca.isIncubating) + { + // 已经有其他卵在孵化了,跳过 + return; + } + } + + // 如果是同时按下gizmo,我们希望只有一个卵响应 + // 我们可以使用一个简单的规则:只让最近选择的一个卵响应 + // 这里我们选择第一个(可能是玩家最后点击的,取决于选择顺序) + // 或者我们可以使用位置排序 + if (!IsFirstValidOotheca(selectedOothecas)) + { + return; + } + } + var larva = FindLarva(); if (larva == null) { Messages.Message("ARA_OothecaIncubator.NoLarvaeFound".Translate(), MessageTypeDefOf.RejectInput); return; } - var job = JobMaker.MakeJob(ARA_JobDefOf.ARA_OperateIncubator, this); larva.jobs.TryTakeOrderedJob(job, JobTag.MiscWork); assignedLarva = larva; Messages.Message("ARA_OothecaIncubator.LarvaCalled".Translate(), MessageTypeDefOf.PositiveEvent); } - + /// + /// 获取当前选中的所有Building_Ootheca + /// + private List GetSelectedOothecas() + { + List result = new List(); + + if (Find.Selector == null) + return result; + + // 获取所有选中的建筑 + var selected = Find.Selector.SelectedObjects; + foreach (var obj in selected) + { + if (obj is Building_Ootheca ootheca && ootheca.Map == this.Map) + { + result.Add(ootheca); + } + } + + return result; + } + /// + /// 判断当前建筑是否是第一个有效的卵(用于多选时只让一个响应) + /// + private bool IsFirstValidOotheca(List oothecas) + { + // 过滤掉无效的(正在孵化或已有幼虫的) + var validOothecas = oothecas.Where(o => + !o.isIncubating && + o.assignedLarva == null + ).ToList(); + + if (validOothecas.Count == 0) + return false; + + // 排序规则:我们可以使用多种规则 + // 1. 按距离玩家视角中心排序(最近的优先) + // 2. 按位置排序(XZ坐标) + // 3. 按建筑ID排序(稳定的顺序) + + // 这里我们使用简单的排序:按建筑位置(X坐标为主,Z坐标为辅) + var sorted = validOothecas.OrderBy(o => o.Position.x).ThenBy(o => o.Position.z).ToList(); + + // 返回是否是第一个 + return sorted.First() == this; + } + private Pawn FindLarva() { float searchRadius = 30f; diff --git a/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/Pawn_GestaltTracker.cs b/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/Pawn_GestaltTracker.cs index a78377f..26305ab 100644 --- a/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/Pawn_GestaltTracker.cs +++ b/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/Pawn_GestaltTracker.cs @@ -29,10 +29,10 @@ namespace ArachnaeSwarm public List ControlledPawns => controlledPawns; // 计算已使用的带宽(包括超载部分) - public int UsedBandwidth => (int)ControlledPawns.Sum(p => p.GetStatValue(StatDefOf.BandwidthCost)); + public int UsedBandwidth => (int)ControlledPawns.Sum(p => p.GetStatValue(ARA_StatDefOf.ARA_GestaltBandwidthCost)); // 计算基础带宽限制 - public int TotalBandwidth => (int)pawn.GetStatValue(StatDefOf.MechBandwidth); + public int TotalBandwidth => (int)pawn.GetStatValue(ARA_StatDefOf.ARA_GestaltBandwidth); // 计算总可用控制组 public int TotalAvailableControlGroups => (int)pawn.GetStatValue(StatDefOf.MechControlGroups); diff --git a/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompHediffTerrainSpawn.cs b/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompHediffTerrainSpawn.cs index 49f1c5f..8660669 100644 --- a/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompHediffTerrainSpawn.cs +++ b/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompHediffTerrainSpawn.cs @@ -111,14 +111,6 @@ namespace ArachnaeSwarm { continue; // 跳过有排除tag的地面 } - // === 新增:检查是否只影响自己的Creep === - if (Props.affectOwnCreepOnly && currentTerrain.tags != null && - currentTerrain.tags.Contains("ARA_Creep")) - { - // 这里可以添加派系检查逻辑 - // 例如,只覆盖自己派系的Creep - } - // 应用地形变化 map.terrainGrid.SetTerrain(current, Props.terrainToSpawn); affectedCells.Add(current); @@ -187,33 +179,6 @@ namespace ArachnaeSwarm return true; } - // 2. 检查允许性(如果启用) - if (Props.checkAffordances && terrain.affordances != null && Props.excludeAffordances != null) - { - foreach (var affordance in terrain.affordances) - { - if (affordance != null && Props.excludeAffordances.Contains(affordance.defName)) - { - return true; - } - } - } - - // 3. 检查优先地形(如果启用智能覆盖) - if (Props.smartOverlay && Props.IsPreferredTerrain(terrain)) - { - return true; - } - - // 4. 检查路径(如果启用路径保护) - if (Props.preservePaths) - { - if (IsPathCell(cell, map)) - { - return true; - } - } - // 5. 检查是否是水或其他特殊地形 if (terrain.IsWater || terrain.defName.Contains("Water") || terrain.defName.Contains("Marsh")) { diff --git a/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompProperties_HediffTerrainSpawn.cs b/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompProperties_HediffTerrainSpawn.cs index f8195f9..6725f82 100644 --- a/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompProperties_HediffTerrainSpawn.cs +++ b/Source/ArachnaeSwarm/Hediffs/ARA_HediffTerrainSpawn/CompProperties_HediffTerrainSpawn.cs @@ -22,19 +22,12 @@ namespace ArachnaeSwarm public List excludedTerrainTags = null; // 要排除的tag列表 public bool useDefaultExclusions = true; // 是否使用默认排除项(ARA_Creep和ARA_Incubator_Nutrient_Solution) - // === 新增:扩展检查选项 === - public bool checkAffordances = false; // 是否检查地形允许性(affordances) - public List excludeAffordances = null; // 要排除的允许性列表 - // === 新增:智能覆盖选项 === - public bool smartOverlay = false; // 是否智能覆盖(仅覆盖"较差"的地形) public List preferredTerrains = null; // 优先地形列表,这些不会被覆盖 - public bool preservePaths = false; // 是否保留路径 // === 新增:行为选项 === public bool onlyWhenOnCreep = false; // 是否只在Creep上生效 - public bool ignoreOccupiedCells = true; // 是否忽略被占用的单元格 - public bool affectOwnCreepOnly = false; // 是否只影响自己的Creep(如果有派系) + public bool ignoreOccupiedCells = false; // 是否忽略被占用的单元格 // === 新增:视觉效果选项 === public EffecterDef spawnEffecter = null; // 生成地形时的效果