This commit is contained in:
2026-01-23 12:04:23 +08:00
parent 3c9ddc4c60
commit 51ba45982f
34 changed files with 1665 additions and 432 deletions

Binary file not shown.

View File

@@ -1578,10 +1578,36 @@
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_Locust_Needle_Fire</defName>
<label>毒针连射</label>
<description>阿拉克涅督虫使用可以喷射剧毒尾针的毒针腺对敌方进行一轮射击。</description>
<writeCombatLog>True</writeCombatLog>
<showPsycastEffects>False</showPsycastEffects>
<cooldownTicksRange>120</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>24</range>
<warmupTime>1</warmupTime>
<soundCast>Heatspikes_Shot</soundCast>
<soundCastTail>Heatspikes_Tail</soundCastTail>
<targetParams>
<canTargetPawns>True</canTargetPawns>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityLaunchMultiProjectile">
<projectileDef>Bullet_ARA_RW_Basic_Fist_Needle_Gun</projectileDef>
<numProjectiles>12</numProjectiles>
</li>
</comps>
</AbilityDef>
<!-- 蜕荚 -->
<AbilityDef>
<defName>ARA_Pouch_Hatching_Acidling</defName>
<defName>ARA_Pouch_Hatching_Baneling</defName>
<label>蜕荚孵化:爆裂种</label>
<description>立刻在脚下孵化三只阿拉克涅爆裂种辅虫,它们会对敌方发起自杀性攻击。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_BaseRace_Launcher</iconPath>
@@ -1603,7 +1629,7 @@
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityLaunchMultiProjectile">
<projectileDef>ArachnaeBase_Race_Acidling_Proj</projectileDef>
<projectileDef>ArachnaeBase_Race_Baneling_Proj</projectileDef>
<numProjectiles>3</numProjectiles>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">

View File

@@ -1260,7 +1260,7 @@
<AbilityDef>
<defName>ARA_Skyraider_Hivelord</defName>
<label>空天种转换——巢虫之主</label>
<description>使空天种发生内驱性进化,以降低机动力和失去高空机动能力为代价,使其获得向敌方自动投射天巢种辅虫的能力——这种辅虫体型很小,会以让人烦扰的近战紧紧黏住敌人。\n\n该进化过程不可逆!</description>
<description>使空天种发生内驱性进化,以降低机动力和失去高空机动能力为代价,使其获得孵化大量天巢种辅虫的能力——这种辅虫体型很小,会以让人烦扰的近战紧紧黏住敌人。\n\n该进化方向提供8只阿拉克涅天巢种辅虫。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Skyraider_Hivelord</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>
@@ -1299,7 +1299,7 @@
<HediffDef>
<defName>ARA_Skyraider_Hivelord</defName>
<label>亚种-领主种</label>
<description>这只阿拉克涅空天种已经获得拔耀,会对敌方投掷天巢种辅虫,这些灵敏的辅虫会在落地后散开四处狩猎目标。</description>
<description>这只阿拉克涅空天种已经获得拔耀,可以孵化大量的天巢种辅虫,这些灵敏的辅虫会后散开四处狩猎目标。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
@@ -1343,15 +1343,24 @@
</li>
</stages>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_TopTurret">
<li Class="ArachnaeSwarm.HediffCompProperties_ProductionQueue">
<productionQueue>
<li>
<pawnKind>ArachnaeBase_Race_Skyhive</pawnKind>
<count>8</count>
<cooldownTicks>400</cooldownTicks>
</li>
</productionQueue>
</li>
<!-- <li Class="ArachnaeSwarm.HediffCompProperties_TopTurret">
<turretDef>ARA_Skyraider_Hivelord_Turret</turretDef>
<angleOffset>0</angleOffset>
<autoAttack>true</autoAttack>
</li>
<li Class="ArachnaeSwarm.HediffCompProperties_DrawMote">
<mote>ARA_Mote_Hivelord_Turret_Range</mote> <!-- 大小和range没有严格对应关系需要自己试出来drawSize -->
<mote>ARA_Mote_Hivelord_Turret_Range</mote>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
</li>
</li> -->
</comps>
</HediffDef>
<ThingDef ParentName="MoteBase">
@@ -1374,7 +1383,7 @@
<AbilityDef>
<defName>ARA_Skyraider_Empthrower</defName>
<label>空天种转换——电磁风暴</label>
<description>使空天种发生内驱性进化,以降低机动力和失去高空机动能力为代价,使其获得向敌方自动投射磁暴种辅虫的能力——这种辅虫会以自杀式袭击的方式释放出EMP以对抗机械族。\n\n该进化过程不可逆!</description>
<description>使空天种发生内驱性进化,以降低机动力和失去高空机动能力为代价,使其获得孵化磁暴种辅虫的能力——这种辅虫会以自杀式袭击的方式释放出EMP以对抗机械族。\n\n该进化方向提供3只阿拉克涅电磁种辅虫。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Skyraider_Empthrower</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>
@@ -1413,7 +1422,7 @@
<HediffDef>
<defName>ARA_Skyraider_Empthrower</defName>
<label>亚种-飓风种</label>
<description>这只阿拉克涅空天种已经获得拔耀,会对敌方投掷磁暴种辅虫,这些辅虫会在落地后散开,以自杀性袭击释放EMP对抗敌方机械族。</description>
<description>这只阿拉克涅空天种已经获得拔耀,会孵化磁暴种辅虫这些辅虫以自杀性袭击释放EMP对抗敌方机械族。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
@@ -1457,7 +1466,16 @@
</li>
</stages>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_TopTurret">
<li Class="ArachnaeSwarm.HediffCompProperties_ProductionQueue">
<productionQueue>
<li>
<pawnKind>ArachnaeBase_Race_Empsuicider</pawnKind>
<count>3</count>
<cooldownTicks>500</cooldownTicks>
</li>
</productionQueue>
</li>
<!-- <li Class="ArachnaeSwarm.HediffCompProperties_TopTurret">
<turretDef>ARA_Skyraider_Empthrower_Turret</turretDef>
<angleOffset>0</angleOffset>
<autoAttack>true</autoAttack>
@@ -1465,7 +1483,7 @@
<li Class="ArachnaeSwarm.HediffCompProperties_DrawMote">
<mote>ARA_Mote_Empthrower_Turret_Range</mote>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
</li>
</li> -->
</comps>
</HediffDef>
<ThingDef ParentName="MoteBase">
@@ -1508,10 +1526,19 @@
</li>
</stages>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_TopTurret">
<turretDef>ARA_Praetorian_Base_Turret</turretDef>
<angleOffset>0</angleOffset>
<autoAttack>true</autoAttack>
<li Class="ArachnaeSwarm.HediffCompProperties_ProductionQueue">
<productionQueue>
<li>
<pawnKind>ArachnaeBase_Race_Acidcut</pawnKind>
<count>3</count>
<cooldownTicks>500</cooldownTicks>
</li>
<li>
<pawnKind>ArachnaeBase_Race_Locust</pawnKind>
<count>2</count>
<cooldownTicks>700</cooldownTicks>
</li>
</productionQueue>
</li>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
@@ -1531,7 +1558,7 @@
<AbilityDef>
<defName>ARA_Praetorian_Navigator</defName>
<label>禁卫种转换——引航灯塔</label>
<description>使禁卫种发生内驱性进化,以牺牲射击能力、跳跃能力、指挥能力为代价,使其换取指挥空中兽虫的能力。\n\n该进化过程不可逆!另外,空中兽虫必须成功升空才能进行指挥——在你解锁这个进化路径时,应该还不能建造空中兽虫。</description>
<description>使禁卫种发生内驱性进化,以牺牲射击能力、跳跃能力、指挥能力为代价,使其换取指挥空中兽虫的能力。\n\n该进化方向不提供阿拉克涅辅虫。另外,空中兽虫必须成功升空才能进行指挥——在你解锁这个进化路径时,应该还不能建造空中兽虫。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Praetorian_Navigator</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>

