32 Commits

Author SHA1 Message Date
ProjectKoi-Kalo\Kalo
b9e6d6ca8b 虫洞 2025-09-21 16:48:23 +08:00
ProjectKoi-Kalo\Kalo
a27f7a8289 暂存 2025-09-21 16:28:11 +08:00
ProjectKoi-Kalo\Kalo
d5d986e62a 暂存 2025-09-21 16:17:08 +08:00
ProjectKoi-Kalo\Kalo
4fb30a03aa 暂存 2025-09-21 15:21:22 +08:00
ProjectKoi-Kalo\Kalo
5d2d2c5e4d 暂存 2025-09-21 15:15:41 +08:00
ProjectKoi-Kalo\Kalo
182cb72cb0 暂存 2025-09-21 14:54:33 +08:00
ProjectKoi-Kalo\Kalo
6000bb58f6 虫洞1 2025-09-21 14:20:33 +08:00
Tourswen
ec4a6631fd 大量更新 2025-09-21 02:08:51 +08:00
Tourswen
534cb901d4 画了一堆 2025-09-20 17:17:01 +08:00
Tourswen
feba171a2c 改动一大堆 2025-09-20 12:00:15 +08:00
Tourswen
5b231de977 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-20 00:28:48 +08:00
Tourswen
fb5fd2b28c 脑虫pawn画了一半 2025-09-20 00:28:39 +08:00
ProjectKoi-Kalo\Kalo
5bd9197d0a 再修动物 2025-09-19 20:35:47 +08:00
ProjectKoi-Kalo\Kalo
5f63216c5d 虫可以次蜜晶糕 2025-09-19 20:28:21 +08:00
ProjectKoi-Kalo\Kalo
a2c81a86ad 暂存改动物吃营养膏 2025-09-19 20:24:07 +08:00
ProjectKoi-Kalo\Kalo
2a6343097d 存营养膏 2025-09-19 20:06:29 +08:00
ProjectKoi-Kalo\Kalo
0b6ae6c398 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-19 20:02:00 +08:00
ProjectKoi-Kalo\Kalo
4fdfad7021 暂存 2025-09-19 20:01:32 +08:00
Tourswen
377cc3d7ce 营养管 2025-09-19 19:15:45 +08:00
Tourswen
9f6208ebe4 2025-09-19 17:29:04 +08:00
Tourswen
29d5232ff2 开关自动生产,恐吓非虫族殖民者机制 2025-09-19 15:10:45 +08:00
Tourswen
b5fe07e968 讲述者 2025-09-19 12:12:54 +08:00
Tourswen
4e5901a94e 脑虫 2025-09-19 00:53:32 +08:00
Tourswen
15a44726d5 脑虫的立绘 2025-09-18 22:57:24 +08:00
Tourswen
fdee401817 我去,虫批 2025-09-18 17:27:10 +08:00
Tourswen
ca2fba145a 这是什么地方 2025-09-18 12:36:40 +08:00
Tourswen
cfbb810aad 我们啥比也是要更新mod的 2025-09-18 12:00:49 +08:00
Tourswen
662d20a27a Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-17 23:59:49 +08:00
Tourswen
969fc15f65 Update 脑虫.sai2 2025-09-17 23:59:38 +08:00
ProjectKoi-Kalo\Kalo
c3a2f33f26 修脑虫没序列化存档丢人 2025-09-17 18:35:28 +08:00
ProjectKoi-Kalo\Kalo
fe6f2ad563 改虫蜜填槽位 2025-09-17 18:27:42 +08:00
Tourswen
690de72ae8 科技补充 2025-09-17 17:29:23 +08:00
118 changed files with 5209 additions and 918 deletions

Binary file not shown.

View File

@@ -31,6 +31,62 @@
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_RaceBaseSwarmProduceOn</defName>
<label>取消繁育抑制</label>
<description>重启该阿拉克涅督虫自动抚育辅虫的能力。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_RaceBaseSwarmProduceOn</iconPath>
<cooldownTicksRange>601</cooldownTicksRange>
<hostile>false</hostile>
<showOnCharacterCard>true</showOnCharacterCard>
<aiCanUse>false</aiCanUse>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>0</warmupTime>
<drawAimPie>false</drawAimPie>
<requireLineOfSight>false</requireLineOfSight>
<targetable>false</targetable>
<targetParams>
<canTargetSelf>true</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<!-- 这是正确的用法 -->
<li Class="RimWorld.CompProperties_AbilityRemoveHediff">
<compClass>ArachnaeSwarm.CompAbilityEffect_RemoveSwitchHediff</compClass>
<hediffDef>ARA_RaceBaseSwarmProduceSwitchHediff</hediffDef>
<applyToSelf>true</applyToSelf>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_RaceBaseSwarmProduceOff</defName>
<label>繁育抑制</label>
<description>关闭该阿拉克涅督虫自动抚育辅虫的能力。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_RaceBaseSwarmProduceOff</iconPath>
<cooldownTicksRange>601</cooldownTicksRange>
<hostile>false</hostile>
<showOnCharacterCard>true</showOnCharacterCard>
<aiCanUse>false</aiCanUse>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>0</warmupTime>
<drawAimPie>false</drawAimPie>
<requireLineOfSight>false</requireLineOfSight>
<targetable>false</targetable>
<targetParams>
<canTargetSelf>true</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="RimWorld.CompProperties_AbilityGiveHediff">
<compClass>ArachnaeSwarm.CompAbilityEffect_GiveSwitchHediff</compClass>
<hediffDef>ARA_RaceBaseSwarmProduceSwitchHediff</hediffDef>
<applyToSelf>true</applyToSelf>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_TrapSpew</defName>
<label>酸爆茧投射</label>
@@ -75,7 +131,7 @@
<defName>ARA_TumorSpew</defName>
<label>菌瘤释放</label>
<description>排出一枚菌瘤,将附近的大片地区转变为菌毯地形,以方便虫群进行活动,并阻碍敌军的前进。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_TumorSpew</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
@@ -203,7 +259,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_6VXI</requiredResearch>
<failMessage>需要科技 基因节点VXI-6"酸囊" 以解锁技能</failMessage>
<failMessage>需要科技 节点VXI-6"酸囊" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
@@ -277,7 +333,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_6VXI</requiredResearch>
<failMessage>需要科技 基因节点VXI-6"酸囊" 以解锁技能</failMessage>
<failMessage>需要科技 节点VXI-6"酸囊" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
@@ -289,7 +345,7 @@
<writeCombatLog>True</writeCombatLog>
<showPsycastEffects>False</showPsycastEffects>
<cooldownTicksRange>6000</cooldownTicksRange>
<iconPath>UI/Abilities/AcidSpray</iconPath>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath>
<verbProperties>
<verbClass>Verb_AbilityShoot</verbClass>
<defaultProjectile>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defaultProjectile>
@@ -318,7 +374,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
<failMessage>需要科技 基因节点PAV-5"毒刺" 以解锁技能</failMessage>
<failMessage>需要科技 节点PAV-5"毒刺" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
@@ -410,11 +466,11 @@
</li>
</comps>
</AbilityDef>
<AbilityDef Name="LongJump">
<AbilityDef>
<defName>ARA_Skyraider_jump</defName>
<label>高空机动</label>
<description>使用强壮的翅膀瞬间加力,以重定位至一处新的地点。</description>
<iconPath>UI/Abilities/Longjump</iconPath>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Skyraider_jump</iconPath> <!-- Placeholder Icon -->
<cooldownTicksRange>5000</cooldownTicksRange>
<hostile>false</hostile>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
@@ -489,7 +545,7 @@
<AbilityDef>
<defName>ARA_Ability_Smokepop</defName>
<label>信息素浓雾释放</label>
<description>浓雾种其腹部的大量释放阿拉克涅信息素烟雾,形成一大片以遮蔽虫族身形的烟雾,并防止敌方使用火焰武器点燃虫族集群。这些信息素会吸引附近的阿拉克涅辅虫破土而出支援虫群,沾染信息素的目标越多(无论敌我),前来支援的虫族就越多。</description>
<description>浓雾种使用其腹部释放大量阿拉克涅信息素烟雾,形成一大片以遮蔽虫族身形和阻燃的烟雾。这些信息素会吸引附近的阿拉克涅辅虫破土而出支援虫群,沾染信息素的目标越多(无论敌我),前来支援的虫族就越多。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_Smokepop</iconPath>
<cooldownTicksRange>6000</cooldownTicksRange>
<targetRequired>false</targetRequired>
@@ -537,10 +593,10 @@
<AbilityDef>
<defName>ARA_Ability_TrackingCharge</defName>
<label>蛮力冲撞</label>
<description>阿拉克涅盾头种对目标发起蓄势冲撞,对路径上的一切造成伤害。在冲击中途经的距离越远,伤害越高。</description>
<description>对目标发起蓄势冲撞,对路径上的一切造成伤害。在冲击中途经的距离越远,伤害越高。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_TrackingCharge</iconPath> <!-- Placeholder Icon -->
<cooldownTicksRange>6000</cooldownTicksRange>
<charges>3</charges>
<charges>2</charges>
<cooldownPerCharge>true</cooldownPerCharge>
<verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
@@ -552,7 +608,7 @@
<canTargetMechs>true</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
</targetParams>
<range>30</range>
<range>18</range>
<warmupTime>1.0</warmupTime>
</verbProperties>
<comps>
@@ -573,7 +629,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_1VTE</requiredResearch>
<failMessage>需要科技 基因节点VTE-1"爆发激素" 以解锁技能</failMessage>
<failMessage>需要科技 节点VTE-1"爆发激素" 以解锁技能</failMessage>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
@@ -590,4 +646,134 @@
<heightFactor>0</heightFactor>
</pawnFlyer>
</ThingDef>
<AbilityDef>
<defName>ARA_PsychicBrainburn</defName>
<label>心灵烧灼</label>
<description>以强大的纯净灵能冲击目标,烧毁目标的中枢神经系统——这会直接杀死目标。</description>
<abilityClass>Psycast</abilityClass>
<category>Psychic</category>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_PsychicBrainburn</iconPath>
<cooldownTicksRange>18000</cooldownTicksRange>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>
<showPsycastEffects>true</showPsycastEffects>
<sendMessageOnCooldownComplete>true</sendMessageOnCooldownComplete>
<stunTargetWhileCasting>true</stunTargetWhileCasting>
<moteOffsetAmountTowardsTarget>0.5</moteOffsetAmountTowardsTarget>
<warmupMote>Mote_HoraxSmallSpellWarmup</warmupMote>
<warmupEffecter>HoraxianAbilityCasting</warmupEffecter>
<warmupSound>AnomalyAbilityWarmup</warmupSound>
<writeCombatLog>true</writeCombatLog>
<statBases>
<Ability_EntropyGain>75</Ability_EntropyGain>
<Ability_PsyfocusCost>-1</Ability_PsyfocusCost>
<Ability_Duration>0</Ability_Duration>
</statBases>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>6</warmupTime>
<range>18</range>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetSelf>false</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_PsychicBrainburn">
<psychic>True</psychic>
<!-- 视觉效果 -->
<effecterDef>Skip_Entry</effecterDef>
<!-- 设为 true 则只能对血肉生物使用。设为 false 则也可以对机械体使用。 -->
<requiresFlesh>false</requiresFlesh>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_NeuroSwarm_jump</defName>
<label>高空机动</label>
<description>增强用于使身体悬浮的力量快速进入较高的高度,然后飞到一处新的地点。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Skyraider_jump</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange>
<hostile>false</hostile>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<charges>1</charges>
<cooldownPerCharge>true</cooldownPerCharge>
<verbProperties>
<verbClass>Verb_CastAbilityJump</verbClass>
<label>jump</label>
<violent>false</violent>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>0</warmupTime>
<range>50</range>
<requireLineOfSight>true</requireLineOfSight>
<soundCast>Longjump_Jump</soundCast>
<soundLanding>Longjump_Land</soundLanding>
<targetParams>
<canTargetLocations>true</canTargetLocations>
<canTargetPawns>false</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
</targetParams>
</verbProperties>
<jobDef>CastJump</jobDef>
</AbilityDef>
<AbilityDef>
<defName>ARA_MimicNematode_Needle_Fire</defName>
<label>拟线种寄生针</label>
<description>向目标喷射若干伤害较低但是会引发阿拉克涅拟线种寄生的囊针,随着感染的推进,目标将逐渐被拟线种控制,逐渐无视外部刺激以获得强大的抗击打能力。\n\n这是一种危险的交易拟线种无法被女皇种控制聪明的虫巢在使用拟线种的力量前都需要思虑再三。</description>
<writeCombatLog>True</writeCombatLog>
<showPsycastEffects>False</showPsycastEffects>
<cooldownTicksRange>6000</cooldownTicksRange>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>
<verbProperties>
<verbClass>Verb_AbilityShoot</verbClass>
<defaultProjectile>Bullet_ARA_MimicNematode_Needle</defaultProjectile>
<range>5</range>
<soundCast>Heatspikes_Shot</soundCast>
<soundCastTail>Heatspikes_Tail</soundCastTail>
<muzzleFlashScale>9</muzzleFlashScale>
<ticksBetweenBurstShots>2</ticksBetweenBurstShots>
<warmupTime>0</warmupTime>
<burstShotCount>32</burstShotCount>
<accuracyTouch>1</accuracyTouch>
<accuracyShort>1</accuracyShort>
<accuracyMedium>1</accuracyMedium>
<accuracyLong>1</accuracyLong>
<ai_IsWeapon>false</ai_IsWeapon>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>0.1</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
<!-- <li Class="ArachnaeSwarm.CompProperties_AbilityBodyPartCheck">
<requiredPart>ARA_Toxic_Needle</requiredPart>
<failMessage>毒针腺受损或缺失,无法发射毒针</failMessage>
</li> -->
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_2MED</requiredResearch>
<failMessage>需要科技 节点MED-2"拟线寄生" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_MimicNematode_Needle</defName>
<label>拟线种寄生针</label>
<graphicData>
<texPath>Things/Projectile/Bullet_Small</texPath>
<graphicClass>Graphic_Single</graphicClass>
<color>(117, 204, 49, 180)</color>
</graphicData>
<projectile>
<damageDef>ARA_MimicNematodeBite</damageDef>
<damageAmountBase>1</damageAmountBase>
<speed>40</speed>
</projectile>
</ThingDef>
</Defs>

View File

@@ -130,4 +130,94 @@
</li>
</comps>
</AbilityDef>
<!-- T2 -->
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew_2Stage</defName>
<label>生育虫卵——等级2</label>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。\n\n该虫卵只能孵化小型虫族。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_EggSpew_2Stage</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac_2Stage</projectileDef>
</li>
</comps>
</AbilityDef>
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew_Huge_2Stage</defName>
<label>生育大型虫卵——等级2</label>
<description>从卵巢中排出一颗休眠的大型虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。\n\n该虫卵只能孵化大型虫族。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_EggSpew_Huge_2Stage</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac_Huge_2Stage</projectileDef>
</li>
</comps>
</AbilityDef>
<!-- T0 -->
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Cloth</defName>
<label>织物孵化茧</label>
<description>投放一枚织物茧,内含可以孵化一套基础织物的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Cocoon_Cloth</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Proj_Cloth</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_4DIL</requiredResearch>
<failMessage>需要科技 节点DIL-4"编织" 以解锁此孵化路径</failMessage>
</li>
</comps>
</AbilityDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Weapon</defName>
<label>武装器官孵化茧</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Cocoon_Weapon</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Proj_Weapon</projectileDef>
</li>
</comps>
</AbilityDef>
<!-- T1 -->
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Cloth_1Stage</defName>
<label>织物孵化茧——等级1</label>
<description>投放一枚织物茧,内含可以孵化一套基础织物的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Cocoon_Cloth_1Stage</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Proj_Cloth</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_4DIL</requiredResearch>
<failMessage>需要科技 节点DIL-4"编织" 以解锁此孵化路径</failMessage>
</li>
</comps>
</AbilityDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Weapon_1Stage</defName>
<label>武装器官孵化茧——等级1</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Cocoon_Weapon_1Stage</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Proj_Weapon_1Stage</projectileDef>
</li>
</comps>
</AbilityDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Medicine</defName>
<label>织物医药茧</label>
<description>投放一枚医药茧,内含可以孵化一组医疗用品或化学品的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Cocoon_Medicine</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Proj_Medicine</projectileDef>
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<AbilityDef>
<defName>ARA_PsychicBrainburn</defName>
<label>心灵烧灼</label>
<description>通过一次强力的心灵冲击,直接摧毁目标生物的意识核心,使其永久失去知觉。</description>
<iconPath>UI/Abilities/Slaughter</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<showPsycastEffects>false</showPsycastEffects>
<sendMessageOnCooldownComplete>true</sendMessageOnCooldownComplete>
<stunTargetWhileCasting>true</stunTargetWhileCasting>
<moteOffsetAmountTowardsTarget>0.5</moteOffsetAmountTowardsTarget>
<warmupMote>Mote_HoraxSmallSpellWarmup</warmupMote>
<warmupEffecter>HoraxianAbilityCasting</warmupEffecter>
<warmupSound>AnomalyAbilityWarmup</warmupSound>
<writeCombatLog>true</writeCombatLog>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>1.5</warmupTime>
<range>25</range>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetSelf>false</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_PsychicBrainburn">
<!-- 视觉效果 -->
<effecterDef>Skip_Entry</effecterDef>
<!-- 设为 true 则只能对血肉生物使用。设为 false 则也可以对机械体使用。 -->
<requiresFlesh>false</requiresFlesh>
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- 变形技能的定义 -->
<AbilityDef>
<defName>ARA_Ability_Morph</defName>
<label>织域形态</label>
<description>将自己转换为一个坚固的静态建筑形态,或从建筑形态恢复。</description>
<iconPath>UI/Commands/EggSpew</iconPath> <!-- TODO: 替换为你的图标路径 -->
<iconPath>UI/Commands/EggSpew</iconPath>
<cooldownTicksRange>6000</cooldownTicksRange>
<hotKey>Misc12</hotKey>
<targetRequired>false</targetRequired>
@@ -30,81 +29,5 @@
</comps>
</AbilityDef>
<ThingDef ParentName="BuildingBase">
<defName>ARA_MorphableResearchBench</defName>
<hasInteractionCell>true</hasInteractionCell>
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
<label>阿拉克涅织域织座</label>
<description>一个供阿拉克涅虫族进行研究的活体结构,可以让虫群尽情地探索变异和进化方向。其研究能力完全取决于内部的阿拉克涅织域种。</description>
<thingClass>ArachnaeSwarm.Building_Morphable</thingClass>
<tickerType>Normal</tickerType>
<size>(3,3)</size>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_ResearchBench</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(3,4.5)</drawSize>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<castEdgeShadows>false</castEdgeShadows>
<fillPercent>0.8</fillPercent>
<staticSunShadowHeight>0</staticSunShadowHeight>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<statBases>
<MaxHitPoints>1000</MaxHitPoints>
<WorkToBuild>2800</WorkToBuild>
<Flammability>1.0</Flammability>
<ResearchSpeedFactor>1.0</ResearchSpeedFactor>
</statBases>
<uiOrder>2600</uiOrder>
<surfaceType>Item</surfaceType>
<building>
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
<deconstructible>false</deconstructible>
</building>
<!-- 不可建造,只能通过变形生成 -->
<comps Inherit="False">
<li Class="CompProperties_ReportWorkSpeed">
<workSpeedStat>ResearchSpeedFactor</workSpeedStat>
</li>
<li Class="ArachnaeSwarm.CompProperties_Morphable">
<!-- 休息速度增益例如1.0代表200%的速度 -->
<restGainMultiplier>1.0</restGainMultiplier>
<!-- 操作按钮的自定义标签 -->
<gizmoLabel>离开织座</gizmoLabel>
<!-- 操作按钮的自定义描述 -->
<gizmoDesc>使织域种离开织座。</gizmoDesc>
<!--
操作按钮的自定义图标路径。
路径相对于"Textures"文件夹。
例如,如果你的图标在 "YourMod/Textures/UI/Icons/Revert.png",路径就是 "UI/Icons/Revert"。
游戏会自动处理.png扩展名。
-->
<gizmoIconPath>UI/Commands/EggSpew</gizmoIconPath>
</li>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
</fuelFilter>
<fuelCapacity>2.0</fuelCapacity>
<targetFuelLevelConfigurable>false</targetFuelLevelConfigurable>
<fuelGizmoLabel>营养</fuelGizmoLabel>
<outOfFuelMessage>没有营养</outOfFuelMessage>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- 翅膀飞行 -->
<AnimationDef>
<defName>ARA_FlyEast</defName>
<durationTicks>60</durationTicks>
@@ -30,7 +31,6 @@
</li>
</keyframeParts>
</AnimationDef>
<AnimationDef>
<defName>ARA_FlyNorth</defName>
<durationTicks>60</durationTicks>
@@ -61,7 +61,6 @@
</li>
</keyframeParts>
</AnimationDef>
<AnimationDef>
<defName>ARA_FlySouth</defName>
<durationTicks>60</durationTicks>
@@ -92,4 +91,75 @@
</li>
</keyframeParts>
</AnimationDef>
<!-- 灵能飞行 -->
<AnimationDef>
<defName>ARA_Psi_FlyEast</defName>
<durationTicks>60</durationTicks>
<keyframeParts>
<!-- <li>
<key>ARA_Flight_Attachment</key>
<value>
<keyframes>
<li><graphicState>ARA_FlyEast_0</graphicState><tick>6</tick></li>
<li><graphicState>ARA_FlyEast_1</graphicState><tick>12</tick></li>
</keyframes>
</value>
</li> -->
<li>
<key>Root</key>
<value><workerType>AnimationWorker_Keyframes</workerType><keyframes>
<li><tick>0</tick><offset>(0,0,-0.05)</offset></li>
<li><tick>30</tick><offset>(0,0,0.05)</offset></li>
<li><tick>60</tick><offset>(0,0,-0.05)</offset></li>
</keyframes></value>
</li>
</keyframeParts>
</AnimationDef>
<AnimationDef>
<defName>ARA_Psi_FlyNorth</defName>
<durationTicks>60</durationTicks>
<keyframeParts>
<!-- <li>
<key>ARA_Flight_Attachment</key>
<value>
<keyframes>
<li><graphicState>ARA_FlyNorth_0</graphicState><tick>6</tick></li>
<li><graphicState>ARA_FlyNorth_1</graphicState><tick>12</tick></li>
</keyframes>
</value>
</li> -->
<li>
<key>Root</key>
<value><workerType>AnimationWorker_Keyframes</workerType><keyframes>
<li><tick>0</tick><offset>(0,0,-0.05)</offset></li>
<li><tick>30</tick><offset>(0,0,0.05)</offset></li>
<li><tick>60</tick><offset>(0,0,-0.05)</offset></li>
</keyframes></value>
</li>
</keyframeParts>
</AnimationDef>
<AnimationDef>
<defName>ARA_Psi_FlySouth</defName>
<durationTicks>60</durationTicks>
<keyframeParts>
<!-- <li>
<key>ARA_Flight_Attachment</key>
<value>
<keyframes>
<li><graphicState>ARA_FlySouth_0</graphicState><tick>6</tick></li>
<li><graphicState>ARA_FlySouth_1</graphicState><tick>12</tick></li>
</keyframes>
</value>
</li> -->
<li>
<key>Root</key>
<value><workerType>AnimationWorker_Keyframes</workerType><keyframes>
<li><tick>0</tick><offset>(0,0,-0.05)</offset></li>
<li><tick>30</tick><offset>(0,0,0.05)</offset></li>
<li><tick>60</tick><offset>(0,0,-0.05)</offset></li>
</keyframes></value>
</li>
</keyframeParts>
</AnimationDef>
</Defs>

View File

@@ -2,6 +2,12 @@
<Defs>
<AlienRace.AlienBackstoryDef Name="ARA_BaseBackStory" Abstract="True">
<requiresSpawnCategory>true</requiresSpawnCategory>
<forcedTraitsChance>
<li>
<defName Degree="0">ARA_CreepyCrawly</defName>
<chance>100</chance>
</li>
</forcedTraitsChance>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
@@ -85,7 +91,7 @@
<li>Crafting</li>
<!-- <li>Cooking</li> -->
<li>Constructing</li>
<li>Caring</li>
<!-- <li>Caring</li> -->
<li>Social</li>
<li>Artistic</li>
<li>Intellectual</li>
@@ -204,7 +210,7 @@
<li>Crafting</li>
<li>Cooking</li>
<li>Constructing</li>
<!-- <li>Caring</li> -->
<li>Caring</li>
<li>Social</li>
<li>Artistic</li>
<li>Intellectual</li>
@@ -275,7 +281,6 @@
<li>ArachnaeNode_spawnCategories_Facehugger</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_NeuroSwarm</defName>
<title>阿拉克涅织域种</title>

View File

@@ -1068,6 +1068,15 @@
<li>ARA_Acid_sacs</li>
</groups>
</li>
<!-- 毒针腺 -->
<li>
<def>ARA_Toxic_Needle</def>
<coverage>0.005</coverage>
<depth>Inside</depth>
<groups>
<li>ARA_Toxic_Needles</li>
</groups>
</li>
</parts>
</li>
</parts>

View File

@@ -59,7 +59,7 @@
<additionalHediffs>
<li>
<hediff>ARA_MimicNematode</hediff>
<severityPerDamageDealt>0.001</severityPerDamageDealt>
<severityPerDamageDealt>0.05</severityPerDamageDealt>
</li>
</additionalHediffs>
</DamageDef>
@@ -90,4 +90,30 @@
</additionalHediffs>
</DamageDef>
<DamageDef ParentName="Wula_Dark_Matter_Beam_DMG">
<defName>ARA_Psi_Damage</defName>
<ignoreShields>true</ignoreShields>
<igniteChanceByTargetFlammability>
<points>
<li>(0, 0)</li>
<li>(1, 0.5)</li>
</points>
</igniteChanceByTargetFlammability>
<label>灵能闪电</label>
<ignoreShields>true</ignoreShields>
<workerClass>DamageWorker_AddInjury</workerClass>
<externalViolence>true</externalViolence>
<deathMessage>{0} 被灵能闪电烧死了。</deathMessage>
<harmAllLayersUntilOutside>true</harmAllLayersUntilOutside>
<impactSoundType>Bullet</impactSoundType>
<hediff>Burn</hediff>
<armorCategory>Heat</armorCategory>
<overkillPctToDestroyPart>0~0.7</overkillPctToDestroyPart>
<isRanged>true</isRanged>
<makesAnimalsFlee>false</makesAnimalsFlee>
<defaultDamage>20</defaultDamage>
<defaultArmorPenetration>1.5</defaultArmorPenetration>
<buildingDamageFactorImpassable>1</buildingDamageFactorImpassable>
<buildingDamageFactorPassable>1</buildingDamageFactorPassable>
</DamageDef>
</Defs>

View File

@@ -39,36 +39,30 @@
<defName>ARA_New_Hive_NamerFaction</defName>
<rulePack>
<rulesStrings>
<li>r_name->[msyl] [hivename]</li>
<li>r_name->[hivename1] [hivename2]</li>
<li>hivename1->猩红</li>
<li>hivename1->至高</li>
<li>hivename1->唯一</li>
<li>hivename1->蔓延</li>
<li>hivename1->永恒</li>
<li>hivename1->永续</li>
<li>hivename->虫巢</li>
<li>msyl->伊尔瓦巴</li>
<li>msyl->赞诺瓦</li>
<li>msyl->比丘</li>
<li>msyl->珀尔迪达</li>
<li>msyl->西萨力克</li>
<li>msyl->希莱克</li>
<li>msyl->切利斯</li>
<li>msyl->韦恩娜</li>
<li>msyl->卡索恩</li>
<li>msyl->卓尔克</li>
<li>msyl->叩科马</li>
<li>msyl->阿琳</li>
<li>msyl->杜布罗格那格</li>
<li>msyl->伊塔克</li>
<li>msyl->代德申科</li>
<li>msyl->鲍特罗</li>
<li>msyl->弗尔特维尔</li>
<li>msyl->捷库阿</li>
<li>msyl->克里斯特森</li>
<li>msyl->巴恩斯</li>
<li>msyl->伊瑞希尔</li>
<li>msyl->新瓷器</li>
<li>msyl->哈德斯</li>
<li>msyl->伊弗尔</li>
<li>msyl->阿切斯塔</li>
<li>msyl->欧德斯</li>
<li>msyl->伊拉戴尔夫</li>
<li>hivename2->核心</li>
<li>hivename2->内核</li>
<li>hivename2->要点</li>
<li>hivename2->中心</li>
<li>hivename2->焦点</li>
<li>hivename2->原点</li>
<li>hivename2->支点</li>
<li>hivename2->枢轴</li>
<li>hivename2->中枢</li>
<li>hivename2->母体</li>
<li>hivename2->源泉</li>
<li>hivename2->源地</li>
<li>hivename2->基体</li>
<li>hivename2->始祖</li>
<li>hivename2->主脑</li>
<li>hivename2->巢心</li>
</rulesStrings>
</rulePack>
</RulePackDef>

View File

@@ -1,18 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>ARA_TerrainBasedHediff</defName>
<label>菌毯刺激</label>
<description>根据所处地形而强化自身</description>
<defName>ARA_TerrainMoveSpeedHediff</defName>
<label>菌毯加成:移动速度</label>
<description>这只阿拉克捏督虫所着织物使其可以在菌毯上获得更高的移动速度。在菌毯上呆的越久,效果越强,离开菌毯后效果将逐渐衰减</description>
<hediffClass>HediffWithComps</hediffClass>
<maxSeverity>1.0</maxSeverity>
<minSeverity>-0.01</minSeverity>
<isBad>false</isBad>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_TerrainBasedSeverity">
<!-- 每60 ticks1秒检查一次 -->
<interval>60</interval>
<interval>180</interval>
<!-- 目标地形列表 -->
<terrainDefs>
@@ -22,10 +20,10 @@
</terrainDefs>
<!-- 站在目标地形上时,每次检查的严重性变化量 -->
<severityOnTerrain>0.0167</severityOnTerrain>
<severityOnTerrain>0.05</severityOnTerrain>
<!-- 不在目标地形上时,每次检查的严重性变化量 (负数表示减少) -->
<severityOffTerrain>-0.0083</severityOffTerrain>
<severityOffTerrain>-0.0249</severityOffTerrain>
</li>
<li Class="HediffCompProperties_RemoveIfApparelDropped" />
</comps>
@@ -36,26 +34,23 @@
<label></label>
</li>
<li>
<minSeverity>0.4</minSeverity>
<label>适应</label>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>0.1</offset>
</li>
</capMods>
<minSeverity>0.1</minSeverity>
<statOffsets>
<MoveSpeed>0.1</MoveSpeed>
</statOffsets>
</li>
<li>
<minSeverity>0.5</minSeverity>
<statOffsets>
<MoveSpeed>0.25</MoveSpeed>
</statOffsets>
</li>
<li>
<minSeverity>0.8</minSeverity>
<label>舒适</label>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>0.25</offset>
</li>
</capMods>
<statOffsets>
<MoveSpeed>0.5</MoveSpeed>
</statOffsets>
</li>
</stages>
</HediffDef>
</Defs>

View File

@@ -3,7 +3,7 @@
<HediffDef>
<defName>ARA_AcidCoverd</defName>
<label>阿拉克涅酸液</label>
<description>拥有酸囊的阿拉克涅虫族向此人喷射了强酸,沾染的液体将使得此人痛不欲生,盔甲和表皮软化,并持续灼烧它的身体。</description>
<description>拥有酸囊的阿拉克涅虫族向此人喷射了强酸,沾染的液体将使得此人痛不欲生,盔甲和表皮软化,并持续灼烧它的身体。</description>
<defaultLabelColor>(1, 1, 0.8)</defaultLabelColor>
<hediffClass>ArachnaeSwarm.HediffCurseFlame</hediffClass>
<comps>
@@ -196,6 +196,4 @@
<li Class="HediffCompProperties_DisappearsOnDeath"/>
</comps>
</HediffDef>
</Defs>

View File

@@ -9,17 +9,11 @@
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>100</maxSeverity>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindMaster">
<scanIntervalTicks>3200</scanIntervalTicks>
</li>
</comps>
<stages>
<li>
<label>连接至 {0} 个虫群工蜂</label>
<minSeverity>0</minSeverity>
<foodPoisoningChanceFactor>0</foodPoisoningChanceFactor>
<regeneration>500</regeneration>
<!-- Stat offsets will be added here later -->
<disablesNeeds>
<li>Joy</li>
@@ -33,8 +27,12 @@
</enablesNeeds>
</li>
</stages>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindMaster">
<scanIntervalTicks>3200</scanIntervalTicks>
</li>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_HiveMindDrone</defName>
<label>阿拉克涅督虫</label>
@@ -43,17 +41,6 @@
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindDrone">
<unlinkedDieDelayTicks>6400</unlinkedDieDelayTicks> <!-- Default to 30 seconds -->
</li>
<li Class="HediffCompProperties_MessageAfterTicks">
<ticks>1</ticks>
<letterLabel>{0_labelShort} 诞生</letterLabel>
<letterText>一只新的阿拉克涅督虫 {0_labelShort} 已经破茧而出!她正在四处徘徊,等待女皇种的指示——使用阿拉克涅女皇种的信息素标记技能完成链接,或者等待其自行建立链接。</letterText>
<letterType>HumanPregnancy</letterType>
</li>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
@@ -70,8 +57,18 @@
</disablesNeeds>
</li>
</stages>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindDrone">
<unlinkedDieDelayTicks>6400</unlinkedDieDelayTicks> <!-- Default to 30 seconds -->
</li>
<li Class="HediffCompProperties_MessageAfterTicks">
<ticks>1</ticks>
<letterLabel>{0_labelShort} 诞生</letterLabel>
<letterText>一只新的阿拉克涅督虫 {0_labelShort} 已经破茧而出!她正在四处徘徊,等待女皇种的指示——使用阿拉克涅女皇种的信息素标记技能完成链接,或者等待其自行建立链接。</letterText>
<letterType>HumanPregnancy</letterType>
</li>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_HiveMindWorker</defName>
<label>阿拉克涅辅虫</label>
@@ -92,4 +89,216 @@
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_HiveStrength</defName>
<label>虫群活力</label>
<description>这只阿拉克涅虫族的修复细胞与众不同,它能以非常快的速度自动治愈伤势,甚至是再生出一些已经损失的器官。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
<regeneration>100</regeneration>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_TemperatureRegulation</defName>
<label>冷血动物</label>
<description>阿拉克涅虫族是冷血动物,这代表着她们对外界的温度变化更加敏感——在适宜温度下她们将变得敏捷而致命,在不适温度下她们将难以行动。\n\n此类阿拉克涅虫族可以接受在16~26°C的温度下活动温度接近21°C时会获得额外的意识加成。</description>
<hediffClass>Hediff_High</hediffClass>
<defaultLabelColor>(0.6, 0.8, 0.9)</defaultLabelColor>
<maxSeverity>1.0</maxSeverity>
<minSeverity>0.01</minSeverity>
<initialSeverity>0.5</initialSeverity>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_Temperature">
<minComfortableTemperature>16</minComfortableTemperature>
<maxComfortableTemperature>26</maxComfortableTemperature>
<severityChangeIn>0.01</severityChangeIn>
<severityChangeOut>-0.01</severityChangeOut>
</li>
<li Class="ArachnaeSwarm.HediffCompProperties_GiveHediffsInRangeToRace">
<range>6</range>
<hediff>ARA_CreepyCrawly_Hediff</hediff>
<mote>Mote_ARA_CreepyCrawly_HediffLinkLine</mote>
<!-- 定义可以被影响的种族列表 -->
<!-- <targetRaces>
<li>Human</li>
</targetRaces> -->
<!-- 其他参数和原版一样 -->
<targetingParameters>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>false</canTargetAnimals>
<canTargetMechs>false</canTargetMechs>
<canTargetSelf>true</canTargetSelf>
<onlyTargetColonists>true</onlyTargetColonists>
</targetingParameters>
<onlyPawnsInSameFaction>false</onlyPawnsInSameFaction>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
</li>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
<label>不适</label>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.5</offset>
</li>
</capMods>
</li>
<li>
<minSeverity>0.4</minSeverity>
<label>适应</label>
</li>
<li>
<minSeverity>0.8</minSeverity>
<label>舒适</label>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>0.25</offset>
</li>
</capMods>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_CreepyCrawly_Hediff</defName>
<label>原始恐惧</label>
<description>快把这些虫子从我身边支开!</description>
<defaultLabelColor>(0.52, 1, 0.95)</defaultLabelColor>
<hediffClass>HediffWithComps</hediffClass>
<isBad>false</isBad>
<debugLabelExtra>other</debugLabelExtra>
<initialSeverity>1</initialSeverity> <!-- 初始层数设置为10 -->
<maxSeverity>1</maxSeverity> <!-- 最大层数,可以根据需要调整 -->
<stages>
<li>
<minSeverity>0</minSeverity>
<becomeVisible>false</becomeVisible>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_Disappears">
<showRemainingTime>false</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
<li Class="HediffCompProperties_Link">
<requireLinkOnOtherPawn>false</requireLinkOnOtherPawn>
<maxDistance>0</maxDistance>
<customMote>Mote_ARA_CreepyCrawly_HediffLinkLine</customMote>
</li>
</comps>
</HediffDef>
<ThingDef ParentName="MoteBase">
<defName>Mote_ARA_CreepyCrawly_HediffLinkLine</defName>
<thingClass>MoteDualAttached</thingClass>
<altitudeLayer>MoteLow</altitudeLayer>
<mote>
<fadeInTime>0.1</fadeInTime>
<fadeOutTime>0.1</fadeOutTime>
<solidTime>999999</solidTime>
<needsMaintenance>True</needsMaintenance>
<rotateTowardsTarget>True</rotateTowardsTarget>
<scaleToConnectTargets>True</scaleToConnectTargets>
</mote>
<graphicData>
<shaderType>MoteGlow</shaderType>
<texPath>Things/Mote/WorkCommandLinkLine</texPath>
<color>(0,0,0,0)</color>
</graphicData>
</ThingDef>
<HediffDef>
<defName>ARA_RaceBaseSwarmProduceSwitchHediff</defName>
<label>繁育抑制</label>
<description>该阿拉克涅督虫已被蜂巢思维禁止进行辅虫的繁育。</description>
<hediffClass>HediffWithComps</hediffClass>
<isBad>false</isBad>
<defaultLabelColor>(0.6, 0.6, 0.6)</defaultLabelColor>
<scenarioCanAdd>false</scenarioCanAdd>
</HediffDef>
<HediffDef>
<defName>ARA_Psi_Master</defName>
<label>灵能专家</label>
<description>阿拉克涅织域种是虫巢中的灵能大师,她们对使用灵能能力得心应手,不仅自身可以依靠灵能进行飞行,还能为附近的己方单位提供保护,并将其作为灵能导线对敌人发射能量攻击。</description>
<hediffClass>Hediff_High</hediffClass>
<defaultLabelColor>(0.6, 0.8, 0.9)</defaultLabelColor>
<maxSeverity>1.0</maxSeverity>
<minSeverity>0.01</minSeverity>
<initialSeverity>0.5</initialSeverity>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_GiveHediffsInRangeToRace">
<range>18</range>
<hediff>ARA_Psi_Conductor</hediff>
<!-- <mote>Mote_ARA_CreepyCrawly_HediffLinkLine</mote> -->
<!-- 定义可以被影响的种族列表 -->
<!-- <targetRaces>
<li>Human</li>
</targetRaces> -->
<!-- 其他参数和原版一样 -->
<targetingParameters>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>true</canTargetAnimals>
<canTargetMechs>false</canTargetMechs>
<canTargetSelf>true</canTargetSelf>
<onlyTargetColonists>true</onlyTargetColonists>
</targetingParameters>
<onlyPawnsInSameFaction>true</onlyPawnsInSameFaction>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
</li>
</comps>
<stages>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_Psi_Conductor</defName>
<label>灵能导体</label>
<description>一只阿拉克涅织域种将这个殖民者作为其强大灵能力量的导体,织域种可以通过控制这个殖民者的灵能对敌方发起自动攻击,并使得这个殖民者更加难以击倒——代价则是殖民者自身会短暂地出现灵能失聪的情况。</description>
<descriptionHyperlinks>
<ThingDef>ARA_Psi_Conductor_Turret</ThingDef>
</descriptionHyperlinks>
<hediffClass>HediffWithComps</hediffClass>
<isBad>false</isBad>
<defaultLabelColor>(0.6, 0.6, 0.6)</defaultLabelColor>
<scenarioCanAdd>false</scenarioCanAdd>
<stages>
<li>
<statFactors>
<IncomingDamageFactor>0.75</IncomingDamageFactor>
<PsychicSensitivity>0</PsychicSensitivity>
</statFactors>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_Disappears">
<showRemainingTime>false</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
<li Class="HediffCompProperties_Link">
<requireLinkOnOtherPawn>false</requireLinkOnOtherPawn>
<maxDistance>18</maxDistance>
<!-- <customMote>Mote_ARA_CreepyCrawly_HediffLinkLine</customMote> -->
</li>
<li Class="ArachnaeSwarm.HediffCompProperties_TopTurret">
<turretDef>ARA_Psi_Conductor_Turret</turretDef>
<angleOffset>0</angleOffset>
<autoAttack>true</autoAttack>
</li>
</comps>
</HediffDef>
</Defs>

View File

@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<HediffDef>
<defName>ARA_MimicNematode</defName>
<label>拟线种虫族寄生</label>
<description>被阿拉克涅拟线种虫族寄生了,如果不加以干预,拟线虫最终会杀死宿主并将其转化为没有意识的寄生体。拟线虫会通过寄生体的攻击行为感染其他躯体。</description>
<description>该殖民者被阿拉克涅拟线种寄生了,如果不加以干预,拟线虫最终会杀死宿主并将其转化为没有意识的寄生体。拟线虫会通过寄生体的攻击行为感染其他躯体。</description>
<!-- 1. 指向我们创建的包含Comp的Hediff类 -->
<hediffClass>ArachnaeSwarm.Hediff_NecroticVirus</hediffClass>
@@ -29,7 +28,7 @@
<vomitMtbDays>1</vomitMtbDays>
<painFactor>0.5</painFactor>
<totalBleedFactor>0.9</totalBleedFactor>
<becomeVisible>false</becomeVisible>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>Talking</capacity>
@@ -148,13 +147,12 @@
<extraDamageType>ARA_MimicNematodeBite</extraDamageType>
</li>
</modExtensions>
</HediffDef>
<RecipeDef ParentName="SurgeryFlesh">
<defName>ARA_CureBloodRot</defName>
<label>清除拟线虫感染</label>
<description>通过多种药物联合靶向治疗清除患者体内的阿拉克涅拟线种虫族感染。</description>
<description>通过多种药物联合靶向治疗清除患者体内的阿拉克涅拟线种虫族感染,这种手术非常复杂,只能使用来自闪耀世界的医药进行</description>
<workerClass>Recipe_RemoveHediff</workerClass>
<jobString>清除拟线虫感染.</jobString>
<workAmount>2000</workAmount>
@@ -173,7 +171,7 @@
<li>MedicineUltratech</li>
</thingDefs>
</filter>
<count>10</count>
<count>2</count>
</li>
</ingredients>
<fixedIngredientFilter>
@@ -301,5 +299,4 @@
</li>
</renderNodeProperties>
</HediffDef>
</Defs>

View File

@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>ARA_TemperatureRegulation</defName>
<label>冷血动物</label>
<description>阿拉克涅虫族是冷血动物,这代表着她们对外界的温度变化更加敏感——在适宜温度下她们将变得敏捷而致命,在不适温度下她们将难以行动。\n\n此类阿拉克涅虫族可以接受在16~26°C的温度下活动温度接近21°C时会获得额外的意识加成。</description>
<hediffClass>Hediff_High</hediffClass>
<defaultLabelColor>(0.6, 0.8, 0.9)</defaultLabelColor>
<maxSeverity>1.0</maxSeverity>
<minSeverity>-0.01</minSeverity>
<initialSeverity>0.5</initialSeverity>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_Temperature">
<minComfortableTemperature>16</minComfortableTemperature>
<maxComfortableTemperature>26</maxComfortableTemperature>
<severityChangeIn>0.01</severityChangeIn>
<severityChangeOut>-0.01</severityChangeOut>
</li>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
<label>不适</label>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.5</offset>
</li>
</capMods>
</li>
<li>
<minSeverity>0.4</minSeverity>
<label>适应</label>
</li>
<li>
<minSeverity>0.8</minSeverity>
<label>舒适</label>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>0.25</offset>
</li>
</capMods>
</li>
</stages>
</HediffDef>
</Defs>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<JobDef>
<defName>ARA_DeployWormhole</defName>
<driverClass>ArachnaeSwarm.JobDriver_DeployWormhole</driverClass>
<reportString>正在部署虫洞。</reportString>
<allowOpportunisticPrefix>true</allowOpportunisticPrefix>
</JobDef>
</Defs>

View File

@@ -70,7 +70,7 @@
<forceNormalGearQuality>true</forceNormalGearQuality>
<initialWillRange>99~99</initialWillRange>
<initialResistanceRange>99~99</initialResistanceRange>
<maxGenerationAge>0</maxGenerationAge>
<maxGenerationAge>0.01</maxGenerationAge>
<minGenerationAge>0</minGenerationAge>
<canBeScattered>false</canBeScattered>
<xenotypeSet>
@@ -119,6 +119,8 @@
</backstoryFiltersOverride>
<abilities>
<li>ARA_AcidSprayBurst</li>
<li>ARA_RaceBaseSwarmProduceOff</li>
<li>ARA_RaceBaseSwarmProduceOn</li>
</abilities>
<apparelTags>
</apparelTags>
@@ -143,6 +145,8 @@
<apparelMoney>0</apparelMoney>
<abilities>
<li>ARA_Ability_TrackingCharge</li>
<li>ARA_RaceBaseSwarmProduceOff</li>
<li>ARA_RaceBaseSwarmProduceOn</li>
</abilities>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
@@ -162,6 +166,10 @@
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
<abilities>
<li>ARA_RaceBaseSwarmProduceOff</li>
<li>ARA_RaceBaseSwarmProduceOn</li>
</abilities>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Facehugger</defName>
@@ -223,6 +231,8 @@
</backstoryFiltersOverride>
<abilities>
<li>ARA_Ability_Smokepop</li>
<li>ARA_RaceBaseSwarmProduceOff</li>
<li>ARA_RaceBaseSwarmProduceOn</li>
</abilities>
<apparelTags>
</apparelTags>
@@ -261,6 +271,11 @@
<race>ArachnaeNode_Race_NeuroSwarm</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>0</invNutrition>
<flyingAnimationFramePathPrefix>ArachnaeSwarm/Things/ARA_NeuroSwarm/Addons/Flying/ARA_NeuroSwarm_Flying_</flyingAnimationFramePathPrefix>
<flyingAnimationDrawSize>1</flyingAnimationDrawSize>
<flyingAnimationFrameCount>1</flyingAnimationFrameCount>
<flyingAnimationTicksPerFrame>2</flyingAnimationTicksPerFrame>
<flyingAnimationInheritColors>false</flyingAnimationInheritColors>
<backstoryFiltersOverride>
<li>
<categories>
@@ -270,7 +285,9 @@
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_Ability_Morph</li>
<li>ARA_PsychicBrainburn</li>
<li>ARA_NeuroSwarm_jump</li>
<!-- <li>ARA_Ability_Morph</li> -->
</abilities>
<apparelTags>
</apparelTags>
@@ -285,7 +302,7 @@
<forceNoDeathNotification>true</forceNoDeathNotification>
<combatPower>75</combatPower>
<ecoSystemWeight>0</ecoSystemWeight>
<maxGenerationAge>0</maxGenerationAge>
<maxGenerationAge>0.01</maxGenerationAge>
<minGenerationAge>0</minGenerationAge>
<moveSpeedFactorByTerrainTag>
<li>

View File