View File

@@ -150,7 +150,7 @@
<li>ArachnaeNode_Race_Skyraider</li>
<li>ArachnaeNode_Race_Praetorian</li>
<li>ArachnaeBase_Race_Acidcut</li>
<li>ArachnaeBase_Race_Acidling</li>
<li>ArachnaeBase_Race_Baneling</li>
<li>ArachnaeBase_Race_Skyhive</li>
<li>ArachnaeNode_Race_MimicNematode</li>
</targetRaces>

View File

@@ -284,8 +284,8 @@
<weaponMoney>0</weaponMoney>
<techHediffsMoney>0</techHediffsMoney>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeBase_Race_Acidling">
<defName>ArachnaeBase_Race_Acidling_Enermy</defName>
<PawnKindDef ParentName="ArachnaeBase_Race_Baneling">
<defName>ArachnaeBase_Race_Baneling_Enermy</defName>
<combatPower>150</combatPower>
<apparelMoney>0</apparelMoney>
<weaponMoney>0</weaponMoney>

View File

@@ -537,7 +537,7 @@
<lifeStages>
<li>
<bodyGraphicData>
<texPath>ArachnaeSwarm/Things/ARA_Acidling/Bodies/Naked_Thin</texPath>
<texPath>ArachnaeSwarm/Things/ARA_Baneling/Bodies/Naked_Thin</texPath>
<drawSize>1</drawSize>
<shadowData>
<volume>(0.4, 0.5, 0.37)</volume>
@@ -606,15 +606,14 @@
</li>
</lifeStages>
</PawnKindDef>
<PawnKindDef Name="ArachnaeBase_Race_Acidling" ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Acidling</defName>
<PawnKindDef Name="ArachnaeBase_Race_Baneling" ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Baneling</defName>
<label>阿拉克涅爆裂种</label>
<race>ArachnaeBase_Race_Acidling</race>
<race>ArachnaeBase_Race_Baneling</race>
<lifeStages>
<li>
<bodyGraphicData>
<texPath>ArachnaeSwarm/Things/ARA_Acidling/Bodies/Naked_Thin</texPath>
<texPath>ArachnaeSwarm/Things/ARA_Baneling/Bodies/Naked_Thin</texPath>
<drawSize>1</drawSize>
<shadowData>
<volume>(0.4, 0.5, 0.37)</volume>
@@ -635,7 +634,7 @@
<lifeStages>
<li>
<bodyGraphicData>
<texPath>ArachnaeSwarm/Things/ARA_Acidling/BodiesEmp/Naked_Thin</texPath>
<texPath>ArachnaeSwarm/Things/ARA_Baneling/BodiesEmp/Naked_Thin</texPath>
<drawSize>1</drawSize>
<shadowData>
<volume>(0.4, 0.5, 0.37)</volume>
@@ -649,6 +648,30 @@
</li>
</lifeStages>
</PawnKindDef>
<PawnKindDef ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Locust</defName>
<label>阿拉克涅爆裂种</label>
<race>ArachnaeBase_Race_Locust</race>
<lifeStages>
<li>
<bodyGraphicData>
<texPath>ArachnaeSwarm/Things/ARA_Baneling/BodiesEmp/Naked_Thin</texPath>
<drawSize>1</drawSize>
<shadowData>
<volume>(0.4, 0.5, 0.37)</volume>
<offset>(0,0,-0.15)</offset>
</shadowData>
</bodyGraphicData>
<dessicatedBodyGraphicData>
<texPath>Things/Pawn/Animal/Spelopede/Dessicated_Spelopede</texPath>
<drawSize>1</drawSize>
</dessicatedBodyGraphicData>
</li>
</lifeStages>
<abilities>
<li>ARA_Locust_Needle_Fire</li>
</abilities>
</PawnKindDef>
<PawnKindDef Name="ArachnaeBeast_Race_Slayer" ParentName="ARA_InsectKindBase">
<defName>ArachnaeBeast_Race_Slayer</defName>

View File