@@ -39,7 +39,7 @@
<AbilityDef>
<defName>ARA_Queen_Upgrade_1_Stage</defName>
<label>女皇种进化——阶段1</label>
<description>使女皇种发生内驱性进化,解锁下一等级的虫群植入物和阿拉克涅卵</description>
<description>使女皇种发生内驱性进化,解锁下一等级的阿拉克涅卵。\n\n注意女皇种进化后所孵化的阿拉克涅卵仍可以孕育低等级的虫族但是越高级的阿拉克涅卵对温度越敏感。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Queen_Upgrade_1_Stage</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>
@@ -71,7 +71,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_1WMT</requiredResearch>
<failMessage>需要科技 基因节点WMT-1"内在突破" 以解锁进化</failMessage>
<failMessage>需要科技 节点WMT-1"突破" 以解锁进化</failMessage>
</li>
</comps>
</AbilityDef>
@@ -130,7 +130,7 @@
<AbilityDef>
<defName>ARA_Queen_Upgrade_2_Stage</defName>
<label>女皇种进化——阶段2</label>
<description>使女皇种发生内驱性进化,解锁下一等级的虫群植入物和阿拉克涅卵</description>
<description>使女皇种发生内驱性进化,解锁下一等级的阿拉克涅卵。\n\n注意女皇种进化后所孵化的阿拉克涅卵仍可以孕育低等级的虫族但是越高级的阿拉克涅卵对温度越敏感。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Queen_Upgrade_2_Stage</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>
@@ -162,7 +162,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_2WMT</requiredResearch>
<failMessage>需要科技 基因节点WMT-2"内在突破2" 以解锁进化</failMessage>
<failMessage>需要科技 节点WMT-2"突破2" 以解锁进化</failMessage>
</li>
</comps>
</AbilityDef>
@@ -203,10 +203,11 @@
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_EggSpew</li>
<li>ARA_EggSpew_2Stage</li>
<li>ARA_EggSpew_Huge_2Stage</li>
<li>ARA_BindDrone</li>
<li>ARA_AcidSprayBurst_Queen</li>
<!-- <li>ARA_Queen_Upgrade_2_Stage</li> -->
<li>ARA_TumorSpew</li>
</abilityDefs>
</li>
<!-- <li Class="HediffCompProperties_RemoveIfOtherHediff">
@@ -241,53 +242,59 @@
<abilityDefs>
<li>ARA_Cocoon_Cloth</li>
<li>ARA_Cocoon_Weapon</li>
<li>ARA_WeaponSmith_Upgrade_1_Stage</li>
</abilityDefs>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Queen_1_Stage_Transition_Period</li>
<li>ARA_WeaponSmith_1_Stage_Transition_Period</li>
</hediffs>
</li>
</comps>
</HediffDef>
<RecipeDef ParentName="SurgeryInstallBodyPartArtificialBase">
<AbilityDef>
<defName>ARA_WeaponSmith_Upgrade_1_Stage</defName>
<label>工艺种进化——阶段1</label>
<description>由阿拉科涅女皇种为该工艺种进行基因调整,以使其获得进化并得以孵化更多的武装器官和织物</description>
<descriptionHyperlinks>
<ThingDef>WULA_Energy_Furnace_DM_Engine</ThingDef>
<HediffDef>WULA_Energy_Furnace_Hediff_DM_Engine</HediffDef>
</descriptionHyperlinks>
<jobString>安装暗物质能源炉中</jobString>
<anesthetize>false</anesthetize>
<!-- <ingredients Inherit="False">
<li>
<filter>
<thingDefs>
<li>WULA_Energy_Furnace_DM_Engine</li>
</thingDefs>
</filter>
<count>1</count>
<description>使工艺种发生内驱性进化,解锁下一等级的阿拉克涅工艺茧。\n\n注意和女皇种的进化不同工艺种一旦进化到下一阶段此后所孵的阿拉克涅工艺茧将无法再制作现阶段及之前的装备并且越高级的阿拉克涅工艺茧对温度越敏感</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Queen_Upgrade_1_Stage</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>1</range>
<warmupTime>12</warmupTime>
<soundCast>AcidSpray_Resolve</soundCast>
<violent>false</violent>
<targetable>false</targetable>
<targetParams>
<canTargetSelf>True</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="CompProperties_AbilityGiveHediff">
<compClass>CompAbilityEffect_GiveHediff</compClass>
<hediffDef>ARA_WeaponSmith_1_Stage_Transition_Period</hediffDef>
<onlyApplyToSelf>True</onlyApplyToSelf>
<replaceExisting>true</replaceExisting>
<severity>1</severity>
</li>
</ingredients> -->
<!-- <fixedIngredientFilter>
<thingDefs>
<li>WULA_Energy_Furnace_DM_Engine</li>
</thingDefs>
</fixedIngredientFilter> -->
<!-- <appliedOnFixedBodyParts>
<li>WULA_Energy_Furnace_Bodypart</li>
</appliedOnFixedBodyParts> -->
<addsHediff>ARA_WeaponSmith_1_Stage_Transition_Period</addsHediff>
<recipeUsers Inherit="False">
<li>ArachnaeNode_Race_WeaponSmith</li>
</recipeUsers>
</RecipeDef>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_1WMT</requiredResearch>
<failMessage>需要科技 节点WMT-1"突破" 以解锁进化</failMessage>
</li>
</comps>
</AbilityDef>
<HediffDef>
<defName>ARA_WeaponSmith_1_Stage_Transition_Period</defName>
<label>工艺种进化——阶段1</label>
<description>由阿拉科涅女皇种为该工艺种进行基因调整,以使其获得进化并得以孵化更多的武装器官和织物。</description>
<description>为该工艺种进行基因调整,以使其获得进化并得以孵化更多的武装器官和织物。</description>
<!-- <hediffClass>HediffWithComps</hediffClass> -->
<hediffClass>Hediff_High</hediffClass>
<initialSeverity>1</initialSeverity>
@@ -304,7 +311,7 @@
<severityRange>0.02~0.15</severityRange>
</li>
</hediffs>
<message>{PAWN_nameDef} 通过女皇种的拔耀获得了更强大的孵化能力,现在她可以孕育更复杂的茧以获取强大的装备。</message>
<message>{PAWN_nameDef} 通过蜂巢意志的拔耀获得了更强大的孵化能力,现在她可以孕育更复杂的茧以获取强大的装备。</message>
</li>
</comps>
</HediffDef>
@@ -312,7 +319,7 @@
<HediffDef>
<defName>ARA_WeaponSmith_1_Stage</defName>
<label>进化等级——等级1</label>
<description>这只阿拉科涅工艺种通过女皇种的拔耀获得了更强大的孵化能力,现在她可以孕育更复杂的茧以获取强大的装备。</description>
<description>这只阿拉科涅工艺种通过蜂巢意志的拔耀获得了更强大的孵化能力,现在她可以孕育更复杂的茧以获取强大的装备。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
@@ -341,4 +348,153 @@
</li>
</comps>
</HediffDef>
<!-- 蜜罐种 -->
<HediffDef>
<defName>ARA_Myrmecocystus_Production_InsectJelly</defName>
<label>产出虫蜜</label>
<description>这只阿拉克涅蜜罐种正在产出虫蜜以滋养虫群。一只蜜罐种每天产出10份阿拉克涅虫蜜。</description>
<descriptionHyperlinks>
<ThingDef>ARA_InsectJelly</ThingDef>
</descriptionHyperlinks>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<!-- <stages>
<li>
<becomeVisible>ture</becomeVisible>
</li>
<li>
<minSeverity>1.01</minSeverity>
<becomeVisible>false</becomeVisible>
</li>
</stages> -->
<comps>
<li Class="ArachnaeSwarm.MoharHediffs.HediffCompProperties_Spawner">
<!--
==================================================
基础设置 (Basic Settings)
==================================================
-->
<!-- [DEBUG] 如果为true则为此组件启用详细的调试日志记录。 -->
<debug>true</debug>
<!-- 要生成的物品的ThingDef。 -->
<thingToSpawn>ARA_InsectJelly</thingToSpawn>
<!-- 每次生成的基础物品数量。 -->
<spawnCount>10</spawnCount>
<!--
==================================================
生成周期 (Spawning Interval)
==================================================
-->
<!-- 下一次生成事件发生前的最少天数。 -->
<minDaysB4Next>1</minDaysB4Next>
<!-- 下一次生成事件发生前的最大天数。 -->
<maxDaysB4Next>1</maxDaysB4Next>
<randomGrace>0</randomGrace>
<!--
==================================================
与年龄相关的调整 (Age-Related Adjustments)
==================================================
-->
<!-- 如果为true生成数量将根据宿主的年龄进行调整。 -->
<ageWeightedQuantity>false</ageWeightedQuantity>
<!-- 如果为true且ageWeightedQuantity为true则随着宿主年龄增长生成数量变多。 -->
<olderBiggerQuantity>true</olderBiggerQuantity>
<!-- 如果为true且ageWeightedQuantity为true则随年龄增长的数量缩放将是指数性的而非线性的。 -->
<exponentialQuantity>true</exponentialQuantity>
<!-- 指数级数量缩放的最大乘数,以防止出现荒谬的数字。 -->
<exponentialRatioLimit>20</exponentialRatioLimit>
<!--
==================================================
生成条件 (Spawning Conditions)
==================================================
-->
<!-- 如果为true当宿主Pawn饥饿时生成将暂停。 -->
<hungerRelative>true</hungerRelative>
<!-- 如果为true当宿主Pawn受伤时生成将暂停。 -->
<healthRelative>false</healthRelative>
</li>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_Myrmecocystus_Production_Medicine</li>
</abilityDefs>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Myrmecocystus_Production_Medicine</li>
</hediffs>
</li>
</comps>
</HediffDef>
<AbilityDef>
<defName>ARA_Myrmecocystus_Production_Medicine</defName>
<label>蜜罐种转换——医药专精</label>
<description>使蜜罐种发生内驱性进化,以牺牲生产阿拉克涅虫蜜的代价,使其可以孵化医药茧,并允许使用医疗能力和操纵拟线种。\n\n该进化过程不可逆</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Myrmecocystus_Production_Medicine</iconPath>
<cooldownTicksRange>1800</cooldownTicksRange>
<hostile>false</hostile>
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>1</range>
<warmupTime>12</warmupTime>
<soundCast>AcidSpray_Resolve</soundCast>
<violent>false</violent>
<targetable>false</targetable>
<targetParams>
<canTargetSelf>True</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="CompProperties_AbilityGiveHediff">
<compClass>CompAbilityEffect_GiveHediff</compClass>
<hediffDef>ARA_Myrmecocystus_Production_Medicine</hediffDef>
<onlyApplyToSelf>True</onlyApplyToSelf>
<replaceExisting>true</replaceExisting>
<severity>1</severity>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_1MED</requiredResearch>
<failMessage>需要科技 节点MED-1"制药" 以解锁进化</failMessage>
</li>
</comps>
</AbilityDef>
<HediffDef>
<defName>ARA_Myrmecocystus_Production_Medicine</defName>
<label>医疗专精</label>
<description>这只阿拉克涅蜜罐种已经获得拔耀,不再生产虫蜜,而是生产巢穴所稀缺的药物、化学品,并可以操纵拟线种。</description>
<descriptionHyperlinks>
<ThingDef>ARA_InsectJelly</ThingDef>
</descriptionHyperlinks>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<stages>
<li>
<minSeverity>0.01</minSeverity>
<statOffsets>
<MedicalTendQualityOffset>1</MedicalTendQualityOffset>
</statOffsets>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_Cocoon_Medicine</li>
<li>ARA_MimicNematode_Needle_Fire</li>
</abilityDefs>
</li>
</comps>
</HediffDef>
</Defs>

View File

@@ -17,11 +17,11 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_1WMT</defName>
<label>基因节点WMT-1"内在突破"</label>
<label>节点WMT-1"突破"</label>
<description>允许女皇种进化到下一个阶段。</description>
<baseCost>150</baseCost>
<researchViewX>4.50</researchViewX>
<researchViewY>3.10</researchViewY>
<researchViewY>3.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
@@ -29,20 +29,21 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2WMT</defName>
<label>基因节点WMT-2"内在突破2"</label>
<label>节点WMT-2"突破2"</label>
<description>允许女皇种进化到下一个阶段。</description>
<baseCost>150</baseCost>
<researchViewX>8.50</researchViewX>
<researchViewY>3.10</researchViewY>
<researchViewY>3.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
<li>ARA_Technology_6KYC</li>
</prerequisites>
</ResearchProjectDef>
<!-- 酸类发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6VXI</defName>
<label>基因节点VXI-6"酸囊"</label>
<label>节点VXI-6"酸囊"</label>
<description>使拥有酸囊的虫族允许喷射强酸击退敌人。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
@@ -54,7 +55,7 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_7VXI</defName>
<label>基因节点VXI-7"外置酸袋"</label>
<label>节点VXI-7"外置酸袋"</label>
<description>允许工艺种孵化新的武器。</description>
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
@@ -64,14 +65,27 @@
<li>ARA_Technology_6VXI</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_8VXI</defName>
<label>节点VXI-7"巨型酸腺"</label>
<description>允许工艺种孵化新的武器。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_6VXI</li>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<!-- 孵化发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_1KYC</defName>
<label>基因节点KYC-1"战士虫"</label>
<label>节点KYC-1"战士虫"</label>
<description>允许女皇种孵化新的虫族——战士种。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>2.20</researchViewY>
<researchViewY>5.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
@@ -79,11 +93,11 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2KYC</defName>
<label>基因节点KYC-2"飞行翼膜"</label>
<label>节点KYC-2"飞行翼膜"</label>
<description>允许女皇种孵化新的虫族——空天种,敏捷而致命的精锐虫族,拥有以飞行姿态穿梭于战场的能力。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.60</researchViewY>
<researchViewX>6.50</researchViewX>
<researchViewY>4.60</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
@@ -91,11 +105,11 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_4KYC</defName>
<label>基因节点KYC-4"原虫"</label>
<label>节点KYC-4"原虫"</label>
<description>允许女皇种孵化新的虫族——原虫种,一种可以寄生在别的种族身上以控制它们的特殊督虫。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>1.30</researchViewY>
<researchViewY>4.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
@@ -103,11 +117,23 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5KYC</defName>
<label>基因节点KYC-5"巨甲"</label>
<description>允许女皇种孵化新的虫族——浓雾种,一种拥有厚重甲壳的大型督虫,可以铺设菌毯、释放烟雾阻燃剂以协助虫群进行集群冲击。</description>
<label>节点KYC-5"巨甲"</label>
<description>允许女皇种孵化新的虫族——浓雾种,一种拥有厚重甲壳的大型督虫,可以释放烟雾阻燃剂和召唤虫族增援的信息素以协助虫群进行集群冲击。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.00</researchViewY>
<researchViewY>4.60</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6KYC</defName>
<label>节点KYC-6"灵脑"</label>
<description>允许女皇种孵化新的虫族——织域种,一种寿命长且拥有强大灵能的特殊,不仅能协助虫群的科研工作,也能承担战场指挥官的责任。</description>
<baseCost>150</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>3.60</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
@@ -116,11 +142,11 @@
<!-- 织物发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_4DIL</defName>
<label>基因节点DIL-4"编织"</label>
<label>节点DIL-4"编织"</label>
<description>允许工艺种孵化织物茧,为虫族提供基础防具。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>5.10</researchViewY>
<researchViewY>1.40</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
@@ -128,37 +154,63 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_1VTE</defName>
<label>基因节点VTE-1"爆发激素"</label>
<label>节点VTE-1"爆发激素"</label>
<description>允许一部分拥有厚重甲壳的阿拉克涅督虫使用追踪冲撞攻击敌军。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewX>6.50</researchViewX>
<researchViewY>5.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_4DIL</li>
<li>ARA_Technology_1KYC</li>
<li>ARA_Technology_5KYC</li>
</prerequisites>
</ResearchProjectDef>
<!-- 毒类发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5PAV</defName>
<label>基因节点PAV-5"毒刺"</label>
<label>节点PAV-5"毒刺"</label>
<description>允许工艺种孵化新的毒针类武器茧,并允许部分带毒针的虫族进行毒针喷射。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>4.40</researchViewY>
<researchViewY>0.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6PAV</defName>
<label>节点PAV-6"暴雨"</label>
<description>允许工艺种孵化新的毒针类武器茧。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_5PAV</li>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<!-- 建筑发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5SHL</defName>
<label>基因节点SHL-5"光瘤"</label>
<label>节点SHL-5"光瘤"</label>
<description>允许虫族建造一种可以提供直射光源以供植物生长的特殊菌瘤。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>1.20</researchViewY>
<researchViewY>2.00</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6SHL</defName>
<label>节点SHL-6"温度控制"</label>
<description>允许虫族建造一种可以控制房间温度的特殊固定辅虫。</description>
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>2.00</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
@@ -167,14 +219,41 @@
<!-- 子巢发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6SPV</defName>
<label>基因节点SPV-6"天巢种之巢"</label>
<label>节点SPV-6"辅虫巢"</label>
<description>允许工艺种孵化新的武器。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>2.20</researchViewY>
<researchViewX>5.50</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
<li>ARA_Technology_5PAV</li>
</prerequisites>
</ResearchProjectDef>
<!-- 药物发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_1MED</defName>
<label>节点MED-1"制药"</label>
<description>允许蜜罐种进行定向进化,以强化其自身的医疗能力并解锁孵化医药茧的技能。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
</Defs>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2MED</defName>
<label>节点MED-2"拟线寄生"</label>
<description>允许蜜罐种使用拟线种寄生的能力,并在医药茧中解锁拟线种抑制剂的制作。</description>
<baseCost>150</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1MED</li>
<li>ARA_Technology_5PAV</li>
</prerequisites>
</ResearchProjectDef>
</Defs>

View File

@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<StorytellerDef ParentName="BaseStoryteller">
<defName>ARA_Lyne</defName>
<label>「织域种」蛉</label>
<description>蛉是一只阿拉克涅织域种督虫,作为讲述者时行为和「经典」卡桑德拉相近,但是会加强大型袭击的难度。此外,选择蛉作为讲述者时,将会开启阿拉克涅虫巢的新手引导,以帮助新巢穴适应这个世界。</description>
<portraitLarge>ArachnaeSwarm/Storyteller/ARA_Lyne</portraitLarge>
<portraitTiny>ArachnaeSwarm/Storyteller/ARA_Lyne_TINY</portraitTiny>
<listOrder>20</listOrder>
<comps>
<!-- Intro -->
<!-- <li Class="StorytellerCompProperties_ClassicIntro"/> -->
<!-- 袭击生成器 -->
<li Class="StorytellerCompProperties_OnOffCycle">
<category>ThreatBig</category> <!-- 大型袭击 -->
<minDaysPassed>15.0</minDaysPassed> <!-- 最低在15日后开始生成 -->
<onDays>2</onDays> <!-- 每个周期(12天)有多少天允许生成袭击 -->
<offDays>9</offDays> <!-- 每个周期(12天)有多少天不生成袭击 -->
<minSpacingDays>0.25</minSpacingDays> <!-- 事件最小间隔 -->
<numIncidentsRange>2~3</numIncidentsRange> <!-- 事件点数 -->
<!-- <forceRaidEnemyBeforeDaysPassed>20</forceRaidEnemyBeforeDaysPassed> -->
<disallowedTargetTags>
<li>Map_RaidBeacon</li>
</disallowedTargetTags>
</li>
<li Class="StorytellerCompProperties_OnOffCycle">
<category>ThreatSmall</category>
<minDaysPassed>11.0</minDaysPassed>
<onDays>4.6</onDays>
<offDays>6.0</offDays>
<numIncidentsRange>0.2~1</numIncidentsRange>
<acceptPercentFactorPerThreatPointsCurve>
<points>
<li>(800, 1)</li>
<li>(2800, 0)</li>
</points>
</acceptPercentFactorPerThreatPointsCurve>
</li>
<li Class="StorytellerCompProperties_ThreatsGenerator">
<allowedTargetTags>
<li>Map_RaidBeacon</li>
</allowedTargetTags>
<parms>
<allowedThreats>Raids</allowedThreats>
<onDays>1.0</onDays>
<offDays>0.5</offDays>
<minSpacingDays>0.04</minSpacingDays>
<numIncidentsRange>1~2</numIncidentsRange>
<minThreatPoints>500</minThreatPoints>
</parms>
</li>
<!-- Home misc incidents-->
<li Class="StorytellerCompProperties_CategoryMTB">
<category>Misc</category>
<allowedTargetTags>
<li>Map_PlayerHome</li>
</allowedTargetTags>
<minDaysPassed>5</minDaysPassed>
<mtbDays>4.8</mtbDays>
</li>
<li Class="StorytellerCompProperties_ShipChunkDrop"/>
<li Class="StorytellerCompProperties_Disease">
<category>DiseaseHuman</category>
<minDaysPassed>9</minDaysPassed>
</li>
<li Class="StorytellerCompProperties_Disease">
<category>DiseaseAnimal</category>
<minDaysPassed>9</minDaysPassed>
</li>
<!-- Ally/neutral interaction -->
<li Class="StorytellerCompProperties_FactionInteraction">
<incident>RaidFriendly</incident>
<baseIncidentsPerYear>15</baseIncidentsPerYear>
<minSpacingDays>0.4</minSpacingDays>
<fullAlliesOnly>true</fullAlliesOnly>
<minDanger>High</minDanger>
</li>
<li Class="StorytellerCompProperties_FactionInteraction">
<incident>TraderCaravanArrival</incident>
<minDaysPassed>5</minDaysPassed>
<baseIncidentsPerYear>5</baseIncidentsPerYear>
<minSpacingDays>6</minSpacingDays>
<allowedTargetTags>
<li>Map_PlayerHome</li>
</allowedTargetTags>
</li>
<li Class="StorytellerCompProperties_FactionInteraction">
<incident>VisitorGroup</incident>
<minDaysPassed>3</minDaysPassed>
<baseIncidentsPerYear>4</baseIncidentsPerYear>
<minSpacingDays>5</minSpacingDays>
<allowedTargetTags>
<li>Map_PlayerHome</li>
</allowedTargetTags>
</li>
<li Class="StorytellerCompProperties_FactionInteraction">
<incident>TravelerGroup</incident>
<minDaysPassed>1</minDaysPassed>
<baseIncidentsPerYear>6</baseIncidentsPerYear>
<minSpacingDays>1</minSpacingDays>
<allowedTargetTags>
<li>Map_PlayerHome</li>
</allowedTargetTags>
</li>
<!-- Caravan / temp map -->
<li Class="StorytellerCompProperties_CategoryIndividualMTBByBiome">
<category>Misc</category>
<allowedTargetTags>
<li>Caravan</li>
<li>Map_TempIncident</li>
</allowedTargetTags>
</li>
<li Class="StorytellerCompProperties_CategoryIndividualMTBByBiome">
<category>ThreatSmall</category>
<applyCaravanVisibility>true</applyCaravanVisibility>
<allowedTargetTags>
<li>Caravan</li>
<li>Map_TempIncident</li>
</allowedTargetTags>
</li>
<li Class="StorytellerCompProperties_CategoryIndividualMTBByBiome">
<category>ThreatBig</category>
<applyCaravanVisibility>true</applyCaravanVisibility>
<allowedTargetTags>
<li>Caravan</li>
<li>Map_TempIncident</li>
</allowedTargetTags>
</li>
<!-- Quests - non-Royalty -->
<li Class="StorytellerCompProperties_RandomQuest">
<category>GiveQuest</category>
<allowedTargetTags>
<li>World</li>
</allowedTargetTags>
<onDays>10</onDays>
<numIncidentsRange>1</numIncidentsRange>
<acceptFractionByDaysPassedCurve>
<points>
<li>(8, 0)</li>
<li>(15, 1)</li>
</points>
</acceptFractionByDaysPassedCurve>
<minSpacingDays>3</minSpacingDays>
<disableIfAnyModActive>
<li>Ludeon.RimWorld.Royalty</li>
</disableIfAnyModActive>
</li>
<!-- Quests - Royalty -->
<li Class="StorytellerCompProperties_RandomQuest">
<category>GiveQuest</category>
<allowedTargetTags>
<li>World</li>
</allowedTargetTags>
<onDays>12</onDays>
<numIncidentsRange>2</numIncidentsRange>
<acceptFractionByDaysPassedCurve>
<points>
<li>(8, 0)</li>
<li>(15, 1)</li>
</points>
</acceptFractionByDaysPassedCurve>
<minSpacingDays>3</minSpacingDays>
<enableIfAnyModActive>
<li>Ludeon.RimWorld.Royalty</li>
</enableIfAnyModActive>
</li>
<!-- World misc incidents-->
<li Class="StorytellerCompProperties_CategoryMTB">
<category>Misc</category>
<allowedTargetTags>
<li>World</li>
</allowedTargetTags>
<minDaysPassed>15</minDaysPassed>
<mtbDays>15</mtbDays>
</li>
<!-- Orbital trader -->
<li Class="StorytellerCompProperties_OnOffCycle">
<incident>OrbitalTraderArrival</incident>
<onDays>7</onDays>
<offDays>8</offDays>
<numIncidentsRange>1</numIncidentsRange>
</li>
<!-- Triggered -->
<li Class="StorytellerCompProperties_Triggered">
<incident>StrangerInBlackJoin</incident>
<delayTicks>180</delayTicks>
</li>
</comps>
</StorytellerDef>
</Defs>

View File

@@ -34,7 +34,6 @@
<baseBodySize>0.5</baseBodySize>
<baseHealthScale>1</baseHealthScale>
<useMeatFrom>Megaspider</useMeatFrom>
<lifeExpectancy>0.1</lifeExpectancy>
<trainability>Advanced</trainability>
<!-- <hasCorpse>false</hasCorpse> -->
<!-- <specialTrainables>
@@ -68,7 +67,7 @@
</race>
<comps>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>72000</totalPowerTicks> <!-- 2 hours -->
<totalPowerTicks>1440000</totalPowerTicks> <!-- 2 hours -->
<labelOverride>寿命</labelOverride>
<tooltipOverride>这种特殊的阿拉克涅辅虫从出生起就走在死亡的道路上了——它们的寿命就是如此短暂。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>

View File

@@ -21,7 +21,6 @@
<hasGenders>false</hasGenders>
<hasCorpse>false</hasCorpse>
<foodType>None</foodType>
<lifeExpectancy>2500</lifeExpectancy>
<bloodDef>Filth_BloodInsect</bloodDef>
<disableIgniteVerb>true</disableIgniteVerb>
<trainability>None</trainability>
@@ -37,6 +36,14 @@
</tools>
<killedLeavings>
</killedLeavings>
<comps>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>4400</totalPowerTicks> <!-- 2 hours -->
<labelOverride>寿命</labelOverride>
<tooltipOverride>这种特殊的阿拉克涅辅虫从出生起就走在死亡的道路上了——它们的寿命就是如此短暂。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ARA_BaseDroneSwarm">
<defName>ArachnaeBase_Race_Acid</defName>
@@ -61,14 +68,6 @@
<statBases>
<MoveSpeed>6</MoveSpeed>
</statBases>
<comps>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>4400</totalPowerTicks> <!-- 2 hours -->
<labelOverride>寿命</labelOverride>
<tooltipOverride>这种特殊的阿拉克涅辅虫从出生起就走在死亡的道路上了——它们的寿命就是如此短暂。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
</comps>
<tools Inherit="False">
<li>
<label>酸性巨颚</label>
@@ -109,14 +108,6 @@
<MaxFlightTime>9999</MaxFlightTime>
<FlightCooldown>0</FlightCooldown>
</statBases>
<comps>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>4400</totalPowerTicks> <!-- 2 hours -->
<labelOverride>寿命</labelOverride>
<tooltipOverride>这种特殊的阿拉克涅辅虫从出生起就走在死亡的道路上了——它们的寿命就是如此短暂。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
</comps>
<tools Inherit="False">
<li>
<label>巨颚</label>
@@ -130,11 +121,10 @@
</li>
</tools>
</ThingDef>
<ThingDef ParentName="ARA_BaseDroneSwarm">
<defName>ArachnaeBase_Race_Acidling</defName>
<label>阿拉克涅爆种</label>
<description>阿拉克涅辅虫之一,智力低下,一般被作为自杀式无人机打出,靠近敌人后就会引爆酸囊产生危险的酸性雾气。</description>
<label>阿拉克涅爆</label>
<description>阿拉克涅辅虫之一,智力低下,一般以自杀式袭击的方式伤害敌军,靠近敌人后就会引爆酸囊产生危险的酸性雾气。</description>
<race>
<thinkTreeConstant>HunterDroneConstant</thinkTreeConstant>
<baseBodySize>0.5</baseBodySize>
@@ -155,12 +145,6 @@
<MoveSpeed>6</MoveSpeed>
</statBases>
<comps>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>4400</totalPowerTicks> <!-- 2 hours -->
<labelOverride>寿命</labelOverride>
<tooltipOverride>这种特殊的阿拉克涅辅虫从出生起就走在死亡的道路上了——它们的寿命就是如此短暂。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
<li Class="ArachnaeSwarm.CompProperties_HunterExplosion">
<explosionRadius>3.9</explosionRadius> <!-- Mapped from smokeRadius -->
<explosionDamageType>ARA_AcidBurn</explosionDamageType>
@@ -185,6 +169,7 @@
</li>
</tools>
</ThingDef>
<ToolCapacityDef>
<defName>ARA_AcidCut</defName>
<label>酸性撕咬</label>
@@ -202,7 +187,6 @@
<combatLogRulesMiss>Maneuver_Slash_MeleeMiss</combatLogRulesMiss>
<combatLogRulesDodge>Maneuver_Slash_MeleeDodge</combatLogRulesDodge>
</ManeuverDef>
<ToolCapacityDef>
<defName>ARA_Bite</defName>
<label>撕咬</label>

View File