@@ -700,11 +700,11 @@
<!-- 蜕荚 -->
<RecipeDef ParentName="ARA_SurgeryInstallImplantBase">
<defName>ARA_Surgery_Install_Acidling_Pouch</defName>
<defName>ARA_Surgery_Install_Baneling_Pouch</defName>
<label>爆裂种蜕荚</label>
<description>诱发阿拉克涅虫族的定向变异,使其蜕荚中预先储存三只即将孵化的阿拉克涅爆裂种,它们一旦被释放就会以自杀式袭击攻击敌方。</description>
<descriptionHyperlinks>
<HediffDef>ARA_Acidling_Pouch_Hediff</HediffDef>
<HediffDef>ARA_Baneling_Pouch_Hediff</HediffDef>
</descriptionHyperlinks>
<jobString>正在实施定向变异</jobString>
<ingredients>
@@ -725,16 +725,16 @@
<li>ARA_Activated_Bacterium</li>
</thingDefs>
</fixedIngredientFilter>
<addsHediff>ARA_Acidling_Pouch_Hediff</addsHediff>
<addsHediff>ARA_Baneling_Pouch_Hediff</addsHediff>
<researchPrerequisite>ARA_Technology_4EVO</researchPrerequisite>
</RecipeDef>
<HediffDef ParentName="AddedBodyPartBase">
<defName>ARA_Acidling_Pouch_Hediff</defName>
<defName>ARA_Baneling_Pouch_Hediff</defName>
<label>爆裂种蜕荚</label>
<hediffClass>Hediff_Implant</hediffClass>
<description>阿拉克涅虫族的蜕荚里装了若干只即将孵化的阿拉克涅爆裂种,只需要获得指令就会立刻破体而出攻击敌方。</description>
<descriptionHyperlinks>
<RecipeDef>ARA_Surgery_Install_Acidling_Pouch</RecipeDef>
<RecipeDef>ARA_Surgery_Install_Baneling_Pouch</RecipeDef>
</descriptionHyperlinks>
<addedPartProps>
<betterThanNatural>true</betterThanNatural>
@@ -742,17 +742,17 @@
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_Pouch_Hatching_Acidling</li>
<li>ARA_Pouch_Hatching_Baneling</li>
</abilityDefs>
</li>
</comps>
</HediffDef>
<ThingDef ParentName="ARA_BodyPartProstheticBase">
<defName>ARA_Acidling_Pouch</defName>
<defName>ARA_Baneling_Pouch</defName>
<label>爆裂种蜕荚</label>
<description>阿拉克涅虫族的蜕荚里装了若干只即将孵化的阿拉克涅爆裂种,只需要获得指令就会立刻破体而出攻击敌方。该手术不需要制作部件,可以直接在阿拉克涅督虫身上实施。</description>
<descriptionHyperlinks>
<RecipeDef>ARA_Surgery_Install_Acidling_Pouch</RecipeDef>
<RecipeDef>ARA_Surgery_Install_Baneling_Pouch</RecipeDef>
</descriptionHyperlinks>
<recipeMaker>
<researchPrerequisite>ARA_Technology_4EVO</researchPrerequisite>

View File

@@ -29,7 +29,7 @@
<li>ARA_Surgery_Install_Reactive_Shell</li>
<li>ARA_Surgery_Install_Strengthening_Tendon</li>
<li>ARA_Surgery_Install_Slide_Patagium</li>
<li>ARA_Surgery_Install_Acidling_Pouch</li>
<li>ARA_Surgery_Install_Baneling_Pouch</li>
<li>ARA_Surgery_Install_Tumor_Pouch</li>
<li>ARA_Surgery_Install_Internal_Circulation_Lung</li>
</recipes>
@@ -524,6 +524,74 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ArachnaeBase_Race">
<defName>ArachnaeBase_Race_Empsuicider</defName>
<label>阿拉克涅电磁种</label>
<description>阿拉克涅辅虫之一智力低下一般以自杀式袭击的方式伤害敌军靠近敌人后就会释放EMP瘫痪附加的机械族如果其监管者督虫处于征召状态则会跟随督虫一起行动。</description>
<race>
<thinkTreeMain>ARA_Insect_Baneling_Thinktree</thinkTreeMain>
<baseBodySize>0.35</baseBodySize>
<!-- <hasCorpse>false</hasCorpse> -->
<body>BeetleLikeWithClaw</body>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<statBases>
<MoveSpeed>6.6</MoveSpeed>
</statBases>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AdvancedTraining">
<trainables>
<li>
<trainable>Obedience</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>Release</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>Rescue</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>Tameness</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>AttackTarget</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
</trainables>
<disableAllSkillDecay>true</disableAllSkillDecay> <!-- 阻止这个动物的所有技能衰减 -->
</li>
<li Class="ArachnaeSwarm.CompProperties_HunterExplosion">
<explosionRadius>6</explosionRadius> <!-- Mapped from smokeRadius -->
<explosionDamageType>EMP</explosionDamageType>
<explosionDamageAmount>65</explosionDamageAmount>
<armorPenetration>2</armorPenetration>
<explosionSound>Explosion_EMP</explosionSound>
<!-- <postExplosionSpawnThingDef>ARA_AcidGasCloud</postExplosionSpawnThingDef>
<postExplosionSpawnChance>1</postExplosionSpawnChance>
<postExplosionSpawnThingCount>1</postExplosionSpawnThingCount> -->
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindWorker</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ArachnaeBase_Race">
<defName>ArachnaeBase_Race_Skyhive</defName>
<label>阿拉克涅天巢种</label>
@@ -608,6 +676,80 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ArachnaeBase_Race">
<defName>ArachnaeBase_Race_Locust</defName>
<label>阿拉克涅天巢种</label>
<description>阿拉克涅辅虫之一,拥有贴地飞行的能力,无论是攻击还是移动速度非常快。</description>
<race>
<thinkTreeMain>ARA_Insect_Locust_Thinktree</thinkTreeMain>
<baseBodySize>0.36</baseBodySize>
<!-- <hasCorpse>false</hasCorpse> -->
<body>BeetleLikeWithClaw</body>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<statBases>
<MoveSpeed>5.5</MoveSpeed>
<ArmorRating_Blunt>0.4</ArmorRating_Blunt>
<ArmorRating_Sharp>0.4</ArmorRating_Sharp>
<ArmorRating_Heat>0.25</ArmorRating_Heat>
</statBases>
<tools Inherit="False">
<li>
<label>复合颚</label>
<capacities>
<li>Cut</li>
</capacities>
<power>3</power>
<cooldownTime>0.8</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
</li>
</tools>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AdvancedTraining">
<trainables>
<li>
<trainable>Obedience</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>Release</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>Rescue</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>Tameness</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
<li>
<trainable>AttackTarget</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
</trainables>
<disableAllSkillDecay>true</disableAllSkillDecay> <!-- 阻止这个动物的所有技能衰减 -->
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindWorker</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</ThingDef>
<ToolCapacityDef>
<defName>ARA_AcidCut</defName>

View File