@@ -320,6 +320,8 @@
<!-- 食物列表 -->
<whiteFoodList>
<li>ARA_InsectJelly</li>
<li>ARA_NutrientPasteMeal</li>
<li>ARA_PheromoneSolvent</li>
</whiteFoodList>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
<!-- 武器列表 -->
@@ -735,14 +737,14 @@
</race>
<comps>
<li Class="ArachnaeSwarm.CompProperties_MilkableArachnae">
<!-- <li Class="ArachnaeSwarm.CompProperties_MilkableArachnae">
<milkDef>ARA_InsectJelly</milkDef>
<milkIntervalDays>1</milkIntervalDays>
<milkAmount>10</milkAmount>
</li>
</li> -->
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
<disableHediff>WULA_MechCarrierSwitchHediff</disableHediff>
<disableHediff>ARA_RaceBaseSwarmProduceSwitchHediff</disableHediff>
<fixedIngredient>ARA_InsectJelly</fixedIngredient>
<maxIngredientCount>500</maxIngredientCount>
<startingIngredientCount>500</startingIngredientCount>
@@ -763,6 +765,13 @@
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_Myrmecocystus_Production_InsectJelly</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
@@ -869,7 +878,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
<disableHediff>WULA_MechCarrierSwitchHediff</disableHediff>
<disableHediff>ARA_RaceBaseSwarmProduceSwitchHediff</disableHediff>
<fixedIngredient>ARA_InsectJelly</fixedIngredient>
<maxIngredientCount>500</maxIngredientCount>
<startingIngredientCount>500</startingIngredientCount>
@@ -957,11 +966,6 @@
<baseHealthScale>0.75</baseHealthScale>
</race>
<recipes Inherit="False">
<li>ARA_WeaponSmith_Upgrade_1_Stage</li>
</recipes>
<comps>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
@@ -972,7 +976,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
<disableHediff>WULA_MechCarrierSwitchHediff</disableHediff>
<disableHediff>ARA_RaceBaseSwarmProduceSwitchHediff</disableHediff>
<fixedIngredient>ARA_InsectJelly</fixedIngredient>
<maxIngredientCount>500</maxIngredientCount>
<startingIngredientCount>500</startingIngredientCount>
@@ -1186,7 +1190,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
<disableHediff>WULA_MechCarrierSwitchHediff</disableHediff>
<disableHediff>ARA_RaceBaseSwarmProduceSwitchHediff</disableHediff>
<fixedIngredient>ARA_InsectJelly</fixedIngredient>
<maxIngredientCount>500</maxIngredientCount>
<startingIngredientCount>500</startingIngredientCount>
@@ -1275,21 +1279,6 @@
</raceRestriction>
</alienRace>
<comps>
<!-- Add our new flight component here -->
<li Class="ArachnaeSwarm.CompProperties_PawnFlight"> <!-- 2. 添加我们的飞行组件 -->
<!-- 飞行触发条件:仅在征召时飞行 -->
<flightCondition>Drafted</flightCondition>
<!-- 链接到我们刚刚创建的 AnimationDef -->
<flyingAnimationNorth>ARA_FlyNorth</flyingAnimationNorth>
<flyingAnimationEast>ARA_FlyEast</flyingAnimationEast>
<flyingAnimationSouth>ARA_FlySouth</flyingAnimationSouth>
</li>
</comps>
<!-- 基础属性设置 -->
<statBases>
<!-- 移动速度 -->
@@ -1331,6 +1320,17 @@
</race>
<comps>
<!-- Add our new flight component here -->
<li Class="ArachnaeSwarm.CompProperties_PawnFlight"> <!-- 2. 添加我们的飞行组件 -->
<!-- 飞行触发条件:仅在征召时飞行 -->
<flightCondition>Drafted</flightCondition>
<!-- 链接到我们刚刚创建的 AnimationDef -->
<flyingAnimationNorth>ARA_FlyNorth</flyingAnimationNorth>
<flyingAnimationEast>ARA_FlyEast</flyingAnimationEast>
<flyingAnimationSouth>ARA_FlySouth</flyingAnimationSouth>
</li>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>7200000</totalPowerTicks>
<labelOverride>寿命</labelOverride>
@@ -1340,71 +1340,442 @@
</comps>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<AlienRace.ThingDef_AlienRace ParentName="ARA_PawnBase">
<defName>ArachnaeNode_Race_NeuroSwarm</defName>
<label>阿拉克涅织域种</label>
<description>阿拉克涅督虫之一,是阿拉克涅虫群中最为特殊的虫族,织域种虽然受到女皇种监管,但仍然具有强大的高级智慧和自我意志,织域种之间能够构建一种高度互联的神经网络从而进行复杂的研究和计算工作,织域种进行计算工作时无法感知外界环境,因此她们是虫群的重要保护对象。</description>
<alienRace>
<!-- 核心设置 -->
<generalSettings>
<!-- 男性生成几率 -->
<maleGenderProbability>0</maleGenderProbability>
<!-- 无视年龄疾病 -->
<immuneToAge>true</immuneToAge>
<!-- 在口角中造成的最大伤害 -->
<maxDamageForSocialfight>15</maxDamageForSocialfight>
<!-- 免疫人类的异形歧视 -->
<immuneToXenophobia>false</immuneToXenophobia>
<!-- 最小的可生成成人背景的年龄 -->
<minAgeForAdulthood>0</minAgeForAdulthood>
<!-- 手术继承自人类 -->
<humanRecipeImport>false</humanRecipeImport>
<!-- 睡觉定义 -->
<canLayDown>false</canLayDown>
<!-- 各种零件定义 -->
<alienPartGenerator>
<alienPartGenerator Inherit="False">
<!-- 允许的头部 -->
<headTypes Inherit="False">
<li>Female_AverageNormal</li>
<!-- <li>Female_AverageWide</li>
<li>Female_AveragePointy</li> -->
</headTypes>
<!-- 身体类型 -->
<bodyTypes Inherit="False">
<li>Thin</li>
</bodyTypes>
<!-- 颜色设置 -->
<colorChannels Inherit="false">
<!-- 皮肤是特殊的,因为现在由基因定义肤色 -->
<li>
<name>skin</name>
<first Class="AlienRace.ColorGenerator_SkinColorMelanin">
<minMelanin>0</minMelanin>
<maxMelanin>0</maxMelanin>
</first>
</li>
<!-- 头发颜色 -->
<li>
<name>hair</name>
<first Class="ColorGenerator_Options">
<options>
<li>
<weight>15</weight>
<min>(0.4,0.3,0.5)</min>
<max>(0.6,0.1,0.7)</max>
</li>
<li>
<weight>6</weight>
<min>(0.9,0.9,0.9)</min>
<max>(0.9,0.9,0.9)</max>
</li>
<li>
<weight>6</weight>
<min>(1,0.8,0.8)</min>
<max>(1,0.9,0.9)</max>
</li>
<li>
<weight>3</weight>
<min>(1,1,1)</min>
<max>(1,1,1)</max>
</li>
</options>
</first>
</li>
</colorChannels>
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_WeaponSmith</path>
<inFrontOfBody>false</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
<offsets>
<north>
<layerOffset>-0.275</layerOffset>
</north>
</offsets>
</li>
</bodyAddons>
<!-- 图像放大 -->
<borderScale>1.5</borderScale>
<atlasScale>1.5</atlasScale>
<customDrawSize>(2,2)</customDrawSize>
<customHeadDrawSize>(1.0,1.0)</customHeadDrawSize>
<customPortraitDrawSize>(1,1)</customPortraitDrawSize>
</alienPartGenerator>
<growthAges Inherit="False">
<li>0</li>
</growthAges>
<!-- 年龄工作效率等的覆盖 -->
<ageStatOverrides Inherit="False">
<WorkSpeedGlobal>
<useBiologicalYears>true</useBiologicalYears>
<curve>
<points>
<li>(0,1)</li>
</points>
</curve>
</WorkSpeedGlobal>
<ShootingAccuracyChildFactor MayRequire="Ludeon.RimWorld.Biotech">
<useBiologicalYears>true</useBiologicalYears>
<curve>
<points>
<li>(0,1)</li>
</points>
</curve>
</ShootingAccuracyChildFactor>
<MarketValue>
<useBiologicalYears>true</useBiologicalYears>
<curve>
<points>
<li>(0,1)</li>
</points>
</curve>
</MarketValue>
<MeleeHitChance>
<useBiologicalYears>true</useBiologicalYears>
<curve>
<points>
<li>(0,1)</li>
</points>
</curve>
</MeleeHitChance>
<AimingDelayFactor>
<useBiologicalYears>true</useBiologicalYears>
<curve>
<points>
<li>(0,1)</li>
</points>
</curve>
</AimingDelayFactor>
<ArrestSuccessChance>
<useBiologicalYears>true</useBiologicalYears>
<curve>
<points>
<li>(0, 1)</li>
</points>
</curve>
</ArrestSuccessChance>
</ageStatOverrides>
<!-- 生育设置,将妊娠设为男性来避免开局刷妊娠 -->
<reproduction>
<gestatingGender>Male</gestatingGender>
<femaleFertilityAgeFactor>
<points>
<li>(0,0)</li>
<li>(1,0)</li>
<li>(999,0)</li>
<li>(9999,0)</li>
</points>
</femaleFertilityAgeFactor>
</reproduction>
<growthFactorByAge Inherit="False">
<points>
<li>(0,0)</li>
<li>(1,0)</li>
<li>(999,0)</li>
<li>(9999,0)</li>
</points>
</growthFactorByAge>
</generalSettings>
<!-- 图形 -->
<graphicPaths>
<!-- 皮肤颜色 -->
<skinColor>(1,1,1,1)</skinColor>
<!-- 皮肤着色器 -->
<skinShader>Cutout</skinShader>
<body>ArachnaeSwarm/Things/ARA_NeuroSwarm/Bodies/</body>
<head>ArachnaeSwarm/Things/ARA_NeuroSwarm/Heads/</head>
<skeleton>Things/Pawn/Humanlike/Bodies/Dessicated/Dessicated_Thin</skeleton>
<stump>ArachnaeSwarm/Things/ARA_HiveNode/Bodies/</stump>
</graphicPaths>
<!-- 风格设置 -->
<styleSettings>
<!-- 头发 -->
<li>
<key>HairDef</key>
<value>
<hasStyle>true</hasStyle>
<styleTagsOverride>
<li>Bald</li>
</styleTagsOverride>
</value>
</li>
<!-- 纹身 -->
<li>
<key>TattooDef</key>
<value>
<hasStyle>false</hasStyle>
</value>
</li>
<!-- 胡须 -->
<li>
<key>BeardDef</key>
<value>
<hasStyle>false</hasStyle>
</value>
</li>
</styleSettings>
<!-- 种族的允许和禁止特化设置 -->
<raceRestriction>
<!-- 无法拥有的内源性基因 -->
<blackEndoCategories MayRequire="Ludeon.RimWorld.Biotech">
<li MayRequire="Ludeon.RimWorld.Biotech">HairColor</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Melanin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">BodyType</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Ears</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Nose</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Voice</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Headbone</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Head</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Jaw</li>
</blackEndoCategories>
<!-- 无法拥有的Tag基因 -->
<blackGeneTags MayRequire="Ludeon.RimWorld.Biotech">
<li MayRequire="Ludeon.RimWorld.Biotech">EyeColor</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Tail</li>
<li MayRequire="Ludeon.RimWorld.Biotech">BeardStyle</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Fur</li>
</blackGeneTags>
<!-- 无法拥有的基因列表 -->
<blackGeneList>
<li MayRequire="Ludeon.RimWorld.Biotech">Furskin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Brow_Heavy</li>
</blackGeneList>
<!-- 禁止的异形变种 -->
<blackXenotypeList>
<li MayRequire="Ludeon.RimWorld.Biotech">Dirtmole</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Genie</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Hussar</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Sanguophage</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Neanderthal</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Pigskin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Impid</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Waster</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Yttakin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Highmate</li>
</blackXenotypeList>
<!-- 异种类型列表 -->
<xenotypeList>
</xenotypeList>
<onlyUseRaceRestrictedXenotypes>true</onlyUseRaceRestrictedXenotypes>
<!-- 食物列表 -->
<whiteFoodList>
<li>ARA_InsectJelly</li>
</whiteFoodList>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
<!-- 可以驯服的宠物,主要是防止小虫由别人驯服 -->
<petList>
<li>ArachnaeBase_Race_Scavenger</li>
<li>ArachnaeBase_Race_HardJaw</li>
</petList>
<onlyTameRaceRestrictedPets>false</onlyTameRaceRestrictedPets>
<!-- 可以穿戴的衣服 -->
<apparelList>
</apparelList>
<blackApparelList>
</blackApparelList>
<!-- 仅使用种族限制的服装 -->
<onlyUseRaceRestrictedApparel>true</onlyUseRaceRestrictedApparel>
<!-- 生育能力 -->
<onlyReproduceWithRestrictedRaces>true</onlyReproduceWithRestrictedRaces>
<canReproduce>false</canReproduce>
<!-- 允许的特质类型 -->
<traitList>
</traitList>
<blackTraitList>
<li>BodyPurist</li>
<li>Cannibal</li>
<li>CreepyBreathing</li>
<li>DislikesWomen</li>
<li>Gourmand</li>
<li>QuickSleeper</li>
<li>Wimp</li>
<li>Beauty</li>
<li>DrugDesire</li>
<li>Immunity</li>
<li>PsychicSensitivity</li>
</blackTraitList>
</raceRestriction>
<!-- 关系设置,不会生成任何随机关系 -->
<relationSettings>
<relationChanceModifierLover>0</relationChanceModifierLover>
<relationChanceModifierExLover>0</relationChanceModifierExLover>
<relationChanceModifierFiance>0</relationChanceModifierFiance>
<relationChanceModifierSpouse>0</relationChanceModifierSpouse>
<relationChanceModifierExSpouse>0</relationChanceModifierExSpouse>
<relationChanceModifierParent>0</relationChanceModifierParent>
<relationChanceModifierChild>0</relationChanceModifierChild>
<relationChanceModifierSibling>0</relationChanceModifierSibling>
</relationSettings>
</alienRace>
<comps>
</comps>
<!-- 基础属性设置 -->
<statBases>
<MaxFlightTime>9999</MaxFlightTime>
<FlightCooldown>0</FlightCooldown>
<!-- 市场价值 -->
<MarketValue>2000</MarketValue>
<RoyalFavorValue>5</RoyalFavorValue>
<!-- 移动速度 -->
<MoveSpeed>3.5</MoveSpeed>
<MoveSpeed>1.5</MoveSpeed>
<Mass>150</Mass>
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<!-- <EatingSpeed>5</EatingSpeed> -->
<MaxNutrition>2</MaxNutrition>
<EatingSpeed>2</EatingSpeed>
<MaxNutrition>0.5</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>40</MeatAmount>
<LeatherAmount>10</LeatherAmount>
<!-- 女皇的负重,设为0以避免女皇能背东西 -->
<CarryingCapacity>0</CarryingCapacity>
<MeatAmount>450</MeatAmount>
<LeatherAmount>600</LeatherAmount>
<PainShockThreshold>1</PainShockThreshold>
<PsychicSensitivity>3</PsychicSensitivity>
<ToxicResistance>0.95</ToxicResistance>
<ToxicEnvironmentResistance MayRequire="Ludeon.RimWorld.Biotech">0.95</ToxicEnvironmentResistance>
<Flammability>0.25</Flammability>
<MeleeDodgeChance>0.75</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->
<!-- <NegotiationAbility>1</NegotiationAbility> -->
<!-- <SellPriceFactor>1</SellPriceFactor> -->
<!-- <SocialImpact>1</SocialImpact> -->
<!-- <TradePriceImprovement>0.5</TradePriceImprovement> -->
<!-- 自带的甲壳可以防御外部攻击 -->
<ArmorRating_Blunt>0.1</ArmorRating_Blunt>
<ArmorRating_Sharp>0.1</ArmorRating_Sharp>
<ArmorRating_Heat>0.05</ArmorRating_Heat>
<ArmorRating_Blunt>0.2</ArmorRating_Blunt>
<ArmorRating_Sharp>0.2</ArmorRating_Sharp>
<ArmorRating_Heat>0.1</ArmorRating_Heat>
<MaxNutrition>1.26</MaxNutrition>
<!-- 虫群拥有惊人的愈合速度 -->
<InjuryHealingFactor>5</InjuryHealingFactor>
<!-- 在野外采集的营养 -->
<ForagedNutritionPerDay>0</ForagedNutritionPerDay>
</statBases>
<race>
<!-- 身体类型 -->
<body>ArachnaeWeaponSmith_Body</body>
<baseBodySize>0.8</baseBodySize>
<baseHealthScale>0.75</baseHealthScale>
<body>ArachnaeQueen_Body</body>
<fleshType>Normal</fleshType>
<!-- AI行为勿改 -->
<thinkTreeMain>ARA_Humanlike</thinkTreeMain>
<!-- 智力水平 -->
<intelligence>Humanlike</intelligence>
<!-- 肉和皮革的定义 -->
<nameCategory>HumanStandard</nameCategory>
<bloodDef>Filth_BloodInsect</bloodDef>
<bloodSmearDef>Filth_BloodSmear</bloodSmearDef>
<!-- 身形大小 -->
<baseBodySize>6</baseBodySize>
<!-- 基础血量,很高 -->
<baseHealthScale>4</baseHealthScale>
<!-- 解剖产物 -->
<leatherDef>ARA_Carapace</leatherDef>
<soundMeleeHitPawn>Pawn_Melee_BigBash_HitPawn</soundMeleeHitPawn>
<soundMeleeHitBuilding>Pawn_Melee_BigBash_HitBuilding</soundMeleeHitBuilding>
<soundMeleeMiss>Pawn_Melee_BigBash_Miss</soundMeleeMiss>
<soundMeleeDodge>Pawn_MeleeDodge</soundMeleeDodge>
<!-- 年龄阶段 -->
<lifeExpectancy>300</lifeExpectancy>
<lifeStageWorkSettings MayRequire="Ludeon.RimWorld.Biotech" Inherit="False">
<Firefighter>0</Firefighter>
<Patient>0</Patient>
<Doctor>0</Doctor>
<PatientBedRest>0</PatientBedRest>
<Childcare MayRequire="Ludeon.RimWorld.Biotech">0</Childcare>
<BasicWorker>0</BasicWorker>
<Warden>0</Warden>
<Handling>0</Handling>
<Cooking>0</Cooking>
<Hunting>0</Hunting>
<Construction>0</Construction>
<Growing>0</Growing>
<Mining>0</Mining>
<PlantCutting>0</PlantCutting>
<Smithing>0</Smithing>
<Tailoring>0</Tailoring>
<Art>0</Art>
<Crafting>0</Crafting>
<Hauling>0</Hauling>
<Cleaning>0</Cleaning>
<Research>0</Research>
<DarkStudy MayRequire="Ludeon.RimWorld.Anomaly">0</DarkStudy>
</lifeStageWorkSettings>
<lifeStageAges Inherit="False">
<li>
<def>ARA_Queen_Adult</def>
<minAge>0</minAge>
<soundWounded>Pawn_HiveQueen_Wounded</soundWounded>
<soundDeath>Pawn_HiveQueen_Death</soundDeath>
<soundCall>Pawn_HiveQueen_Call</soundCall>
<soundAngry>Pawn_HiveQueen_Angry</soundAngry>
</li>
</lifeStageAges>
<canFlyInVacuum>false</canFlyInVacuum>
</race>
<!-- 工具设置(攻击方式) -->
<tools>
<li>
<label>头顶</label>
<capacities>
<li>Poke</li>
</capacities>
<power>16</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
<chanceFactor>0.01</chanceFactor>
</li>
</tools>
<recipes Inherit="False">
</recipes>
<comps>
<!-- Add our new flight component here -->
<li Class="ArachnaeSwarm.CompProperties_PawnFlight"> <!-- 2. 添加我们的飞行组件 -->
<!-- 飞行触发条件:仅在征召时飞行 -->
<flightCondition>Drafted</flightCondition>
<flyingAnimationNorth>ARA_Psi_FlyNorth</flyingAnimationNorth>
<flyingAnimationEast>ARA_Psi_FlyEast</flyingAnimationEast>
<flyingAnimationSouth>ARA_Psi_FlySouth</flyingAnimationSouth>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindDrone</li>
<li>ARA_HiveStrength</li>
<li>ARA_Psi_Master</li>
<li>PsychicAmplifier</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</AlienRace.ThingDef_AlienRace>
</Defs>

View File

@@ -16,7 +16,7 @@
<thinkTreeConstant>HumanlikeConstant</thinkTreeConstant>
<intelligence>Humanlike</intelligence>
<makesFootprints>true</makesFootprints>
<lifeExpectancy>80</lifeExpectancy>
<lifeExpectancy>300</lifeExpectancy>
<bloodDef>Filth_Blood</bloodDef>
<bloodSmearDef>Filth_BloodSmear</bloodSmearDef>
<leatherDef>Leather_Human</leatherDef>
@@ -410,6 +410,8 @@
<!-- 食物列表 -->
<whiteFoodList>
<li>ARA_InsectJelly</li>
<li>ARA_NutrientPasteMeal</li>
<li>ARA_PheromoneSolvent</li>
</whiteFoodList>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
<!-- 可以驯服的宠物,主要是防止小虫由别人驯服 -->
@@ -430,9 +432,6 @@
<canReproduce>false</canReproduce>
<!-- 允许操纵的配方 -->
<recipeList>
<li>ARA_WeaponSmith_Upgrade_1_Stage</li>
<!-- <li>ARA_WeaponSmith_Upgrade_2_Stage</li> -->
<!-- <li>ARA_WeaponSmith_Upgrade_3_Stage</li> -->
</recipeList>
<!-- 允许的工作台类型,放开以供其他种族使用 -->
<!-- <workGiverList>
@@ -459,6 +458,7 @@
<thoughtSettings>
<!-- 不会产生的想法 -->
<cannotReceiveThoughts>
<li>ARA_CreepyCrawly</li>
<li>Naked</li>
<li>AnyBodyPartButGroinCovered_Disapproved_Female</li>
<li>AnyBodyPartButGroinCovered_Disapproved_Male</li>
@@ -610,7 +610,7 @@
<soundMeleeMiss>Pawn_Melee_BigBash_Miss</soundMeleeMiss>
<soundMeleeDodge>Pawn_MeleeDodge</soundMeleeDodge>
<!-- 年龄阶段 -->
<!-- <lifeExpectancy>5000</lifeExpectancy> -->
<lifeExpectancy>300</lifeExpectancy>
<lifeStageWorkSettings MayRequire="Ludeon.RimWorld.Biotech" Inherit="False">
<Firefighter>0</Firefighter>
<Patient>0</Patient>
@@ -698,6 +698,7 @@
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_Queen_0_Stage</li>
<li>ARA_HiveStrength</li>
<li>ARA_HiveMindMaster</li>
</hediffs>
<addChance>1.0</addChance>

View File

@@ -1,8 +1,36 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- ==================== 1. 物品定义:阿拉克涅信息素溶剂 ==================== -->
<ThingDef ParentName="MedicineBase">
<defName>ARA_Medicine</defName>
<label>阿拉克涅愈合素</label>
<description>由阿拉克涅医药孵化茧所孵化的药物,效力等同于常规的医药,但是需要在冷藏条件下保存。</description>
<possessionCount>10</possessionCount>
<graphicData>
<texPath>Things/Item/Resource/Medicine/MedicineHerbal</texPath>
<graphicClass>Graphic_StackCount</graphicClass>
<drawSize>0.85</drawSize>
</graphicData>
<techLevel>Animal</techLevel>
<statBases>
<MarketValue>10</MarketValue>
<Mass>0.5</Mass>
<Flammability>1</Flammability>
<MedicalPotency>1</MedicalPotency>
<MedicalQualityMax>1.00</MedicalQualityMax>
<DeteriorationRate>2</DeteriorationRate>
<WorkToMake>700</WorkToMake>
</statBases>
<tickerType>Rare</tickerType>
<comps>
<li Class="CompProperties_Rottable">
<daysToRotStart>150</daysToRotStart>
<rotDestroys>true</rotDestroys>
</li>
</comps>
<allowedArchonexusCount>20</allowedArchonexusCount>
</ThingDef>
<!-- ==================== 信息素 ==================== -->
<ThingDef ParentName="MakeableDrugPillBase">
<defName>ARA_PheromoneSolvent</defName>
<label>阿拉克涅信息素溶剂</label>
@@ -12,9 +40,9 @@
<HediffDef>ARA_MimicNematode</HediffDef>
</descriptionHyperlinks>
<graphicData>
<texPath>Things/Item/Drug/WakeUp</texPath> <!-- 暂时使用WakeUp的贴图可后续替换 -->
<graphicClass>Graphic_StackCount</graphicClass>
<color>(1.0, 0.647, 0.0, 0.5)</color> <!-- 橙色 -->
<texPath>ArachnaeSwarm/Item/ARA_PheromoneSolvent</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>TransparentPostLight</shaderType>
</graphicData>
<rotatable>false</rotatable>
<statBases>
@@ -22,7 +50,7 @@
<MarketValue>50</MarketValue>
<Mass>0.01</Mass>
</statBases>
<techLevel>Industrial</techLevel>
<techLevel>Animal</techLevel>
<ingestible>
<drugCategory>Medical</drugCategory> <!-- 定义为医疗品,而非娱乐品 -->
<outcomeDoers>
@@ -33,13 +61,10 @@
</outcomeDoers>
</ingestible>
<recipeMaker>
<researchPrerequisite>MedicineProduction</researchPrerequisite> <!-- 假设需要基础制药解锁 -->
<recipeUsers>
<li>DrugLab</li>
</recipeUsers>
<researchPrerequisite>ARA_Technology_2MED</researchPrerequisite> <!-- 假设需要基础制药解锁 -->
<recipeUsers Inherit="False"/>
</recipeMaker>
<costList>
<Neutroamine>2</Neutroamine>
<ARA_InsectJelly>5</ARA_InsectJelly> <!-- 使用虫胶作为特色材料 -->
</costList>
<comps>
@@ -51,14 +76,11 @@
</li>
</comps>
</ThingDef>
<!-- ==================== 2. Hediff定义共生稳定器效果 ==================== -->
<HediffDef>
<defName>ARA_SymbioticStabilizer</defName>
<label>信息素抑制</label>
<labelNoun>一种信息素抑制效果</labelNoun>
<description>阿拉克涅信息素溶剂的效果正在生效,它模拟了虫群的共生信号,抑制了体内寄生体的活性。</description>
<description>阿拉克涅信息素溶剂的效果正在生效,它模拟了虫群的共生信号,抑制了体内寄生体的活性。在溶剂生效时不会使得拟线种虫族寄生的进度超过80%。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.7, 1.0, 0.7)</defaultLabelColor>
<isBad>false</isBad>
@@ -69,47 +91,12 @@
</li>
</comps>
</HediffDef>
<!-- ==================== 3. 物品定义:阿拉克涅拟线种虫卵 ==================== -->
<ThingDef ParentName="MakeableDrugPillBase">
<defName>ARA_NematodeEgg</defName>
<label>阿拉克涅拟线种虫卵</label>
<description>一个经过特殊处理的阿拉克涅拟线种虫卵,可以被直接服用。服用后,虫卵会迅速在宿主体内孵化并释放大量阿拉克涅拟线虫,导致极其严重的感染。</description>
<descriptionHyperlinks>
<HediffDef>ARA_MimicNematode</HediffDef>
</descriptionHyperlinks>
<graphicData>
<texPath>Things/Item/Drug/Luciferium</texPath>
<graphicClass>Graphic_StackCount</graphicClass>
<color>(100,50,100)</color> <!-- 深紫色 -->
</graphicData>
<statBases>
<MarketValue>75</MarketValue>
<Mass>0.05</Mass>
</statBases>
<techLevel>Industrial</techLevel>
<ingestible>
<drugCategory>None</drugCategory> <!-- 修正:这不是药物,不应被药物政策管理 -->
<foodType>AnimalProduct</foodType>
<outcomeDoers>
<li Class="IngestionOutcomeDoer_GiveHediff">
<hediffDef>ARA_MimicNematode</hediffDef>
<severity>0.5</severity> <!-- 直接给予0.7的严重性 -->
</li>
</outcomeDoers>
</ingestible>
<recipeMaker IsNull="True" /> <!-- 明确声明此物品不可制造,以覆盖父类的设置 -->
</ThingDef>
<!-- ==================== 3. 阿拉克涅信息素成瘾机制 ==================== -->
<ChemicalDef>
<defName>ARA_Pheromone</defName>
<label>阿拉克涅信息素</label>
<addictionHediff>ARA_PheromoneAddiction</addictionHediff>
</ChemicalDef>
<NeedDef ParentName="DrugAddictionNeedBase">
<defName>Chemical_ARA_Pheromone</defName>
<needClass>Need_Chemical</needClass>
@@ -118,7 +105,6 @@
<fallPerDay>0.333</fallPerDay>
<listPriority>50</listPriority>
</NeedDef>
<HediffDef ParentName="AddictionBase">
<defName>ARA_PheromoneAddiction</defName>
<label>信息素依赖</label>
@@ -147,7 +133,6 @@
</li>
</stages>
</HediffDef>
<ThoughtDef>
<defName>ARA_PheromoneWithdrawal</defName>
<workerClass>ThoughtWorker_Hediff</workerClass>
@@ -164,5 +149,4 @@
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@@ -33,6 +33,31 @@
<allowedArchonexusCount>150</allowedArchonexusCount>
</ThingDef>
<!-- The meal produced by the new dispenser -->
<ThingDef ParentName="MealBase">
<defName>ARA_NutrientPasteMeal</defName>
<label>阿拉克涅蜜晶糕</label>
<description>一种由虫蜜合成的黏糊糕点,能提供虫族生存所需,味道对于虫族来说不太可口,不过普通的人类也许会喜欢这种虫族合成的糕点。</description>
<graphicData>
<texPath>Things/Item/Meal/NutrientPaste</texPath>
<graphicClass>Graphic_StackCount</graphicClass>
</graphicData>
<statBases>
<MarketValue>10</MarketValue>
<Nutrition>2.0</Nutrition>
</statBases>
<ingestible>
<foodType>AnimalProduct</foodType>
<preferability>MealFine</preferability>
<joy>0.04</joy>
<joyKind>Gluttonous</joyKind>
<ingestEffect>EatVegetarian</ingestEffect>
<ingestSound>Meal_Eat</ingestSound>
<lowPriorityCaravanFood>true</lowPriorityCaravanFood>
<babiesCanIngest>true</babiesCanIngest>
</ingestible>
</ThingDef>
<ThingDef ParentName="ResourceBase">
<defName>ARA_Carapace</defName>
<label>甲壳素</label>