@@ -74,7 +74,7 @@
</comps>
</ThingDef>
<ThingDef ParentName="ARA_BaseDroneSwarm">
<defName>ArachnaeBase_Race_Acidling</defName>
<defName>ArachnaeBase_Race_Baneling</defName>
<label>阿拉克涅爆裂种</label>
<description>阿拉克涅辅虫之一,智力低下,一般以自杀式袭击的方式伤害敌军,靠近敌人后就会引爆酸囊产生危险的酸性雾气。</description>
<race>
@@ -112,32 +112,5 @@
</li>
</tools>
</ThingDef>
<ThingDef ParentName="ARA_BaseDroneSwarm">
<defName>ArachnaeBase_Race_Empsuicider</defName>
<label>阿拉克涅爆裂种</label>
<description>阿拉克涅辅虫之一智力低下一般以自杀式袭击的方式伤害敌军靠近敌人后就会释放EMP瘫痪附加的机械族。</description>
<race>
<thinkTreeConstant>HunterDroneConstant</thinkTreeConstant>
<baseBodySize>0.25</baseBodySize>
<!-- <hasCorpse>false</hasCorpse> -->
<body>BeetleLikeWithClaw</body>
<baseHealthScale>1</baseHealthScale>
</race>
<statBases>
<MoveSpeed>6</MoveSpeed>
</statBases>
<comps>
<li Class="ArachnaeSwarm.CompProperties_HunterExplosion">
<explosionRadius>6</explosionRadius> <!-- Mapped from smokeRadius -->
<explosionDamageType>EMP</explosionDamageType>
<explosionDamageAmount>65</explosionDamageAmount>
<armorPenetration>2</armorPenetration>
<explosionSound>Explosion_EMP</explosionSound>
<!-- <postExplosionSpawnThingDef>ARA_AcidGasCloud</postExplosionSpawnThingDef>
<postExplosionSpawnChance>1</postExplosionSpawnChance>
<postExplosionSpawnThingCount>1</postExplosionSpawnThingCount> -->
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -625,7 +625,7 @@
<li>ARA_Surgery_Install_Reactive_Shell</li>
<li>ARA_Surgery_Install_Strengthening_Tendon</li>
<li>ARA_Surgery_Install_Slide_Patagium</li>
<li>ARA_Surgery_Install_Acidling_Pouch</li>
<li>ARA_Surgery_Install_Baneling_Pouch</li>
<li>ARA_Surgery_Install_Tumor_Pouch</li>
<li>ARA_Surgery_Install_Internal_Circulation_Lung</li>
</recipes>

View File

@@ -556,7 +556,7 @@
<li>ARA_Surgery_Install_Reactive_Shell</li>
<li>ARA_Surgery_Install_Strengthening_Tendon</li>
<li>ARA_Surgery_Install_Slide_Patagium</li>
<li>ARA_Surgery_Install_Acidling_Pouch</li>
<li>ARA_Surgery_Install_Baneling_Pouch</li>
<li>ARA_Surgery_Install_Tumor_Pouch</li>
<li>ARA_Surgery_Install_Internal_Circulation_Lung</li>
</recipes>

View File

@@ -2158,7 +2158,7 @@
<label>阿拉克涅磁暴种</label>
<thingClass>Projectile_SpawnsPawnZeroAge</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Things/ARA_Acidling/BodiesEmp/Naked_Thin_north</texPath>
<texPath>ArachnaeSwarm/Things/ARA_Baneling/BodiesEmp/Naked_Thin_north</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>

View File

@@ -96,7 +96,7 @@
</modExtensions>
</ThingDef>
<ThingDef ParentName="PlantBase">
<defName>ARA_AcidlingTrapPlant</defName>
<defName>ARA_BanelingTrapPlant</defName>
<label>爆裂巢花</label>
<thingClass>ArachnaeSwarm.Plant_Transforming</thingClass>
<description>一种由阿拉克涅虫群培育的真菌混合体,它会汲取菌毯的营养,在生长到一定阶段后进行变态发育,最终转换成一枚阿拉克涅爆裂茧——一种会对附近的敌军释放自杀性辅虫的特殊陷阱。</description>
@@ -107,7 +107,7 @@
<Nutrition>0.2</Nutrition>
</statBases>
<graphicData>
<texPath>ArachnaeSwarm/Plant/ARA_AcidlingTrapPlant</texPath>
<texPath>ArachnaeSwarm/Plant/ARA_BanelingTrapPlant</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<selectable>true</selectable>
@@ -132,7 +132,7 @@
</plant>
<modExtensions>
<li Class="ArachnaeSwarm.PlantTransformExtension">
<buildingDef>Arachnae_AcidlingTrap</buildingDef>
<buildingDef>Arachnae_BanelingTrap</buildingDef>
<transformAtGrowth>0.8</transformAtGrowth>
</li>
</modExtensions>

View File

@@ -57,7 +57,7 @@
<li>ARA_MorphableResearchBench</li>
<li>ARANutrientDispenser</li>
<li>ARA_WormholePortal_A</li>
<li>ARA_Acidling_AutoMortar</li>
<li>ARA_Baneling_AutoMortar</li>
<li>CatastropheMissileSilo</li>
<li>ARA_AutoSniperCannon</li>
<li>ARA_Pawn_Ootheca</li>

View File