View File

@@ -38,6 +38,9 @@
<defName>ARA_Bodystocking_White</defName>
<label>连身白丝</label>
<description>阿拉克涅虫群的装饰性织物,对于虫群来说应该是没啥用的东西。</description>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Cloth</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Apparel/ARA_Bodystocking_White</texPath>
</graphicData>
@@ -58,6 +61,9 @@
<defName>ARA_Bodystocking_Black</defName>
<label>连身黑丝</label>
<description>阿拉克涅虫群的装饰性织物,对于虫群来说应该是没啥用的东西。</description>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Cloth</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Apparel/ARA_Bodystocking_Black</texPath>
</graphicData>
@@ -155,7 +161,10 @@
<ThingDef ParentName="ARA_ClothBase">
<defName>ARA_Maid_Uniform</defName>
<label>阿拉克涅女仆装</label>
<description>阿拉克涅督虫们所着织物中的一种,是她们永远服侍虫巢形象的完美具现化。</description>
<description>阿拉克涅督虫们所着织物中的一种,设计上修身轻便,可以使其在阿拉克捏菌毯上获得额外的速度,是她们永远服侍虫巢形象的完美具现化。</description>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Cloth</ThingDef>
</descriptionHyperlinks>
<recipeMaker Inherit="False">
<researchPrerequisite>ARA_Technology_4DIL</researchPrerequisite>
</recipeMaker>
@@ -179,12 +188,11 @@
<wornGraphicPath>ArachnaeSwarm/Apparel/ARA_Maid_Uniform</wornGraphicPath>
</apparel>
<equippedStatOffsets>
<MoveSpeed>0.25</MoveSpeed>
</equippedStatOffsets>
<costStuffCount>0</costStuffCount>
<comps>
<li Class="CompProperties_CauseHediff_Apparel">
<hediff>ARA_TerrainBasedHediff</hediff>
<hediff>ARA_TerrainMoveSpeedHediff</hediff>
</li>
</comps>
</ThingDef>

View File

@@ -5,6 +5,9 @@
<defName>ARA_MW_Bone_Sword</defName>
<label>武装器官"骨刃"</label>
<description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。尽管它只是一块坚硬的剑形骨片,但是丝毫不影响那些拥有无穷蛮力的阿拉克涅虫群督虫使用它将侵犯虫巢之敌一一斩首。</description>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Weapon</ThingDef>
</descriptionHyperlinks>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Melee</li>
@@ -72,6 +75,9 @@
<description>阿拉克涅虫群督虫使用基础远程武装器官,外表就像一只拳套,可以通过神经束缠绕接在阿拉克涅督虫的辅肢上。这种武器小巧轻盈,虽然射程很短,但是面对敌人时能喷出一整排的带毒尖刺,把对手扎个透心凉。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Weapon</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Fist_Needle_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -170,6 +176,9 @@
<description>阿拉克涅虫群督虫所使用的武装器官,拥有四排刺针管道,可以在联结神经束的指挥下交替发射大量的毒针,虽然准度较差但是威力不逊色于人类所使用的机枪。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Weapon_1Stage</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Fist_Needle_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -179,7 +188,7 @@
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_5PAV</researchPrerequisite>
<researchPrerequisite>ARA_Technology_6PAV</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
@@ -239,6 +248,9 @@
<description>阿拉克涅虫群督虫使用基础远程武装器官,可以通过肌肉的瞬间加压喷出一团包含阿拉克涅酸液的液体团。这种酸液团的飞行速度很慢,但是能在目标地点炸开,并灼烧所有粘上酸液的敌人。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Weapon</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -345,6 +357,9 @@
<description>阿拉克涅虫群督虫使用大型远程武装器官,膛内布满了强健的肌肉组织,可以在一瞬间的收缩后将一团酸液发射到空中,以在安全距离下对敌人的集群进行轰炸。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Weapon_1Stage</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -353,7 +368,7 @@
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_7VXI</researchPrerequisite>
<researchPrerequisite>ARA_Technology_8VXI</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
@@ -454,6 +469,9 @@
<description>阿拉科涅虫群的生物武器</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<descriptionHyperlinks>
<ThingDef>ARA_Cocoon_Weapon_1Stage</ThingDef>
</descriptionHyperlinks>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -628,4 +646,83 @@
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
</ThingDef>
<!-- 炮塔 -->
<ThingDef ParentName="BaseWeaponTurret">
<defName>ARA_Psi_Conductor_Turret</defName>
<label>灵能导线</label>
<description>阿拉克涅织域种正在通过这个殖民者对敌方发起攻击——这种攻击的发动无关殖民者的状态,无论它目前在干什么,攻击都会照常进行。</description>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<descriptionHyperlinks>
<HediffDef>ARA_Psi_Conductor</HediffDef>
</descriptionHyperlinks>
<statBases>
<AccuracyTouch>1</AccuracyTouch>
<AccuracyShort>1</AccuracyShort>
<AccuracyMedium>1</AccuracyMedium>
<AccuracyLong>1</AccuracyLong>
<Mass>5</Mass>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<defaultProjectile>Bullet_ARA_Psi_Conductor_Turret</defaultProjectile>
<range>6</range>
<burstShotCount>1</burstShotCount>
<soundCast>AgonyPulse_Cast</soundCast>
<soundCastTail>GunTail_Medium</soundCastTail>
<muzzleFlashScale>9</muzzleFlashScale>
<defaultCooldownTime>4</defaultCooldownTime>
</li>
</verbs>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_Psi_Conductor_Turret</defName>
<label>灵能闪电</label>
<thingClass>Beam</thingClass>
<graphicData>
<texPath>Things/Projectile/Bullet_Small</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>
<damageDef>ARA_Psi_Damage</damageDef>
<damageAmountBase>4</damageAmountBase>
<beamMoteDef>ARA_Psi_Conductor_Turret_ArcBeam</beamMoteDef>
<beamStartOffset>0.5</beamStartOffset>
<armorPenetrationBase>1</armorPenetrationBase>
</projectile>
</ThingDef>
<ThingDef ParentName="MoteBase">
<defName>ARA_Psi_Conductor_Turret_ArcBeam</defName>
<thingClass>MoteDualAttached</thingClass>
<altitudeLayer>MoteOverhead</altitudeLayer>
<mote>
<fadeInTime>0</fadeInTime>
<fadeOutTime>1</fadeOutTime>
<solidTime>0.4</solidTime>
<needsMaintenance>False</needsMaintenance>
<rotateTowardsTarget>True</rotateTowardsTarget>
<scaleToConnectTargets>True</scaleToConnectTargets>
<fadeOutUnmaintained>False</fadeOutUnmaintained>
</mote>
<drawOffscreen>true</drawOffscreen>
<graphicData>
<texPath>ArachnaeSwarm/Mote/ARA_Lighting_Beam</texPath>
<color>(140, 49, 138, 255)</color>
<graphicClass>Graphic_MoteWithAgeSecs</graphicClass>
<shaderType>MoteGlow</shaderType>
<drawSize>(1.5,1)</drawSize>
<shaderParameters>
<_ExtraTexA>/Things/Mote/BeamSecondaryNoise_A</_ExtraTexA>
<_ExtraTexB>/Things/Mote/BeamSecondaryNoise_B</_ExtraTexB>
<_ScrollSpeedA>-4 </_ScrollSpeedA>
<_ScrollSpeedB>3</_ScrollSpeedB>
<_Intensity>2</_Intensity>
</shaderParameters>
</graphicData>
</ThingDef>
</Defs>

View File

@@ -447,4 +447,147 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>ARA_MorphableResearchBench</defName>
<hasInteractionCell>true</hasInteractionCell>
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
<label>阿拉克涅织域织座</label>
<description>一个供阿拉克涅虫族进行研究的活体结构,可以让虫群尽情地探索变异和进化方向。其研究能力完全取决于内部的阿拉克涅织域种。</description>
<thingClass>ArachnaeSwarm.Building_Morphable</thingClass>
<tickerType>Normal</tickerType>
<size>(3,3)</size>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_ResearchBench</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(3,4.5)</drawSize>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<castEdgeShadows>false</castEdgeShadows>
<fillPercent>0.8</fillPercent>
<staticSunShadowHeight>0</staticSunShadowHeight>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<statBases>
<MaxHitPoints>1000</MaxHitPoints>
<WorkToBuild>2800</WorkToBuild>
<Flammability>1.0</Flammability>
<ResearchSpeedFactor>1.0</ResearchSpeedFactor>
</statBases>
<uiOrder>2600</uiOrder>
<surfaceType>Item</surfaceType>
<building>
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
<deconstructible>false</deconstructible>
</building>
<!-- 不可建造,只能通过变形生成 -->
<comps Inherit="False">
<li Class="CompProperties_ReportWorkSpeed">
<workSpeedStat>ResearchSpeedFactor</workSpeedStat>
</li>
<li Class="ArachnaeSwarm.CompProperties_Morphable">
<!-- 休息速度增益例如1.0代表200%的速度 -->
<restGainMultiplier>1.0</restGainMultiplier>
<!-- 操作按钮的自定义标签 -->
<gizmoLabel>离开织座</gizmoLabel>
<!-- 操作按钮的自定义描述 -->
<gizmoDesc>使织域种离开织座。</gizmoDesc>
<!--
操作按钮的自定义图标路径。
路径相对于"Textures"文件夹。
例如,如果你的图标在 "YourMod/Textures/UI/Icons/Revert.png",路径就是 "UI/Icons/Revert"。
游戏会自动处理.png扩展名。
-->
<gizmoIconPath>UI/Commands/EggSpew</gizmoIconPath>
</li>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelCapacity>2.0</fuelCapacity>
<targetFuelLevelConfigurable>false</targetFuelLevelConfigurable>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<outOfFuelMessage>没有营养</outOfFuelMessage>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>ARA_SmartThermostat</defName>
<label>阿拉克涅纤管虫</label>
<description>一只只有基础反射反应的阿拉克涅辅虫,它会尝试将通过气体交换,维持尾部所向的房间的温度。必须像制冷器一样安装在墙上。</description>
<thingClass>ArachnaeSwarm.Building_SmartThermostat</thingClass>
<uiIconPath>ArachnaeSwarm/Building/ARA_SmartThermostat_south</uiIconPath>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_SmartThermostat</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<drawSize>(1.75,1.75)</drawSize>
<shadowData>
<volume>(0.6, 0.4, 0.3)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<uiIconScale>0.6</uiIconScale>
<altitudeLayer>BuildingOnTop</altitudeLayer>
<passability>Impassable</passability>
<blockWind>true</blockWind>
<fillPercent>1</fillPercent>
<coversFloor>true</coversFloor>
<blockLight>true</blockLight>
<blockWeather>true</blockWeather>
<castEdgeShadows>true</castEdgeShadows>
<canOverlapZones>false</canOverlapZones>
<staticSunShadowHeight>0</staticSunShadowHeight>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<statBases>
<WorkToBuild>400</WorkToBuild>
<MaxHitPoints>100</MaxHitPoints>
<Flammability>1.0</Flammability>
</statBases>
<tickerType>Rare</tickerType>
<costList>
<ARA_Carapace>30</ARA_Carapace>
</costList>
<placeWorkers>
<li>PlaceWorker_Vent</li>
</placeWorkers>
<drawPlaceWorkersWhileSelected>true</drawPlaceWorkersWhileSelected>
<building>
<canPlaceOverWall>true</canPlaceOverWall>
<canExchangeVacuum>true</canExchangeVacuum>
<isAirtight>true</isAirtight>
</building>
<researchPrerequisites>
<li>ARA_Technology_6SHL</li>
</researchPrerequisites>
<designationCategory>ARA_Buildings</designationCategory>
<comps>
<!-- 提供开关按钮 -->
<li Class="CompProperties_Flickable">
<commandTexture>UI/Commands/Vent</commandTexture>
<commandLabelKey>CommandDesignateOpenCloseVentLabel</commandLabelKey>
<commandDescKey>CommandDesignateOpenCloseVentDesc</commandDescKey>
</li>
<!-- 提供温度控制UI和逻辑 -->
<li Class="ArachnaeSwarm.CompProperties_TempControl_Fixed">
<!-- 这是设备的热交换功率。数值越大,制冷/制热速度越快。-->
<energyPerSecond>2</energyPerSecond>
</li>
<li Class="CompProperties_Breakdownable"/>
</comps>
</ThingDef>
</Defs>

View File

@@ -66,8 +66,8 @@
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
<li>ARA_Technology_1KYC</li>
</researchPrerequisites>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
@@ -219,6 +219,10 @@
<graphicData>
<drawSize>(1.2,1.2)</drawSize>
</graphicData>
<researchPrerequisites>
<li>ARA_Technology_2KYC</li>
<li>ARA_Technology_4KYC</li>
</researchPrerequisites>
<comps>
<li Class="CompProperties_Glower">
@@ -276,6 +280,135 @@
<defName>ARA_InteractiveEggSac_Huge_1Stage</defName>
<label>大型阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只大型督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为-10~22°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Myrmecocystus</ThingDef>
<ThingDef>ArachnaeNode_Race_Smokepop</ThingDef>
<ThingDef>ArachnaeNode_Race_NeuroSwarm</ThingDef>
</descriptionHyperlinks>
<graphicData>
<color>(0.9, 0.9 ,0.5)</color>
<drawSize>(1.4,1.4)</drawSize>
</graphicData>
<researchPrerequisites>
<li>ARA_Technology_5KYC</li>
<li>ARA_Technology_6KYC</li>
</researchPrerequisites>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(230, 230, 128, 0)</glowColor>
</li>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delayTicks>180000</delayTicks>
</li>
<li>
<pawnKind>ArachnaeNode_Race_Smokepop</pawnKind>
<delayTicks>360000</delayTicks>
<requiredResearch>ARA_Technology_5KYC</requiredResearch>
</li>
<li>
<pawnKind>ArachnaeNode_Race_NeuroSwarm</pawnKind>
<delayTicks>1440000</delayTicks>
<requiredResearch>ARA_Technology_6KYC</requiredResearch>
</li>
</spawnablePawns>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<destroyOnSpawn>true</destroyOnSpawn>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-10</minSafeTemperature>
<maxSafeTemperature>22</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<!-- T2 -->
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac_2Stage</defName>
<label>阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_2Stage</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_2Stage</defName>
<label>阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为0~18°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_ShieldHead</ThingDef>
<ThingDef>ArachnaeNode_Race_WeaponSmith</ThingDef>
<ThingDef>ArachnaeNode_Race_Fighter</ThingDef>
<ThingDef>ArachnaeNode_Race_Skyraider</ThingDef>
<ThingDef>ArachnaeNode_Race_Facehugger</ThingDef>
</descriptionHyperlinks>
<graphicData>
<drawSize>(1.2,1.2)</drawSize>
</graphicData>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(113,141,117,0)</glowColor>
</li>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_ShieldHead</pawnKind>
<delayTicks>120000</delayTicks>
</li>
<li>
<pawnKind>ArachnaeNode_Race_WeaponSmith</pawnKind>
<delayTicks>180000</delayTicks>
</li>
<li>
<pawnKind>ArachnaeNode_Race_Fighter</pawnKind>
<delayTicks>120000</delayTicks>
<requiredResearch>ARA_Technology_1KYC</requiredResearch>
</li>
<li>
<pawnKind>ArachnaeNode_Race_Facehugger</pawnKind>
<delayTicks>420000</delayTicks>
<requiredResearch>ARA_Technology_4KYC</requiredResearch>
</li>
<li>
<pawnKind>ArachnaeNode_Race_Skyraider</pawnKind>
<delayTicks>360000</delayTicks>
<requiredResearch>ARA_Technology_2KYC</requiredResearch>
</li>
</spawnablePawns>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<destroyOnSpawn>true</destroyOnSpawn>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>0</minSafeTemperature>
<maxSafeTemperature>18</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac_Huge_2Stage</defName>
<label>大型阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_Huge_2Stage</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_Huge_2Stage</defName>
<label>大型阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只大型督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为-10~22°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Myrmecocystus</ThingDef>
<ThingDef>ArachnaeNode_Race_Smokepop</ThingDef>
@@ -316,4 +449,541 @@
</li>
</comps>
</ThingDef>
<ThingDef Name="ARA_Cocoon_Base" ParentName="BuildingBase" Abstract="True">
<thingClass>Building</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Cocoon</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(1.1,1.1)</drawSize>
<shadowData>
<volume>(0.7, 0.4, 0.7)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<size>(1,1)</size>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<fillPercent>0.3</fillPercent>
<rotatable>false</rotatable>
<tickerType>Normal</tickerType>
<statBases>
<MaxHitPoints>50</MaxHitPoints>
<Flammability>1</Flammability>
</statBases>
<building>
<deconstructible>false</deconstructible>
<repairable>false</repairable>
</building>
<comps>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>
<li Class="CompProperties_SpawnerFilth">
<filthDef>Filth_Slime</filthDef>
<spawnCountOnSpawn>10</spawnCountOnSpawn>
<spawnMtbHours>4</spawnMtbHours>
<spawnRadius>5</spawnRadius>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>2.5</spawnRadius>
</li>
</comps>
</ThingDef>
<!-- T0 -->
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Proj_Cloth</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Cloth</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Cloth</defName>
<label>阿拉克涅孵化茧 织物</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一套基础织物装备的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-30~55°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_Bodystocking_White</ThingDef>
<ThingDef>ARA_Bodystocking_Black</ThingDef>
<ThingDef>ARA_Maid_Uniform</ThingDef>
</descriptionHyperlinks>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>虫蜜</fuelLabel>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_Bodystocking_White</thingDef>
<productionTicks>6000</productionTicks>
<totalNutritionNeeded>1</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_Bodystocking_Black</thingDef>
<productionTicks>6000</productionTicks>
<totalNutritionNeeded>1</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_Maid_Uniform</thingDef>
<productionTicks>18000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>-30</minSafeTemperature>
<maxSafeTemperature>55</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-30</minSafeTemperature>
<maxSafeTemperature>55</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Proj_Weapon</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Weapon</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Weapon</defName>
<label>阿拉克涅孵化茧 武装器官</label>
<description>一个布满尖刺的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一个武装器官的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-20~35°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_MW_Bone_Sword</ThingDef>
<ThingDef>ARA_RW_Basic_Acid_Bladder_Gun</ThingDef>
<ThingDef>ARA_RW_Basic_Fist_Needle_Gun</ThingDef>
</descriptionHyperlinks>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>虫蜜</fuelLabel>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_MW_Bone_Sword</thingDef>
<productionTicks>60000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_RW_Basic_Fist_Needle_Gun</thingDef>
<productionTicks>40000</productionTicks>
<totalNutritionNeeded>10</totalNutritionNeeded>
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
</li>
<li>
<thingDef>ARA_RW_Basic_Acid_Bladder_Gun</thingDef>
<productionTicks>80000</productionTicks>
<totalNutritionNeeded>30</totalNutritionNeeded>
<requiredResearch>ARA_Technology_7VXI</requiredResearch>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>-20</minSafeTemperature>
<maxSafeTemperature>35</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-20</minSafeTemperature>
<maxSafeTemperature>35</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<!-- T1 -->
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Proj_Cloth_1Stage</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Cloth_1Stage</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Cloth_1Stage</defName>
<label>阿拉克涅孵化茧 织物</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一套基础织物装备的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-30~55°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_Bodystocking_White</ThingDef>
<ThingDef>ARA_Bodystocking_Black</ThingDef>
</descriptionHyperlinks>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>虫蜜</fuelLabel>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_Bodystocking_White</thingDef>
<productionTicks>6000</productionTicks>
<totalNutritionNeeded>1</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_Bodystocking_Black</thingDef>
<productionTicks>6000</productionTicks>
<totalNutritionNeeded>1</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_Maid_Uniform</thingDef>
<productionTicks>18000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>-30</minSafeTemperature>
<maxSafeTemperature>55</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-30</minSafeTemperature>
<maxSafeTemperature>55</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Proj_Weapon_1Stage</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Weapon_1Stage</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Weapon_1Stage</defName>
<label>阿拉克涅孵化茧 武装器官</label>
<description>一个布满尖刺的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一个武装器官的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-20~35°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_MW_Bone_Sword</ThingDef>
<ThingDef>ARA_RW_Basic_Acid_Bladder_Gun</ThingDef>
<ThingDef>ARA_RW_Basic_Fist_Needle_Gun</ThingDef>
</descriptionHyperlinks>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>虫蜜</fuelLabel>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_MW_Bone_Sword</thingDef>
<productionTicks>60000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_RW_Basic_Fist_Needle_Gun</thingDef>
<productionTicks>40000</productionTicks>
<totalNutritionNeeded>10</totalNutritionNeeded>
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
</li>
<li>
<thingDef>ARA_RW_Basic_Acid_Bladder_Gun</thingDef>
<productionTicks>80000</productionTicks>
<totalNutritionNeeded>30</totalNutritionNeeded>
<requiredResearch>ARA_Technology_7VXI</requiredResearch>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>-20</minSafeTemperature>
<maxSafeTemperature>35</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-20</minSafeTemperature>
<maxSafeTemperature>35</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<!-- 医药 -->
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Proj_Medicine</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Medicine</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Medicine</defName>
<label>阿拉克涅孵化茧 医药</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅蜜罐种所诞之卵,内含孵化一组医疗用品或化学品的营养物质,可以通过阿拉克涅蜜罐种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为0~12°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_PheromoneSolvent</ThingDef>
</descriptionHyperlinks>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>虫蜜</fuelLabel>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_Medicine</thingDef>
<productionTicks>36000</productionTicks>
<totalNutritionNeeded>10</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_PheromoneSolvent</thingDef>
<productionTicks>72000</productionTicks>
<totalNutritionNeeded>20</totalNutritionNeeded>
<requiredResearch>ARA_Technology_2MED</requiredResearch>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_Myrmecocystus</li>
</whitelist>
<spawnCount>10</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>0</minSafeTemperature>
<maxSafeTemperature>12</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>0</minSafeTemperature>
<maxSafeTemperature>12</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -1,269 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef Name="ARA_Cocoon_Base" ParentName="BuildingBase" Abstract="True">
<thingClass>Building</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Cocoon</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(1.1,1.1)</drawSize>
<shadowData>
<volume>(0.7, 0.4, 0.7)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<size>(1,1)</size>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<fillPercent>0.3</fillPercent>
<rotatable>false</rotatable>
<tickerType>Normal</tickerType>
<statBases>
<MaxHitPoints>50</MaxHitPoints>
<Flammability>1</Flammability>
</statBases>
<building>
<deconstructible>false</deconstructible>
<repairable>false</repairable>
</building>
<comps>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>
<li Class="CompProperties_SpawnerFilth">
<filthDef>Filth_Slime</filthDef>
<spawnCountOnSpawn>10</spawnCountOnSpawn>
<spawnMtbHours>4</spawnMtbHours>
<spawnRadius>5</spawnRadius>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>2.5</spawnRadius>
</li>
</comps>
</ThingDef>
<!-- T0 -->
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Cloth</defName>
<label>投放织物孵化茧</label>
<description>投放一枚织物茧,内含可以孵化一套基础织物的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Cloth_Proj</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_4DIL</requiredResearch>
<failMessage>需要科技 基因节点DIL-4"编织" 以解锁此孵化路径</failMessage>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Cloth_Proj</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Cloth</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Cloth</defName>
<label>阿拉克涅孵化茧 基础织物</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一套基础织物装备的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-30~55°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_Bodystocking_White</ThingDef>
<ThingDef>ARA_Bodystocking_Black</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Technology_4DIL</li>
</researchPrerequisites>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>营养</fuelLabel>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_Bodystocking_White</thingDef>
<productionTicks>6000</productionTicks>
<totalNutritionNeeded>1</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_Bodystocking_Black</thingDef>
<productionTicks>6000</productionTicks>
<totalNutritionNeeded>1</totalNutritionNeeded>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>-30</minSafeTemperature>
<maxSafeTemperature>55</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-30</minSafeTemperature>
<maxSafeTemperature>55</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_Cocoon_Weapon</defName>
<label>投放武装器官孵化茧</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Weapon_Proj</projectileDef>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Weapon_Proj</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Weapon</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Weapon</defName>
<label>阿拉克涅孵化茧 武装器官</label>
<description>一个布满尖刺的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一个武装器官的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-20~35°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_MW_Bone_Sword</ThingDef>
<ThingDef>ARA_RW_Basic_Acid_Bladder_Gun</ThingDef>
<ThingDef>ARA_RW_Basic_Fist_Needle_Gun</ThingDef>
</descriptionHyperlinks>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10</fuelCapacity>
<fuelLabel>营养</fuelLabel>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
</li>
<!-- The refactored producer component -->
<li Class="ArachnaeSwarm.CompProperties_InteractiveProducer">
<processes>
<li>
<thingDef>ARA_MW_Bone_Sword</thingDef>
<productionTicks>60000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
</li>
<li>
<thingDef>ARA_RW_Basic_Fist_Needle_Gun</thingDef>
<productionTicks>40000</productionTicks>
<totalNutritionNeeded>10</totalNutritionNeeded>
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
</li>
<li>
<thingDef>ARA_RW_Basic_Acid_Bladder_Gun</thingDef>
<productionTicks>80000</productionTicks>
<totalNutritionNeeded>30</totalNutritionNeeded>
<requiredResearch>ARA_Technology_7VXI</requiredResearch>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>-20</minSafeTemperature>
<maxSafeTemperature>35</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
<qualityThresholds>
<li>
<quality>Legendary</quality>
<threshold>0.99</threshold>
</li>
<li>
<quality>Masterwork</quality>
<threshold>0.90</threshold>
</li>
<li>
<quality>Excellent</quality>
<threshold>0.70</threshold>
</li>
<li>
<quality>Good</quality>
<threshold>0.50</threshold>
</li>
<li>
<quality>Normal</quality>
<threshold>0.20</threshold>
</li>
<li>
<quality>Poor</quality>
<threshold>0.10</threshold>
</li>
</qualityThresholds>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-20</minSafeTemperature>
<maxSafeTemperature>35</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="BuildingBase">
<defName>ARANutrientDispenser</defName>
<label>阿拉克涅蜜晶巢穴</label>
<description>一个生产阿拉克涅蜜晶糕的虫虫巢穴。通过分解虫蜜来生产可食用的蜜晶糕。</description>
<thingClass>ArachnaeSwarm.Building_ARANutrientDispenser</thingClass>
<graphicData>
<texPath>Things/Building/Production/NutrientDispenser</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<color>(232,255,191)</color>
<shaderType>CutoutComplex</shaderType>
<drawSize>(3,4)</drawSize>
<damageData>
<rect>(0.02,0.25,2.96,2.85)</rect>
<cornerTL>Damage/Corner</cornerTL>
<cornerTR>Damage/Corner</cornerTR>
</damageData>
<shadowData>
<volume>(2.87,0.75,3.05)</volume>
<offset>(0,0,0.38)</offset>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<pathCost>150</pathCost>
<fillPercent>1.0</fillPercent>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>2000</WorkToBuild>
<Flammability>0.5</Flammability>
</statBases>
<size>(3,4)</size>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<tickerType>Normal</tickerType>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<comps>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
<!-- This component acts as a perpetual power source with no consumption, ensuring powerComp.PowerOn is always true -->
<li Class="CompProperties_Power">
<compClass>CompPowerPlant</compClass>
<basePowerConsumption>-1</basePowerConsumption> <!-- Negative value makes it a generator -->
<transmitsPower>false</transmitsPower> <!-- This is CRITICAL. It prevents the building from powering the whole grid. -->
</li>
</comps>
<modExtensions>
<li Class="ArachnaeSwarm.ARAFoodDispenserProperties">
<thingToDispense>ARA_NutrientPasteMeal</thingToDispense>
<nutritionCostPerDispense>0.5</nutritionCostPerDispense>
<soundDispense>DispensePaste</soundDispense>
</li>
</modExtensions>
<building>
<isMealSource>true</isMealSource>
</building>
<interactionCellOffset>(0,0,3)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>ARA_Buildings</designationCategory>
<researchPrerequisites>
<li>NutrientPaste</li>
</researchPrerequisites>
</ThingDef>
</Defs>