@@ -198,7 +198,7 @@
</ThingDef>
<ThingDef>
<defName>Arachnae_AcidlingTrap</defName>
<defName>Arachnae_BanelingTrap</defName>
<label>阿拉克涅爆裂茧</label>
<description>一种阿拉克涅休眠茧,内藏有休眠中的阿拉克涅虫族。如果靠太近则会唤醒其中的虫族。</description>
<thingClass>ArachnaeSwarm.Building_TrapReleaseRandom</thingClass>
@@ -228,7 +228,7 @@
<MarketValue>50</MarketValue>
</statBases>
<graphicData>
<texPath>ArachnaeSwarm/Plant/ARA_AcidlingTrapPlant</texPath>
<texPath>ArachnaeSwarm/Plant/ARA_BanelingTrapPlant</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>1.2</drawSize>
<shadowData>
@@ -242,7 +242,7 @@
<detectionRadius>5</detectionRadius>
<countToSpawn>3</countToSpawn>
<pawnKinds>
<li>ArachnaeBase_Race_Acidling</li>
<li>ArachnaeBase_Race_Baneling</li>
<!-- <li>ArachnaeBase_Race_Acid</li> -->
</pawnKinds>
</li>
@@ -394,14 +394,14 @@
</ThingDef>
<!-- Auto mortar -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_Acidling_AutoMortar</defName>
<defName>ARA_Baneling_AutoMortar</defName>
<label>爆裂种投射巢组织</label>
<description>阿拉克涅虫族用于防御巢穴的组织之一。它由大量没有自主意识的高度特化器官共同构成,能向进犯巢穴的敌军发射多只阿拉克涅爆裂种辅虫,这些辅虫将自行寻找目标以发起自杀性袭击。作为阿拉克涅防御组织,其可以通过获取营养来自行生成补充弹药。</description>
<thingClass>ArachnaeSwarm.Building_TurretGunHasSpeed</thingClass>
<drawerType>MapMeshAndRealTime</drawerType>
<drawHighlight>true</drawHighlight>
<drawHighlightOnlyForHostile>true</drawHighlightOnlyForHostile>
<uiIconPath>ArachnaeSwarm/Building/ARA_Acidling_AutoMortar_Icon</uiIconPath>
<uiIconPath>ArachnaeSwarm/Building/ARA_Baneling_AutoMortar_Icon</uiIconPath>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_AutoSniperCannon_Base</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -481,7 +481,7 @@
<buildingTags>
<li>Artillery</li>
</buildingTags>
<turretGunDef>ARA_Acidling_Artillery_AutoMortar</turretGunDef>
<turretGunDef>ARA_Baneling_Artillery_AutoMortar</turretGunDef>
<turretBurstWarmupTime>10.0</turretBurstWarmupTime>
<turretTopDrawSize>3.0</turretTopDrawSize>
<relatedTerrain>
@@ -496,10 +496,10 @@
<constructionSkillPrerequisite>8</constructionSkillPrerequisite>
</ThingDef>
<ThingDef ParentName="BaseArtilleryWeapon">
<defName>ARA_Acidling_Artillery_AutoMortar</defName>
<defName>ARA_Baneling_Artillery_AutoMortar</defName>
<label>爆裂种投射巢</label>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Acidling_Artillery_AutoMortar_Tower</texPath>
<texPath>ArachnaeSwarm/Building/ARA_Baneling_Artillery_AutoMortar_Tower</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<uiIconScale>1.25</uiIconScale>
@@ -509,7 +509,7 @@
<verbs>
<li>
<verbClass>ArachnaeSwarm.Verb_ShootWithOffset</verbClass>
<defaultProjectile>ArachnaeBase_Race_Acidling_Proj</defaultProjectile>
<defaultProjectile>ArachnaeBase_Race_Baneling_Proj</defaultProjectile>
<ai_AvoidFriendlyFireRadius>3</ai_AvoidFriendlyFireRadius>
<warmupTime>2</warmupTime>
<range>500</range>
@@ -534,16 +534,16 @@
</modExtensions>
</ThingDef>
<ThingDef ParentName="BaseGrenadeProjectile">
<defName>ArachnaeBase_Race_Acidling_Proj</defName>
<defName>ArachnaeBase_Race_Baneling_Proj</defName>
<label>阿拉克涅爆裂种</label>
<thingClass>Projectile_SpawnsPawnZeroAge</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Things/ARA_Acidling/Bodies/Naked_Thin</texPath>
<texPath>ArachnaeSwarm/Things/ARA_Baneling/Bodies/Naked_Thin</texPath>
<graphicClass>Graphic_Multi</graphicClass>
</graphicData>
<projectile>
<speed>41</speed>
<spawnsPawnKind>ArachnaeBase_Race_Acidling</spawnsPawnKind>
<spawnsPawnKind>ArachnaeBase_Race_Baneling</spawnsPawnKind>
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
<damageDef>ARA_AcidBurn</damageDef>
<damageAmountBase>10</damageAmountBase>

View File