View File

@@ -7,10 +7,11 @@
<description>一个中央营养供给设施。它可以自动为链接到的、需要营养的建筑补充燃料。它本身需要被手动填充大量的生物质。</description>
<size>(5,5)</size>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_ResearchBench</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<texPath>ArachnaeSwarm/Building/ARA_NutrientNetworkTower</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(5,6.7)</drawSize>
<drawSize>(7,7)</drawSize>
<drawOffset>(0, 0, 0.8)</drawOffset>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
@@ -18,7 +19,7 @@
<tickerType>Normal</tickerType> <!-- 改为 Normal 以匹配 CompRefuelable 的要求 -->
<fillPercent>0.5</fillPercent>
<statBases>
<MaxHitPoints>300</MaxHitPoints>
<MaxHitPoints>3000</MaxHitPoints>
<WorkToBuild>3000</WorkToBuild>
<Mass>20</Mass>
<Flammability>0.5</Flammability>
@@ -26,7 +27,14 @@
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<comps>
<li Class="CompProperties_Glower">
<overlightRadius>7.0</overlightRadius>
<glowRadius>14</glowRadius>
<glowColor>(220,210,171,0)</glowColor>
<colorPickerEnabled>true</colorPickerEnabled>
</li>
<!-- 供能核心组件 -->
<li Class="ArachnaeSwarm.CompProperties_NutrientProvider">
<linkableBuildings>
@@ -37,6 +45,8 @@
<li>ARA_JellyVat</li>
<li>ARA_GrowthVat</li>
<li>ARA_MorphableResearchBench</li>
<li>ARANutrientDispenser</li>
<li>ARA_WormholePortal_A</li>
</linkableBuildings>
<maxDistance>80</maxDistance> <!-- 供能范围 -->
<maxSimultaneous>10</maxSimultaneous>
@@ -51,20 +61,22 @@
<li>ARA_JellyVat</li>
<li>ARA_GrowthVat</li>
<li>ARA_MorphableResearchBench</li>
<li>ARANutrientDispenser</li>
<li>ARA_WormholePortal_A</li>
</linkableBuildings>
<maxDistance>80</maxDistance>
<lineTexturePath>ArachnaeSwarm/Building/Nutrition_Pie</lineTexturePath>
</li>
<!-- 自身的燃料库 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10000.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
<li>Corpses</li>
</categories>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>
@@ -187,13 +199,13 @@
<!-- b. 我们的营养燃料组件 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>100.0</fuelCapacity>
<fuelCapacity>20.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>
@@ -284,13 +296,13 @@
<!-- b. 我们的营养燃料组件 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>100.0</fuelCapacity>
<fuelCapacity>20.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>
@@ -352,6 +364,7 @@
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
</building>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<comps>
<li Class="CompProperties_Flickable"/>
@@ -371,30 +384,16 @@
<!-- 燃料槽 1: 素食 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
<saveKeysPrefix>veg_vat</saveKeysPrefix>
<fuelLabel>素食</fuelLabel>
<saveKeysPrefix>bio</saveKeysPrefix>
<fuelLabel>生物质</fuelLabel>
<fuelFilter>
<categories>
<li>PlantFoodRaw</li>
<li>Foods</li>
<li>Corpses</li>
</categories>
</fuelFilter>
<fuelCapacity>50</fuelCapacity>
<fuelConsumptionRate>12.5</fuelConsumptionRate>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<!-- 燃料槽 2: 肉类 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition_WithKey">
<saveKeysPrefix>meat_vat</saveKeysPrefix>
<fuelLabel>肉食</fuelLabel>
<fuelFilter>
<categories>
<li>MeatRaw</li>
<li>AnimalProductRaw</li>
</categories>
</fuelFilter>
<fuelCapacity>50</fuelCapacity>
<fuelConsumptionRate>12.5</fuelConsumptionRate>
<fuelConsumptionRate>25</fuelConsumptionRate>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
@@ -460,16 +459,17 @@
<workTableRoomRole>Laboratory</workTableRoomRole>
</building>
<constructionSkillPrerequisite>4</constructionSkillPrerequisite>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<comps>
<!-- 1. 作为消费者,自己也需要燃料 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>100.0</fuelCapacity>
<fuelCapacity>10.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- ==================== A端传送门 ==================== -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_WormholePortal_A</defName>
<label>阿拉克涅坑道虫虫洞</label>
<description>阿拉克涅虫洞网络的主体组成部分。它可以向远方发射尾巴作为虫洞出口,它是阿拉克涅坑道虫头部的一部分,装入虫洞的物体会被坑道虫加压移动从而快速旅行,虫洞允许双向通行。</description>
<thingClass>ArachnaeSwarm.Building_WormholePortal_A</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Wormhole_A</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(4,4)</drawSize>
<shadowData>
<volume>(1.6, 0.5, 1.6)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<tickerType>Normal</tickerType>
<category>Building</category>
<statBases>
<MaxHitPoints>1000</MaxHitPoints>
<WorkToBuild>8000</WorkToBuild>
<Flammability>0.5</Flammability>
<Mass>100</Mass>
</statBases>
<size>(2,2)</size>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<comps>
<li Class="CompProperties_Glower">
<overlightRadius>7.0</overlightRadius>
<glowRadius>14</glowRadius>
<glowColor>(220,210,171,0)</glowColor>
<colorPickerEnabled>true</colorPickerEnabled>
</li>
<li Class="CompProperties_Flickable"/>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>500.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>
<li Class="ArachnaeSwarm.CompProperties_LaunchableWormhole">
<fuelPerTile>2.5</fuelPerTile>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
</comps>
<designationCategory>ARA_Buildings</designationCategory>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<building>
<ai_chillDestination>false</ai_chillDestination>
</building>
<portal>
<traverseSound>TraversePitGate</traverseSound>
</portal>
</ThingDef>
<!-- ==================== B端传送门 ==================== -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_WormholePortal_B</defName>
<label>阿拉克涅坑道虫虫洞出口</label>
<description>一个被远程部署的虫洞出口。它是阿拉克涅坑道虫尾巴的一部分,装入虫洞的物体会被坑道虫加压移动从而快速旅行,虫洞允许双向通行。</description>
<thingClass>ArachnaeSwarm.Building_WormholePortal_B</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Wormhole_B</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(4,4)</drawSize>
<shadowData>
<volume>(1.6, 0.5, 1.6)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<statBases>
<MaxHitPoints>500</MaxHitPoints>
<Flammability>0.5</Flammability>
</statBases>
<size>(2,2)</size>
<comps>
<li Class="CompProperties_Glower">
<overlightRadius>7.0</overlightRadius>
<glowRadius>14</glowRadius>
<glowColor>(220,210,171,0)</glowColor>
<colorPickerEnabled>true</colorPickerEnabled>
</li>
<li Class="CompProperties_Flickable"/>
</comps>
<tradeability>None</tradeability>
<portal>
<traverseSound>TraversePitGate</traverseSound>
</portal>
</ThingDef>
<!-- CompProperties for our custom launchable -->
<!-- This is referenced by the li Class above -->
</Defs>

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="BuildingBase">
<defName>ARA_SmartThermostat</defName>
<label>阿拉克涅纤管虫</label>
<description>一个不耗电的温控虫虫。它是一个可逆的热泵,能自动制热或制冷以维持设定的目标温度。必须像制冷器一样安装在墙上。</description>
<thingClass>ArachnaeSwarm.Building_SmartThermostat</thingClass> <!-- 使用我们新的建筑类 -->
<graphicData>
<texPath>Things/Building/Misc/TempControl/Cooler</texPath> <!-- 暂时使用制冷器的贴图 -->
<graphicClass>Graphic_Multi</graphicClass>
<shadowData>
<volume>(0.6, 0.4, 0.3)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<blockWind>true</blockWind>
<fillPercent>1</fillPercent>
<coversFloor>true</coversFloor>
<blockLight>true</blockLight>
<blockWeather>true</blockWeather>
<castEdgeShadows>true</castEdgeShadows>
<canOverlapZones>false</canOverlapZones>
<staticSunShadowHeight>0</staticSunShadowHeight>
<statBases>
<WorkToBuild>400</WorkToBuild>
<MaxHitPoints>100</MaxHitPoints>
<Flammability>1.0</Flammability>
</statBases>
<tickerType>Rare</tickerType>
<costList>
<ARA_Carapace>30</ARA_Carapace>
</costList>
<terrainAffordanceNeeded>Medium</terrainAffordanceNeeded>
<placeWorkers>
<li>PlaceWorker_Vent</li>
</placeWorkers>
<drawPlaceWorkersWhileSelected>true</drawPlaceWorkersWhileSelected>
<building>
<canPlaceOverWall>true</canPlaceOverWall>
<canExchangeVacuum>true</canExchangeVacuum>
<isAirtight>true</isAirtight>
</building>
<researchPrerequisites>
<li>AirConditioning</li>
</researchPrerequisites>
<designationCategory>ARA_Buildings</designationCategory>
<comps>
<!-- 提供开关按钮 -->
<li Class="CompProperties_Flickable">
<commandTexture>UI/Commands/Vent</commandTexture>
<commandLabelKey>CommandDesignateOpenCloseVentLabel</commandLabelKey>
<commandDescKey>CommandDesignateOpenCloseVentDesc</commandDescKey>
</li>
<!-- 提供温度控制UI和逻辑 -->
<li Class="ArachnaeSwarm.CompProperties_TempControl_Fixed">
<!-- 这是设备的热交换功率。数值越大,制冷/制热速度越快。-->
<energyPerSecond>34</energyPerSecond>
</li>
<li Class="CompProperties_Breakdownable"/>
</comps>
</ThingDef>
</Defs>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThoughtDef>
<defName>ARA_CreepyCrawly</defName>
<workerClass>ThoughtWorker_Hediff</workerClass>
<hediff>ARA_CreepyCrawly_Hediff</hediff>
<validWhileDespawned>true</validWhileDespawned>
<stages>
<li>
<label>原始恐惧</label>
<description>受不了了,快把这些虫子从我身边支开!</description>
<baseMoodEffect>-30</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<TraitDef>
<defName>ARA_CreepyCrawly</defName>
<commonality>0</commonality>
<degreeDatas>
<li>
<degree>0</degree>
<label>节肢类昆虫</label>
<description>{PAWN_nameDef} 是一只巨大的节肢类昆虫,多对附肢、镜面反光的外骨骼和扭动的分节身体足以引发人类心底埋藏的强烈恐惧感。\n\n额你该不会真以为它们是一群美少女吧</description>
<marketValueFactorOffset>-1</marketValueFactorOffset>
</li>
</degreeDatas>
</TraitDef>
</Defs>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<WorldObjectDef>
<defName>ARA_TravelingWormhole</defName>
<label>掘进中的虫洞</label>
<worldObjectClass>ArachnaeSwarm.TravelingWormhole</worldObjectClass>
<texture>World/WorldObjects/Caravan</texture>
<useDynamicDrawer>true</useDynamicDrawer>
<expandingIcon>true</expandingIcon>
<expandingIconTexture>World/WorldObjects/Expanding/Caravan</expandingIconTexture>
<expandingIconPriority>100</expandingIconPriority>
<expandMore>true</expandMore>
<modExtensions>
<li Class="ArachnaeSwarm.DefModExtension_TravelingWormhole">
<travelSpeed>10</travelSpeed>
</li>
</modExtensions>
</WorldObjectDef>
</Defs>

View File

@@ -26,4 +26,5 @@
<MessageTrapSprung>{TRAP} 被 {PAWN} 触发!</MessageTrapSprung>
<MessageTrapSprung_NoInstigator>{TRAP} 被触发!</MessageTrapSprung_NoInstigator>
<delivery>{PAWN}生成了{THING}。</delivery>
</LanguageData>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
<!-- Commands & Messages -->
<CommandDeployWormholePortalB_Pilot>部署虫洞传送门</CommandDeployWormholePortalB_Pilot>
<CommandDeployWormholePortalB_PilotDesc>选择一名驾驶员来启动一个B端传送门。</CommandDeployWormholePortalB_PilotDesc>
<NoPilotAvailable>没有可用的驾驶员</NoPilotAvailable>
<ForceLaunch>无人驾驶发射</ForceLaunch>
</LanguageData>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
<!-- Commands & Messages -->
<CommandDeployWormholePortalB_Pilot>部署虫洞传送门</CommandDeployWormholePortalB_Pilot>
<CommandDeployWormholePortalB_PilotDesc>选择一名驾驶员来启动一个B端传送门。</CommandDeployWormholePortalB_PilotDesc>
<NoPilotAvailable>没有可用的驾驶员</NoPilotAvailable>
</LanguageData>

BIN
About/preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1,16 +1,7 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\verb\\verb_shootmeltbeam.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:verb\\verb_shootmeltbeam.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\verb\\compcleave.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:verb\\compcleave.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 0,
@@ -18,36 +9,11 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"SelectedChildIndex": -1,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "Verb_ShootMeltBeam.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\Verb_ShootMeltBeam.cs",
"RelativeDocumentMoniker": "Verb\\Verb_ShootMeltBeam.cs",
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\Verb_ShootMeltBeam.cs",
"RelativeToolTip": "Verb\\Verb_ShootMeltBeam.cs",
"ViewState": "AQIAAAAAAAAAAAAAAADwvwAAAAAAAAAA",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-09-09T03:04:00.299Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "CompCleave.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\CompCleave.cs",
"RelativeDocumentMoniker": "Verb\\CompCleave.cs",
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\CompCleave.cs",
"RelativeToolTip": "Verb\\CompCleave.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAmAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-09-09T03:03:30.118Z"
}
]
}

View File

@@ -0,0 +1,12 @@
using Verse;
using Verse.Sound;
namespace ArachnaeSwarm
{
public class ARAFoodDispenserProperties : DefModExtension
{
public ThingDef thingToDispense;
public float nutritionCostPerDispense = 0.3f;
public SoundDef soundDispense;
}
}

View File

@@ -0,0 +1,32 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompAbilityEffect_GiveSwitchHediff : CompAbilityEffect
{
public new CompProperties_AbilityGiveHediff Props => (CompProperties_AbilityGiveHediff)props;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
if (Props.hediffDef != null)
{
parent.pawn.health.AddHediff(Props.hediffDef);
}
}
public override bool ShouldHideGizmo
{
get
{
// 如果父级Pawn已经有了这个Hediff就隐藏“给予”按钮
if (parent.pawn?.health.hediffSet.HasHediff(Props.hediffDef) ?? false)
{
return true;
}
return base.ShouldHideGizmo;
}
}
}
}

View File

@@ -0,0 +1,33 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompAbilityEffect_RemoveSwitchHediff : CompAbilityEffect
{
public new CompProperties_AbilityRemoveHediff Props => (CompProperties_AbilityRemoveHediff)props;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
Hediff firstHediffOfDef = parent.pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef);
if (firstHediffOfDef != null)
{
parent.pawn.health.RemoveHediff(firstHediffOfDef);
}
}
public override bool ShouldHideGizmo
{
get
{
// 如果父级Pawn没有这个Hediff就隐藏“移除”按钮
if (!parent.pawn?.health.hediffSet.HasHediff(Props.hediffDef) ?? true)
{
return true;
}
return base.ShouldHideGizmo;
}
}
}
}

View File

@@ -0,0 +1,202 @@
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_Switch : CompProperties_EquippableAbility
{
public ThingDef changeTo;
public CompProperties_Switch()
{
compClass = typeof(CompSwitch);
}
}
public class CompSwitch : CompEquippableAbility
{
public CompProperties_Switch Props => (CompProperties_Switch)props;
public HediffWithComps hediff;
public HediffComp_Disappears Disappears => hediff.GetComp<HediffComp_Disappears>();
public override void Notify_Equipped(Pawn pawn)
{
base.Notify_Equipped(pawn);
if (hediff != null)
{
pawn.health.AddHediff(hediff);
}
}
public override void Notify_Unequipped(Pawn pawn)
{
base.Notify_Unequipped(pawn);
if (hediff != null)
{
pawn.health.RemoveHediff(hediff);
}
}
public override string CompInspectStringExtra()
{
string text = "";
if (hediff != null)
{
text += hediff.LabelBase + ": " + Disappears.ticksToDisappear.ToStringSecondsFromTicks("F0");
}
return text;
}
public override void CompTick()
{
base.CompTick();
if (hediff != null)
{
float severityAdjustment = 0f;
Disappears.CompPostTick(ref severityAdjustment);
if (Disappears.ticksToDisappear <= 0)
{
hediff = null;
Extension.ChangeOldThing(parent, Props.changeTo);
}
}
}
public override void PostExposeData()
{
base.PostExposeData();
Scribe_References.Look(ref hediff, "hediff", true);
}
}
public class CompAbilityEffect_Switch : CompAbilityEffect
{
public Pawn Pawn => parent.pawn;
public ThingWithComps BaseForm => Pawn.equipment.Primary;
public ThingDef ChangeTo => BaseForm.GetComp<CompSwitch>().Props.changeTo;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
Pawn.ChangeEquipThing(BaseForm, ChangeTo);
}
public override bool AICanTargetNow(LocalTargetInfo target)
{
return true;
}
}
public class CompAbilityEffect_RemoveHediff : CompAbilityEffect
{
public Pawn Pawn => parent.pawn;
public ThingWithComps BaseForm => Pawn.equipment.Primary;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
CompSwitch comp = BaseForm.GetComp<CompSwitch>();
if (comp.hediff != null)
{
comp.Disappears.ticksToDisappear = 0;
Pawn.health.RemoveHediff(comp.hediff);
comp.hediff = null;
}
}
public override bool AICanTargetNow(LocalTargetInfo target)
{
return true;
}
}
public static class Extension
{
public static ThingWithComps ChangeThing(ThingWithComps baseForm, ThingDef changeTo)
{
int hitPoints = baseForm.HitPoints;
ThingDef stuff = null;
if (baseForm.Stuff != null)
{
stuff = baseForm.Stuff;
}
ThingWithComps newThing = (ThingWithComps)ThingMaker.MakeThing(changeTo, stuff);
newThing.HitPoints = hitPoints;
for (int i = 0; i < newThing.AllComps.Count; i++)
{
CompProperties Index = newThing.AllComps[i].props;
ThingComp baseComp = baseForm.GetCompByDefType(Index);
if (baseComp != null)
{
baseComp.parent = newThing;
newThing.AllComps[i] = baseComp;
}
}
CompSwitch compSwitch = newThing.GetComp<CompSwitch>();
compSwitch.Initialize(newThing.def.comps.Find(x => x.compClass == typeof(CompSwitch)));
ThingStyleDef styleDef = baseForm.StyleDef;
if (baseForm.def.randomStyle != null && newThing.def.randomStyle != null)
{
ThingStyleChance chance = baseForm.def.randomStyle.Find(x => x.StyleDef == styleDef);
int index = baseForm.def.randomStyle.IndexOf(chance);
newThing.StyleDef = newThing.def.randomStyle[index].StyleDef;
}
return newThing;
}
public static void ChangeOldThing(ThingWithComps baseForm, ThingDef changeTo)
{
ThingWithComps newThing = ChangeThing(baseForm, changeTo);
IntVec3 intVec3 = baseForm.Position;
Map map = baseForm.Map;
baseForm.Destroy();
GenSpawn.Spawn(newThing, intVec3, map);
}
public static void ChangeEquipThing(this Pawn pawn, ThingWithComps baseForm, ThingDef changeTo)
{
ThingWithComps newThing = ChangeThing(baseForm, changeTo);
pawn.equipment.DestroyEquipment(baseForm);
baseForm.Notify_Unequipped(pawn);
pawn.equipment.MakeRoomFor(newThing);
pawn.equipment.AddEquipment(newThing);
}
}
public class HediffCompPropertiesSwitch : HediffCompProperties_GiveAbility
{
public HediffCompPropertiesSwitch()
{
compClass = typeof(SwitchWhenDisappear);
}
}
public class SwitchWhenDisappear : HediffComp_GiveAbility
{
public HediffCompPropertiesSwitch Props => (HediffCompPropertiesSwitch)props;
public override void CompPostMake()
{
base.CompPostMake();
CompSwitch compSwitch = Pawn.equipment.Primary.GetComp<CompSwitch>();
compSwitch.hediff = parent;
}
public override void CompPostPostRemoved()
{
base.CompPostPostRemoved();
if (parent.ShouldRemove)
{
ThingWithComps thing = Pawn.equipment.Primary;
if (thing != null)
{
CompSwitch compSwitch = thing.GetComp<CompSwitch>();
compSwitch.hediff = null;
if (compSwitch != null)
{
Pawn.ChangeEquipThing(thing, compSwitch.Props.changeTo);
}
}
}
}
}
}

View File

@@ -21,7 +21,7 @@ namespace ArachnaeSwarm
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Deep.Look(ref storedPawn, "storedPawn", false);
Scribe_Deep.Look(ref storedPawn, "storedPawn");
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()

View File

@@ -68,6 +68,9 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Abilities\ARA_AbilitySwitch\CompAbilityEffect_GiveSwitchHediff.cs" />
<Compile Include="Abilities\ARA_AbilitySwitch\CompAbilityEffect_RemoveSwitchHediff.cs" />
<Compile Include="Abilities\ARA_AbilitySwitch\WeaponSwitch.cs" />
<Compile Include="Abilities\ARA_HuggingFace\CompAbilityEffect_Possess.cs" />
<Compile Include="Abilities\ARA_HuggingFace\CompProperties_AbilityPossess.cs" />
<Compile Include="Abilities\ARA_HuggingFace\Hediff_Possession.cs" />
@@ -130,6 +133,7 @@
<Compile Include="Hediffs\ARA_ConfigurableMutant\HediffComp_NecroticTransformation.cs" />
<Compile Include="Hediffs\ARA_ConfigurableMutant\HediffComp_Symbiosis.cs" />
<Compile Include="Hediffs\ARA_ConfigurableMutant\NecroticTransformationUtility.cs" />
<Compile Include="Hediffs\ARA_HediffComp_TopTurret\HediffComp_TopTurret.cs" />
<Compile Include="Hediffs\ARA_HiveMind\CompAbilityEffect_BindDrone.cs" />
<Compile Include="Hediffs\ARA_HiveMind\CompProperties_AbilityBindDrone.cs" />
<Compile Include="Hediffs\ARA_HiveMind\Hediff_HiveMindDrone.cs" />
@@ -143,6 +147,9 @@
<Compile Include="Hediffs\HediffComp_TerrainBasedSeverity\HediffComp_TerrainBasedSeverity.cs" />
<Compile Include="Hediffs\HediffComp_TerrainBasedSeverity\HediffCompProperties_TerrainBasedSeverity.cs" />
<Compile Include="Hediffs\HediffGiver_RandomWithSeverity.cs" />
<Compile Include="Hediffs\MoharHediffs\HediffCompProperties_Spawner.cs" />
<Compile Include="Hediffs\MoharHediffs\HediffComp_Spawner.cs" />
<Compile Include="Hediffs\MoharHediffs\Tools.cs" />
<Compile Include="Hediffs\ProphecyGearEffect.cs" />
<Compile Include="Hediffs\WULA_HediffDamgeShield\DRMDamageShield.cs" />
<Compile Include="Hediffs\WULA_HediffDamgeShield\Hediff_DamageShield.cs" />
@@ -194,6 +201,17 @@
<Compile Include="Verbs\VerbProperties_Excalibur.cs" />
<Compile Include="Verbs\WeaponStealBeam\Verb_ShootWeaponStealBeam.cs" />
<Compile Include="Verbs\WeaponStealBeam\VerbProperties_WeaponStealBeam.cs" />
<Compile Include="Building_ARANutrientDispenser.cs" />
<Compile Include="ARAFoodDispenserProperties.cs" />
<Compile Include="Patch_DispenserFoodSearch.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Wormhole\Building_WormholePortal_A.cs" />
<Compile Include="Wormhole\Building_WormholePortal_B.cs" />
<Compile Include="Wormhole\CompLaunchableWormhole.cs" />
<Compile Include="Wormhole\JobDriver_DeployWormhole.cs" />
<Compile Include="Wormhole\TravelingWormhole.cs" />
<Compile Include="Wormhole\DefModExtension_TravelingWormhole.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- 自定义清理任务删除obj文件夹中的临时文件 -->

View File

@@ -0,0 +1,77 @@
using RimWorld;
using Verse;
using Verse.Sound; // Ensure this is present
using System.Collections.Generic;
using System.Linq;
namespace ArachnaeSwarm
{
// By inheriting from Building_NutrientPasteDispenser, we automatically pass all "is Building_NutrientPasteDispenser" checks in the game's code.
public class Building_ARANutrientDispenser : Building_NutrientPasteDispenser
{
private CompRefuelableNutrition nutritionComp;
private ARAFoodDispenserProperties dispenserProps;
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
// We MUST call the base method for it to initialize the `powerComp` field,
// which we will provide via a dummy CompPowerPlant in the XML. This prevents NullReferenceExceptions.
base.SpawnSetup(map, respawningAfterLoad);
this.nutritionComp = this.GetComp<CompRefuelableNutrition>();
this.dispenserProps = this.def.GetModExtension<ARAFoodDispenserProperties>();
}
// We don't need to override CanDispenseNow. The base method is perfect if we handle its dependencies.
// The base CanDispenseNow checks powerComp.PowerOn (which our XML hack makes always true)
// and HasEnoughFeedstockInHoppers(), which we DO override below.
public override Thing TryDispenseFood()
{
// The base method is tightly coupled with hoppers. We must fully override it.
if (!this.HasEnoughFeedstockInHoppers()) // Directly check our condition
{
return null;
}
this.nutritionComp.ConsumeFuel(this.dispenserProps.nutritionCostPerDispense);
if (this.dispenserProps.soundDispense != null)
{
this.dispenserProps.soundDispense.PlayOneShot(new TargetInfo(this.Position, this.Map));
}
return ThingMaker.MakeThing(this.DispensableDef);
}
public override ThingDef DispensableDef
{
get
{
if (this.dispenserProps == null) return base.DispensableDef;
return this.dispenserProps.thingToDispense;
}
}
// --- Hopper-related overrides to decouple from them ---
public override Building AdjacentReachableHopper(Pawn reacher) => null;
public override Thing FindFeedInAnyHopper() => null;
public override bool HasEnoughFeedstockInHoppers()
{
// This is the crucial hook. The base CanDispenseNow and the AI's food search call this method.
// We replace the hopper check with our fuel check.
if (this.dispenserProps == null) return false;
return this.nutritionComp != null && this.nutritionComp.Fuel >= this.dispenserProps.nutritionCostPerDispense;
}
public override IEnumerable<Gizmo> GetGizmos()
{
// base.GetGizmos() provides the "Build Hopper" gizmo, which we don't want.
// We filter it out here.
return base.GetGizmos().Where(gizmo =>
!(gizmo is Designator_Build designator && designator.PlacingDef == ThingDefOf.Hopper)
);
}
}
}

View File

@@ -0,0 +1,268 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using Verse;
using Verse.AI;
using RimWorld;
namespace ArachnaeSwarm
{
public class HediffCompProperties_TopTurret : HediffCompProperties
{
public HediffCompProperties_TopTurret()
{
this.compClass = typeof(HediffComp_TopTurret);
}
public ThingDef turretDef;
public float angleOffset;
public bool autoAttack = true;
}
[StaticConstructorOnStartup]
public class HediffComp_TopTurret : HediffComp, IAttackTargetSearcher
{
public Thing Thing
{
get
{
return this.Pawn;
}
}
private HediffCompProperties_TopTurret Props
{
get
{
return (HediffCompProperties_TopTurret)this.props;
}
}
public Verb CurrentEffectiveVerb
{
get
{
return this.AttackVerb;
}
}
public LocalTargetInfo LastAttackedTarget
{
get
{
return this.lastAttackedTarget;
}
}
public int LastAttackTargetTick
{
get
{
return this.lastAttackTargetTick;
}
}
public CompEquippable GunCompEq
{
get
{
return this.gun.TryGetComp<CompEquippable>();
}
}
public Verb AttackVerb
{
get
{
return this.GunCompEq.PrimaryVerb;
}
}
private bool WarmingUp
{
get
{
return this.burstWarmupTicksLeft > 0;
}
}
private bool CanShoot
{
get
{
Pawn pawn;
if ((pawn = (this.Pawn)) != null)
{
if (!pawn.Spawned || pawn.Downed || pawn.Dead || !pawn.Awake())
{
return false;
}
if (pawn.stances.stunner.Stunned)
{
return false;
}
if (this.TurretDestroyed)
{
return false;
}
if (pawn.IsColonyMechPlayerControlled && !this.fireAtWill)
{
return false;
}
}
CompCanBeDormant compCanBeDormant = this.Pawn.TryGetComp<CompCanBeDormant>();
return compCanBeDormant == null || compCanBeDormant.Awake;
}
}
public bool TurretDestroyed
{
get
{
Pawn pawn;
return (pawn = (this.Pawn)) != null && this.AttackVerb.verbProps.linkedBodyPartsGroup != null && this.AttackVerb.verbProps.ensureLinkedBodyPartsGroupAlwaysUsable && PawnCapacityUtility.CalculateNaturalPartsAverageEfficiency(pawn.health.hediffSet, this.AttackVerb.verbProps.linkedBodyPartsGroup) <= 0f;
}
}
private Material TurretMat
{
get
{
if (this.turretMat == null)
{
this.turretMat = MaterialPool.MatFrom(this.Props.turretDef.graphicData.texPath);
}
return this.turretMat;
}
}
public bool AutoAttack
{
get
{
return this.Props.autoAttack;
}
}
public override void CompPostMake()
{
base.CompPostMake();
this.MakeGun();
}
private void MakeGun()
{
this.gun = ThingMaker.MakeThing(this.Props.turretDef, null);
this.UpdateGunVerbs();
}
private void UpdateGunVerbs()
{
List<Verb> allVerbs = this.gun.TryGetComp<CompEquippable>().AllVerbs;
for (int i = 0; i < allVerbs.Count; i++)
{
Verb verb = allVerbs[i];
verb.caster = this.Pawn;
verb.castCompleteCallback = delegate ()
{
this.burstCooldownTicksLeft = this.AttackVerb.verbProps.defaultCooldownTime.SecondsToTicks();
};
}
}
public override void CompPostTick(ref float severityAdjustment)
{
base.CompPostTick(ref severityAdjustment);
if (!this.CanShoot)
{
return;
}
if (this.currentTarget.IsValid)
{
this.curRotation = (this.currentTarget.Cell.ToVector3Shifted() - this.Pawn.DrawPos).AngleFlat() + this.Props.angleOffset;
}
this.AttackVerb.VerbTick();
if (this.AttackVerb.state != VerbState.Bursting)
{
if (this.WarmingUp)
{
this.burstWarmupTicksLeft--;
if (this.burstWarmupTicksLeft == 0)
{
this.AttackVerb.TryStartCastOn(this.currentTarget, false, true, false, true);
this.lastAttackTargetTick = Find.TickManager.TicksGame;
this.lastAttackedTarget = this.currentTarget;
return;
}
}
else
{
if (this.burstCooldownTicksLeft > 0)
{
this.burstCooldownTicksLeft--;
}
if (this.burstCooldownTicksLeft <= 0 && this.Pawn.IsHashIntervalTick(10))
{
this.currentTarget = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(this, TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable, null, 0f, 9999f);
if (this.currentTarget.IsValid)
{
this.burstWarmupTicksLeft = 1;
return;
}
this.ResetCurrentTarget();
}
}
}
}
private void ResetCurrentTarget()
{
this.currentTarget = LocalTargetInfo.Invalid;
this.burstWarmupTicksLeft = 0;
}
public override void CompExposeData()
{
base.CompExposeData();
Scribe_Values.Look<int>(ref this.burstCooldownTicksLeft, "burstCooldownTicksLeft", 0, false);
Scribe_Values.Look<int>(ref this.burstWarmupTicksLeft, "burstWarmupTicksLeft", 0, false);
Scribe_TargetInfo.Look(ref this.currentTarget, "currentTarget");
Scribe_Deep.Look<Thing>(ref this.gun, "gun", Array.Empty<object>());
Scribe_Values.Look<bool>(ref this.fireAtWill, "fireAtWill", true, false);
if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
if (this.gun == null)
{
Log.Error("CompTurrentGun had null gun after loading. Recreating.");
this.MakeGun();
return;
}
this.UpdateGunVerbs();
}
}
private const int StartShootIntervalTicks = 10;
private static readonly CachedTexture ToggleTurretIcon = new CachedTexture("UI/Gizmos/ToggleTurret");
public Thing gun;
protected int burstCooldownTicksLeft;
protected int burstWarmupTicksLeft;
protected LocalTargetInfo currentTarget = LocalTargetInfo.Invalid;
private bool fireAtWill = true;
private LocalTargetInfo lastAttackedTarget = LocalTargetInfo.Invalid;
private int lastAttackTargetTick;
private float curRotation;
[Unsaved(false)]
public Material turretMat;
}
}

View File

@@ -0,0 +1,118 @@
using System;
using Verse;
namespace ArachnaeSwarm.MoharHediffs
{
public class HediffCompProperties_Spawner : HediffCompProperties
{
public HediffCompProperties_Spawner()
{
this.compClass = typeof(HediffComp_Spawner);
}
/// <summary>
/// 要生成的物品的ThingDef。如果animalThing为false则使用此项。
/// </summary>
public ThingDef thingToSpawn;
/// <summary>
/// 每次生成的基础物品数量。
/// </summary>
public int spawnCount = 1;
/// <summary>
/// 如果为true则生成一个Pawn动物。如果为false则生成一个Thing。
/// </summary>
public bool animalThing;
/// <summary>
/// 要生成的动物的PawnKindDef。如果animalThing为true则使用此项。
/// </summary>
public PawnKindDef animalToSpawn;
/// <summary>
/// 如果为true生成的动物将属于玩家派系。
/// </summary>
public bool factionOfPlayerAnimal;
/// <summary>
/// 下一次生成事件发生前的最少天数。
/// </summary>
public float minDaysB4Next = 1f;
/// <summary>
/// 下一次生成事件发生前的最大天数。
/// </summary>
public float maxDaysB4Next = 2f;
/// <summary>
/// 生成后进入宽限期延迟下一次生成的几率0.0到1.0)。
/// </summary>
public float randomGrace;
/// <summary>
/// 如果触发,宽限期的持续时间(天)。
/// </summary>
public float graceDays = 0.5f;
/// <summary>
/// 附近允许的相同Pawn的最大数量。如果超过该数量则暂停生成。-1为禁用。
/// </summary>
public int spawnMaxAdjacent = -1;
/// <summary>
/// 如果为true生成的物品将被禁用。
/// </summary>
public bool spawnForbidden;
/// <summary>
/// 如果为true当宿主Pawn饥饿时生成将暂停。
/// </summary>
public bool hungerRelative;
/// <summary>
/// 如果为true当宿主Pawn受伤时生成将暂停。
/// </summary>
public bool healthRelative;
/// <summary>
/// 如果为true生成数量将根据宿主的年龄进行调整。
/// </summary>
public bool ageWeightedQuantity;
/// <summary>
/// 如果为true生成周期两次生成之间的时间将根据宿主的年龄进行调整。
/// </summary>
public bool ageWeightedPeriod;
/// <summary>
/// 如果为true且ageWeightedPeriod为true则随着宿主年龄增长生成周期变短。如果为false则变长。
/// </summary>
public bool olderSmallerPeriod;
/// <summary>
/// 如果为true且ageWeightedQuantity为true则随着宿主年龄增长生成数量变多。如果为false则变少。
/// </summary>
public bool olderBiggerQuantity;
/// <summary>
/// 如果为true且ageWeightedQuantity为true则随年龄增长的数量缩放将是指数性的而非线性的。
/// </summary>
public bool exponentialQuantity;
/// <summary>
/// 指数级数量缩放的最大乘数,以防止出现荒谬的数字。
/// </summary>
public int exponentialRatioLimit = 15;
/// <summary>
/// 生成时显示的消息的翻译键(例如,“{PAWN}下了一个蛋。”)。
/// </summary>
public string spawnVerb = "delivery";
/// <summary>
/// 如果为true则为此组件启用详细的调试日志记录。
/// </summary>
public bool debug;
}
}

View File