@@ -1102,6 +1102,26 @@
</subNodes>
</li>
<!-- 特殊处理——非生产者生产会使用单元逻辑 -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ArachnaeSwarm.ThinkNode_ConditionalNotProducedByMechCarrier">
<subNodes>
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>100</targetAcquireRadius>
<targetKeepRadius>100</targetKeepRadius>
</li>
<li Class="JobGiver_AITrashColonyClose" />
<li Class="JobGiver_AITrashBuildingsDistant" />
<li Class="JobGiver_AIGotoNearestHostile" />
<li Class="JobGiver_AITrashBuildingsDistant">
<attackAllInert>true</attackAllInert>
</li>
<li Class="JobGiver_WanderAnywhere" />
</subNodes>
</li>
</subNodes>
</li>
<!-- 特殊处理——如果生产者被征召会跟随pawn -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
@@ -1442,6 +1462,26 @@
</subNodes>
</li>
<!-- 特殊处理——非生产者生产会使用单元逻辑 -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ArachnaeSwarm.ThinkNode_ConditionalNotProducedByMechCarrier">
<subNodes>
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>100</targetAcquireRadius>
<targetKeepRadius>100</targetKeepRadius>
</li>
<li Class="JobGiver_AITrashColonyClose" />
<li Class="JobGiver_AITrashBuildingsDistant" />
<li Class="JobGiver_AIGotoNearestHostile" />
<li Class="JobGiver_AITrashBuildingsDistant">
<attackAllInert>true</attackAllInert>
</li>
<li Class="JobGiver_WanderAnywhere" />
</subNodes>
</li>
</subNodes>
</li>
<!-- 特殊处理——如果生产者被征召会跟随pawn -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
@@ -2305,6 +2345,26 @@
</subNodes>
</li>
<!-- 特殊处理——非生产者生产会使用单元逻辑 -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ArachnaeSwarm.ThinkNode_ConditionalNotProducedByMechCarrier">
<subNodes>
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>100</targetAcquireRadius>
<targetKeepRadius>100</targetKeepRadius>
</li>
<li Class="JobGiver_AITrashColonyClose" />
<li Class="JobGiver_AITrashBuildingsDistant" />
<li Class="JobGiver_AIGotoNearestHostile" />
<li Class="JobGiver_AITrashBuildingsDistant">
<attackAllInert>true</attackAllInert>
</li>
<li Class="JobGiver_WanderAnywhere" />
</subNodes>
</li>
</subNodes>
</li>
<!-- 特殊处理——如果生产者被征召会跟随pawn -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
@@ -2559,6 +2619,26 @@
</subNodes>
</li>
<!-- 特殊处理——非生产者生产会使用单元逻辑 -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ArachnaeSwarm.ThinkNode_ConditionalNotProducedByMechCarrier">
<subNodes>
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>100</targetAcquireRadius>
<targetKeepRadius>100</targetKeepRadius>
</li>
<li Class="JobGiver_AITrashColonyClose" />
<li Class="JobGiver_AITrashBuildingsDistant" />
<li Class="JobGiver_AIGotoNearestHostile" />
<li Class="JobGiver_AITrashBuildingsDistant">
<attackAllInert>true</attackAllInert>
</li>
<li Class="JobGiver_WanderAnywhere" />
</subNodes>
</li>
</subNodes>
</li>
<!-- 特殊处理——如果生产者被征召会跟随pawn -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
@@ -2691,6 +2771,313 @@
</subNodes>
</thinkRoot>
</ThinkTreeDef>
<ThinkTreeDef>
<defName>ARA_Insect_Locust_Thinktree</defName>
<thinkRoot Class="ThinkNode_Priority">
<subNodes>
<!-- Keep lying down if we have to -->
<li Class="ThinkNode_ConditionalMustKeepLyingDown">
<subNodes>
<!-- Do a queued job if possible -->
<li Class="ThinkNode_QueuedJob">
<inBedOnly>true</inBedOnly>
</li>
<!-- Keep lying down -->
<li Class="JobGiver_KeepLyingDown"/>
</subNodes>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>Downed</treeDef>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>BurningResponse</treeDef>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>MentalStateCritical</treeDef>
</li>
<!-- React to close melee threat -->
<li Class="JobGiver_ReactToCloseMeleeThreat">
<maxDistance>2.9</maxDistance>
</li>
<!-- Do a queued job -->
<li Class="ThinkNode_QueuedJob"/>
<!-- Mental state non critical -->
<li Class="ThinkNode_Subtree">
<treeDef>MentalStateNonCritical</treeDef>
</li>
<!-- Forced goto -->
<li Class="ThinkNode_ConditionalForcedGoto">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ForcedGoto"/>
</subNodes>
</li>
</subNodes>
</li>
<!-- Behavior when roped -->
<li Class="ThinkNode_Subtree">
<treeDef>RopedPawn</treeDef>
</li>
<!-- Lord directives -->
<li Class="ThinkNode_Subtree">
<treeDef>LordDuty</treeDef>
</li>
<li Class="ThinkNode_ConditionalHasFaction">
<invert>true</invert>
<subNodes>
<!-- Wild insects with no lord will fight nearby enemies -->
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>30</targetAcquireRadius> <!-- Same as DefendAndExpandHive -->
<targetKeepRadius>35</targetKeepRadius>
</li>
<!-- Wild insects leave map in some conditions -->
<li Class="ThinkNode_Subtree">
<treeDef>LeaveIfWrongSeason</treeDef>
</li>
<li Class="ThinkNode_Subtree">
<treeDef>LeaveIfStarving</treeDef>
</li>
<!-- Wild insects randomly leave map -->
<li Class="ThinkNode_ChancePerHour_Constant">
<mtbDays>60</mtbDays>
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ExitMapRandom">
<defaultLocomotion>Walk</defaultLocomotion>
</li>
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Insects of a faction that's not the players without a lord leave randomly -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<invert>true</invert>
<subNodes>
<li Class="ThinkNode_ConditionalHasFaction">
<subNodes>
<li Class="ThinkNode_ConditionalNoLord">
<subNodes>
<li Class="ThinkNode_ChancePerHour_Constant">
<mtbDays>60</mtbDays>
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ExitMapRandom">
<defaultLocomotion>Walk</defaultLocomotion>
</li>
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- 特殊处理——非生产者生产会使用单元逻辑 -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ArachnaeSwarm.ThinkNode_ConditionalNotProducedByMechCarrier">
<subNodes>
<li Class="JobGiver_FleeForDistance">
<enemyDistToFleeRange>2.9~7.9</enemyDistToFleeRange>
<fleeDistRange>13.5~20</fleeDistRange>
</li>
<!-- React to close melee threat -->
<li Class="JobGiver_ReactToCloseMeleeThreat">
<maxDistance>2.9</maxDistance>
</li>
<!-- Fire spikes at distant enemies -->
<li Class="JobGiver_AIAbilityFight">
<targetAcquireRadius>65</targetAcquireRadius>
<targetKeepRadius>72</targetKeepRadius>
<skipIfCantTargetNow>true</skipIfCantTargetNow>
<ability>ARA_Locust_Needle_Fire</ability>
<allowTurrets>true</allowTurrets>
<needLOSToAcquireNonPawnTargets>true</needLOSToAcquireNonPawnTargets>
</li>
<li Class="JobGiver_AITrashColonyClose" />
<li Class="JobGiver_AITrashBuildingsDistant" />
<li Class="JobGiver_AIGotoNearestHostile" />
<li Class="JobGiver_AITrashBuildingsDistant">
<attackAllInert>true</attackAllInert>
</li>
<li Class="JobGiver_WanderAnywhere" />
</subNodes>
</li>
</subNodes>
</li>
<!-- 特殊处理——如果生产者被征召会跟随pawn -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ArachnaeSwarm.ThinkNode_ConditionalShouldFollowProducer">
<subNodes>
<!-- <li Class="ArachnaeSwarm.JobGiver_AIDefendProducer">
<attackMeleeThreatEvenIfNotHostile>true</attackMeleeThreatEvenIfNotHostile>
<defendRadius>100</defendRadius>
</li> -->
<!-- Keep distance -->
<li Class="JobGiver_FleeForDistance">
<enemyDistToFleeRange>2.9~7.9</enemyDistToFleeRange>
<fleeDistRange>13.5~20</fleeDistRange>
</li>
<!-- React to close melee threat -->
<li Class="JobGiver_ReactToCloseMeleeThreat">
<maxDistance>2.9</maxDistance>
</li>
<!-- Fire spikes at distant enemies -->
<li Class="JobGiver_AIAbilityFight">
<targetAcquireRadius>65</targetAcquireRadius>
<targetKeepRadius>72</targetKeepRadius>
<skipIfCantTargetNow>true</skipIfCantTargetNow>
<ability>ARA_Locust_Needle_Fire</ability>
<allowTurrets>true</allowTurrets>
<needLOSToAcquireNonPawnTargets>true</needLOSToAcquireNonPawnTargets>
</li>
<li Class="ArachnaeSwarm.JobGiver_AIFollowProducer"/>
<li Class="ArachnaeSwarm.JobGiver_WanderNearProducer"/>
</subNodes>
</li>
<!-- Take care of critical needs (below rescue - so heroic!)-->
<li Class="ThinkNode_Tagger">
<tagToGive>RestingForMedicalReasons</tagToGive>
<subNodes>
<li Class="JobGiver_PatientGoToBed"/>
</subNodes>
</li>
<li Class="JobGiver_SeekAllowedArea"/>
<li Class="JobGiver_SeekSafeTemperature"/>
</subNodes>
</li>
<!-- Satisfy basic needs -->
<li Class="ThinkNode_Subtree">
<treeDef>SatisfyBasicNeeds</treeDef>
</li>
<!-- Tame animal: wander near colony if possible -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<!-- Wander near your current position if in hostile map -->
<li Class="ThinkNode_ConditionalAnyEnemyInHostileMap">
<subNodes>
<li Class="JobGiver_WanderAnywhere">
<maxDanger>None</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
</li>
</subNodes>
</li>
<li Class="ThinkNode_ConditionalRoamer">
<subNodes>
<li Class="JobGiver_WanderInRoofedCellsInPen">
<maxDanger>None</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
<expiryInterval>1200</expiryInterval>
</li>
<!-- tame roamers should not wander too far, and if unenclosed wander near a suitable pen marker 10% of the time -->
<li Class="ThinkNode_ConditionalRandom">
<chance>0.1</chance>
<subNodes>
<li Class="JobGiver_WanderInPen">
<maxDanger>None</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
<expiryInterval>1200</expiryInterval>
</li>
</subNodes>
</li>
<li Class="JobGiver_WanderAnywhere">
<maxDanger>None</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
</li>
</subNodes>
</li>
<!-- Wander near colony -->
<li Class="JobGiver_WanderColony">
<maxDanger>None</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Of neutral faction: rest and then exit the map -->
<li Class="ThinkNode_ConditionalNonPlayerNonHostileFaction">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>RestingForMedicalReasons</tagToGive>
<subNodes>
<li Class="JobGiver_PatientGoToBed" />
</subNodes>
</li>
<li Class="ThinkNode_Tagger">
<tagToGive>Misc</tagToGive>
<subNodes>
<li Class="JobGiver_ExitMapBest">
<defaultLocomotion>Walk</defaultLocomotion>
</li>
</subNodes>
</li>
</subNodes>
</li>
<!-- Wander -->
<li Class="ThinkNode_Tagger">
<tagToGive>Idle</tagToGive>
<subNodes>
<li Class="ThinkNode_ConditionalHerdAnimal">
<subNodes>
<li Class="JobGiver_WanderHerd">
<maxDanger>Deadly</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
</li>
</subNodes>
</li>
<li Class="JobGiver_WanderAnywhere">
<maxDanger>Deadly</maxDanger>
<ticksBetweenWandersRange>160~300</ticksBetweenWandersRange>
</li>
</subNodes>
</li>
<li Class="JobGiver_IdleError"/>
</subNodes>
</thinkRoot>
</ThinkTreeDef>
<ThinkTreeDef>
<defName>ARA_Humanlike</defName> <!-- 更改defName以避免与原版Humanlike冲突 -->

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,21 +1,41 @@
{
"Version": 1,
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"WorkspaceRootPath": "D:\\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\\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\\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\\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\\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\\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\\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\\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|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\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\\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|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\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\\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|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\ara_productionqueue\\hediffcomp_productionqueue.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\hediffs\\ara_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}"
}
],
@@ -26,19 +46,84 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"SelectedChildIndex": 2,
"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==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T04:01:20.292Z",
"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==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T04:01:18.535Z",
"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==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-23T03:49:32.234Z",
"EditorCaption": ""
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
"DocumentIndex": 0,
"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": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\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": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\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|",
@@ -47,42 +132,39 @@
},
{
"$type": "Document",
"DocumentIndex": 1,
"DocumentIndex": 6,
"Title": "CompProperties_PawnFlight.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_Flight\\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": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\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",
"EditorCaption": ""
"WhenOpened": "2026-01-22T14:02:45.434Z"
},
{
"$type": "Document",
"DocumentIndex": 3,
"DocumentIndex": 8,
"Title": "HediffComp_ProductionQueue.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\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": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\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",
"EditorCaption": ""
"WhenOpened": "2026-01-22T10:31:06.201Z"
},
{
"$type": "Document",
"DocumentIndex": 2,
"DocumentIndex": 7,
"Title": "HediffCompProperties_ProductionQueue.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_ProductionQueue\\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": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\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==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-22T09:30:17.721Z",
"EditorCaption": ""
"WhenOpened": "2026-01-22T09:30:17.721Z"
}
]
}