@@ -0,0 +1,565 @@
using System;
using System.Collections.Generic;
using System.Linq;
using RimWorld;
using RimWorld.Planet;
using Verse;
namespace ArachnaeSwarm.MoharHediffs
{
public class HediffComp_Spawner : HediffComp
{
public HediffCompProperties_Spawner Props
{
get
{
return (HediffCompProperties_Spawner)this.props;
}
}
public override void CompExposeData()
{
Scribe_Values.Look<int>(ref this.ticksUntilSpawn, "ticksUntilSpawn", 0, false);
Scribe_Values.Look<int>(ref this.initialTicksUntilSpawn, "initialTicksUntilSpawn", 0, false);
Scribe_Values.Look<float>(ref this.calculatedMinDaysB4Next, "calculatedMinDaysB4Next", 0f, false);
Scribe_Values.Look<float>(ref this.calculatedMaxDaysB4Next, "calculatedMaxDaysB4Next", 0f, false);
Scribe_Values.Look<int>(ref this.calculatedQuantity, "calculatedQuantity", 0, false);
Scribe_Values.Look<int>(ref this.graceTicks, "graceTicks", 0, false);
}
public override void CompPostMake()
{
this.myDebug = this.Props.debug;
Tools.Warn(string.Concat(new string[]
{
">>> ",
this.parent.pawn.Label,
" - ",
this.parent.def.defName,
" - CompPostMake start"
}), this.myDebug);
this.TraceProps();
this.CheckProps();
this.CalculateValues();
this.CheckCalculatedValues();
this.TraceCalculatedValues();
if (this.initialTicksUntilSpawn == 0)
{
Tools.Warn("Reseting countdown bc initialTicksUntilSpawn == 0 (comppostmake)", this.myDebug);
this.ResetCountdown();
}
}
public override void CompPostTick(ref float severityAdjustment)
{
this.pawn = this.parent.pawn;
if (!Tools.OkPawn(this.pawn))
{
return;
}
if (this.blockSpawn)
{
return;
}
if (this.graceTicks > 0)
{
this.graceTicks--;
return;
}
if (this.Props.hungerRelative && this.pawn.IsHungry(this.myDebug))
{
int num = (int)(this.RandomGraceDays() * 60000f);
this.hungerReset++;
this.graceTicks = num;
return;
}
if (this.Props.healthRelative && this.pawn.IsInjured(this.myDebug))
{
int num2 = (int)(this.RandomGraceDays() * 60000f);
this.healthReset++;
this.graceTicks = num2;
return;
}
this.hungerReset = (this.healthReset = 0);
if (this.CheckShouldSpawn())
{
Tools.Warn("Reseting countdown bc spawned thing", this.myDebug);
this.CalculateValues();
this.CheckCalculatedValues();
this.ResetCountdown();
if (Rand.Chance(this.Props.randomGrace))
{
int num3 = (int)(this.RandomGraceDays() * 60000f);
this.graceTicks = num3;
}
}
}
private void TraceProps()
{
Tools.Warn(string.Concat(new string[]
{
"Props => minDaysB4Next: ",
this.Props.minDaysB4Next.ToString(),
"; maxDaysB4Next: ",
this.Props.maxDaysB4Next.ToString(),
"; randomGrace: ",
this.Props.randomGrace.ToString(),
"; graceDays: ",
this.Props.graceDays.ToString(),
"; hungerRelative: ",
this.Props.hungerRelative.ToString(),
"; healthRelative: ",
this.Props.healthRelative.ToString(),
"; "
}), this.myDebug);
if (this.Props.animalThing)
{
Tools.Warn(string.Concat(new string[]
{
"animalThing: ",
this.Props.animalThing.ToString(),
"; animalName: ",
this.Props.animalToSpawn.defName,
"; factionOfPlayerAnimal: ",
this.Props.factionOfPlayerAnimal.ToString(),
"; "
}), this.myDebug);
}
if (this.Props.ageWeightedQuantity)
{
Tools.Warn(string.Concat(new string[]
{
"ageWeightedQuantity:",
this.Props.ageWeightedQuantity.ToString(),
"; olderBiggerQuantity:",
this.Props.olderBiggerQuantity.ToString(),
"; ",
this.myDebug.ToString()
}), false);
if (this.Props.exponentialQuantity)
{
Tools.Warn(string.Concat(new string[]
{
"exponentialQuantity:",
this.Props.exponentialQuantity.ToString(),
"; exponentialRatioLimit:",
this.Props.exponentialRatioLimit.ToString(),
"; "
}), this.myDebug);
}
}
Tools.Warn(string.Concat(new string[]
{
"ageWeightedPeriod:",
this.Props.ageWeightedPeriod.ToString(),
"; olderSmallerPeriod:",
this.Props.olderSmallerPeriod.ToString(),
"; ",
this.myDebug.ToString()
}), false);
}
private void CalculateValues()
{
float num = Tools.GetPawnAgeOverlifeExpectancyRatio(this.parent.pawn, this.myDebug);
num = ((num > 1f) ? 1f : num);
this.calculatedMinDaysB4Next = this.Props.minDaysB4Next;
this.calculatedMaxDaysB4Next = this.Props.maxDaysB4Next;
if (this.Props.ageWeightedPeriod)
{
float num2 = this.Props.olderSmallerPeriod ? (-num) : num;
this.calculatedMinDaysB4Next = this.Props.minDaysB4Next * (1f + num2);
this.calculatedMaxDaysB4Next = this.Props.maxDaysB4Next * (1f + num2);
Tools.Warn(string.Concat(new string[]
{
" ageWeightedPeriod: ",
this.Props.ageWeightedPeriod.ToString(),
" ageRatio: ",
num.ToString(),
" minDaysB4Next: ",
this.Props.minDaysB4Next.ToString(),
" maxDaysB4Next: ",
this.Props.maxDaysB4Next.ToString(),
" daysAgeRatio: ",
num2.ToString(),
" calculatedMinDaysB4Next: ",
this.calculatedMinDaysB4Next.ToString(),
"; calculatedMaxDaysB4Next: ",
this.calculatedMaxDaysB4Next.ToString(),
"; "
}), this.myDebug);
}
this.calculatedQuantity = this.Props.spawnCount;
if (this.Props.ageWeightedQuantity)
{
float num3 = this.Props.olderBiggerQuantity ? num : (-num);
Tools.Warn("quantityAgeRatio: " + num3.ToString(), this.myDebug);
this.calculatedQuantity = (int)Math.Round((double)this.Props.spawnCount * (double)(1f + num3));
if (this.Props.exponentialQuantity)
{
num3 = 1f - num;
if (num3 == 0f)
{
Tools.Warn(">ERROR< quantityAgeRatio is f* up : " + num3.ToString(), this.myDebug);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
float num4 = this.Props.olderBiggerQuantity ? (1f / num3) : (num3 * num3);
bool flag = false;
bool flag2 = false;
if (num4 > (float)this.Props.exponentialRatioLimit)
{
num4 = (float)this.Props.exponentialRatioLimit;
flag = true;
}
this.calculatedQuantity = (int)Math.Round((double)this.Props.spawnCount * (double)num4);
if (this.calculatedQuantity < 1)
{
this.calculatedQuantity = 1;
flag2 = true;
}
Tools.Warn(string.Concat(new string[]
{
" exponentialQuantity: ",
this.Props.exponentialQuantity.ToString(),
"; expoFactor: ",
num4.ToString(),
"; gotLimited: ",
flag.ToString(),
"; gotAugmented: ",
flag2.ToString()
}), this.myDebug);
}
Tools.Warn("; Props.spawnCount: " + this.Props.spawnCount.ToString() + "; calculatedQuantity: " + this.calculatedQuantity.ToString(), this.myDebug);
}
}
private void CheckCalculatedValues()
{
if (this.calculatedQuantity > this.errorSpawnCount)
{
Tools.Warn(string.Concat(new string[]
{
">ERROR< calculatedQuantity is too high: ",
this.calculatedQuantity.ToString(),
"(>",
this.errorSpawnCount.ToString(),
"), check and adjust your hediff props"
}), this.myDebug);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (this.calculatedMinDaysB4Next < this.errorMinDaysB4Next)
{
this.calculatedMinDaysB4Next = this.errorMinDaysB4Next;
}
if (this.calculatedMaxDaysB4Next < this.errorMinDaysB4Next)
{
this.calculatedMaxDaysB4Next = this.errorMinDaysB4Next;
}
}
private void TraceCalculatedValues()
{
Tools.Warn("calculatedMinDaysB4Next:" + this.calculatedMinDaysB4Next.ToString(), this.myDebug);
Tools.Warn("calculatedMaxDaysB4Next:" + this.calculatedMaxDaysB4Next.ToString(), this.myDebug);
Tools.Warn("calculatedQuantity:" + this.calculatedQuantity.ToString(), this.myDebug);
}
private void CheckProps()
{
if (this.Props.animalThing && this.Props.animalToSpawn == null)
{
Tools.Warn(this.parent.pawn.Label + " has a hediffcomp_spawner with animalflag but without animalToSpawn", true);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (this.Props.minDaysB4Next <= 0f)
{
Tools.Warn(this.parent.pawn.Label + " has a hediffcomp_spawner with null/negative minDaysB4Next", true);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (this.Props.maxDaysB4Next <= 0f)
{
Tools.Warn(this.parent.pawn.Label + " has a hediffcomp_spawner with null/negative maxDaysB4Next", true);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (this.Props.maxDaysB4Next < this.Props.minDaysB4Next)
{
Tools.Warn(this.parent.pawn.Label + " has a hediffcomp_spawner with maxDaysB4Next < minDaysB4Next", true);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (this.Props.spawnCount <= 0)
{
Tools.Warn(this.parent.pawn.Label + " has a hediffcomp_spawner with null/negative spawnCount", true);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (!this.Props.animalThing && this.Props.thingToSpawn == null)
{
Tools.Warn(this.parent.pawn.Label + " has a hediffcomp_spawner without thingToSpawn", true);
this.blockSpawn = true;
Tools.DestroyParentHediff(this.parent, this.myDebug);
return;
}
if (this.Props.ageWeightedQuantity && this.Props.exponentialQuantity && this.Props.exponentialRatioLimit > this.errorExponentialLimit)
{
Tools.Warn(string.Concat(new string[]
{
this.parent.pawn.Label,
" has a hediffcomp_spawner with exponentialRatioLimit>",
this.errorExponentialLimit.ToString(),
" this is not allowed. It will be set to ",
this.errorExponentialLimit.ToString()
}), true);
this.Props.exponentialRatioLimit = this.errorExponentialLimit;
}
}
private bool CheckShouldSpawn()
{
this.ticksUntilSpawn--;
if (this.ticksUntilSpawn <= 0)
{
if (this.TryDoSpawn())
{
return true;
}
Tools.Warn("Did not spawn, reseting countdown", this.myDebug);
this.ResetCountdown();
}
return false;
}
private PawnKindDef MyPawnKindDefNamed(string myDefName)
{
return DefDatabase<PawnKindDef>.GetNamed(myDefName, true);
}
public bool TryDoSpawn()
{
Pawn pawn = this.parent.pawn;
if (this.Props.spawnMaxAdjacent > 0 && pawn.Map.mapPawns.AllPawns.Where(delegate(Pawn mP)
{
ThingDef defToCompare = this.Props.animalThing ? this.Props.animalToSpawn?.race : this.Props.thingToSpawn;
if (defToCompare?.race == null)
{
return false;
}
return mP.def == defToCompare && mP.Position.InHorDistOf(pawn.Position, (float)this.Props.spawnMaxAdjacent);
}).Count<Pawn>() >= this.Props.spawnMaxAdjacent)
{
return false;
}
if (this.Props.animalThing)
{
if (this.Props.animalToSpawn == null)
{
return false;
}
Faction faction = this.Props.factionOfPlayerAnimal ? Faction.OfPlayer : null;
int i = 0;
while (i < this.calculatedQuantity)
{
IntVec3 intVec;
if (!this.TryFindSpawnCell(out intVec))
{
return false;
}
Pawn pawn2 = PawnGenerator.GeneratePawn(this.Props.animalToSpawn, faction);
if (pawn2 == null)
{
return false;
}
GenSpawn.Spawn(pawn2, intVec, pawn.Map, WipeMode.Vanish);
pawn2.SetFaction(faction, null);
FilthMaker.TryMakeFilth(intVec, pawn.Map, ThingDefOf.Filth_AmnioticFluid, pawn.LabelIndefinite(), 5, FilthSourceFlags.None);
if (!this.Props.spawnForbidden)
{
pawn2.playerSettings.Master = pawn;
pawn2.training.Train(TrainableDefOf.Obedience, pawn, true);
}
i++;
continue;
}
if (PawnUtility.ShouldSendNotificationAbout(pawn) || PawnUtility.ShouldSendNotificationAbout(pawn))
{
Messages.Message(this.Props.spawnVerb.Translate(pawn.Named("PAWN")), pawn, MessageTypeDefOf.PositiveEvent, true);
}
return true;
}
else
{
IntVec3 intVec2;
if (!this.TryFindSpawnCell(out intVec2))
{
return false;
}
Thing thing = ThingMaker.MakeThing(this.Props.thingToSpawn, null);
if (thing == null)
{
return false;
}
thing.stackCount = this.calculatedQuantity;
if (this.Props.spawnForbidden)
{
thing.SetForbidden(true, true);
}
GenPlace.TryPlaceThing(thing, intVec2, pawn.Map, ThingPlaceMode.Direct, null, null, default(Rot4));
if (PawnUtility.ShouldSendNotificationAbout(pawn))
{
Messages.Message(this.Props.spawnVerb.Translate(pawn.Named("PAWN"), thing.Named("THING")), thing, MessageTypeDefOf.PositiveEvent, true);
}
return true;
}
}
private bool TryFindSpawnCell(out IntVec3 result)
{
result = IntVec3.Invalid;
bool result2;
if (this.pawn == null)
{
result2 = false;
}
else
{
Map map = this.pawn.Map;
if (map == null)
{
result2 = false;
}
else
{
result = CellFinder.RandomClosewalkCellNear(this.pawn.Position, map, 5, null);
result2 = true;
}
}
return result2;
}
private void ResetCountdown()
{
this.ticksUntilSpawn = (int)(this.RandomDays2wait() * 60000f);
this.initialTicksUntilSpawn = this.ticksUntilSpawn;
}
private float RandomDays2wait()
{
return Rand.Range(this.calculatedMinDaysB4Next, this.calculatedMaxDaysB4Next);
}
private float RandomGraceDays()
{
return Rand.Range(this.Props.graceDays / 2f, this.Props.graceDays);
}
public override string CompTipStringExtra
{
get
{
if (!this.myDebug)
{
return null;
}
string text = "ticksUntilSpawn: " + this.ticksUntilSpawn.ToString() + "\n";
string text2 = text;
text = string.Concat(new string[]
{
text2,
"initialTicksUntilSpawn: ",
this.initialTicksUntilSpawn.ToString(),
"\n"
});
text2 = text;
text = string.Concat(new string[]
{
text2,
"graceTicks: ",
this.graceTicks.ToString(),
"\n"
});
text2 = text;
text = string.Concat(new string[]
{
text2,
"hunger resets: ",
this.hungerReset.ToString(),
"\n"
});
text2 = text;
text = string.Concat(new string[]
{
text2,
"health resets: ",
this.healthReset.ToString(),
"\n"
});
text2 = text;
text = string.Concat(new string[]
{
text2,
"calculatedMinDaysB4Next: ",
this.calculatedMinDaysB4Next.ToString(),
"\n"
});
text2 = text;
text = string.Concat(new string[]
{
text2,
"calculatedMaxDaysB4Next: ",
this.calculatedMaxDaysB4Next.ToString(),
"\n"
});
text2 = text;
text = string.Concat(new string[]
{
text2,
"calculatedQuantity: ",
this.calculatedQuantity.ToString(),
"\n"
});
return text + "blockSpawn: " + this.blockSpawn.ToString();
}
}
private int ticksUntilSpawn;
private int initialTicksUntilSpawn;
private int hungerReset;
private int healthReset;
private int graceTicks;
private Pawn pawn;
private float calculatedMaxDaysB4Next = 2f;
private float calculatedMinDaysB4Next = 1f;
private int calculatedQuantity = 1;
private bool blockSpawn;
private bool myDebug;
private readonly float errorMinDaysB4Next = 0.001f;
private readonly int errorExponentialLimit = 20;
private readonly int errorSpawnCount = 750;
}
}

View File

@@ -0,0 +1,106 @@
using System;
using System.Collections.Generic;
using RimWorld;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm.MoharHediffs
{
public static class Tools
{
public static void DestroyParentHediff(Hediff parentHediff, bool debug = false)
{
if (parentHediff.pawn != null && parentHediff.def.defName != null && debug)
{
Log.Warning(parentHediff.pawn.Label + "'s Hediff: " + parentHediff.def.defName + " says goodbye.");
}
parentHediff.Severity = 0f;
}
public static float GetPawnAgeOverlifeExpectancyRatio(Pawn pawn, bool debug = false)
{
float result = 1f;
if (pawn == null)
{
if (debug)
{
Log.Warning("GetPawnAgeOverlifeExpectancyRatio pawn NOT OK");
}
return result;
}
result = pawn.ageTracker.AgeBiologicalYearsFloat / pawn.RaceProps.lifeExpectancy;
if (debug)
{
Log.Warning(string.Concat(new string[]
{
pawn.Label,
" Age: ",
pawn.ageTracker.AgeBiologicalYearsFloat.ToString(),
"; lifeExpectancy: ",
pawn.RaceProps.lifeExpectancy.ToString(),
"; ratio:",
result.ToString()
}));
}
return result;
}
public static bool IsInjured(this Pawn pawn, bool debug = false)
{
if (pawn == null)
{
if (debug)
{
Log.Warning("pawn is null - wounded ");
}
return false;
}
float num = 0f;
List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
for (int i = 0; i < hediffs.Count; i++)
{
if (hediffs[i] is Hediff_Injury && !hediffs[i].IsPermanent())
{
num += hediffs[i].Severity;
}
}
if (debug && num > 0f)
{
Log.Warning(pawn.Label + " is wounded ");
}
return num > 0f;
}
public static bool IsHungry(this Pawn pawn, bool debug = false)
{
if (pawn == null)
{
if (debug)
{
Log.Warning("pawn is null - IsHungry ");
}
return false;
}
bool flag = pawn.needs.food != null && pawn.needs.food.CurCategory == HungerCategory.Starving;
if (debug && flag)
{
Log.Warning(pawn.Label + " is hungry ");
}
return flag;
}
public static bool OkPawn(Pawn pawn)
{
return pawn != null && pawn.Map != null;
}
public static void Warn(string warning, bool debug = false)
{
if (debug)
{
Log.Warning(warning);
}
}
}
}

View File

@@ -0,0 +1,170 @@
using HarmonyLib;
using RimWorld;
using Verse;
using System.Linq;
namespace ArachnaeSwarm
{
[HarmonyPatch(typeof(FoodUtility), nameof(FoodUtility.BestFoodSourceOnMap))]
public static class Patch_DispenserFoodSearch
{
// A state variable to pass our found dispenser from Prefix to Postfix
private static Building_ARANutrientDispenser foundCustomDispenser = null;
/// <summary>
/// Runs BEFORE the original BestFoodSourceOnMap.
/// Its job is to specifically find OUR custom dispenser.
/// </summary>
[HarmonyPrefix]
public static bool Prefix(Pawn getter, Pawn eater, bool desperate = false, FoodPreferability maxPref = FoodPreferability.MealLavish)
{
// Reset state at the beginning of each check
foundCustomDispenser = null;
// First, check if our custom dispenser can even be a candidate.
// We find a representative def for our dispenser to get the meal properties.
// This is a bit of a hack, but necessary to know the preferability without an instance.
var representativeDef = ThingDef.Named("ARANutrientDispenser"); // Assuming this is the defName of your dispenser
var props = representativeDef?.GetModExtension<ARAFoodDispenserProperties>();
var customMealDef = props?.thingToDispense;
if (customMealDef == null) {
// If we can't find our meal def, something is wrong with the XML.
// It's safer to not interfere.
return true;
}
// Don't interfere if the pawn is looking for something better than what we can offer.
if (maxPref < customMealDef.ingestible.preferability)
{
return true; // Let the original method run, it's looking for fancy food.
}
// Find the best available custom dispenser on the map
var bestDispenser = FindBestCustomDispenser(getter, eater, desperate);
if (bestDispenser != null)
{
// We found one! Store it for the Postfix.
foundCustomDispenser = bestDispenser;
Log.Message($"[ArachnaeSwarm Prefix] Found a potential custom dispenser for {eater.LabelShort}: {bestDispenser.Label}");
}
// ALWAYS let the original method run.
// This allows us to compare its result with ours in the Postfix, ensuring maximum compatibility.
return true;
}
/// <summary>
/// Runs AFTER the original BestFoodSourceOnMap.
/// Compares the original method's result with our custom dispenser (if any) and picks the best one.
/// </summary>
[HarmonyPostfix]
public static void Postfix(ref Thing __result, ref ThingDef foodDef, Pawn eater, Pawn getter)
{
if (foundCustomDispenser == null)
{
// Our prefix didn't find any custom dispensers, so we don't need to do anything.
return;
}
var customDispenserMealDef = foundCustomDispenser.DispensableDef;
if (customDispenserMealDef == null)
{
Log.Warning($"[ArachnaeSwarm Postfix] Custom dispenser {foundCustomDispenser.Label} has a null DispensableDef.");
return;
}
// If the original method found NO food, then our dispenser is the best (and only) choice.
if (__result == null)
{
Log.Message($"[ArachnaeSwarm Postfix] Original method found no food. Using our custom dispenser: {foundCustomDispenser.Label}");
__result = foundCustomDispenser;
foodDef = customDispenserMealDef;
return;
}
// Both we and the original method found food. We must now choose the better one.
// "FoodOptimality" is the score RimWorld uses to decide. Higher is better.
float ourScore = FoodUtility.FoodOptimality(eater, foundCustomDispenser, customDispenserMealDef, (getter.Position - foundCustomDispenser.Position).LengthManhattan);
float theirScore = FoodUtility.FoodOptimality(eater, __result, foodDef, (getter.Position - __result.Position).LengthManhattan);
Log.Message($"[ArachnaeSwarm Postfix] Comparing food sources: Our Dispenser (Score: {ourScore:F2}) vs Original Result '{__result.Label}' (Score: {theirScore:F2}).");
// If our dispenser is a better choice, override the result.
if (ourScore > theirScore)
{
Log.Message($"[ArachnaeSwarm Postfix] Our dispenser is better. Overriding result.");
__result = foundCustomDispenser;
foodDef = customDispenserMealDef;
}
else
{
Log.Message($"[ArachnaeSwarm Postfix] Original result is better or equal. Keeping it.");
}
}
/// <summary>
/// A helper to find the best custom dispenser for a pawn.
/// </summary>
private static Building_ARANutrientDispenser FindBestCustomDispenser(Pawn getter, Pawn eater, bool desperate)
{
if (getter.Map == null) return null;
var allCustomDispensers = getter.Map.listerBuildings.AllBuildingsColonistOfClass<Building_ARANutrientDispenser>();
Building_ARANutrientDispenser bestDispenser = null;
float bestScore = float.MinValue;
foreach (var dispenser in allCustomDispensers)
{
var currentMealDef = dispenser.DispensableDef;
if (currentMealDef == null) continue;
// --- Start of refined access checks ---
// 1. Block hostile pawns.
if (getter.HostileTo(Faction.OfPlayer))
{
continue;
}
// 2. Block wild animals. Tamed player-faction animals are allowed.
if (getter.RaceProps.Animal && getter.Faction != Faction.OfPlayer)
{
continue;
}
// 3. Use the game's built-in social properness check for things like prisoner access.
if (!dispenser.IsSociallyProper(getter))
{
continue;
}
// --- End of refined access checks ---
// Check if the dispenser is usable
if (!dispenser.CanDispenseNow || dispenser.IsForbidden(getter) || !eater.WillEat(currentMealDef, getter))
{
continue;
}
// Check reachability
if (!getter.CanReach(dispenser, Verse.AI.PathEndMode.InteractionCell, Danger.Some))
{
continue;
}
// Calculate score
float score = FoodUtility.FoodOptimality(eater, dispenser, currentMealDef, (getter.Position - dispenser.Position).LengthManhattan);
if (score > bestScore)
{
bestScore = score;
bestDispenser = dispenser;
}
}
return bestDispenser;
}
}
}

View File

@@ -31,11 +31,22 @@ namespace ArachnaeSwarm
IReadOnlyList<Pawn> pawns = ((!Props.onlyPawnsInSameFaction || parent.pawn.Faction == null) ? parent.pawn.Map.mapPawns.AllPawnsSpawned : parent.pawn.Map.mapPawns.SpawnedPawnsInFaction(parent.pawn.Faction));
foreach (Pawn pawn in pawns)
{
// 修改点:检查种族是否在我们的目标列表中如果列表为空或null则不进行任何操作
if ((Props.targetRaces.NullOrEmpty() || !Props.targetRaces.Contains(pawn.def)) || pawn.Dead || pawn.health == null || pawn == parent.pawn || !(pawn.Position.DistanceTo(parent.pawn.Position) <= Props.range) || !Props.targetingParameters.CanTarget(pawn))
// 检查种族是否在我们的目标列表中如果列表为空或null则不进行任何操作
if ( pawn.Dead || pawn.health == null || pawn == parent.pawn || !(pawn.Position.DistanceTo(parent.pawn.Position) <= Props.range) || !Props.targetingParameters.CanTarget(pawn))
{
continue;
}
else
{
// 如果列表是空的或null则默认对所有的pawn进行操作
if (Props.targetRaces.NullOrEmpty())
{
}
else if (!Props.targetRaces.Contains(pawn.def))
{
continue;
}
}
Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediff);
if (hediff == null)
{

View File

@@ -5,7 +5,7 @@ using UnityEngine;
using Verse;
using RimWorld;
namespace WulaFallenEmpire
namespace ArachnaeSwarm
{
public class CompCustomUniqueWeapon : CompUniqueWeapon
{

View File

@@ -2,7 +2,7 @@ using System.Collections.Generic;
using Verse;
using RimWorld;
namespace WulaFallenEmpire
namespace ArachnaeSwarm
{
public class CompProperties_CustomUniqueWeapon : CompProperties_UniqueWeapon
{

View File

@@ -0,0 +1,159 @@
using RimWorld;
using RimWorld.Planet;
using System.Collections.Generic;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public enum WormholePortalStatus
{
Idle,
Deploying,
Linked
}
public class Building_WormholePortal_A : MapPortal
{
private Building_WormholePortal_B linkedPortalB;
public WormholePortalStatus status = WormholePortalStatus.Idle;
private CompRefuelable refuelableComp;
public Building_WormholePortal_B LinkedPortal => linkedPortalB;
public override void ExposeData()
{
base.ExposeData();
Scribe_References.Look(ref linkedPortalB, "linkedPortalB");
Scribe_Values.Look(ref status, "status", WormholePortalStatus.Idle);
}
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
base.SpawnSetup(map, respawningAfterLoad);
refuelableComp = GetComp<CompRefuelable>();
}
// --- MapPortal Overrides ---
public override bool IsEnterable(out string reason)
{
if (status != WormholePortalStatus.Linked)
{
reason = "WormholeNotLinked".Translate();
return false;
}
if (linkedPortalB == null || linkedPortalB.Destroyed)
{
reason = "WormholeLinkLost".Translate();
Notify_B_Destroyed();
return false;
}
reason = "";
return true;
}
public override Map GetOtherMap()
{
return linkedPortalB?.Map;
}
public override IntVec3 GetDestinationLocation()
{
return linkedPortalB.Position;
}
public override void OnEntered(Pawn pawn)
{
// The base class handles adding the pawn to the container.
base.OnEntered(pawn);
// Now, transfer everything in the container to the destination.
if (linkedPortalB != null && !linkedPortalB.Destroyed)
{
// Transfer pawns first
List<Pawn> pawnsInPortal = new List<Pawn>();
foreach (Thing item in GetDirectlyHeldThings())
{
if (item is Pawn p)
{
pawnsInPortal.Add(p);
}
}
foreach(Pawn p in pawnsInPortal)
{
p.DeSpawn();
GenSpawn.Spawn(p, CellFinder.RandomClosewalkCellNear(linkedPortalB.Position, linkedPortalB.Map, 5), linkedPortalB.Map, WipeMode.Vanish);
GetDirectlyHeldThings().Remove(p);
}
// Transfer items
GetDirectlyHeldThings().TryDropAll(linkedPortalB.Position, linkedPortalB.Map, ThingPlaceMode.Near);
}
// Custom sound/effect can be played here.
EffecterDefOf.Skip_Exit.Spawn(pawn.Position, pawn.Map);
}
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
{
Log.Message($"[ArachnaeSwarm] Portal A ({this.GetUniqueLoadID()}) is despawning. Notifying and destroying Portal B ({linkedPortalB?.GetUniqueLoadID() ?? "null"}).");
if (linkedPortalB != null && !linkedPortalB.Destroyed)
{
linkedPortalB.Notify_A_Destroyed();
linkedPortalB.Destroy(DestroyMode.Vanish);
}
base.DeSpawn(mode);
}
public void SetLinkedPortal(Building_WormholePortal_B portalB)
{
if (portalB == null)
{
Notify_B_Destroyed();
return;
}
Log.Message($"[ArachnaeSwarm] Portal A ({this.GetUniqueLoadID()}) is linking to Portal B ({portalB?.GetUniqueLoadID() ?? "null"}).");
linkedPortalB = portalB;
status = WormholePortalStatus.Linked;
Messages.Message("WormholePortalLinked".Translate(this.Label, portalB.Map.Parent.LabelCap), this, MessageTypeDefOf.PositiveEvent);
}
public void Notify_B_Destroyed()
{
Log.Warning($"[ArachnaeSwarm] Portal A ({this.GetUniqueLoadID()}) received notification that Portal B was destroyed. Resetting status to Idle.");
linkedPortalB = null;
status = WormholePortalStatus.Idle;
Messages.Message("WormholePortalB_Destroyed".Translate(this.Label), this, MessageTypeDefOf.NegativeEvent);
}
public override IEnumerable<Gizmo> GetGizmos()
{
// Use the base (MapPortal) gizmos, which include "Enter" and "Cancel Load"
foreach (Gizmo g in base.GetGizmos())
{
yield return g;
}
}
public override string GetInspectString()
{
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
stringBuilder.Append(base.GetInspectString());
if (stringBuilder.Length > 0) stringBuilder.AppendLine();
stringBuilder.Append("Status".Translate() + ": " + status.ToString().Translate());
if (status == WormholePortalStatus.Linked && linkedPortalB != null && !linkedPortalB.Destroyed)
{
stringBuilder.AppendLine();
stringBuilder.Append("LinkedTo".Translate() + ": " + linkedPortalB.Map.Parent.LabelCap);
}
return stringBuilder.ToString();
}
}
}

View File

@@ -0,0 +1,126 @@
using RimWorld;
using RimWorld.Planet;
using System.Collections.Generic;
using Verse;
namespace ArachnaeSwarm
{
public class Building_WormholePortal_B : MapPortal
{
private Building_WormholePortal_A linkedPortalA;
public Building_WormholePortal_A LinkedPortal => linkedPortalA;
public override void ExposeData()
{
base.ExposeData();
Scribe_References.Look(ref linkedPortalA, "linkedPortalA");
}
public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish)
{
// 如果B被摧毁通知A
Log.Warning($"[ArachnaeSwarm] Portal B ({this.GetUniqueLoadID()}) is despawning. Notifying Portal A ({linkedPortalA?.GetUniqueLoadID() ?? "null"}).");
if (linkedPortalA != null && !linkedPortalA.Destroyed)
{
linkedPortalA.Notify_B_Destroyed();
}
base.DeSpawn(mode);
}
// 这个方法在A端被摧毁时由A端调用避免B端重复通知
public void Notify_A_Destroyed()
{
linkedPortalA = null;
}
public void SetLinkedPortal(Building_WormholePortal_A portalA)
{
Log.Message($"[ArachnaeSwarm] Portal B ({this.GetUniqueLoadID()}) is linking to Portal A ({portalA?.GetUniqueLoadID() ?? "null"}).");
linkedPortalA = portalA;
}
public override IEnumerable<Gizmo> GetGizmos()
{
// Use the base (MapPortal) gizmos
foreach (Gizmo g in base.GetGizmos())
{
yield return g;
}
}
// --- MapPortal Overrides ---
public override bool IsEnterable(out string reason)
{
if (linkedPortalA == null || linkedPortalA.Destroyed)
{
reason = "WormholeLinkLost".Translate();
if (linkedPortalA != null) linkedPortalA.Notify_B_Destroyed();
this.Destroy(DestroyMode.Vanish);
return false;
}
reason = "";
return true;
}
public override Map GetOtherMap()
{
return linkedPortalA?.Map;
}
public override IntVec3 GetDestinationLocation()
{
return linkedPortalA.Position;
}
public override void OnEntered(Pawn pawn)
{
base.OnEntered(pawn);
if (linkedPortalA != null && !linkedPortalA.Destroyed)
{
// Transfer pawns first
List<Pawn> pawnsInPortal = new List<Pawn>();
foreach (Thing item in GetDirectlyHeldThings())
{
if (item is Pawn p)
{
pawnsInPortal.Add(p);
}
}
foreach(Pawn p in pawnsInPortal)
{
p.DeSpawn();
GenSpawn.Spawn(p, CellFinder.RandomClosewalkCellNear(linkedPortalA.Position, linkedPortalA.Map, 5), linkedPortalA.Map, WipeMode.Vanish);
GetDirectlyHeldThings().Remove(p);
}
// Transfer items
GetDirectlyHeldThings().TryDropAll(linkedPortalA.Position, linkedPortalA.Map, ThingPlaceMode.Near);
}
EffecterDefOf.Skip_Exit.Spawn(pawn.Position, pawn.Map);
}
public override string GetInspectString()
{
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
stringBuilder.Append(base.GetInspectString());
if (linkedPortalA != null && !linkedPortalA.Destroyed)
{
if (stringBuilder.Length > 0) stringBuilder.AppendLine();
stringBuilder.Append("LinkedTo".Translate() + ": " + linkedPortalA.Map.Parent.LabelCap);
}
else
{
if (stringBuilder.Length > 0) stringBuilder.AppendLine();
stringBuilder.Append("ConnectionLost".Translate());
}
return stringBuilder.ToString();
}
}
}

View File

@@ -0,0 +1,160 @@
using System.Collections.Generic;
using System.Linq;
using RimWorld;
using RimWorld.Planet;
using UnityEngine;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class CompLaunchableWormhole : ThingComp
{
private CompRefuelableNutrition refuelableComp;
public Building_WormholePortal_A PortalA => this.parent as Building_WormholePortal_A;
public CompProperties_LaunchableWormhole Props => (CompProperties_LaunchableWormhole)props;
public override void Initialize(CompProperties props)
{
base.Initialize(props);
this.refuelableComp = this.parent.GetComp<CompRefuelableNutrition>();
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
if (PortalA?.status == WormholePortalStatus.Linked || PortalA?.status == WormholePortalStatus.Deploying)
{
yield break;
}
Command_Action launchCommand = new Command_Action();
launchCommand.defaultLabel = "CommandDeployWormholePortalB_Pilot".Translate();
launchCommand.defaultDesc = "CommandDeployWormholePortalB_PilotDesc".Translate();
launchCommand.icon = ContentFinder<Texture2D>.Get("UI/Commands/LaunchShip");
// Fuel check is now more complex, we can show max range or check on target selection.
// For simplicity, we'll disable if there's basically no fuel.
if (refuelableComp.Fuel < Props.fuelPerTile)
{
launchCommand.Disable("NotEnoughFuel".Translate());
}
List<Pawn> pilots = parent.Map.mapPawns.AllPawnsSpawned
.Where(p => p.IsColonistPlayerControlled && !p.Downed && !p.IsBurning() && p.CanReach(parent, PathEndMode.Touch, Danger.Deadly))
.ToList();
if (!pilots.Any())
{
launchCommand.Disable("NoPilotAvailable".Translate());
}
launchCommand.action = delegate
{
List<FloatMenuOption> options = new List<FloatMenuOption>();
foreach (Pawn p in pilots)
{
void pilotAction()
{
var jobDef = DefDatabase<JobDef>.GetNamed("ARA_DeployWormhole");
var job = JobMaker.MakeJob(jobDef, parent);
p.jobs.TryTakeOrderedJob(job, JobTag.Misc);
}
options.Add(new FloatMenuOption(p.LabelCap, pilotAction));
}
// Add force launch option
options.Add(new FloatMenuOption("ForceLaunch".Translate(), () => StartChoosingDestination(null)));
Find.WindowStack.Add(new FloatMenu(options));
};
yield return launchCommand;
}
public void StartChoosingDestination(Pawn pilot)
{
CameraJumper.TryJump(CameraJumper.GetWorldTarget(this.parent));
Find.WorldSelector.ClearSelection();
int tile = this.parent.Map.Tile;
int maxDist = (int)(refuelableComp.Fuel / Props.fuelPerTile);
Find.WorldTargeter.BeginTargeting((GlobalTargetInfo t) => ChoseWorldTarget(t, pilot, maxDist), true, CompLaunchable.TargeterMouseAttachment, true, delegate
{
GenDraw.DrawWorldRadiusRing(tile, maxDist);
}, (GlobalTargetInfo t) => "Select target tile");
}
private bool ChoseWorldTarget(GlobalTargetInfo t, Pawn pilot, int maxDist)
{
if (!t.IsValid)
{
Messages.Message("MessageTransportPodsDestinationIsInvalid".Translate(), MessageTypeDefOf.RejectInput);
return false;
}
if (Find.World.Impassable(t.Tile))
{
Messages.Message("MessageTransportPodsDestinationIsImpassable".Translate(), MessageTypeDefOf.RejectInput);
return false;
}
int distance = Find.WorldGrid.TraversalDistanceBetween(parent.Map.Tile, t.Tile, true);
if (distance > maxDist)
{
Messages.Message("NotEnoughFuel".Translate(), MessageTypeDefOf.RejectInput);
return false;
}
var mapParent = Find.WorldObjects.MapParentAt(t.Tile);
if (mapParent != null && mapParent.HasMap)
{
// Has map, let player choose local destination
StartChoosingLocalDestination(mapParent.Map, pilot, t.Tile, distance);
}
else
{
// No map, deploy to center
Launch(t.Tile, pilot, distance, IntVec3.Invalid);
}
return true;
}
private void StartChoosingLocalDestination(Map map, Pawn pilot, int tile, int distance)
{
CameraJumper.TryJump(new GlobalTargetInfo(map.Center, map));
Find.Targeter.BeginTargeting(TargetingParameters.ForDropPodsDestination(), localTarget =>
{
Launch(tile, pilot, distance, localTarget.Cell);
});
}
private void Launch(int destinationTile, Pawn pilot, int distance, IntVec3 arrivalCell)
{
float fuelCost = distance * Props.fuelPerTile;
refuelableComp.ConsumeFuel(fuelCost);
if(pilot != null) pilot.DeSpawn();
EffecterDefOf.Skip_Entry.Spawn(this.parent.Position, this.parent.Map);
var travelingWormhole = (TravelingWormhole)WorldObjectMaker.MakeWorldObject(DefDatabase<WorldObjectDef>.GetNamed("ARA_TravelingWormhole"));
travelingWormhole.sourcePortal = this.PortalA;
travelingWormhole.StartMove(parent.Map.Tile, destinationTile, pilot, arrivalCell);
Find.WorldObjects.Add(travelingWormhole);
PortalA.status = WormholePortalStatus.Deploying;
}
}
public class CompProperties_LaunchableWormhole : CompProperties
{
public float fuelPerTile = 1f; // Default fuel cost per tile
public CompProperties_LaunchableWormhole()
{
this.compClass = typeof(CompLaunchableWormhole);
}
}
}

View File

@@ -0,0 +1,9 @@
using Verse;
namespace ArachnaeSwarm
{
public class DefModExtension_TravelingWormhole : DefModExtension
{
public float travelSpeed = 5f; // 20 Default speed in tiles per day
}
}

View File

@@ -0,0 +1,45 @@
using System.Collections.Generic;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class JobDriver_DeployWormhole : JobDriver
{
private Building_WormholePortal_A PortalA => (Building_WormholePortal_A)job.targetA.Thing;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
this.FailOnDespawnedOrNull(TargetIndex.A);
this.FailOn(() => PortalA.status == WormholePortalStatus.Linked);
// Go to Portal A
yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch);
// Wait a bit to simulate 'entering'
Toil waitToil = Toils_General.Wait(120).WithProgressBarToilDelay(TargetIndex.A);
waitToil.FailOnCannotTouch(TargetIndex.A, PathEndMode.Touch);
yield return waitToil;
// Start the deployment process
Toil deployToil = new Toil();
deployToil.initAction = delegate
{
var comp = PortalA.GetComp<CompLaunchableWormhole>();
if (comp != null)
{
// This will open the world map targeting UI
// The actual teleportation of the pilot happens inside StartChoosingDestination -> ChoseWorldTarget -> Deploy
comp.StartChoosingDestination(pawn);
}
};
deployToil.defaultCompleteMode = ToilCompleteMode.Instant;
yield return deployToil;
}
}
}

Some files were not shown because too many files have changed in this diff Show More