View File

@@ -34,6 +34,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Compile Include="Buildings\Building_CorpseVat\Building_CorpseVat.cs" />
<Compile Include="Buildings\Building_CorpseVat\CorpseVatExtension.cs" />
<Compile Include="Buildings\Building_CorpseVat\JobDriver_HaulCorpseToVat.cs" />
<Compile Include="Damage\DamageDefExtension_TerrainCover.cs" />
<Compile Include="Damage\DamageWorker_ExplosionWithTerrain.cs" />
<Compile Include="Hediffs\ARA_GestaltNode\CompGestalt.cs" />
@@ -311,6 +314,7 @@
<Compile Include="Jobs\JobDriver_FollowProducer\JobGiver_AIDefendProducer.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\JobGiver_AIFollowProducer.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\JobGiver_WanderNearProducer.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\ThinkNode_ConditionalNotProducedByMechCarrier.cs" />
<Compile Include="Jobs\JobDriver_FollowProducer\ThinkNode_ConditionalShouldFollowProducer.cs" />
<Compile Include="Jobs\JobDriver_Refuel_Nutrition.cs" />
<Compile Include="Jobs\JobDriver_StripChitin\CompProperties_ChitinStripping.cs" />

View File

@@ -0,0 +1,45 @@
using System;
using RimWorld;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
/// <summary>
/// 尸体保存建筑的扩展定义
/// </summary>
public class CorpseVatExtension : DefModExtension
{
// ===== 贴图配置 =====
public string topGraphicPath; // 顶部贴图路径
public Type graphicClass = typeof(Graphic_Multi); // 贴图类
// ===== 尸体绘制配置 =====
public Vector3 corpseDrawOffset = Vector3.zero; // 尸体绘制偏移
public float corpseDrawRotation = 0f; // 尸体绘制旋转
public float corpseDrawScale = 1f; // 尸体绘制缩放
public bool drawPreservationEffect = true; // 是否绘制保存效果
// ===== 功能配置 =====
public bool requiresPower = true; // 是否需要电源
public float slowDecayRate = 0.1f; // 腐烂减缓率0-10=完全停止腐烂1=正常腐烂)
// ===== 音效配置 =====
public SoundDef insertSound; // 放入音效
public SoundDef ejectSound; // 弹出音效
public string GetConfigSummary()
{
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}");
sb.AppendLine($"绘制旋转: {corpseDrawRotation}");
sb.AppendLine($"绘制缩放: {corpseDrawScale}");
return sb.ToString();
}
}
}

View File

@@ -1,22 +0,0 @@
using Verse;
namespace ArachnaeSwarm
{
public class DefModExtension_CorpseContainer : DefModExtension
{
// 最大容量
public int maxCapacity = 1;
// 是否允许存储非人类尸体
public bool allowNonHumanCorpses = true;
// 是否允许存储腐烂的尸体
public bool allowRottingCorpses = true;
// 是否自动保鲜(防止腐烂)
public bool preserveCorpses = false;
// 自定义存储效果描述
public string storageEffectDescriptionKey;
}
}

View File

@@ -1,64 +0,0 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class JobDriver_HaulCorpseToContainer : JobDriver
{
private const TargetIndex CorpseIndex = TargetIndex.A;
private const TargetIndex ContainerIndex = TargetIndex.B;
private const TargetIndex StoreCellIndex = TargetIndex.C;
private Corpse Corpse => (Corpse)job.GetTarget(CorpseIndex).Thing;
private Building_CorpseContainer Container => (Building_CorpseContainer)job.GetTarget(ContainerIndex).Thing;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(Corpse, job, 1, -1, null, errorOnFailed) &&
pawn.Reserve(Container, job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
// 验证目标
this.FailOnDestroyedOrNull(CorpseIndex);
this.FailOnDestroyedOrNull(ContainerIndex);
this.FailOnForbidden(CorpseIndex);
this.FailOnForbidden(ContainerIndex);
// 前往尸体
yield return Toils_Goto.GotoThing(CorpseIndex, PathEndMode.Touch)
.FailOnSomeonePhysicallyInteracting(CorpseIndex);
// 捡起尸体
yield return Toils_Haul.StartCarryThing(CorpseIndex);
// 前往容器
yield return Toils_Goto.GotoThing(ContainerIndex, PathEndMode.InteractionCell);
// 存储尸体到容器
Toil storeToil = new Toil();
storeToil.initAction = delegate
{
if (pawn.carryTracker.CarriedThing is Corpse carriedCorpse)
{
AcceptanceReport report = Container.TryAcceptCorpse(carriedCorpse);
if (report.Accepted)
{
// 尸体已成功存储,清空搬运
pawn.carryTracker.innerContainer.Clear();
}
else
{
// 存储失败,结束工作
EndJobWith(JobCondition.Incompletable);
}
}
};
storeToil.defaultCompleteMode = ToilCompleteMode.Instant;
yield return storeToil;
}
}
}

View File

@@ -0,0 +1,73 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
/// <summary>
/// 自定义的搬运尸体工作驱动
/// </summary>
public class JobDriver_HaulCorpseToVat : JobDriver_HaulToContainer
{
protected override Toil CarryToContainerToil()
{
Toil toil = base.CarryToContainerToil();
// 添加自定义行为
toil.AddPreTickAction(() =>
{
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);
}
}
});
return toil;
}
protected override Toil FindCarryToCellToil()
{
Toil toil = base.FindCarryToCellToil();
// 添加额外条件检查
toil.AddFailCondition(() =>
{
Corpse corpse = TargetThingA as Corpse;
Building_CorpseVat vat = TargetThingB as Building_CorpseVat;
if (corpse == null || corpse.Destroyed || vat == null || vat.Destroyed)
{
return true;
}
// 检查尸体是否仍然可以被接受
AcceptanceReport report = vat.CanAcceptCorpse(corpse);
return !report.Accepted;
});
return toil;
}
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
// 为尸体和建筑预留
if (!pawn.Reserve(TargetA, job, 1, -1, null, errorOnFailed))
{
return false;
}
if (!pawn.Reserve(TargetB, job, 1, -1, null, errorOnFailed))
{
return false;
}
return true;
}
}
}

View File

@@ -0,0 +1,94 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
/// <summary>
/// 反向条件节点:如果单位不是由生产者生产的,则进入此节点
/// 与ThinkNode_ConditionalShouldFollowProducer逻辑相反
/// </summary>
public class ThinkNode_ConditionalNotProducedByMechCarrier : ThinkNode_Conditional
{
// 可选:是否检查生产者是否存活
private bool checkProducerAlive = true;
// 可选:是否检查生产者是否在同一地图
private bool checkSameMap = true;
// 可选:是否检查生产者是否可到达
private bool checkReachable = true;
// 可选是否检查生产者类型pawn必须征召才跟随
private bool checkProducerTypeConditions = true;
// 可选额外条件类可以通过XML添加额外条件
public string extraConditionClass;
public ThinkNode_ConditionalNotProducedByMechCarrier()
{
}
protected override bool Satisfied(Pawn pawn)
{
// 基础检查如果不是生产者生产的返回true
bool isProduced = IsProducedByMechCarrier(pawn);
// 如果是生产者生产的,再检查其他条件
if (isProduced)
{
return false; // 是生产者生产的,不满足条件
}
// 不是生产者生产的,满足条件
return true;
}
/// <summary>
/// 检查pawn是否由生产者生产
/// </summary>
private bool IsProducedByMechCarrier(Pawn pawn)
{
if (!pawn.Spawned)
return false;
// 检查是否有生产者Comp
CompProducedByMechCarrier producerComp = pawn.TryGetComp<CompProducedByMechCarrier>();
if (producerComp == null || !producerComp.HasValidProducer)
return false;
Thing producer = producerComp.Producer;
if (producer == null || producer.Destroyed)
return false;
// 检查生产者是否在同一地图
if (checkSameMap && producer.Map != pawn.Map)
return false;
// 检查是否可以到达生产者
if (checkReachable && !pawn.CanReach(producer, PathEndMode.OnCell, Danger.Deadly))
return false;
// 根据生产者类型检查特定条件
if (checkProducerTypeConditions && producer is Pawn pawnProducer)
{
// 如果生产者是pawn则只在征召状态下才跟随
// 这是为了模拟原版动物跟随主人的逻辑
if (checkProducerAlive && (pawnProducer.Dead || pawnProducer.Downed))
return false;
// 只有在征召状态下才认为需要跟随
if (!pawnProducer.Drafted)
return false;
}
else if (checkProducerTypeConditions && producer is Building buildingProducer)
{
// 如果生产者是建筑默认返回true
// 可以根据需要添加其他条件
return true;
}
return true;
}
}
}