42 Commits

Author SHA1 Message Date
ProjectKoi-Kalo\Kalo
a072b7c532 暂存 2025-09-10 15:00:11 +08:00
ProjectKoi-Kalo\Kalo
250844ab00 暂存3 2025-09-10 14:47:33 +08:00
ProjectKoi-Kalo\Kalo
26dba2f16b 暂存2 2025-09-10 14:41:40 +08:00
ProjectKoi-Kalo\Kalo
17722d473a 暂存 2025-09-10 13:13:41 +08:00
ProjectKoi-Kalo\Kalo
ef14ad1caf 暂存 2025-09-10 12:38:56 +08:00
ProjectKoi-Kalo\Kalo
6fe5db0b4f 暂存3 2025-09-10 12:22:03 +08:00
ProjectKoi-Kalo\Kalo
5ed1b3ec62 暂存 2025-09-10 12:17:47 +08:00
ProjectKoi-Kalo\Kalo
cc5206c3c6 暂存 2025-09-10 12:14:30 +08:00
ProjectKoi-Kalo\Kalo
54de15873f 暂存 2025-09-10 11:25:51 +08:00
Tourswen
64fd63796d 各种描述修改,两个水货武器,科技调整,完善升级树,将武器标签系统搬过来 2025-09-10 10:01:21 +08:00
ProjectKoi-Kalo\Kalo
12ea403c97 暂存 2025-09-10 01:02:08 +08:00
ProjectKoi-Kalo\Kalo
c9fd2e8844 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-09 23:54:51 +08:00
ProjectKoi-Kalo\Kalo
f3fb6122e3 暂存 2025-09-09 23:54:48 +08:00
Tourswen
72fbec8d21 Update ArachnaeNode_Race_Addons_Skyraider_Wing_south.sai2 2025-09-09 23:47:00 +08:00
Tourswen
c2299e22e6 杂七杂八的调整 2025-09-09 23:46:51 +08:00
ProjectKoi-Kalo\Kalo
d1f9e7f17a 虫肉虫肉 2025-09-09 23:18:27 +08:00
ProjectKoi-Kalo\Kalo
19de1bfd8f Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-09 17:51:22 +08:00
ProjectKoi-Kalo\Kalo
de5c7412b3 虫烟 2025-09-09 17:51:20 +08:00
Tourswen
770f81e4c8 科技和虫卵 2025-09-09 17:32:27 +08:00
ProjectKoi-Kalo\Kalo
6e9b0829b7 暂存 2025-09-09 15:15:34 +08:00
ProjectKoi-Kalo\Kalo
6694ff2d62 存天巢种 2025-09-09 14:56:06 +08:00
ProjectKoi-Kalo\Kalo
b1a0a35b94 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-09 12:44:49 +08:00
ProjectKoi-Kalo\Kalo
17cdfd07eb 暂存 2025-09-09 12:44:47 +08:00
Tourswen
54ad384068 大型虫族的确立 2025-09-09 12:00:40 +08:00
Tourswen
d18e70f2e4 将所有的verb从乌拉迁移(不包括咖喱棒) 2025-09-09 11:05:06 +08:00
Tourswen
025881a310 将种族限定区域hediff挪过来 2025-09-09 10:56:15 +08:00
Tourswen
6b8fb58777 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-09 01:14:39 +08:00
Tourswen
3add58d294 浓雾种 2025-09-09 01:12:18 +08:00
ProjectKoi-Kalo\Kalo
501bc91e35 Merge branch '空天种' 2025-09-08 23:36:01 +08:00
ProjectKoi-Kalo\Kalo
390128f503 暂存 2025-09-08 23:31:22 +08:00
Tourswen
6516871763 生物孵化池的立绘 2025-09-08 22:16:09 +08:00
ProjectKoi-Kalo\Kalo
8a0fbe32e8 暂存 2025-09-08 21:59:11 +08:00
ProjectKoi-Kalo\Kalo
24a0ed126b 暂存 2025-09-08 21:39:32 +08:00
ProjectKoi-Kalo\Kalo
8d6c992f1f 暂存2 2025-09-08 20:09:22 +08:00
ProjectKoi-Kalo\Kalo
30ee96a196 zz暂存 2025-09-08 20:05:20 +08:00
Tourswen
a136c0eb50 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-08 19:21:43 +08:00
Tourswen
42a96c6cfb 修改茧名字,修改产物速率,修改菌毯减速 2025-09-08 19:21:27 +08:00
ProjectKoi-Kalo\Kalo
ebe217223d 2025-09-08 18:34:28 +08:00
ProjectKoi-Kalo\Kalo
82b3855fc8 暂存物品池 2025-09-08 18:26:12 +08:00
ProjectKoi-Kalo\Kalo
1a102fcf31 暂存 2025-09-08 18:05:15 +08:00
Tourswen
f72fb7e62e 修改描述,合并虫卵 2025-09-08 17:27:18 +08:00
ProjectKoi-Kalo\Kalo
ec20d84344 暂存 2025-09-08 15:35:19 +08:00
124 changed files with 8542 additions and 2341 deletions

Binary file not shown.

View File

@@ -106,7 +106,6 @@
<filthChance>0.25</filthChance>
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_AcidSprayBurst</defName>
<label>酸液轰炸</label>
@@ -151,6 +150,7 @@
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_Toxic_Needle_Fire</defName>
<label>毒针连射</label>
@@ -244,6 +244,42 @@
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_BaseRace_Skyhive_Launcher</defName>
<label>天巢种喷射巢</label>
<description>将三只阿拉克涅天巢种辅虫发射到目标身上,天巢种将附着到敌人身上撕咬,脱落后仍然能继续对敌人展开攻击。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<charges>3</charges>
<cooldownPerCharge>true</cooldownPerCharge>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>24</range>
<warmupTime>1</warmupTime>
<soundCast>AcidSpray_Resolve</soundCast>
<violent>false</violent>
<targetParams>
<canTargetPawns>True</canTargetPawns>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityLaunchMultiProjectile">
<projectileDef>Bullet_ARA_RW_Basic_SkyHive_Gun</projectileDef>
<numProjectiles>3</numProjectiles>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>0.5</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_Ability_Possess</defName>
<label>原虫种突袭寄生</label>
@@ -283,4 +319,143 @@
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_Ability_Smokepop</defName>
<label>信息素浓雾释放</label>
<description>浓雾种将其腹部的大量释放阿拉克涅信息素烟雾,吸引附近的阿拉克涅辅虫破土而出支援虫群。形成一大片足以遮蔽虫族身形的烟雾,并防止敌方使用火焰武器点燃虫族集群。</description>
<iconPath>UI/Abilities/MechSmokepop</iconPath>
<cooldownTicksRange>6000</cooldownTicksRange>
<targetRequired>false</targetRequired>
<hostile>false</hostile>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>1</warmupTime>
<range>10</range>
<drawAimPie>false</drawAimPie>
<targetParams>
<canTargetSelf>true</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>0.25</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
<!--<li Class="CompProperties_AbilityFirefoampop">
<firefoamRadius>10</firefoamRadius>
<clamorType>Ability</clamorType>
<clamorRadius>15</clamorRadius>
</li>-->
<li Class="ArachnaeSwarm.CompProperties_AbilityDRM_Deaddustpop">
<damageDef>ARA_ReinforceGas</damageDef>
<damageAmount>5</damageAmount>
<armorPenetration>2.0</armorPenetration>
<smokeRadius>10</smokeRadius>
<explosionSound>Explosion_Smoke</explosionSound>
<clamorType>Ability</clamorType>
<clamorRadius>15</clamorRadius>
<postExplosionSpawnThingDef>ARA_ReinforceGasCloud</postExplosionSpawnThingDef> <!-- ARL_ToxicGasCloud -->
<postExplosionSpawnChance>1</postExplosionSpawnChance>
<postExplosionSpawnThingCount>1</postExplosionSpawnThingCount>
</li>
<!-- <li Class="ArachnaeSwarm.CompProperties_AbilityBodyPartCheck">
<requiredPart>ARA_Toxic_Needle</requiredPart>
<failMessage>毒针腺受损或缺失,无法发射毒针</failMessage>
</li> -->
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_TumorSpew</defName>
<label>菌瘤释放</label>
<description>排出一枚菌瘤,将附近的大片地区转变为菌毯地形,以方便虫群进行活动,并阻碍敌军的前进。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<targetRequired>false</targetRequired>
<hostile>false</hostile>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>13</range>
<warmupTime>1</warmupTime>
<soundCast>AcidSpray_Resolve</soundCast>
<violent>false</violent>
<targetable>false</targetable>
<drawAimPie>false</drawAimPie>
<targetParams>
<canTargetSelf>True</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>1</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_Tumor</projectileDef>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_Tumor</defName>
<label>阿拉克涅菌瘤</label>
<projectile>
<spawnsThingDef>ARA_Tumor_Smokepop</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="BuildingNaturalBase">
<defName>ARA_Tumor_Smokepop</defName>
<label>阿拉克涅枯萎菌瘤</label>
<description>由少数虫族排出的特殊菌瘤,除了照明外还会在地上大范围地扩散菌毯,但是很快就会枯死。</description>
<thingClass>Building</thingClass>
<!-- <minifiedDef>MinifiedThing</minifiedDef> -->
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<selectable>true</selectable>
<fillPercent>0.20</fillPercent>
<leaveResourcesWhenKilled>false</leaveResourcesWhenKilled>
<rotatable>false</rotatable>
<tickerType>Normal</tickerType>
<repairEffect>EatVegetarian</repairEffect>
<filthLeaving>Filth_Slime</filthLeaving>
<statBases>
<MaxHitPoints>10</MaxHitPoints>
<Mass>4</Mass>
<Flammability>1.0</Flammability>
<MarketValue>50</MarketValue>
</statBases>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Tumor</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>1.2</drawSize>
<shadowData>
<volume>(0.3, 0.6, 0.3)</volume>
<offset>(0,0,-0.1)</offset>
</shadowData>
</graphicData>
<placeWorkers>
<li>PlaceWorker_GlowRadius</li>
</placeWorkers>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>13</glowRadius>
<glowColor>(220,210,171,0)</glowColor>
</li>
<li Class="CompProperties_Lifespan">
<lifespanTicks>9000</lifespanTicks>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>13</spawnRadius>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<AbilityDef Name="ARA_EggSpew_Base" Abstract="True">
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>false</aiCanUse>
@@ -31,7 +30,6 @@
</li>
</comps>
</AbilityDef>
<ThingDef Name="ARA_EggSpew_Base_Proj" ParentName="BaseGrenadeProjectile" Abstract="True">
<thingClass>Projectile_SpawnsThing</thingClass>
<graphicData>
@@ -45,7 +43,6 @@
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
</projectile>
</ThingDef>
<AbilityDef Name="ARA_CocoonSpew_Base" Abstract="True">
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
@@ -72,12 +69,11 @@
</li>
</comps>
</AbilityDef>
<ThingDef Name="ARA_CocoonSpew_Base_Proj" ParentName="BaseGrenadeProjectile" Abstract="True">
<label>阿拉克涅孵化茧</label>
<thingClass>Projectile_SpawnsThing</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_BioforgeIncubator</texPath>
<texPath>ArachnaeSwarm/Building/ARA_Cocoon</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>
@@ -88,26 +84,11 @@
</projectile>
</ThingDef>
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew_BaseFighter</defName>
<label>生育虫卵-战士虫</label>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac_BaseFighter</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_1KYC</requiredResearch>
<failMessage>需要科技 基因节点KYC-1"战士虫" 以解锁此孵化路径</failMessage>
</li>
</comps>
</AbilityDef>
<!-- T0 -->
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew</defName>
<label>生育虫卵</label>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。</description>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。\n\n该虫卵只能孵化小型虫族。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
@@ -115,6 +96,38 @@
</li>
</comps>
</AbilityDef>
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew_Huge</defName>
<label>生育大型虫卵</label>
<description>从卵巢中排出一颗休眠的大型虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。\n\n该虫卵只能孵化大型虫族。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac_Huge</projectileDef>
</li>
</comps>
</AbilityDef>
<!-- T1 -->
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew_1Stage</defName>
<label>生育虫卵——等级1</label>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。\n\n该虫卵只能孵化小型虫族。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac_1Stage</projectileDef>
</li>
</comps>
</AbilityDef>
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew_Huge_1Stage</defName>
<label>生育大型虫卵——等级1</label>
<description>从卵巢中排出一颗休眠的大型虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。\n\n该虫卵只能孵化大型虫族。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac_Huge_1Stage</projectileDef>
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -20,7 +20,7 @@
<cooldownTicksRange>600</cooldownTicksRange>
<verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
<label>tracking charge</label>
<label>追踪冲撞</label>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
@@ -28,7 +28,7 @@
<canTargetMechs>true</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
</targetParams>
<range>60</range>
<range>30</range>
<warmupTime>1.0</warmupTime>
</verbProperties>
<comps>
@@ -49,5 +49,4 @@
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<AnimationDef>
<defName>ARA_FlyEast</defName>
<durationTicks>60</durationTicks>
<keyframeParts>
<li>
<key>ARA_Flight_Attachment</key>
<value>
<keyframes>
<li><graphicState>ARA_FlyEast_0</graphicState><tick>0</tick></li>
<li><graphicState>ARA_FlyEast_1</graphicState><tick>4</tick></li>
<li><graphicState>ARA_FlyEast_2</graphicState><tick>8</tick></li>
<li><graphicState>ARA_FlyEast_3</graphicState><tick>12</tick></li>
<li><graphicState>ARA_FlyEast_4</graphicState><tick>16</tick></li>
<li><graphicState>ARA_FlyEast_5</graphicState><tick>20</tick></li>
<li><graphicState>ARA_FlyEast_6</graphicState><tick>24</tick></li>
<li><graphicState>ARA_FlyEast_7</graphicState><tick>28</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_FlyNorth</defName>
<durationTicks>60</durationTicks>
<keyframeParts>
<li>
<key>ARA_Flight_Attachment</key>
<value>
<keyframes>
<li><graphicState>ARA_FlyNorth_0</graphicState><tick>0</tick></li>
<li><graphicState>ARA_FlyNorth_1</graphicState><tick>4</tick></li>
<li><graphicState>ARA_FlyNorth_2</graphicState><tick>8</tick></li>
<li><graphicState>ARA_FlyNorth_3</graphicState><tick>12</tick></li>
<li><graphicState>ARA_FlyNorth_4</graphicState><tick>16</tick></li>
<li><graphicState>ARA_FlyNorth_5</graphicState><tick>20</tick></li>
<li><graphicState>ARA_FlyNorth_6</graphicState><tick>24</tick></li>
<li><graphicState>ARA_FlyNorth_7</graphicState><tick>28</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_FlySouth</defName>
<durationTicks>60</durationTicks>
<keyframeParts>
<li>
<key>ARA_Flight_Attachment</key>
<value>
<keyframes>
<li><graphicState>ARA_FlySouth_0</graphicState><tick>0</tick></li>
<li><graphicState>ARA_FlySouth_1</graphicState><tick>4</tick></li>
<li><graphicState>ARA_FlySouth_2</graphicState><tick>8</tick></li>
<li><graphicState>ARA_FlySouth_3</graphicState><tick>12</tick></li>
<li><graphicState>ARA_FlySouth_4</graphicState><tick>16</tick></li>
<li><graphicState>ARA_FlySouth_5</graphicState><tick>20</tick></li>
<li><graphicState>ARA_FlySouth_6</graphicState><tick>24</tick></li>
<li><graphicState>ARA_FlySouth_7</graphicState><tick>28</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

@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_normal</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>normal</browShapeDef>
<lidShapeDef>normal</lidShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
<headShapeDef>normal</headShapeDef>
</li>
</animationFrames>
<priority>0</priority>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_eyeMoving</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>15</duration>
<eyeballOffset>(-0.005,0,0)</eyeballOffset>
</li>
</animationFrames>
<priority>1002</priority>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>500</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_eyeMoving2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>15</duration>
<eyeballOffset>(0.005,0,0)</eyeballOffset>
</li>
</animationFrames>
<priority>1001</priority>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>500</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_eyeFlicker</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>3</duration>
</li>
</animationFrames>
<priority>1001</priority>
<roopIntervalMin>10 </roopIntervalMin>
<roopIntervalMax>30</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_blink</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>3</duration>
<browOffset>(0,0,-0.005)</browOffset>
<lidOffset>(0,0,-0.005)</lidOffset>
<lidShapeDef>normal</lidShapeDef>
</li>
<li>
<duration>12</duration>
<browOffset>(0,0,-0.01)</browOffset>
<lidShapeDef>close</lidShapeDef>
</li>
<li>
<duration>3</duration>
<browOffset>(0,0,-0.005)</browOffset>
<lidOffset>(0,0,-0.005)</lidOffset>
<lidShapeDef>normal</lidShapeDef>
</li>
</animationFrames>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>500</roopIntervalMax>
<priority>1000</priority>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- 裸体想法 -->
<!-- <FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Thought_Naked</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<headShapeDef>blush</headShapeDef>
<browShapeDef>s-shaped</browShapeDef>
</li>
</animationFrames>
<priority>200</priority>
<targetThoughtDefs>
<li>Naked</li>
<li>GroinUncovered_Disapproved_Male</li>
<li>GroinUncovered_Disapproved_Female</li>
<li>GroinOrChestUncovered_Disapproved_Male</li>
<li>GroinOrChestUncovered_Disapproved_Female</li>
<li>GroinChestOrHairUncovered_Disapproved_Male</li>
<li>GroinChestOrHairUncovered_Disapproved_Female</li>
<li>GroinChestHairOrFaceUncovered_Disapproved_Male</li>
<li>GroinChestHairOrFaceUncovered_Disapproved_Female</li>
</targetThoughtDefs>
</FacialAnimation.FaceAnimationDef> -->
</Defs>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_AttackMelee</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>angled</browShapeDef>
<mouthShapeDef>open</mouthShapeDef>
<browOffset>(0,0,-0.00875)</browOffset>
<lidOffset>(0.0,0,-0.005)</lidOffset>
</li>
</animationFrames>
<targetJobs>
<li>AttackMelee</li>
</targetJobs>
<priority>10200</priority>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>AttackMelee2</defName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>angled</browShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>AttackMelee</li>
</targetJobs>
<priority>10201</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_AttackStatic</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>angled</browShapeDef>
<mouthShapeDef>open</mouthShapeDef>
<browOffset>(0,0,-0.00875)</browOffset>
<lidOffset>(0.0,0,-0.005)</lidOffset>
</li>
</animationFrames>
<targetJobs>
<li>AttackStatic</li>
</targetJobs>
<priority>10200</priority>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>AttackStatic2</defName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>angled</browShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>AttackStatic</li>
</targetJobs>
<priority>10201</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_DoBill</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<lidOffset>(0,0,-0.00625)</lidOffset>
<eyeballOffset>(0.0,0,-0.0075)</eyeballOffset>
<headOffset>(0,0,-0.0007)</headOffset>
<browShapeDef>normal</browShapeDef>
<browOffset>(0,0,-0.00325)</browOffset>
<mouthOffset>(0,0,-0.00125)</mouthOffset>
</li>
</animationFrames>
<roopIntervalMin>0</roopIntervalMin>
<roopIntervalMax>0</roopIntervalMax>
<targetJobs>
<li>DoBill</li>
</targetJobs>
<priority>10000</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_DoBill2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>3</duration>
<lidOffset>(0,0,-0.0035)</lidOffset>
<eyeballOffset>(0.0,0,-0.00375)</eyeballOffset>
<headOffset>(0,0,-0.0035)</headOffset>
<browShapeDef>normal</browShapeDef>
<browOffset>(0,0,-0.00025)</browOffset>
<mouthOffset>(0,0,-0.000625)</mouthOffset>
</li>
<li>
<duration>6</duration>
<lidOffset>(0,0,-0.007)</lidOffset>
<eyeballOffset>(0.0,0,-0.00525)</eyeballOffset>
<headOffset>(0,0,-0.0075)</headOffset>
<browShapeDef>normal</browShapeDef>
<browOffset>(0,0,-0.00375)</browOffset>
<mouthOffset>(0,0,-0.00125)</mouthOffset>
</li>
<li>
<duration>3</duration>
<lidOffset>(0,0,-0.0035)</lidOffset>
<eyeballOffset>(0.0,0,-0.00375)</eyeballOffset>
<headOffset>(0,0,-0.0035)</headOffset>
<browShapeDef>normal</browShapeDef>
<browOffset>(0,0,-0.00025)</browOffset>
<mouthOffset>(0,0,-0.000625)</mouthOffset>
</li>
</animationFrames>
<roopIntervalMin>100</roopIntervalMin>
<roopIntervalMax>200</roopIntervalMax>
<targetJobs>
<li>DoBill</li>
</targetJobs>
<priority>10001</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Goto</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>angled</browShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
<headOffset>(0.0,0,-0.0025)</headOffset>
</li>
</animationFrames>
<targetJobs>
<li>Goto</li>
</targetJobs>
<priority>10300</priority>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Ingest</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>4</duration>
<headOffset>(0.0,0,0.0025)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>4</duration>
<headOffset>(0.0,0,0.005)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>6</duration>
<headOffset>(0.0,0,0)</headOffset>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>0</roopIntervalMin>
<roopIntervalMax>30</roopIntervalMax>
<targetJobs>
<li>Ingest</li>
</targetJobs>
<priority>10</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_laydown</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>flat</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>0</roopIntervalMin>
<roopIntervalMax>0</roopIntervalMax>
<targetJobs>
<li>LayDown</li>
</targetJobs>
<priority>10001</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_laydown2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>240</duration>
<mouthShapeDef>open</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>100</roopIntervalMin>
<roopIntervalMax>500</roopIntervalMax>
<targetJobs>
<li>LayDown</li>
</targetJobs>
<priority>10002</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_laydown3</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>15</duration>
<lidOffset>(0.0,0,0.0015)</lidOffset>
<headOffset>(0,0,0.0035)</headOffset>
<browOffset>(0,0,0.00025)</browOffset>
<mouthOffset>(0,0,0.000625)</mouthOffset>
</li>
<li>
<duration>60</duration>
<lidOffset>(0.0,0,0.00275)</lidOffset>
<headOffset>(0,0,0.0075)</headOffset>
<browOffset>(0,0,0.00375)</browOffset>
<mouthOffset>(0,0,0.00125)</mouthOffset>
</li>
<li>
<duration>10</duration>
<lidOffset>(0.0,0,0.0015)</lidOffset>
<headOffset>(0,0,0.0035)</headOffset>
<browOffset>(0,0,0.00025)</browOffset>
<mouthOffset>(0,0,0.000625)</mouthOffset>
</li>
</animationFrames>
<roopIntervalMin>40</roopIntervalMin>
<roopIntervalMax>200</roopIntervalMax>
<targetJobs>
<li>LayDown</li>
</targetJobs>
<priority>10003</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,80 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Lovin</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>8</duration>
<browShapeDef>s-shaped</browShapeDef>
<headOffset>(0.0,0,0.00125)</headOffset>
<browOffset>(0.0,0,-0.005)</browOffset>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0.0,0,-0.001)</lidOffset>
<eyeballOffset>(0.0,0,0.0075)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>8</duration>
<browShapeDef>s-shaped</browShapeDef>
<headOffset>(0.0,0,-0.00375)</headOffset>
<browOffset>(0.0,0,-0.0075)</browOffset>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0.0,0,-0.0015)</lidOffset>
<eyeballOffset>(0.0,0,0.0075)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<mouthOffset>(0,0,-0.002)</mouthOffset>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>8</duration>
<browShapeDef>s-shaped</browShapeDef>
<headOffset>(0.0,0,0.0075)</headOffset>
<browOffset>(0.0,0,0.00125)</browOffset>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0.0,0,0.001)</lidOffset>
<eyeballOffset>(0.0,0,0.0075)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<mouthOffset>(0,0,-0.001)</mouthOffset>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<targetJobs>
<li>Lovin</li>
<li>MLI_Jobs_MassLoveIn</li>
<li>MLI_Jobs_SingleLoveIn</li>
</targetJobs>
<priority>10400</priority>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Lovin2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>240</duration>
<browShapeDef>s-shaped</browShapeDef>
<headOffset>(0.0,0,0.01)</headOffset>
<browOffset>(0.0,0,-0.00)</browOffset>
<lidShapeDef>normal</lidShapeDef>
<lidOffset>(0.0,0,-0.001)</lidOffset>
<mouthOffset>(0,0,-0.001)</mouthOffset>
<eyeballOffset>(0.0,0,0.005)</eyeballOffset>
<mouthShapeDef>normal</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<roopIntervalMin>240</roopIntervalMin>
<roopIntervalMax>240</roopIntervalMax>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<targetJobs>
<li>Lovin</li>
<li>MLI_Jobs_MassLoveIn</li>
<li>MLI_Jobs_SingleLoveIn</li>
</targetJobs>
<priority>10500</priority>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Mine</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.005)</lidOffset>
<headOffset>(0,0,0)</headOffset>
<browShapeDef>angled</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>5</duration>
<lidOffset>(0,0,0.01)</lidOffset>
<headOffset>(0,0,-0.01)</headOffset>
<browShapeDef>angled</browShapeDef>
<mouthOffset>(0,0,-0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>0</roopIntervalMin>
<roopIntervalMax>0</roopIntervalMax>
<targetJobs>
<li>Mine</li>
</targetJobs>
<priority>10000</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,78 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_RemoveApparel</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(-0.005,0,0.005)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(0.005,0,0.005)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(0,0,0.005)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>RemoveApparel</li>
</targetJobs>
<priority>105</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>300</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_RemoveApparel2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>s-shaped</browShapeDef>
<lidShapeDef>normal</lidShapeDef>
<eyeballOffset>(0.0,0,0.005)</eyeballOffset>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>RemoveApparel</li>
</targetJobs>
<priority>104</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_RemoveApparel3</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>120</duration>
<browShapeDef>flat</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<headOffset>(0.0,0,0.005)</headOffset>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>RemoveApparel</li>
</targetJobs>
<priority>110</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>300</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,100 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Research</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>10</duration>
<lidOffset>(0,0,-0.005)</lidOffset>
<headOffset>(0,0,-0.01)</headOffset>
<browShapeDef>flat</browShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
<mouthOffset>(0,0,-0.00375)</mouthOffset>
</li>
</animationFrames>
<targetJobs>
<li>Research</li>
</targetJobs>
<priority>10001</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Research2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>4</duration>
<browOffset>(0,0,0.00325)</browOffset>
<lidOffset>(0,0,0.00625)</lidOffset>
<headOffset>(0,0,0.005)</headOffset>
<browShapeDef>normal</browShapeDef>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>40</duration>
<browOffset>(0,0,0.00625)</browOffset>
<lidOffset>(0,0,0.00875)</lidOffset>
<headOffset>(0,0,0.01)</headOffset>
<browShapeDef>normal</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>3</duration>
<browOffset>(0,0,0.00625)</browOffset>
<lidOffset>(0,0,0.00875)</lidOffset>
<headOffset>(0,0,0.01)</headOffset>
<lidShapeDef>close</lidShapeDef>
<browShapeDef>normal</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>20</duration>
<browOffset>(0,0,0.00625)</browOffset>
<lidOffset>(0,0,0.00875)</lidOffset>
<headOffset>(0,0,0.01)</headOffset>
<browShapeDef>normal</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>3</duration>
<browOffset>(0,0,0.00625)</browOffset>
<lidOffset>(0,0,0.00875)</lidOffset>
<headOffset>(0,0,0.01)</headOffset>
<lidShapeDef>close</lidShapeDef>
<browShapeDef>normal</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>40</duration>
<browOffset>(0,0,0.00625)</browOffset>
<lidOffset>(0,0,0.00875)</lidOffset>
<headOffset>(0,0,0.01)</headOffset>
<browShapeDef>normal</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>8</duration>
<browOffset>(0,0,0.00325)</browOffset>
<lidOffset>(0,0,0.00625)</lidOffset>
<headOffset>(0,0,0.005)</headOffset>
<browShapeDef>normal</browShapeDef>
<mouthShapeDef>open</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>900</roopIntervalMin>
<roopIntervalMax>1200</roopIntervalMax>
<targetJobs>
<li>Research</li>
</targetJobs>
<priority>10002</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_SocialRelax</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>normal</browShapeDef>
<lidShapeDef>close</lidShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>SocialRelax</li>
</targetJobs>
<priority>10200</priority>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_StandAndBeSociallyActive</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>3</duration>
<browShapeDef>normal</browShapeDef>
<headOffset>(0.0,0,-0.0025)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>3</duration>
<browShapeDef>normal</browShapeDef>
<headOffset>(0.0,0,-0.005)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>3</duration>
<browShapeDef>normal</browShapeDef>
<headOffset>(0.0,0,0)</headOffset>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>0</roopIntervalMin>
<roopIntervalMax>100</roopIntervalMax>
<targetJobs>
<li>StandAndBeSociallyActive</li>
</targetJobs>
<priority>10</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,53 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Strip</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(-0.005,0,0.005)</eyeballOffset>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(0.005,0,0.005)</eyeballOffset>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(0,0,0.005)</eyeballOffset>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Strip</li>
</targetJobs>
<priority>105</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>300</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>Strip2</defName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>s-shaped</browShapeDef>
<lidShapeDef>normal</lidShapeDef>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Strip</li>
</targetJobs>
<priority>106</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_WaitCombat</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>angled</browShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Wait_Combat</li>
</targetJobs>
<priority>10200</priority>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Wait_Combat_Rare</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>15</duration>
<browShapeDef>normal</browShapeDef>
</li>
<li>
<duration>4</duration>
<browOffset>(0,0,-0.00375)</browOffset>
<browShapeDef>flat</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0,0,-0.0025)</lidOffset>
<headOffset>(0,0,-0.00625)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>45</duration>
<browOffset>(0,0,-0.01)</browOffset>
<browShapeDef>s-shaped</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0,0,-0.005)</lidOffset>
<headOffset>(0,0,-0.0175)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
<mouthOffset>(0,0,-0.005)</mouthOffset>
</li>
<li>
<duration>30</duration>
<browOffset>(0,0,-0.01)</browOffset>
<browShapeDef>s-shaped</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0,0,-0.005)</lidOffset>
<headOffset>(0,0,-0.015)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
<mouthOffset>(0,0,-0.005)</mouthOffset>
</li>
<li>
<duration>7</duration>
<browOffset>(0,0,-0.00375)</browOffset>
<browShapeDef>s-shaped</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<lidOffset>(0,0,-0.0025)</lidOffset>
<headOffset>(0,0,-0.0085)</headOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>4</duration>
<browShapeDef>flat</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
</li>
<li>
<duration>30</duration>
<browShapeDef>normal</browShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Wait_Combat</li>
</targetJobs>
<priority>10301</priority>
<roopIntervalMin>1000</roopIntervalMin>
<roopIntervalMax>2000</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Wait_Downed</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>30</duration>
<browOffset>(0,0,0.015)</browOffset>
<lidOffset>(0,0,0.01)</lidOffset>
<headOffset>(0,0,0.01)</headOffset>
<browShapeDef>flat</browShapeDef>
<mouthOffset>(0,0,0.0025)</mouthOffset>
<mouthShapeDef>open</mouthShapeDef>
</li>
<li>
<duration>3</duration>
<browOffset>(0,0,0.0075)</browOffset>
<lidOffset>(0,0,0.005)</lidOffset>
<headOffset>(0,0,0.005)</headOffset>
<browShapeDef>flat</browShapeDef>
<mouthShapeDef>normal</mouthShapeDef>
</li>
</animationFrames>
<roopIntervalMin>0</roopIntervalMin>
<roopIntervalMax>100</roopIntervalMax>
<targetJobs>
<li>Wait_Downed</li>
</targetJobs>
<priority>10000</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>Wait_Downed2</defName>
<animationFrames>
<li>
<duration>3</duration>
<lidOffset>(0,0,0.005)</lidOffset>
<browShapeDef>flat</browShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Wait_Downed</li>
</targetJobs>
<priority>10001</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -1,77 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Wear</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(-0.005,0,0.005)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(0.005,0,0.005)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
<li>
<duration>10</duration>
<lidOffset>(0,0,0.0)</lidOffset>
<eyeballOffset>(0,0,0.005)</eyeballOffset>
<mouthShapeDef>open</mouthShapeDef>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Wear</li>
</targetJobs>
<priority>105</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>300</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Wear2</defName>
<raceName>ArachnaeNode_Race_Myrmecocystus</raceName>
<animationFrames>
<li>
<duration>1</duration>
<browShapeDef>s-shaped</browShapeDef>
<lidShapeDef>normal</lidShapeDef>
<eyeballOffset>(0.0,0,0.005)</eyeballOffset>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Wear</li>
</targetJobs>
<priority>104</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
</FacialAnimation.FaceAnimationDef>
<FacialAnimation.FaceAnimationDef MayRequire="Nals.FacialAnimation">
<defName>Wear3</defName>
<animationFrames>
<li>
<duration>120</duration>
<browShapeDef>flat</browShapeDef>
<lidShapeDef>close</lidShapeDef>
<headOffset>(0.0,0,0.005)</headOffset>
<headShapeDef>blush</headShapeDef>
</li>
</animationFrames>
<targetJobs>
<li>Wear</li>
</targetJobs>
<priority>110</priority>
<applyWhenStandingOnly>true</applyWhenStandingOnly>
<roopIntervalMin>30 </roopIntervalMin>
<roopIntervalMax>300</roopIntervalMax>
</FacialAnimation.FaceAnimationDef>
</Defs>

View File

@@ -35,7 +35,21 @@
<Intellectual>3</Intellectual>
<Social>3</Social>
</skillGains>
<workDisables>ManualDumb,Mining,PlantWork,Animals,Crafting,Cooking,Constructing,Hunting</workDisables>
<workDisables>
<li>Cleaning</li>
<li>Hauling</li>
<li>Mining</li>
<li>PlantWork</li>
<li>Animals</li>
<li>Hunting</li>
<li>Crafting</li>
<li>Cooking</li>
<!-- <li>Constructing</li> -->
<!-- <li>Caring</li> -->
<!-- <li>Social</li> -->
<!-- <li>Artistic</li> -->
<!-- <li>Intellectual</li> -->
</workDisables>
<spawnCategories>
<li>ArachnaeQueen_spawnCategoriesB</li>
@@ -59,7 +73,7 @@
<defName>Arachnae_Node_BS_Adult_Myrmecocystus</defName>
<title>阿拉克涅蜜罐种</title>
<titleShort>蜜罐种</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅蜜罐种督虫。基因的选择性表达使其长出了肿胀的囊袋和复杂的口器,这使得她可以吞噬那些未经过处理的尸体和各种杂食或是将其进一步分解,并通过消化器官将其转变为阿拉克涅虫蜜以供其他虫族食用。\n\n[PAWN_nameDef]在战斗中并不是一个值得正视的对手,她没有可以接入武装器官的副肢,脆弱臃肿的特性也决定了她几乎无法躲开任何攻击。</description>
<description>[PAWN_nameDef]是一只阿拉克涅蜜罐种督虫。基因的选择性表达使其长出了肿胀的囊袋和复杂的口器,这使得她可以吞噬那些未经过处理的尸体和各种杂食或是将其进一步分解,并通过消化器官将其转变为阿拉克涅虫蜜以供其他虫族食用。\n\n[PAWN_nameDef]在战斗中并不是一个值得正视的对手,她的战斗技能非常笨拙,脆弱臃肿的特性也决定了她几乎无法躲开任何攻击。</description>
<slot>Adulthood</slot>
<workDisables>
<li>Cleaning</li>
@@ -77,7 +91,9 @@
<li>Intellectual</li>
</workDisables>
<skillGains>
<Cooking>5</Cooking>
<Shooting>-10</Shooting>
<Melee>-10</Melee>
<Plants>5</Plants>
</skillGains>
<spawnCategories>
@@ -106,7 +122,7 @@
<li>Intellectual</li>
</workDisables>
<skillGains>
<Mining>5</Mining>
<Construction>5</Construction>
</skillGains>
<spawnCategories>
@@ -172,13 +188,88 @@
<li>ArachnaeNode_spawnCategories_Fighter</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_Smokepop</defName>
<title>阿拉克涅浓雾种</title>
<titleShort>浓雾种</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅浓雾种督虫,是少见的大型虫族,可以装配大型武装器官。她拥有让其他侵略者望而却步的巨型甲壳,常规的手持武器难以穿透;并且她还拥有一个巨大的浓雾腔,可以通过多条生物喷管将阻碍燃烧的白色黏着物和白色烟雾喷到大范围的广阔区域中,以掩护虫群集群冲击敌方炮塔阵地。</description>
<slot>Adulthood</slot>
<workDisables>
<!-- <li>Cleaning</li> -->
<!-- <li>Hauling</li> -->
<li>Mining</li>
<li>PlantWork</li>
<li>Animals</li>
<li>Hunting</li>
<li>Crafting</li>
<li>Cooking</li>
<li>Constructing</li>
<!-- <li>Caring</li> -->
<li>Social</li>
<li>Artistic</li>
<li>Intellectual</li>
</workDisables>
<skillGains>
<Shooting>3</Shooting>
<Melee>3</Melee>
<Medicine>6</Medicine>
</skillGains>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_Smokepop</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_Skyraider</defName>
<title>阿拉克涅空天种</title>
<titleShort>空天种</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅空天种督虫,空天种作为阿拉克涅督虫中的精锐,进化出了强大的飞行能力,是巢穴中无可争议的空中霸主。\n\n作为为数不多拥有飞行能力的虫族她可以从空中掠袭猎物并将其带至千米高空之上俯冲投下只留其余猎物在地面无助的挣扎。</description>
<slot>Adulthood</slot>
<workDisables>
<li>Cleaning</li>
<!-- <li>Hauling</li> -->
<li>Mining</li>
<li>PlantWork</li>
<li>Animals</li>
<li>Hunting</li>
<li>Crafting</li>
<li>Cooking</li>
<li>Constructing</li>
<li>Caring</li>
<li>Social</li>
<li>Artistic</li>
<li>Intellectual</li>
</workDisables>
<skillGains>
<Shooting>8</Shooting>
<Melee>5</Melee>
</skillGains>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_Skyraider</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_Facehugger</defName>
<title>阿拉克涅原虫种</title>
<titleShort>原虫种</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅原虫种督虫。[PAWN_nameDef]通过独特的神经链接管伸入受害者身体来接管受害者的身体。不同于普通阿拉克涅虫族,阿拉克涅原虫种拥有自我意识,不需要女皇种的监管</description>
<description>[PAWN_nameDef]是一只阿拉克涅原虫种督虫。[PAWN_nameDef]通过独特的神经链接管伸入受害者身体来接管受害者的身体。在进行接管时,技能熟练度将采取原虫种和受害者两者间较高的一方,但是所有在寄生期间获得的技能熟练度不会被原虫种离开受害者时继承</description>
<slot>Adulthood</slot>
<workDisables>
<!-- <li>Cleaning</li>
<li>Hauling</li>
<li>Mining</li>
<li>PlantWork</li>
<li>Animals</li>
<li>Hunting</li>
<li>Crafting</li>
<li>Cooking</li>
<li>Constructing</li>
<li>Caring</li>
<li>Social</li>
<li>Artistic</li> -->
<li>Intellectual</li>
</workDisables>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_Facehugger</li>

View File

@@ -44,4 +44,50 @@
</li>
</additionalHediffs>
</DamageDef>
<DamageDef ParentName="Bite">
<defName>ARA_SkyhiveBite</defName>
<label>天巢种撕咬</label>
<additionalHediffsThisPart>
<li>
<hediff>ARA_SkyhiveBite</hediff>
</li>
</additionalHediffsThisPart>
</DamageDef>
<DamageDef ParentName="Bite">
<defName>ARA_MimicNematodeBite</defName>
<additionalHediffs>
<li>
<hediff>ARA_MimicNematode</hediff>
<severityPerDamageDealt>0.001</severityPerDamageDealt>
</li>
</additionalHediffs>
</DamageDef>
<DamageDef>
<defName>ARA_ReinforceGas</defName>
<label>信息素烟雾</label>
<workerClass>DamageWorker_AddInjury</workerClass>
<hasForcefulImpact>false</hasForcefulImpact>
<makesBlood>false</makesBlood>
<canInterruptJobs>false</canInterruptJobs>
<externalViolence>false</externalViolence>
<deathMessage>{0} 被烟呛死了。</deathMessage>
<hediff>Burn</hediff>
<minDamageToFragment>1</minDamageToFragment>
<defaultDamage>2</defaultDamage>
<defaultArmorPenetration>0</defaultArmorPenetration>
<explosionHeatEnergyPerCell>0</explosionHeatEnergyPerCell>
<armorCategory>Heat</armorCategory>
<soundExplosion>Explosion_Smoke</soundExplosion>
<combatLogRules>Damage_Smoke</combatLogRules>
<canUseDeflectMetalEffect>false</canUseDeflectMetalEffect>
<scaleDamageToBuildingsBasedOnFlammability>true</scaleDamageToBuildingsBasedOnFlammability>
<additionalHediffs>
<li>
<hediff>ARA_ReinforceGasCoverd</hediff>
</li>
</additionalHediffs>
</DamageDef>
</Defs>

View File

@@ -249,5 +249,42 @@
<FacialAnimation.SkinTypeDef ParentName="ArachnaeNode_Skin" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_SkinNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.SkinTypeDef>
<FacialAnimation.BrowTypeDef ParentName="ArachnaeNode_Brow" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_BrowNormal</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.BrowTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeA" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_EyeNormal</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeB" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_EyeNormal2</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeC" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_EyeNormal3</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeD" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_EyeNormal4</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.HeadTypeDef ParentName="ArachnaeNode_Head" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_HeadNormal</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.HeadTypeDef>
<FacialAnimation.LidTypeDef ParentName="ArachnaeNode_Lid" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_LidNormal</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.LidTypeDef>
<FacialAnimation.MouthTypeDef ParentName="ArachnaeNode_Mouth" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_MouthNormal</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.MouthTypeDef>
<FacialAnimation.SkinTypeDef ParentName="ArachnaeNode_Skin" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Smokepop_SkinNormal</defName>
<raceName>ArachnaeNode_Race_Smokepop</raceName>
</FacialAnimation.SkinTypeDef>
</Defs>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- North Frames -->
<GraphicStateDef><defName>ARA_FlyNorth_0</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_1_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_1</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_2_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_2</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_3_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_3</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_4_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_4</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_5_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_5</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_6_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_6</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_7_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyNorth_7</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_8_north</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<!-- East Frames -->
<GraphicStateDef><defName>ARA_FlyEast_0</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_1_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_1</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_2_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_2</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_3_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_3</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_4_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_4</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_5_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_5</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_6_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_6</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_7_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlyEast_7</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_8_east</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<!-- South Frames -->
<GraphicStateDef><defName>ARA_FlySouth_0</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_1_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_1</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_2_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_2</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_3_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_3</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_4_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_4</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_5_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_5</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_6_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_6</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_7_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
<GraphicStateDef><defName>ARA_FlySouth_7</defName><defaultGraphicData><graphicClass>Graphic_Single</graphicClass><texPath>Things/Pawn/Animal/Goose/Goose_Flying_8_south</texPath><drawSize>1.35</drawSize></defaultGraphicData></GraphicStateDef>
</Defs>

View File

@@ -12,7 +12,7 @@
<HeadTypeDef ParentName="ARA_FemaleHeadtypeBase">
<defName>ARA_QUEEN_Female_AverageNormalA</defName>
<graphicPath>Textures/Pawns/General/Invisible/Inv</graphicPath>
<graphicPath>ArachnaeSwarm/Things/General/Invisible/Inv</graphicPath>
</HeadTypeDef>

View File

@@ -84,4 +84,118 @@
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_SkyhiveBite</defName>
<label>天巢种虫族附着</label>
<description>一只可爱的天巢种阿拉克涅虫族咬到了你的身上,虫虫会不停的咬你直到从你身上脱离。这不会有太大问题...对吧?</description>
<!--<tendable>false</tendable> Must be removed via surgery -->
<!--<displayWound>true</displayWound>-->
<hediffClass>ArachnaeSwarm.HediffCurseFlame</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<comps>
<li Class="HediffCompProperties_Disappears">
<disappearsAfterTicks>600</disappearsAfterTicks>
<showRemainingTime>True</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
<li Class="ArachnaeSwarm.HediffCompProperties_SpawnPawnOnRemoved">
<pawnKindDefs>
<li>ArachnaeBase_Race_Skyhive</li>
</pawnKindDefs>
<spawnCount>1</spawnCount>
<fixedBiologicalAge>0</fixedBiologicalAge>
</li>
</comps>
<modExtensions>
<li Class="ArachnaeSwarm.CurseFlameModExt">
<damageDefName>Bite</damageDefName>
<damageRange>3~5</damageRange>
<damageIntervalTicks>150</damageIntervalTicks>
</li>
</modExtensions>
<stages>
<li>
<painOffset>0.05</painOffset>
</li>
</stages>
<renderNodeProperties>
<li>
<debugLabel>Arachnae Skyhive</debugLabel>
<workerClass>PawnRenderNodeWorker_AttachmentBody</workerClass>
<texPaths>
<li>Things/Pawn/Insect/Locust/Locust_north</li>
<li>Things/Pawn/Insect/Locust/Locust_east</li>
</texPaths>
<color>(145,140,109)</color>
<baseLayer>65</baseLayer>
<texSeed>1</texSeed>
<drawData>
<dataNorth>
<rotationOffset>263</rotationOffset>
<offset>(-0.04, 0, 0.04)</offset>
</dataNorth>
<dataEast>
<rotationOffset>245</rotationOffset>
<offset>(0.05, 0, 0.02)</offset>
</dataEast>
<dataSouth>
<rotationOffset>2</rotationOffset>
<offset>(0.05, 0, 0.02)</offset>
</dataSouth>
<dataWest>
<rotationOffset>-245</rotationOffset>
<offset>(-0.04, 0, 0.04)</offset>
<flip>true</flip>
</dataWest>
</drawData>
</li>
</renderNodeProperties>
</HediffDef>
<HediffDef>
<defName>ARA_ReinforceGasCoverd</defName>
<label>阿拉克涅信息素沾染</label>
<description>你身上沾染了阿拉克涅信息素,有什么正在从在地下袭来。</description>
<!--<tendable>false</tendable> Must be removed via surgery -->
<!--<displayWound>true</displayWound>-->
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<comps>
<li Class="HediffCompProperties_Disappears">
<disappearsAfterTicks>600</disappearsAfterTicks>
<showRemainingTime>True</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
<li Class="ArachnaeSwarm.HediffCompProperties_SpawnPawnOnRemoved">
<pawnKindDefs>
<li>ArachnaeBase_Race_Acid</li>
</pawnKindDefs>
<spawnCount>1</spawnCount>
<fixedBiologicalAge>0</fixedBiologicalAge>
</li>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_Unburnable</defName>
<label>阻燃烟雾</label>
<description>一种特殊的烟雾覆盖了这片地区,使得置身其中的殖民者难以被点着.</description>
<hediffClass>HediffWithComps</hediffClass>
<stages>
<li>
<statFactors>
<Flammability>0</Flammability>
</statFactors>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_Disappears">
<disappearsAfterTicks>1200</disappearsAfterTicks>
<showRemainingTime>True</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
</comps>
</HediffDef>
</Defs>

View File

@@ -83,6 +83,13 @@
<comps>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
<disablesNeeds>
<li>Food</li>
<li>Rest</li>
</disablesNeeds>
</li>
</stages>
</HediffDef>
</Defs>

View File

@@ -0,0 +1,266 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>ARA_MimicNematode</defName>
<label>拟线种虫族寄生</label>
<description>被阿拉克涅拟线种虫族寄生了,如果不加以干预,拟线虫最终会杀死宿主并将其转化为没有意识的寄生体。拟线虫会通过寄生体的攻击行为感染其他躯体。</description>
<!-- 1. 指向我们创建的包含Comp的Hediff类 -->
<hediffClass>ArachnaeSwarm.Hediff_NecroticVirus</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>true</isBad>
<maxSeverity>1.0</maxSeverity>
<lethalSeverity>1.0</lethalSeverity>
<minSeverity>0.001</minSeverity>
<initialSeverity>0.001</initialSeverity>
<everCurableByItem>false</everCurableByItem>
<stages>
<li>
<label>潜伏期</label>
<becomeVisible>false</becomeVisible>
<vomitMtbDays>5</vomitMtbDays>
</li>
<li>
<label>活跃期</label>
<minSeverity>0.5</minSeverity>
<vomitMtbDays>1</vomitMtbDays>
<painFactor>0.5</painFactor>
<becomeVisible>false</becomeVisible>
<capMods>
<li>
<capacity>Talking</capacity>
<postFactor>0</postFactor>
</li>
</capMods>
</li>
<li>
<label>终末期</label>
<minSeverity>0.7</minSeverity>
<deathMtbDays>0.5</deathMtbDays>
<painFactor>0</painFactor>
<lifeThreatening>true</lifeThreatening>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>Talking</capacity>
<postFactor>0</postFactor>
</li>
<li>
<capacity>Consciousness</capacity>
<postFactor>0.7</postFactor>
</li>
</capMods>
<regeneration>50</regeneration>
</li>
<li>
<label>即将转化</label>
<minSeverity>0.9</minSeverity>
<deathMtbDays>0.5</deathMtbDays>
<painFactor>2.0</painFactor>
<lifeThreatening>true</lifeThreatening>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>Talking</capacity>
<postFactor>0</postFactor>
</li>
<li>
<capacity>Consciousness</capacity>
<setMax>0.1</setMax>
</li>
</capMods>
<regeneration>50</regeneration>
</li>
</stages>
<tendable>true</tendable>
<!-- 2. 这是最关键的配置部分 -->
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>0.3</severityPerDay>
</li>
<li Class="HediffCompProperties_TendDuration">
<severityPerDayTended>-1</severityPerDayTended>
<baseTendDurationHours>24</baseTendDurationHours>
</li>
<li Class="HediffCompProperties_Disappears">
<disappearsAfterTicks>1800000~2400000</disappearsAfterTicks> <!-- 30 ! 45 days -->
<showRemainingTime>true</showRemainingTime>
</li>
<li Class="ArachnaeSwarm.HediffCompProperties_NecroticTransformation">
<!-- 3. 在这里指定你希望转化成的MutantDef的defName -->
<!-- 例如: Shambler, Ghoul, 或者您自己定义的其他变异体 -->
<mutantDef>ARA_MimicNematodeShambler</mutantDef>
<triggerSeverity>0.7</triggerSeverity>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath" />
</comps>
<modExtensions>
<li Class="ArachnaeSwarm.ProphecyGearEffect">
<!-- 只有当攻击者同时拥有'ARA_MimicNematode'这个仿生体时,以下效果才会触发 -->
<requiredBionicHediff>ARA_MimicNematode</requiredBionicHediff>
<!-- 额外造成5%的'ARA_MimicNematodeBite'伤害 -->
<enableExtraDamage>true</enableExtraDamage>
<extraDamageFactor>0.05</extraDamageFactor>
<extraDamageType>ARA_MimicNematodeBite</extraDamageType>
</li>
</modExtensions>
</HediffDef>
<RecipeDef ParentName="SurgeryFlesh">
<defName>ARA_CureBloodRot</defName>
<label>清除拟线虫感染</label>
<description>通过多种药物联合靶向治疗清除患者体内的阿拉克涅拟线种虫族感染。</description>
<workerClass>Recipe_RemoveHediff</workerClass>
<jobString>清除拟线虫感染.</jobString>
<workAmount>2000</workAmount>
<hideBodyPartNames>true</hideBodyPartNames>
<isViolation>false</isViolation>
<targetsBodyPart>false</targetsBodyPart>
<removesHediff>ARA_MimicNematode</removesHediff>
<successfullyRemovedHediffMessage>{0} 成功清除了 {1} 体内的拟线虫感染.</successfullyRemovedHediffMessage>
<skillRequirements>
<Medicine>5</Medicine>
</skillRequirements>
<ingredients>
<li>
<filter>
<thingDefs>
<li>MedicineUltratech</li>
</thingDefs>
</filter>
<count>10</count>
</li>
</ingredients>
<fixedIngredientFilter>
<categories>
<li>Medicine</li>
</categories>
</fixedIngredientFilter>
</RecipeDef>
<!-- 这是我们的主要变异体Hediff现在使用我们自己的可配置类 -->
<HediffDef>
<defName>ARA_MimicNematodeShambler</defName>
<label>阿拉克涅拟线种寄生体</label>
<description>这具尸体被一种阿拉克涅拟线虫所寄生并重新激活。被寄生的生物行动迟缓、没有心智,只会无情地攻击任何活物。在活动几天后,寄生体将因宿主新陈代谢衰竭而死亡。被捕获并固定后,寄生体无法移动,因此其生命活动会暂停。</description>
<hediffClass>ArachnaeSwarm.Hediff_ConfigurableMutant</hediffClass> <!-- 指向我们自己的类 -->
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<everCurableByItem>false</everCurableByItem>
<duplicationAllowed>false</duplicationAllowed>
<keepOnBodyPartRestoration>True</keepOnBodyPartRestoration>
<stages>
<li>
<naturalHealingFactor>0</naturalHealingFactor>
<painFactor>0</painFactor>
<statFactors>
<MeleeCooldownFactor>1.5</MeleeCooldownFactor>
<PsychicSensitivity>0</PsychicSensitivity>
</statFactors>
<statOffsets>
<ComfyTemperatureMin>-60</ComfyTemperatureMin>
<ComfyTemperatureMax>30</ComfyTemperatureMax>
<MinimumContainmentStrength>25</MinimumContainmentStrength>
<ToxicResistance>1</ToxicResistance>
</statOffsets>
<capMods>
<li><capacity>Talking</capacity><postFactor>0</postFactor></li>
<li><capacity>Consciousness</capacity><postFactor>0.7</postFactor></li>
</capMods>
<regeneration>200</regeneration>
</li>
</stages>
<comps>
<!-- 原版的消失组件保持不变-->
<li Class="HediffCompProperties_DisappearsAndKills">
<compClass>HediffComp_DisappearsAndKills_Shambler</compClass>
<disappearsAfterTicks>1800000~2400000</disappearsAfterTicks> <!-- 30 ! 45 days -->
<showRemainingTime>true</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath" />
<li Class="HediffCompProperties_AttachPoints" />
<!-- 添加我们的新配置组件 -->
<li Class="ArachnaeSwarm.HediffCompProperties_ConfigurableMutant">
<!-- 1. 定义起身和尸体状态 -->
<risingHediff>ARA_Rising</risingHediff>
<corpseHediff>ARA_MimicNematodeShamblerShamblerCorpse</corpseHediff>
<!-- 2. (可选) 覆盖其他默认值 -->
<bioferriteOnDeathChance>0</bioferriteOnDeathChance>
<bioferriteAmountOnDeath>0</bioferriteAmountOnDeath>
</li>
</comps>
<renderNodeProperties>
<li>
<debugLabel>ARA_Swarm_claws</debugLabel>
<workerClass>PawnRenderNodeWorker_AttachmentBody</workerClass>
<texPaths>
<li>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Claw</li>
</texPaths>
<baseLayer>60</baseLayer>
<texSeed>1</texSeed>
<drawData>
<dataNorth>
<flip>true</flip>
</dataNorth>
</drawData>
</li>
</renderNodeProperties>
</HediffDef>
<!-- ====================================================================== -->
<!-- 以下是上面引用的两个Hediff的定义保持不变 -->
<HediffDef>
<defName>ARA_Rising</defName>
<label>起身中</label>
<description>阿拉克涅拟线虫寄生赋予的强大再生能力正在复苏这具身体。</description>
<everCurableByItem>false</everCurableByItem>
<recordDownedTale>false</recordDownedTale>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<stages>
<li>
<painFactor>0</painFactor>
<capMods>
<li><capacity>Moving</capacity><postFactor>0</postFactor></li>
<li><capacity>Manipulation</capacity><postFactor>0</postFactor></li>
<li><capacity>Talking</capacity><postFactor>0</postFactor></li>
<li><capacity>Consciousness</capacity><setMax>0.1</setMax></li>
</capMods>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_MimicNematodeShamblerShamblerCorpse</defName>
<label>拟线种寄生体尸体</label>
<description>这具身体刚刚被阿拉克涅拟线种寄生"复活"过。</description>
<forceRemoveOnResurrection>true</forceRemoveOnResurrection>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<renderNodeProperties>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Shambler wounds</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayShambler</workerClass>
<overlayLayer>Body</overlayLayer>
<baseLayer>20</baseLayer>
<pawnType>HumanlikeOnly</pawnType>
</li>
<li>
<debugLabel>Shambler wounds</debugLabel>
<nodeClass>PawnRenderNode_AnimalPart</nodeClass>
<workerClass>PawnRenderNodeWorker_OverlayShambler</workerClass>
<overlayLayer>Body</overlayLayer>
<baseLayer>20</baseLayer>
<pawnType>NonHumanlikeOnly</pawnType>
</li>
</renderNodeProperties>
</HediffDef>
</Defs>

View File

@@ -4,7 +4,21 @@
<JobDef>
<defName>ARA_StartInteractiveProduction</defName>
<driverClass>ArachnaeSwarm.JobDriver_StartProduction</driverClass>
<reportString>正在启动生产 TargetA.</reportString>
<reportString>正在启动孵化 TargetA.</reportString>
<allowOpportunisticPrefix>true</allowOpportunisticPrefix>
</JobDef>
<JobDef>
<defName>ARA_AddToQueueJob</defName>
<driverClass>ArachnaeSwarm.JobDriver_AddToQueue</driverClass>
<reportString>正在添加虫族孵化订单。</reportString>
<allowOpportunisticPrefix>true</allowOpportunisticPrefix>
</JobDef>
<JobDef>
<defName>ARA_AddProcessToQueueJob</defName>
<driverClass>ArachnaeSwarm.JobDriver_AddProcessToQueue</driverClass>
<reportString>正在添加物品孵化订单。</reportString>
<allowOpportunisticPrefix>true</allowOpportunisticPrefix>
</JobDef>

View File

@@ -38,7 +38,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>2.0</value>
<value>3.0</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
@@ -99,7 +99,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>2.0</value>
<value>3.0</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
@@ -159,17 +159,11 @@
</categories>
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_BioforgeIncubator_ClothBase</li>
<li>ARA_BioforgeIncubator_AcidBase</li>
<li>ARA_BioforgeIncubator_ToxicNeedleBase</li>
<li>ARA_BioforgeIncubator_BoneBase</li>
</abilities>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Facehugger</defName>
<label>阿拉克涅原虫种</label>
<race>ArachnaeNode_Race_Facehugger</race>
@@ -213,6 +207,55 @@
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Smokepop</defName>
<label>阿拉克涅浓雾种</label>
<race>ArachnaeNode_Race_Smokepop</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>0</invNutrition>
<backstoryFiltersOverride>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategories_Smokepop</li>
</categories>
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_Ability_Smokepop</li>
</abilities>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Skyraider</defName>
<label>阿拉克涅空天种</label>
<race>ArachnaeNode_Race_Skyraider</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>0</invNutrition>
<flyingAnimationFramePathPrefix>Things/Pawn/Animal/Goose/Goose_Flying_</flyingAnimationFramePathPrefix>
<flyingAnimationDrawSize>1.35</flyingAnimationDrawSize>
<flyingAnimationFrameCount>2</flyingAnimationFrameCount>
<flyingAnimationTicksPerFrame>2</flyingAnimationTicksPerFrame>
<flyingAnimationInheritColors>false</flyingAnimationInheritColors>
<backstoryFiltersOverride>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategories_Skyraider</li>
</categories>
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_BaseRace_Skyhive_Launcher</li>
</abilities>
<abilities>
</abilities>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef Name="ARA_InsectKindBase" ParentName="AnimalKindBase" Abstract="True">
<defaultFactionType>PlayerColony</defaultFactionType>
@@ -224,32 +267,10 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>2.0</value>
<value>3.0</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
<!--<PawnKindDef ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Slavey</defName>
<label>阿拉克涅苦役种</label>
<race>ArachnaeBase_Race_Slavey</race>
<lifeStages>
<li>
<bodyGraphicData>
<texPath>Things/Pawn/Animal/Spelopede/Spelopede</texPath>
<drawSize>1</drawSize>
<color>(156,148,125)</color>
<shadowData>
<volume>(0.4, 0.5, 0.37)</volume>
<offset>(0,0,-0.15)</offset>
</shadowData>
</bodyGraphicData>
<dessicatedBodyGraphicData>
<texPath>Things/Pawn/Animal/Spelopede/Dessicated_Spelopede</texPath>
<drawSize>1</drawSize>
</dessicatedBodyGraphicData>
</li>
</lifeStages>
</PawnKindDef>-->
<PawnKindDef ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Scavenger</defName>
<label>阿拉克涅食腐种</label>
@@ -338,4 +359,32 @@
</li>
</lifeStages>
</PawnKindDef>
<PawnKindDef ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Skyhive</defName>
<label>阿拉克涅天巢种</label>
<race>ArachnaeBase_Race_Skyhive</race>
<flyingAnimationFramePathPrefix>Things/Pawn/Insect/Locust/LocustFlying/Locust_Flying_</flyingAnimationFramePathPrefix>
<flyingAnimationFrameCount>5</flyingAnimationFrameCount>
<flyingAnimationTicksPerFrame>2</flyingAnimationTicksPerFrame>
<flyingAnimationDrawSize>1</flyingAnimationDrawSize>
<flyingAnimationDrawSizeIsMultiplier>false</flyingAnimationDrawSizeIsMultiplier>
<flyingAnimationInheritColors>true</flyingAnimationInheritColors>
<lifeStages>
<li>
<bodyGraphicData>
<texPath>Things/Pawn/Insect/Locust/Locust</texPath>
<drawSize>1</drawSize>
<color>(145,140,109)</color>
<shadowData>
<volume>(0.2, 0.3, 0.2)</volume>
<offset>(0,0,0)</offset>
</shadowData>
</bodyGraphicData>
<dessicatedBodyGraphicData>
<texPath>Things/Pawn/Insect/Locust/Dessicated_Locust</texPath>
<drawSize>1</drawSize>
</dessicatedBodyGraphicData>
</li>
</lifeStages>
</PawnKindDef>
</Defs>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnRenderNodeTagDef>
<defName>ARA_Flight_Attachment</defName>
</PawnRenderNodeTagDef>
</Defs>

View File

@@ -0,0 +1,169 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnRenderTreeDef>
<defName>ARA_ArachnaeRenderTree</defName>
<root Class="PawnRenderNodeProperties_Parent">
<debugLabel>Root</debugLabel>
<tagDef>Root</tagDef>
<children>
<li>
<debugLabel>Body</debugLabel>
<nodeClass>PawnRenderNode_Body</nodeClass>
<workerClass>PawnRenderNodeWorker_Body</workerClass>
<tagDef>Body</tagDef>
<skipFlag>Body</skipFlag>
<colorType>Skin</colorType>
<useRottenColor>true</useRottenColor>
<useSkinShader>true</useSkinShader>
<children>
<li Class="PawnRenderNodeProperties_Tattoo" MayRequire="Ludeon.RimWorld.Ideology">
<debugLabel>Body tattoo</debugLabel>
<nodeClass>PawnRenderNode_Tattoo_Body</nodeClass>
<workerClass>PawnRenderNodeWorker_Body_Tattoo</workerClass>
<colorType>Skin</colorType>
<useRottenColor>true</useRottenColor>
<baseLayer>2</baseLayer>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
</li>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Wounds - pre apparel</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayWounds</workerClass>
<overlayLayer>Body</overlayLayer>
<baseLayer>8</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Swaddle" MayRequire="Ludeon.RimWorld.Biotech">
<debugLabel>Baby swaddle</debugLabel>
<nodeClass>PawnRenderNode_Swaddle</nodeClass>
<workerClass>PawnRenderNodeWorker_Swaddle</workerClass>
<texPath>Things/Pawn/Humanlike/Apparel/SwaddledBaby/Swaddled_Child</texPath>
<swaddleColorOffset>0.1</swaddleColorOffset>
<brightnessRange>0.6~0.89</brightnessRange>
<baseLayer>10</baseLayer>
</li>
<!-- ===== OUR CUSTOM NODE INSERTION START ===== -->
<li>
<debugLabel>Arachnae Flight Attachment</debugLabel>
<tagDef>ARA_Flight_Attachment</tagDef>
<texPath>ArachnaeSwarm/Things/General/Invisible/Inv</texPath>
<baseLayer>60</baseLayer>
<drawData>
<dataSouth>
<layer>-10</layer>
</dataSouth>
</drawData>
</li>
<li> <!-- 使用默认的 PawnRenderNodeProperties -->
<debugLabel>Wings (Hides when flying)</debugLabel>
<workerClass>ArachnaeSwarm.PawnRenderNodeWorker_AttachmentBody_NoFlight</workerClass>
<texPath>ArachnaeSwarm/Things/General/Invisible/Inv</texPath>
<baseLayer>60</baseLayer>
<drawData>
<dataSouth>
<layer>-10</layer>
</dataSouth>
</drawData>
</li>
<!-- ===== OUR CUSTOM NODE INSERTION END ===== -->
<li Class="PawnRenderNodeProperties_Parent">
<debugLabel>Apparel root</debugLabel>
<tagDef>ApparelBody</tagDef>
<baseLayer>20</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Wounds - post apparel</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayWounds</workerClass>
<overlayOverApparel>true</overlayOverApparel>
<overlayLayer>Body</overlayLayer>
<baseLayer>30</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Firefoam</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayFirefoam</workerClass>
<overlayLayer>Body</overlayLayer>
<baseLayer>40</baseLayer>
</li>
</children>
</li>
<li>
<debugLabel>Head stump</debugLabel>
<nodeClass>PawnRenderNode_Stump</nodeClass>
<workerClass>PawnRenderNodeWorker_Stump</workerClass>
<texPath>Things/Pawn/Humanlike/Heads/None_Average_Stump</texPath>
<baseLayer>50</baseLayer>
<colorType>Skin</colorType>
<skipFlag>Head</skipFlag>
<useSkinShader>true</useSkinShader>
<useRottenColor>true</useRottenColor>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
</li>
<li>
<debugLabel>Head</debugLabel>
<nodeClass>PawnRenderNode_Head</nodeClass>
<workerClass>PawnRenderNodeWorker_Head</workerClass>
<tagDef>Head</tagDef>
<skipFlag>Head</skipFlag>
<baseLayer>50</baseLayer>
<colorType>Skin</colorType>
<useRottenColor>true</useRottenColor>
<useSkinShader>true</useSkinShader>
<children>
<li Class="PawnRenderNodeProperties_Tattoo" MayRequire="Ludeon.RimWorld.Ideology">
<debugLabel>Head tattoo</debugLabel>
<nodeClass>PawnRenderNode_Tattoo_Head</nodeClass>
<workerClass>PawnRenderNodeWorker_Tattoo_Head</workerClass>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
<colorType>Skin</colorType>
<baseLayer>52</baseLayer>
</li>
<li>
<debugLabel>Beard</debugLabel>
<nodeClass>PawnRenderNode_Beard</nodeClass>
<workerClass>PawnRenderNodeWorker_Beard</workerClass>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
<colorType>Hair</colorType>
<skipFlag>Beard</skipFlag>
<baseLayer>60</baseLayer>
</li>
<li>
<debugLabel>Hair</debugLabel>
<nodeClass>PawnRenderNode_Hair</nodeClass>
<workerClass>PawnRenderNodeWorker_FlipWhenCrawling</workerClass>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
<colorType>Hair</colorType>
<skipFlag>Hair</skipFlag>
<baseLayer>62</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Head wounds</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayWounds</workerClass>
<overlayLayer>Head</overlayLayer>
<baseLayer>65</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Parent">
<debugLabel>Apparel root</debugLabel>
<tagDef>ApparelHead</tagDef>
<baseLayer>70</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Firefoam</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayFirefoam</workerClass>
<overlayLayer>Head</overlayLayer>
<baseLayer>85</baseLayer>
</li>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Status overlay</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayStatus</workerClass>
<baseLayer>100</baseLayer>
</li>
</children>
</li>
<li Class="PawnRenderNodeProperties_Carried">
<debugLabel>Weapon/carried thing</debugLabel>
<workerClass>PawnRenderNodeWorker_Carried</workerClass>
</li>
</children>
</root>
</PawnRenderTreeDef>
</Defs>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- T0 -->
<HediffDef>
<defName>ARA_Queen_0_Stage</defName>
<label>进化等级——无</label>
@@ -22,10 +23,10 @@
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_EggSpew</li>
<li>ARA_EggSpew_BaseFighter</li>
<li>ARA_EggSpew_Huge</li>
<li>ARA_BindDrone</li>
<li>ARA_Queen_Upgrade_1_Stage</li>
<li>ARA_AcidSprayBurst_Queen</li>
<li>ARA_Queen_Upgrade_1_Stage</li>
</abilityDefs>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
@@ -44,7 +45,7 @@
<hostile>false</hostile>
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>true</disableGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
@@ -69,8 +70,8 @@
<severity>1</severity>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_2WMT</requiredResearch>
<failMessage>需要科技 基因节点WMT-2"内在突破" 以解锁进化</failMessage>
<requiredResearch>ARA_Technology_1WMT</requiredResearch>
<failMessage>需要科技 基因节点WMT-1"内在突破" 以解锁进化</failMessage>
</li>
</comps>
</AbilityDef>
@@ -98,6 +99,7 @@
</li>
</comps>
</HediffDef>
<!-- T1 -->
<HediffDef>
<defName>ARA_Queen_1_Stage</defName>
<label>进化等级——等级1</label>
@@ -110,13 +112,19 @@
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_EggSpew</li>
<li>ARA_EggSpew_BaseFighter</li>
<li>ARA_EggSpew_1Stage</li>
<li>ARA_EggSpew_Huge_1Stage</li>
<li>ARA_BindDrone</li>
<li>ARA_AcidSprayBurst_Queen</li>
<li>ARA_TumorSpew</li>
<li>ARA_Queen_Upgrade_2_Stage</li>
</abilityDefs>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Queen_2_Stage_Transition_Period</li>
</hediffs>
</li>
</comps>
</HediffDef>
<AbilityDef>
@@ -128,7 +136,7 @@
<hostile>false</hostile>
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>true</disableGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
@@ -154,7 +162,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_2WMT</requiredResearch>
<failMessage>需要科技 基因节点WMT-2"内在突破" 以解锁进化</failMessage>
<failMessage>需要科技 基因节点WMT-2"内在突破2" 以解锁进化</failMessage>
</li>
</comps>
</AbilityDef>
@@ -182,6 +190,7 @@
</li>
</comps>
</HediffDef>
<!-- T2 -->
<HediffDef>
<defName>ARA_Queen_2_Stage</defName>
<label>进化等级——等级2</label>
@@ -195,19 +204,56 @@
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_EggSpew</li>
<li>ARA_EggSpew_BaseFighter</li>
<li>ARA_BindDrone</li>
<li>ARA_AcidSprayBurst_Queen</li>
<!-- <li>ARA_Queen_Upgrade_2_Stage</li> -->
</abilityDefs>
</li>
<!-- <li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Queen_3_Stage_Transition_Period</li>
</hediffs>
</li> -->
</comps>
</HediffDef>
<!-- T0 -->
<HediffDef>
<defName>ARA_WeaponSmith_0_Stage</defName>
<label>进化等级——无</label>
<description>这只阿拉克涅工艺种尚未得到任何强化,只能孵化最普通的茧以生产一些早期装备。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>2.0</maxSeverity>
<!-- <stages>
<li>
<becomeVisible>ture</becomeVisible>
</li>
<li>
<minSeverity>1.01</minSeverity>
<becomeVisible>false</becomeVisible>
</li>
</stages> -->
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_Cocoon_Cloth</li>
<li>ARA_Cocoon_Weapon</li>
</abilityDefs>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Queen_1_Stage_Transition_Period</li>
</hediffs>
</li>
</comps>
</HediffDef>
<RecipeDef ParentName="SurgeryInstallBodyPartArtificialBase">
<defName>ARA_Install_</defName>
<label>安装暗物质能源炉</label>
<description>为合成人安装暗物质能源炉</description>
<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>
@@ -238,4 +284,61 @@
<li>ArachnaeNode_Race_WeaponSmith</li>
</recipeUsers>
</RecipeDef>
<HediffDef>
<defName>ARA_WeaponSmith_1_Stage_Transition_Period</defName>
<label>工艺种进化——阶段1</label>
<description>由阿拉科涅女皇种为该工艺种进行基因调整,以使其获得进化并得以孵化更多的武装器官和织物。</description>
<!-- <hediffClass>HediffWithComps</hediffClass> -->
<hediffClass>Hediff_High</hediffClass>
<initialSeverity>1</initialSeverity>
<maxSeverity>1.01</maxSeverity>
<alwaysShowSeverity>true</alwaysShowSeverity>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
<li Class="HediffCompProperties_ReplaceHediff">
<hediffs>
<li>
<hediff>ARA_WeaponSmith_1_Stage</hediff>
<severityRange>0.02~0.15</severityRange>
</li>
</hediffs>
<message>{PAWN_nameDef} 通过女皇种的拔耀获得了更强大的孵化能力,现在她可以孕育更复杂的茧以获取强大的装备。</message>
</li>
</comps>
</HediffDef>
<!-- T1 -->
<HediffDef>
<defName>ARA_WeaponSmith_1_Stage</defName>
<label>进化等级——等级1</label>
<description>这只阿拉科涅工艺种通过女皇种的拔耀获得了更强大的孵化能力,现在她可以孕育更复杂的茧以获取强大的装备。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>2.0</maxSeverity>
<!-- <stages>
<li>
<becomeVisible>ture</becomeVisible>
</li>
<li>
<minSeverity>1.01</minSeverity>
<becomeVisible>false</becomeVisible>
</li>
</stages> -->
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_Cocoon_Cloth_1Stage</li>
<li>ARA_Cocoon_Weapon_1Stage</li>
</abilityDefs>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Queen_1_Stage_Transition_Period</li>
</hediffs>
</li>
</comps>
</HediffDef>
</Defs>

View File

@@ -16,8 +16,8 @@
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2WMT</defName>
<label>基因节点WMT-2"内在突破"</label>
<defName>ARA_Technology_1WMT</defName>
<label>基因节点WMT-1"内在突破"</label>
<description>允许女皇种进化到下一个阶段。</description>
<baseCost>150</baseCost>
<researchViewX>4.50</researchViewX>
@@ -27,6 +27,18 @@
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2WMT</defName>
<label>基因节点WMT-2"内在突破2"</label>
<description>允许女皇种进化到下一个阶段。</description>
<baseCost>150</baseCost>
<researchViewX>8.50</researchViewX>
<researchViewY>3.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<!-- 酸类发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6VXI</defName>
@@ -43,7 +55,7 @@
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_7VXI</defName>
<label>基因节点VXI-7"外置酸袋"</label>
<description>允许工艺种孵化新的酸类武器</description>
<description>允许工艺种孵化新的武器</description>
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>0.20</researchViewY>
@@ -65,28 +77,16 @@
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_3KYC</defName>
<label>基因节点KYC-3"冰壳虫"</label>
<description>允许女皇种孵化新的虫族——冰壳种,拥有使得附近温度极急剧下降的特殊能力,此类虫族的卵需要在较低的温度下才能正常孵化。</description>
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>2.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2KYC</defName>
<label>基因节点KYC-2"熔火虫"</label>
<description>允许女皇种孵化新的虫族——熔火种,拥有喷射高温射流和在近距离灼烧敌人的能力,此类虫族的卵需要在较高的温度下才能正常孵化</description>
<label>基因节点KYC-2"飞行翼膜"</label>
<description>允许女皇种孵化新的虫族——空天种,敏捷而致命的精锐虫族,拥有以飞行姿态穿梭于战场的能力</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.20</researchViewY>
<researchViewY>2.60</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2WMT</li>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
@@ -95,13 +95,25 @@
<description>允许女皇种孵化新的虫族——原虫种,一种可以寄生在别的种族身上以控制它们的特殊督虫。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>1.50</researchViewY>
<researchViewY>1.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2WMT</li>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<!-- 硬壳发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5KYC</defName>
<label>基因节点KYC-5"巨甲"</label>
<description>允许女皇种孵化新的虫族——浓雾种,一种拥有厚重甲壳的大型督虫,可以铺设菌毯、释放烟雾和阻燃剂以协助虫群进行集群冲击。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.00</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
<!-- 织物发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_4DIL</defName>
<label>基因节点DIL-4"编织"</label>
@@ -114,18 +126,6 @@
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5DIL</defName>
<label>基因节点DIL-5"骨刀"</label>
<description>允许工艺种孵化骨刃茧,为虫族提供基础近战武器。</description>
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>5.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_4DIL</li>
</prerequisites>
</ResearchProjectDef>
<!-- 毒类发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5PAV</defName>
@@ -139,7 +139,6 @@
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<!-- 工艺种进化 -->
<!-- 建筑发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5SHL</defName>
@@ -153,4 +152,17 @@
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<!-- 子巢发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6SPV</defName>
<label>基因节点SPV-6"天巢种之巢"</label>
<description>允许工艺种孵化新的武器。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>2.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
</ResearchProjectDef>
</Defs>

View File

@@ -60,11 +60,19 @@
<li>(0.0, 0, -0.12)</li>
<li>(-0.07, 0, 0.08)</li>
</headPosPerRotation>
<!-- <deathAction Class="DeathActionProperties_Vanish">
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
</deathAction> -->
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<comps>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>72000</totalPowerTicks> <!-- 2 hours -->
<labelOverride>寿命</labelOverride>
<tooltipOverride>这种特殊的阿拉克涅辅虫从出生起就走在死亡的道路上了——它们的寿命就是如此短暂。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_TemperatureRegulation</li>
@@ -158,65 +166,4 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseDrone" MayRequire="Ludeon.RimWorld.Odyssey">
<defName>ArachnaeBase_Race_Acid</defName>
<label>阿拉克涅酸噬种</label>
<description>阿拉克涅辅虫之一,智力低下,一般被作为活体炮弹打出,击中敌人后若是还没散架,就会继续依靠带酸液的颚撕咬敌军。</description>
<race>
<thinkTreeConstant>WarUrchinConstant</thinkTreeConstant>
<baseBodySize>0.5</baseBodySize>
<!-- <hasCorpse>false</hasCorpse> -->
<body>BeetleLikeWithClaw</body>
<lifeStageAges>
<li>
<def>EusocialInsectAdult</def>
<minAge>0</minAge>
<soundWounded>Pawn_Spelopede_Pain</soundWounded>
<soundDeath>Pawn_Spelopede_Death</soundDeath>
<soundCall>Pawn_Spelopede_Call</soundCall>
<soundAngry>Pawn_Spelopede_Angry</soundAngry>
</li>
</lifeStageAges>
</race>
<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>
<capacities>
<li>ARA_AcidCut</li>
</capacities>
<power>6</power>
<cooldownTime>2.6</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
</li>
</tools>
</ThingDef>
<ToolCapacityDef>
<defName>ARA_AcidCut</defName>
<label>酸性撕咬</label>
</ToolCapacityDef>
<ManeuverDef>
<defName>ARA_AcidCut</defName>
<requiredCapacity>ARA_AcidCut</requiredCapacity>
<verb>
<verbClass>Verb_MeleeAttackDamage</verbClass>
<meleeDamageDef>ARA_AcidCut_Damage</meleeDamageDef>
</verb>
<logEntryDef>MeleeAttack</logEntryDef>
<combatLogRulesHit>Maneuver_Slash_MeleeHit</combatLogRulesHit>
<combatLogRulesDeflect>Maneuver_Slash_MeleeDeflect</combatLogRulesDeflect>
<combatLogRulesMiss>Maneuver_Slash_MeleeMiss</combatLogRulesMiss>
<combatLogRulesDodge>Maneuver_Slash_MeleeDodge</combatLogRulesDodge>
</ManeuverDef>
</Defs>
</Defs>

View File

@@ -0,0 +1,172 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<ThingDef ParentName="AnimalThingBase" Name="ARA_BaseDroneSwarm" Abstract="True">
<statBases>
<MarketValue>1200</MarketValue>
<PsychicSensitivity>0</PsychicSensitivity>
<ToxicResistance>1</ToxicResistance>
<Flammability>0</Flammability>
<ComfyTemperatureMin>-100</ComfyTemperatureMin>
<ComfyTemperatureMax>250</ComfyTemperatureMax>
<MeatAmount>0</MeatAmount>
<ToxicEnvironmentResistance>1</ToxicEnvironmentResistance>
<VacuumResistance>1</VacuumResistance>
</statBases>
<receivesSignals>true</receivesSignals>
<tradeability>None</tradeability>
<race>
<alwaysAwake>true</alwaysAwake>
<fleshType>Insectoid</fleshType>
<needsRest>false</needsRest>
<hasGenders>false</hasGenders>
<hasCorpse>false</hasCorpse>
<foodType>None</foodType>
<lifeExpectancy>2500</lifeExpectancy>
<bloodDef>Filth_BloodInsect</bloodDef>
<disableIgniteVerb>true</disableIgniteVerb>
<trainability>None</trainability>
<soundCallIntervalRange>1000~2000</soundCallIntervalRange>
<soundCallIntervalFriendlyFactor>2</soundCallIntervalFriendlyFactor>
<thinkTreeConstant>SentryDroneConstant</thinkTreeConstant>
<hideTrainingTab>true</hideTrainingTab>
<intelligence>ToolUser</intelligence>
<thinkTreeMain>Drone</thinkTreeMain>
<canFlyInVacuum>true</canFlyInVacuum>
</race>
<tools>
</tools>
<killedLeavings>
</killedLeavings>
</ThingDef>
<ThingDef ParentName="ARA_BaseDroneSwarm">
<defName>ArachnaeBase_Race_Acid</defName>
<label>阿拉克涅酸噬种</label>
<description>阿拉克涅辅虫之一,智力低下,一般被作为活体炮弹打出,击中敌人后若是还没散架,就会继续依靠带酸液的颚撕咬敌军。</description>
<race>
<thinkTreeConstant>WarUrchinConstant</thinkTreeConstant>
<baseBodySize>0.5</baseBodySize>
<!-- <hasCorpse>false</hasCorpse> -->
<body>BeetleLikeWithClaw</body>
<lifeStageAges>
<li>
<def>EusocialInsectAdult</def>
<minAge>0</minAge>
<soundWounded>Pawn_Spelopede_Pain</soundWounded>
<soundDeath>Pawn_Spelopede_Death</soundDeath>
<soundCall>Pawn_Spelopede_Call</soundCall>
<soundAngry>Pawn_Spelopede_Angry</soundAngry>
</li>
</lifeStageAges>
</race>
<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>
<capacities>
<li>ARA_AcidCut</li>
</capacities>
<power>6</power>
<cooldownTime>2.6</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
</li>
</tools>
</ThingDef>
<ThingDef ParentName="ARA_BaseDroneSwarm">
<defName>ArachnaeBase_Race_Skyhive</defName>
<label>阿拉克涅天巢种</label>
<description>阿拉克涅辅虫之一,智力低下,一般被作为活体炮弹打出,击中敌人后若是还没散架,就会继续依靠带酸液的颚撕咬敌军。</description>
<race>
<flightStartChanceOnJobStart>1.0</flightStartChanceOnJobStart>
<thinkTreeConstant>WarUrchinConstant</thinkTreeConstant>
<baseBodySize>0.5</baseBodySize>
<!-- <hasCorpse>false</hasCorpse> -->
<body>BeetleLikeWithClaw</body>
<lifeStageAges>
<li>
<def>EusocialInsectAdult</def>
<minAge>0</minAge>
<soundWounded>Pawn_Spelopede_Pain</soundWounded>
<soundDeath>Pawn_Spelopede_Death</soundDeath>
<soundCall>Pawn_Spelopede_Call</soundCall>
<soundAngry>Pawn_Spelopede_Angry</soundAngry>
</li>
</lifeStageAges>
</race>
<statBases>
<MoveSpeed>6</MoveSpeed>
<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>
<capacities>
<li>ARA_Bite</li>
</capacities>
<power>6</power>
<cooldownTime>2.6</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
</li>
</tools>
</ThingDef>
<ToolCapacityDef>
<defName>ARA_AcidCut</defName>
<label>酸性撕咬</label>
</ToolCapacityDef>
<ManeuverDef>
<defName>ARA_AcidCut</defName>
<requiredCapacity>ARA_AcidCut</requiredCapacity>
<verb>
<verbClass>Verb_MeleeAttackDamage</verbClass>
<meleeDamageDef>ARA_AcidCut_Damage</meleeDamageDef>
</verb>
<logEntryDef>MeleeAttack</logEntryDef>
<combatLogRulesHit>Maneuver_Slash_MeleeHit</combatLogRulesHit>
<combatLogRulesDeflect>Maneuver_Slash_MeleeDeflect</combatLogRulesDeflect>
<combatLogRulesMiss>Maneuver_Slash_MeleeMiss</combatLogRulesMiss>
<combatLogRulesDodge>Maneuver_Slash_MeleeDodge</combatLogRulesDodge>
</ManeuverDef>
<ToolCapacityDef>
<defName>ARA_Bite</defName>
<label>撕咬</label>
</ToolCapacityDef>
<ManeuverDef>
<defName>ARA_Bite</defName>
<requiredCapacity>ARA_Bite</requiredCapacity>
<verb>
<verbClass>Verb_MeleeAttackDamage</verbClass>
<meleeDamageDef>Bite</meleeDamageDef>
</verb>
<logEntryDef>MeleeAttack</logEntryDef>
<combatLogRulesHit>Maneuver_Slash_MeleeHit</combatLogRulesHit>
<combatLogRulesDeflect>Maneuver_Slash_MeleeDeflect</combatLogRulesDeflect>
<combatLogRulesMiss>Maneuver_Slash_MeleeMiss</combatLogRulesMiss>
<combatLogRulesDodge>Maneuver_Slash_MeleeDodge</combatLogRulesDodge>
</ManeuverDef>
</Defs>

View File

@@ -0,0 +1,146 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<MutantDef ParentName="BaseMutantEntity">
<defName>ARA_MimicNematodeShambler</defName>
<label>阿拉克涅拟线种寄生体</label>
<description>阿拉克涅拟线种是虫群中最神秘的分支之一。它们与原虫种同源,但在进化之路上并未发展出高级智慧,而是走向了一条截然不同的道路:寄生。拟线种是无法脱离宿主独立存活的寄生虫。一旦寄生于生物体内,它们会长期潜伏,最终逐步接管宿主的神经与代谢系统,将其变为受其操控的行尸走肉——“寄生体”。得益于超凡的细胞复制与再生能力,拟线种能够模仿并替代宿主的细胞结构,这使得寄生体拥有了惊人的自我修复能力。然而,这种寄生关系也极具侵略性:拟线种的虫卵遍布寄生体体表,任何被寄生体攻击的生物都有可能被感染,最终沦为新的寄生体。尽管拟线虫将寄生体的新陈代谢维持在极低水平,但寄生体本身并不会主动觅食。因此,当能量耗尽后,它们终将迎来“死亡”。</description>
<hediff>ARA_MimicNematodeShambler</hediff>
<thinkTree>Shambler</thinkTree>
<thinkTreeConstant>ShamblerConstant</thinkTreeConstant>
<hideLabel>true</hideLabel>
<namePrefix>拟线种寄生体 </namePrefix>
<useCorpseGraphics>false</useCorpseGraphics>
<isConsideredCorpse>true</isConsideredCorpse>
<bloodDef>Filth_DarkBlood</bloodDef>
<bloodSmearDef>Filth_DarkBloodSmear</bloodSmearDef>
<entitledToMedicalCare>false</entitledToMedicalCare>
<removeAllInjuries>true</removeAllInjuries>
<restoreLegs>true</restoreLegs>
<defaultFaction>Entities</defaultFaction>
<standingAnimation>ShamblerSway</standingAnimation>
<canOpenDoors>false</canOpenDoors>
<makesFootprints>false</makesFootprints>
<tameable>false</tameable>
<clearMutantStatusOnDeath>true</clearMutantStatusOnDeath>
<canTravelInCaravan>false</canTravelInCaravan>
<canAttackWhileCrawling>true</canAttackWhileCrawling>
<respectsAllowedArea>false</respectsAllowedArea>
<disableFlying>true</disableFlying>
<canGainXP>false</canGainXP>
<canBeDrafted>false</canBeDrafted>
<disableHostilityResponse>true</disableHostilityResponse>
<deathOnDownedChance>0.25</deathOnDownedChance>
<woundColor>(0.3, 0.3, 0.0, 1.0)</woundColor>
<anomalyKnowledgeOffset>0</anomalyKnowledgeOffset>
<knowledgeCategory>Basic</knowledgeCategory>
<!--<codexEntry>Shambler</codexEntry>-->
<!-- Sounds -->
<soundAttackChance>0.25</soundAttackChance>
<soundCall>Pawn_Shambler_Call</soundCall>
<soundAttack>Pawn_Shambler_Attack</soundAttack>
<soundWounded>Pawn_Shambler_Wounded</soundWounded>
<soundDeath>Pawn_Shambler_Killed</soundDeath>
<removesHediffs>
<li>ARA_MimicNematode</li>
</removesHediffs>
<!-- Rendering -->
<renderNodeProperties>
<li Class="PawnRenderNodeProperties_Overlay">
<debugLabel>Shambler wounds</debugLabel>
<workerClass>PawnRenderNodeWorker_OverlayShambler</workerClass>
<overlayLayer>Body</overlayLayer>
<baseLayer>20</baseLayer>
<pawnType>HumanlikeOnly</pawnType>
</li>
<li>
<debugLabel>Shambler wounds</debugLabel>
<nodeClass>PawnRenderNode_AnimalPart</nodeClass>
<workerClass>PawnRenderNodeWorker_OverlayShambler</workerClass>
<overlayLayer>Body</overlayLayer>
<baseLayer>20</baseLayer>
<pawnType>NonHumanlikeOnly</pawnType>
</li>
</renderNodeProperties>
<tools>
<li>
<label>撕咬</label>
<capacities>
<li>ARA_MimicNematodeShamblerBite</li>
</capacities>
<power>8.2</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>Teeth</linkedBodyPartsGroup>
<chanceFactor>1</chanceFactor>
<soundMeleeHit>Pawn_Melee_HumanBite_Hit</soundMeleeHit>
<soundMeleeMiss>Pawn_Melee_HumanBite_Miss</soundMeleeMiss>
</li>
<li>
<label>巨镰</label>
<capacities>
<li>Cut</li>
</capacities>
<power>15</power>
<cooldownTime>2.5</cooldownTime>
<linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup>
<!-- <ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable> -->
<chanceFactor>0.5</chanceFactor>
<alwaysTreatAsWeapon>true</alwaysTreatAsWeapon>
</li>
<li>
<label>巨镰</label>
<capacities>
<li>Cut</li>
</capacities>
<power>15</power>
<cooldownTime>2.5</cooldownTime>
<linkedBodyPartsGroup>RightHand</linkedBodyPartsGroup>
<!-- <ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable> -->
<chanceFactor>0.5</chanceFactor>
<alwaysTreatAsWeapon>true</alwaysTreatAsWeapon>
</li>
</tools>
</MutantDef>
<ToolCapacityDef>
<defName>ARA_MimicNematodeShamblerBite</defName>
<label>撕咬</label>
</ToolCapacityDef>
<ManeuverDef>
<defName>ARA_MimicNematodeShamblerBite</defName>
<requiredCapacity>ARA_MimicNematodeShamblerBite</requiredCapacity>
<verb>
<verbClass>Verb_MeleeAttackDamage</verbClass>
<meleeDamageDef>ARA_MimicNematodeBite</meleeDamageDef>
</verb>
<logEntryDef>MeleeAttack</logEntryDef>
<combatLogRulesHit>Maneuver_Slash_MeleeHit</combatLogRulesHit>
<combatLogRulesDeflect>Maneuver_Slash_MeleeDeflect</combatLogRulesDeflect>
<combatLogRulesMiss>Maneuver_Slash_MeleeMiss</combatLogRulesMiss>
<combatLogRulesDodge>Maneuver_Slash_MeleeDodge</combatLogRulesDodge>
</ManeuverDef>
<PawnKindDef ParentName="MutantBase" Name="ARA_ShamblerBase" Abstract="True">
<mutant>ARA_MimicNematodeShambler</mutant>
<generateInitialNonFamilyRelations>false</generateInitialNonFamilyRelations>
</PawnKindDef>
<PawnKindDef ParentName="ARA_ShamblerBase">
<defName>ARA_MimicNematodeShamblerSwarmer</defName>
<label>阿拉克涅拟线种寄生体</label>
<combatPower>40</combatPower>
<gearHealthRange>0.2~0.4</gearHealthRange>
<itemQuality>Poor</itemQuality>
<apparelMoney>0~100</apparelMoney>
<apparelAllowHeadgearChance>0</apparelAllowHeadgearChance>
<apparelTags>
<li>IndustrialBasic</li>
<li>Neolithic</li>
</apparelTags>
<meleeAttackInfectionPathways>
<li>EntityAttacked</li>
</meleeAttackInfectionPathways>
</PawnKindDef>
</Defs>

View File

@@ -111,44 +111,6 @@
</east>
</offsets>
</li>
<!--<li>
<name>ArachnaeNode Hair BG</name>
<userCustomizable>true</userCustomizable>
<path></path>
<inFrontOfBody>false</inFrontOfBody>
<layerInvert>false</layerInvert>
<colorChannel>hair</colorChannel>
<defaultOffset>Center</defaultOffset>
<drawSize>1</drawSize>
<alignWithHead>true</alignWithHead>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
<linkVariantIndexWithPrevious>true</linkVariantIndexWithPrevious>
<conditions>
<BodyPart>
<bodyPart>Head</bodyPart>
</BodyPart>
<Posture>
<drawnStanding>true</drawnStanding>
<drawnInBed>false</drawnInBed>
<drawnLaying>true</drawnLaying>
</Posture>
<RotStage>Fresh,Rotting</RotStage>
</conditions>
<offsets>
<west>
<layerOffset>-0.275</layerOffset>
</west>
<south>
<layerOffset>-0.299</layerOffset>
</south>
<north>
<layerOffset>-0.275</layerOffset>
</north>
<east>
<layerOffset>-0.275</layerOffset>
</east>
</offsets>
</li>-->
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Base</path>
<inFrontOfBody>true</inFrontOfBody>
@@ -567,7 +529,6 @@
<baseHealthScale>1.5</baseHealthScale>
<!-- 解剖产物 -->
<leatherDef>ARA_Carapace</leatherDef>
<specificMeatDef>Meat_Megaspider</specificMeatDef>
<!-- 身体类型 -->
<body>Human</body>
<!-- 年龄阶段,较短 -->
@@ -598,17 +559,20 @@
</lifeStageWorkSettings>
<lifeStageAges Inherit="False">
<li>
<def>ARA_Queen_Adult</def>
<def>ArachnaeNode_Myrmecocystus_Adult</def>
<minAge>0</minAge>
<soundWounded>Pawn_BigInsect_Pain</soundWounded>
<soundDeath>Pawn_BigInsect_Death</soundDeath>
<soundCall>Pawn_BigInsect_Call</soundCall>
<soundAngry>Pawn_BigInsect_Angry</soundAngry>
</li>
</lifeStageAges>
<canFlyInVacuum>false</canFlyInVacuum>
<!-- 身形大小,略大于常规人类 -->
<baseBodySize>2</baseBodySize>
<soundMeleeHitPawn>Pawn_Melee_BigBash_HitPawn</soundMeleeHitPawn>
<soundMeleeHitBuilding>Pawn_Melee_BigBash_HitBuilding</soundMeleeHitBuilding>
<soundMeleeMiss>Pawn_Melee_BigBash_Miss</soundMeleeMiss>
<soundMeleeDodge>Pawn_MeleeDodge</soundMeleeDodge>
<canFlyInVacuum>false</canFlyInVacuum>
<!-- 身形大小,略大于常规人类 -->
<baseBodySize>2</baseBodySize>
</race>
<!-- 工具设置(攻击方式) -->
@@ -667,12 +631,39 @@
<li Class="CompProperties_DrugAddict"/> -->
</comps>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace Name="ARA_NodeBase_Huge" ParentName="ARA_NodeBase" Abstract="True">
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
<alienPartGenerator>
<!-- 图像放大 -->
<customDrawSize>(1.2,1.2)</customDrawSize>
<customHeadDrawSize>(1.05,1.05)</customHeadDrawSize>
<customPortraitDrawSize>(0.9,0.9)</customPortraitDrawSize>
<borderScale>1.2</borderScale>
<atlasScale>1.2</atlasScale>
</alienPartGenerator>
</generalSettings>
<!-- 种族的允许和禁止特化设置 -->
<raceRestriction>
<!-- 武器列表 -->
<weaponList>
</weaponList>
</raceRestriction>
</alienRace>
<race>
<baseBodySize>2.5</baseBodySize>
<baseHealthScale>4</baseHealthScale>
<lifeExpectancy>10</lifeExpectancy>
</race>
</AlienRace.ThingDef_AlienRace>
<!-- 定义阿拉克涅节点虫种族 -->
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase_Huge">
<defName>ArachnaeNode_Race_Myrmecocystus</defName>
<label>阿拉克涅蜜罐种</label>
<description>阿拉克涅督虫之一,拥有非常广泛食谱,可以吞下许多未经处理的生物并将其分解为阿拉克涅虫蜜,以滋养虫群。这种督虫除了生产虫蜜外也能执行烹饪工作。\n\n作为督虫她可以繁育并监管若干阿拉克涅苦役种辅虫,以协助巢穴进行搬运工作。</description>
<description>阿拉克涅督虫之一,拥有广泛食谱的大型虫族,可以吞下许多未经处理的生物并将其分解为阿拉克涅虫蜜,以滋养虫群。\n\n她可以进行搬运、烹饪和种植工作战斗技能非常差。\n\n作为督虫她可以繁育并监管若干阿拉克涅食腐种辅虫,以协助巢穴进行收割和播种工作。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -680,10 +671,10 @@
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Myrmecocystus_Addons_Stomach</path>
<path>
ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Myrmecocystus_Addons_Stomach</path>
<inFrontOfBody>false</inFrontOfBody>
<conditions>
</conditions>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
</li>
</bodyAddons>
</alienPartGenerator>
@@ -691,20 +682,18 @@
<!-- 种族的允许和禁止特化设置 -->
<raceRestriction>
<!-- 食物列表 -->
<whiteFoodList Inherit="False"/>
<whiteFoodList Inherit="False" />
<blackFoodList>
<li>ARA_InsectJelly</li>
</blackFoodList>
<onlyEatRaceRestrictedFood>false</onlyEatRaceRestrictedFood>
<!-- 武器列表 -->
<weaponList Inherit="False"/>
</raceRestriction>
</alienRace>
<comps>
<li Class="ArachnaeSwarm.CompProperties_MilkableArachnae">
<milkDef>ARA_InsectJelly</milkDef>
<milkIntervalDays>3</milkIntervalDays>
<milkAmount>4</milkAmount>
<milkIntervalDays>1</milkIntervalDays>
<milkAmount>10</milkAmount>
</li>
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
@@ -763,18 +752,12 @@
<baseHealthScale>3</baseHealthScale>
<!-- 蜜罐虫的寿命很低 -->
<lifeExpectancy>1.5</lifeExpectancy>
<lifeStageAges Inherit="False">
<li>
<def>ArachnaeNode_Myrmecocystus_Adult</def>
<minAge>0</minAge>
</li>
</lifeStageAges>
</race>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_ShieldHead</defName>
<label>阿拉克涅盾头种</label>
<description>阿拉克涅督虫之一,拥有过度生长而覆盖头部和腿部的甲壳,防御力超群的同时还可以定时剥落甲壳素供虫巢使用。坚韧的鳌刺挥舞起来非常缓慢但是可以破开岩壁,以完成虫群的采矿工作。\n\n作为督虫她可以繁育并监管若干阿拉克涅坚颚种辅虫以协助巢穴开采矿脉。</description>
<description>阿拉克涅督虫之一,拥有过度生长而覆盖头部和腿部的甲壳,可以定时剥落甲壳素供虫巢使用。\n\n她可以进行搬运、采矿和建筑工作战斗技能平平无奇但是拥有较好的防御。\n\n作为督虫她可以繁育并监管若干阿拉克涅坚颚种辅虫以协助巢穴开采矿脉。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -798,6 +781,7 @@
</west>
</offsets>
<inFrontOfBody>true</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_ShieldBody</path>
@@ -807,7 +791,7 @@
</south>
<north>
<layerOffset>-0.275</layerOffset>
</north>
</north>
<east>
<layerOffset>-0.275</layerOffset>
</east>
@@ -817,6 +801,7 @@
</offsets>
<inFrontOfBody>true</inFrontOfBody>
<layerInvert>false</layerInvert>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
</li>
</bodyAddons>
</alienPartGenerator>
@@ -828,8 +813,8 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_MilkableArachnae">
<milkDef>ARA_Carapace</milkDef>
<milkIntervalDays>3</milkIntervalDays>
<milkAmount>25</milkAmount>
<milkIntervalDays>1</milkIntervalDays>
<milkAmount>15</milkAmount>
</li>
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
@@ -887,18 +872,12 @@
<baseHealthScale>5</baseHealthScale>
<!-- 蜜罐虫的寿命很低 -->
<lifeExpectancy>2</lifeExpectancy>
<lifeStageAges Inherit="False">
<li>
<def>ArachnaeNode_Myrmecocystus_Adult</def>
<minAge>0</minAge>
</li>
</lifeStageAges>
</race>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_WeaponSmith</defName>
<label>阿拉克涅工艺种</label>
<description>阿拉克涅督虫之一,是少数拥有结茧能力的非女皇种阿拉克涅虫族——她们可以排出一枚器官茧,这枚茧将按照其信息素所标定的方向定向演化出一个武装器官,以供虫群使用。除此之外,她们的辅肢比普通的虫族更加复杂灵活,这使得她们不仅可以执行手工、建造、艺术等复杂的工作,也可以操作武装器官——虽然她们本身极度脆弱。\n\n作为督虫她可以繁育并监管若干阿拉克涅家政种辅虫以协助巢穴进行清洁工作。</description>
<description>阿拉克涅督虫之一,是少数拥有结茧能力的非女皇种阿拉克涅虫族——她们可以排出一枚器官茧,这枚茧将按照其信息素所标定的方向定向演化出一个武装器官,以供虫群使用。\n\n她可以进行搬运、手工和艺术工作战斗技能平平无奇本身极度脆弱。\n\n作为督虫她可以繁育并监管若干阿拉克涅家政种辅虫以协助巢穴进行清洁和搬运工作。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -908,10 +887,11 @@
<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>
</north>
</offsets>
</li>
</bodyAddons>
@@ -976,20 +956,12 @@
<baseBodySize>0.8</baseBodySize>
<baseHealthScale>0.75</baseHealthScale>
<lifeExpectancy>5</lifeExpectancy>
<lifeStageAges Inherit="False">
<li>
<def>ArachnaeNode_Myrmecocystus_Adult</def>
<minAge>0</minAge>
</li>
</lifeStageAges>
</race>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_Fighter</defName>
<label>阿拉克涅战士种</label>
<description>阿拉克涅督虫之一,是巢穴中真正的战士,除了战斗外也可以进行狩猎和搬运。其拥有强大的可塑性基因,随着科技的解锁其将获得更多的能力。\n\n作为督虫她可以向敌人投射寿命有限但是非常恼人的阿拉克涅酸噬种辅虫以阻止敌人的远程火力开火。</description>
<description>阿拉克涅督虫之一,是巢穴中真正的战士,其拥有强大的可塑性基因,随着科技的解锁其将获得更多的能力。\n\n她可以进行搬运、狩猎和驯兽工作,战斗技能非常亮眼,并且移动敏捷。\n\n作为督虫,她可以向敌人投射寿命有限但是非常恼人的阿拉克涅酸噬种辅虫,以阻止敌人的远程火力开火。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -999,14 +971,16 @@
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Claw</path>
<inFrontOfBody>true</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Tail</path>
<inFrontOfBody>false</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
<offsets>
<north>
<layerOffset>-0.275</layerOffset>
</north>
</north>
</offsets>
</li>
</bodyAddons>
@@ -1067,20 +1041,12 @@
<baseBodySize>0.85</baseBodySize>
<baseHealthScale>2</baseHealthScale>
<lifeExpectancy>5</lifeExpectancy>
<lifeStageAges Inherit="False">
<li>
<def>ArachnaeNode_Myrmecocystus_Adult</def>
<minAge>0</minAge>
</li>
</lifeStageAges>
</race>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_Facehugger</defName>
<label>阿拉克涅原虫种</label>
<description>阿拉克涅督虫之一,呈现高度未分化状态的特殊督虫,可以通过独特的神经链接管控制受害者的身体,并释放灵能信号以使得周围的人忽略其存在。\n\n不同于普通阿拉克涅虫族高度未分化的身体决定了其无法孕育任何辅虫,在完成寄生前也无法进行任何工作</description>
<description>阿拉克涅督虫之一,呈现高度未分化状态的特殊督虫,可以通过独特的神经链接管控制受害者的身体,并释放灵能信号以使得周围的人忽略其存在。然而她本身实在过于脆弱,在完成寄生前难以胜任任何工作。\n\n她可以进行所有非研究工作战斗技能约等于无。\n\n不同于普通阿拉克涅虫族高度未分化的身体决定了其无法孕育任何辅虫。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -1106,7 +1072,7 @@
<!-- 种族的允许和禁止特化设置 -->
<raceRestriction>
<!-- 武器列表 -->
<weaponList Inherit="False"/>
<weaponList Inherit="False" />
</raceRestriction>
</alienRace>
@@ -1125,12 +1091,6 @@
<baseBodySize>0.5</baseBodySize>
<baseHealthScale>0.25</baseHealthScale>
<lifeExpectancy>30</lifeExpectancy>
<lifeStageAges Inherit="False">
<li>
<def>ArachnaeNode_Myrmecocystus_Adult</def>
<minAge>0</minAge>
</li>
</lifeStageAges>
</race>
<comps>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
@@ -1142,4 +1102,198 @@
</li>
</comps>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase_Huge">
<defName>ArachnaeNode_Race_Smokepop</defName>
<label>阿拉克涅浓雾种</label>
<description>阿拉克涅督虫之一,身披厚重甲壳的大型虫族,拥有在大范围内喷射烟雾、阻燃物和铺设菌毯的能力,虽然移动速度比较慢,但是在战斗中就如同装甲车一样难以撼动。\n\n她可以进行搬运和医护工作拥有不错的战斗技能防御力和伤害耐受能力强大。\n\n作为督虫她可以繁育并监管大量阿拉克涅家政种辅虫以协助巢穴进行清洁和搬运工作。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
<alienPartGenerator>
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Smokepop_Armor</path>
<inFrontOfBody>true</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Smokepop_Tail</path>
<inFrontOfBody>false</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
<offsets>
<north>
<layerOffset>-0.275</layerOffset>
</north>
</offsets>
</li>
</bodyAddons>
<!-- 图像放大 -->
<customDrawSize>(1.2,1.2)</customDrawSize>
<customHeadDrawSize>(1.05,1.05)</customHeadDrawSize>
<customPortraitDrawSize>(0.9,0.9)</customPortraitDrawSize>
<!-- <borderScale>4</borderScale>
<atlasScale>4</atlasScale> -->
</alienPartGenerator>
</generalSettings>
</alienRace>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AutoMechCarrier">
<freeProduction>true</freeProduction>
<disableHediff>WULA_MechCarrierSwitchHediff</disableHediff>
<fixedIngredient>ARA_InsectJelly</fixedIngredient>
<maxIngredientCount>500</maxIngredientCount>
<startingIngredientCount>500</startingIngredientCount>
<costPerPawn>999</costPerPawn>
<cooldownTicks>9999</cooldownTicks>
<productionQueue>
<li>
<!-- <pawnKind>ArachnaeBase_Race_Slavey</pawnKind> -->
<pawnKind>ArachnaeBase_Race_Maid</pawnKind>
<count>5</count>
<cooldownTicks>1000</cooldownTicks>
</li>
</productionQueue>
<spawnEffecter>CocoonDestroyed</spawnEffecter>
</li>
</comps>
<!-- 基础属性设置 -->
<statBases>
<!-- 移动速度 -->
<MoveSpeed>1.55</MoveSpeed>
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<!-- <EatingSpeed>5</EatingSpeed> -->
<MaxNutrition>3</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>150</MeatAmount>
<LeatherAmount>150</LeatherAmount>
<MeleeDodgeChance>0.5</MeleeDodgeChance>
<!-- <NegotiationAbility>1</NegotiationAbility> -->
<!-- <SellPriceFactor>1</SellPriceFactor> -->
<!-- <SocialImpact>1</SocialImpact> -->
<!-- <TradePriceImprovement>0.5</TradePriceImprovement> -->
<!-- 自带的甲壳可以防御外部攻击 -->
<ArmorRating_Blunt>0.85</ArmorRating_Blunt>
<ArmorRating_Sharp>0.85</ArmorRating_Sharp>
<ArmorRating_Heat>0.6</ArmorRating_Heat>
</statBases>
<race>
<!-- 身体类型 -->
<body>ArachnaeFighter_Body</body>
<baseBodySize>2.5</baseBodySize>
<baseHealthScale>4</baseHealthScale>
<lifeExpectancy>10</lifeExpectancy>
</race>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_Skyraider</defName>
<label>阿拉克涅空天种</label>
<description>阿拉克涅督虫之一,众督虫中的精锐,进化出了强大的飞行能力,是巢穴中无可争议的空中霸主。\n\n她可以进行搬运工作拥有不错的战斗技能非常灵活。\n\n作为为数不多拥有飞行能力的虫族她可以从空中掠袭猎物并将其带至千米高空之上俯冲投下只留其余猎物在地面无助的挣扎。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
<alienPartGenerator>
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Claw</path>
<inFrontOfBody>true</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Tail</path>
<inFrontOfBody>false</inFrontOfBody>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
<offsets>
<north>
<layerOffset>-0.275</layerOffset>
</north>
</offsets>
</li>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<raceRestriction>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
</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>
<!-- 移动速度 -->
<MoveSpeed>4.5</MoveSpeed>
<MaxFlightTime>9999</MaxFlightTime>
<FlightCooldown>0</FlightCooldown>
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<!-- <EatingSpeed>5</EatingSpeed> -->
<MaxNutrition>2</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>60</MeatAmount>
<LeatherAmount>30</LeatherAmount>
<MeleeDodgeChance>1.25</MeleeDodgeChance>
<MeleeHitChance>1.25</MeleeHitChance>
<!-- <NegotiationAbility>1</NegotiationAbility> -->
<!-- <SellPriceFactor>1</SellPriceFactor> -->
<!-- <SocialImpact>1</SocialImpact> -->
<!-- <TradePriceImprovement>0.5</TradePriceImprovement> -->
<!-- 自带的甲壳可以防御外部攻击 -->
<ArmorRating_Blunt>0.4</ArmorRating_Blunt>
<ArmorRating_Sharp>0.4</ArmorRating_Sharp>
<ArmorRating_Heat>0.3</ArmorRating_Heat>
</statBases>
<tools>
<li>
<label>巨镰</label>
<capacities>
<li>Cut</li>
</capacities>
<power>20</power>
<cooldownTime>2.5</cooldownTime>
<linkedBodyPartsGroup>ARA_Sickles</linkedBodyPartsGroup>
<!-- <ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable> -->
<chanceFactor>0.5</chanceFactor>
</li>
</tools>
<race>
<!-- 身体类型 -->
<body>ArachnaeFighter_Body</body>
<renderTree>ARA_ArachnaeRenderTree</renderTree>
<flightStartChanceOnJobStart>1.0</flightStartChanceOnJobStart>
<baseBodySize>0.85</baseBodySize>
<baseHealthScale>2</baseHealthScale>
<lifeExpectancy>5</lifeExpectancy>
</race>
</AlienRace.ThingDef_AlienRace>
</Defs>

View File

@@ -9,67 +9,9 @@
<RoyalFavorValue>3</RoyalFavorValue>
</statBases>
<tools>
<li>
<label>left fist</label>
<labelNoLocation>fist</labelNoLocation>
<capacities>
<li>Blunt</li>
</capacities>
<power>8.2</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup>
<surpriseAttack>
<extraMeleeDamages>
<li>
<def>Stun</def>
<amount>14</amount>
</li>
</extraMeleeDamages>
</surpriseAttack>
</li>
<li>
<label>right fist</label>
<labelNoLocation>fist</labelNoLocation>
<capacities>
<li>Blunt</li>
</capacities>
<power>8.2</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>RightHand</linkedBodyPartsGroup>
<surpriseAttack>
<extraMeleeDamages>
<li>
<def>Stun</def>
<amount>14</amount>
</li>
</extraMeleeDamages>
</surpriseAttack>
</li>
<li>
<label>teeth</label>
<capacities>
<li>Bite</li>
</capacities>
<power>8.2</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>Teeth</linkedBodyPartsGroup>
<chanceFactor>0.07</chanceFactor>
<soundMeleeHit>Pawn_Melee_HumanBite_Hit</soundMeleeHit>
<soundMeleeMiss>Pawn_Melee_HumanBite_Miss</soundMeleeMiss>
</li>
<li>
<label>head</label>
<capacities>
<li>Blunt</li>
</capacities>
<power>5</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
<chanceFactor>0.2</chanceFactor>
</li>
</tools>
<race>
<useMeatFrom>Megaspider</useMeatFrom>
<thinkTreeMain>Humanlike</thinkTreeMain>
<thinkTreeConstant>HumanlikeConstant</thinkTreeConstant>
<intelligence>Humanlike</intelligence>
@@ -486,6 +428,12 @@
<!-- 生育能力 -->
<onlyReproduceWithRestrictedRaces>true</onlyReproduceWithRestrictedRaces>
<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>
<li>WULA_Large_Mechine_proudctor_Bills</li>
@@ -656,7 +604,6 @@
<baseHealthScale>10</baseHealthScale>
<!-- 解剖产物 -->
<leatherDef>ARA_Carapace</leatherDef>
<specificMeatDef>Meat_Megaspider</specificMeatDef>
<soundMeleeHitPawn>Pawn_Melee_BigBash_HitPawn</soundMeleeHitPawn>
<soundMeleeHitBuilding>Pawn_Melee_BigBash_HitBuilding</soundMeleeHitBuilding>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<Defs>
<ThingDef Name="ARA_BaseGas" Abstract="True">
<thingClass>Gas</thingClass>
<label>gas</label>
<category>Gas</category>
<altitudeLayer>Gas</altitudeLayer>
<useHitPoints>false</useHitPoints>
<tickerType>Normal</tickerType>
<graphicData>
<graphicClass>Graphic_Gas</graphicClass>
<shaderType>Transparent</shaderType>
</graphicData>
</ThingDef>
<!-- Gas : Thing -->
<ThingDef ParentName="ARA_BaseGas">
<defName>ARA_ReinforceGasCloud</defName>
<label>阿拉克涅信息素烟雾</label>
<graphicData>
<texPath>Things/Gas/Puff</texPath>
<drawSize>2.6</drawSize>
<color>(1.0, 0.647, 0.0, 0.5)</color>
</graphicData>
<gas>
<expireSeconds>
<min>15</min>
<max>20</max>
</expireSeconds>
<rotationSpeed>20</rotationSpeed>
</gas>
<thingClass>ArachnaeSwarm.OPToxicGas</thingClass>
<modExtensions>
<li Class="ArachnaeSwarm.OPToxicDefs">
<OPToxicHediff>ARA_Unburnable</OPToxicHediff>
<OPToxicSeverity>0.1</OPToxicSeverity>
<OPSevUpTickPeriod>240</OPSevUpTickPeriod>
</li>
</modExtensions>
</ThingDef>
</Defs>

View File

@@ -63,116 +63,6 @@
<WorkToMake>3000</WorkToMake>
</statBases>
</ThingDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_BioforgeIncubator_ClothBase</defName>
<label>投放孵化茧 基础织物</label>
<description>投放一枚织物茧,内含可以孵化一套基础织物的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_BioforgeIncubator_ClothBase_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_BioforgeIncubator_ClothBase_Proj</defName>
<projectile>
<spawnsThingDef>ARA_BioforgeIncubator_ClothBase</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_BioforgeIncubator_Base">
<defName>ARA_BioforgeIncubator_ClothBase</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>
<ApparelLayerDef>
<defName>Shield</defName>

View File

@@ -0,0 +1,631 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!---->
<ThingDef ParentName="BaseMeleeWeapon_Sharp_Quality">
<defName>ARA_MW_Bone_Sword</defName>
<label>武装器官"骨刃"</label>
<description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。尽管它只是一块坚硬的剑形骨片,但是丝毫不影响那些拥有无穷蛮力的阿拉克涅虫群督虫使用它将侵犯虫巢之敌一一斩首。</description>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_MW_Bone_Sword</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>1</drawSize>
</graphicData>
<uiIconScale>1</uiIconScale>
<!-- <equippedAngleOffset>-65</equippedAngleOffset> -->
<techLevel>Animal</techLevel>
<!-- <equippedAngleOffset>-25</equippedAngleOffset> -->
<costStuffCount>0</costStuffCount>
<stuffCategories Inherit="False"/>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<statBases>
<WorkToMake>1000</WorkToMake>
<Mass>5</Mass>
</statBases>
<tools Inherit="False">
<li>
<label>横扫</label>
<capacities>
<li>Cut</li>
</capacities>
<power>15</power>
<cooldownTime>1.3</cooldownTime>
<armorPenetration>0.50</armorPenetration>
</li>
<li>
<label>下砸</label>
<capacities>
<li>Poke</li>
</capacities>
<power>12</power>
<armorPenetration>0.20</armorPenetration>
<cooldownTime>1.5</cooldownTime>
<extraMeleeDamages>
<li>
<def>Stun</def>
<amount>15</amount>
</li>
</extraMeleeDamages>
</li>
</tools>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite Inherit="False" />
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
</ThingDef>
<!---->
<ThingDef ParentName="BaseHumanMakeableGun">
<defName>ARA_RW_Basic_Fist_Needle_Gun</defName>
<label>武装器官"拳针枪"</label>
<description>阿拉克涅虫群督虫使用基础远程武装器官,外表就像一只拳套,可以通过神经束缠绕接在阿拉克涅督虫的辅肢上。这种武器小巧轻盈,虽然射程很短,但是面对敌人时能喷出一整排的带毒尖刺,把对手扎个透心凉。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Fist_Needle_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>0.75</drawSize>
</graphicData>
<uiIconScale>1.3</uiIconScale>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_5PAV</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>0.5</Mass>
<AccuracyTouch>0.85</AccuracyTouch>
<AccuracyShort>0.6</AccuracyShort>
<AccuracyMedium>0.45</AccuracyMedium>
<AccuracyLong>0.3</AccuracyLong>
<RangedWeapon_Cooldown>1.25</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>0.25</warmupTime>
<defaultProjectile>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defaultProjectile>
<range>14</range>
<burstShotCount>6</burstShotCount>
<ticksBetweenBurstShots>1</ticksBetweenBurstShots>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>25</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
<tools Inherit="False">
<li>
<label>拳针枪拳击</label>
<capacities>
<li>Poke</li>
</capacities>
<power>10</power>
<armorPenetration>0.25</armorPenetration>
<cooldownTime>1.25</cooldownTime>
<extraMeleeDamages>
<li>
<def>Stun</def>
<amount>12</amount>
</li>
</extraMeleeDamages>
</li>
</tools>
<comps>
<li Class="WulaFallenEmpire.CompProperties_CustomUniqueWeapon" MayRequire="Ludeon.RimWorld.Odyssey">
<forcedTraits>
<li>ARA_Weapon_Damage_Toxid</li>
</forcedTraits>
<numTraitsRange>
<min>1</min>
<max>1</max>
</numTraitsRange>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defName>
<label>毒针</label>
<graphicData>
<texPath>Things/Projectile/Bullet_Small</texPath>
<graphicClass>Graphic_Single</graphicClass>
<color>(117, 204, 49, 180)</color>
</graphicData>
<projectile>
<damageDef>ARA_Fist_Needle</damageDef>
<damageAmountBase>2</damageAmountBase>
<speed>40</speed>
</projectile>
</ThingDef>
<ThingDef ParentName="BaseHumanMakeableGun">
<defName>ARA_RW_Toxic_Needle_MG</defName>
<label>武装器官"风暴刺针枪"</label>
<description>阿拉克涅虫群督虫所使用的武装器官,拥有四排刺针管道,可以在联结神经束的指挥下交替发射大量的毒针,虽然准度较差但是威力不逊色于人类所使用的机枪。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Fist_Needle_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>0.75</drawSize>
</graphicData>
<uiIconScale>1.3</uiIconScale>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_5PAV</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>4</Mass>
<AccuracyTouch>0.5</AccuracyTouch>
<AccuracyShort>0.4</AccuracyShort>
<AccuracyMedium>0.35</AccuracyMedium>
<AccuracyLong>0.3</AccuracyLong>
<RangedWeapon_Cooldown>2.5</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>0.8</warmupTime>
<defaultProjectile>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defaultProjectile>
<range>22</range>
<burstShotCount>32</burstShotCount>
<ticksBetweenBurstShots>2</ticksBetweenBurstShots>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>25</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
<comps>
<li Class="WulaFallenEmpire.CompProperties_CustomUniqueWeapon" MayRequire="Ludeon.RimWorld.Odyssey">
<forcedTraits>
<li>ARA_Weapon_Damage_Toxid</li>
</forcedTraits>
<numTraitsRange>
<min>1</min>
<max>1</max>
</numTraitsRange>
</li>
</comps>
</ThingDef>
<!---->
<ThingDef ParentName="BaseHumanMakeableGun">
<defName>ARA_RW_Basic_Acid_Bladder_Gun</defName>
<label>武装器官"酸液枪"</label>
<description>阿拉克涅虫群督虫使用基础远程武装器官,可以通过肌肉的瞬间加压喷出一团包含阿拉克涅酸液的液体团。这种酸液团的飞行速度很慢,但是能在目标地点炸开,并灼烧所有粘上酸液的敌人。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>1.2</drawSize>
</graphicData>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_7VXI</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>3.5</Mass>
<AccuracyTouch>0.5</AccuracyTouch>
<AccuracyShort>0.6</AccuracyShort>
<AccuracyMedium>0.45</AccuracyMedium>
<AccuracyLong>0.3</AccuracyLong>
<RangedWeapon_Cooldown>2.5</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>1.0</warmupTime>
<forcedMissRadius>1</forcedMissRadius>
<defaultProjectile>Bullet_ARA_RW_Basic_Acid_Bladder_Gun</defaultProjectile>
<isMortar>true</isMortar>
<requireLineOfSight>false</requireLineOfSight>
<minRange>3</minRange>
<range>28</range>
<burstShotCount>1</burstShotCount>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
<comps>
<li Class="WulaFallenEmpire.CompProperties_CustomUniqueWeapon" MayRequire="Ludeon.RimWorld.Odyssey">
<forcedTraits>
<li>ARA_Weapon_Damage_Acid</li>
</forcedTraits>
<numTraitsRange>
<min>1</min>
<max>1</max>
</numTraitsRange>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_RW_Basic_Acid_Bladder_Gun</defName>
<label>酸液团</label>
<graphicData>
<graphicClass>Graphic_Single_AgeSecs</graphicClass>
<texPath>Things/Projectile/FleshmassSpitterProjectileSheet</texPath>
<drawSize>(.5, .5)</drawSize>
<shaderType>MoteGlow</shaderType>
</graphicData>
<uiIconScale>0.8</uiIconScale>
<thingClass>Projectile_Explosive</thingClass>
<projectile>
<useGraphicClass>True</useGraphicClass>
<shadowSize>1</shadowSize>
<damageDef>ARA_AcidBurn</damageDef>
<spinRate>20</spinRate>
<damageAmountBase>20</damageAmountBase>
<speed>15</speed>
<arcHeightFactor>1</arcHeightFactor>
<explosionRadius>1.75</explosionRadius>
<flyOverhead>true</flyOverhead>
<soundExplode>SpitterSpitLands</soundExplode>
<filth>Filth_SpentAcid</filth>
<filthCount>1</filthCount>
<explosionEffect>Shell_AcidSpitImpact</explosionEffect>
<explosionEffectLifetimeTicks>60</explosionEffectLifetimeTicks>
<doExplosionVFX>false</doExplosionVFX>
</projectile>
<comps>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitStream</effecterDef>
</li>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitLaunched</effecterDef>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseHumanMakeableGun">
<defName>ARA_RW_Acid_Mortar</defName>
<label>武装器官"腐蚀臼炮"</label>
<description>阿拉克涅虫群督虫使用大型远程武装器官,膛内布满了强健的肌肉组织,可以在一瞬间的收缩后将一团酸液发射到空中,以在安全距离下对敌人的集群进行轰炸。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>1.2</drawSize>
</graphicData>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_7VXI</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>3.5</Mass>
<AccuracyTouch>0.3</AccuracyTouch>
<AccuracyShort>0.3</AccuracyShort>
<AccuracyMedium>0.25</AccuracyMedium>
<AccuracyLong>0.1</AccuracyLong>
<RangedWeapon_Cooldown>3.5</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>1.5</warmupTime>
<forcedMissRadius>3</forcedMissRadius>
<defaultProjectile>Bullet_ARA_RW_Acid_Mortar</defaultProjectile>
<isMortar>true</isMortar>
<requireLineOfSight>false</requireLineOfSight>
<minRange>5</minRange>
<range>120</range>
<burstShotCount>1</burstShotCount>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
<comps>
<li Class="WulaFallenEmpire.CompProperties_CustomUniqueWeapon" MayRequire="Ludeon.RimWorld.Odyssey">
<forcedTraits>
<li>ARA_Huge_Weapon</li>
<li>ARA_Weapon_Damage_Acid</li>
</forcedTraits>
<numTraitsRange>
<min>2</min>
<max>2</max>
</numTraitsRange>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_RW_Acid_Mortar</defName>
<label>大型酸液团</label>
<graphicData>
<graphicClass>Graphic_Single_AgeSecs</graphicClass>
<texPath>Things/Projectile/FleshmassSpitterProjectileSheet</texPath>
<drawSize>(.75, .75)</drawSize>
<shaderType>MoteGlow</shaderType>
</graphicData>
<uiIconScale>0.8</uiIconScale>
<thingClass>Projectile_Explosive</thingClass>
<projectile>
<useGraphicClass>True</useGraphicClass>
<shadowSize>1</shadowSize>
<damageDef>ARA_AcidBurn</damageDef>
<spinRate>15</spinRate>
<damageAmountBase>50</damageAmountBase>
<speed>15</speed>
<arcHeightFactor>1</arcHeightFactor>
<explosionRadius>3.5</explosionRadius>
<flyOverhead>true</flyOverhead>
<soundExplode>SpitterSpitLands</soundExplode>
<filth>Filth_SpentAcid</filth>
<filthCount>4</filthCount>
<explosionEffect>Shell_AcidSpitImpact</explosionEffect>
<explosionEffectLifetimeTicks>60</explosionEffectLifetimeTicks>
<doExplosionVFX>false</doExplosionVFX>
</projectile>
<comps>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitStream</effecterDef>
</li>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitLaunched</effecterDef>
</li>
</comps>
</ThingDef>
<!-- spawn -->
<ThingDef ParentName="BaseHumanMakeableGun">
<defName>ARA_RW_Basic_SkyHive_Gun</defName>
<label>武装器官"天巢种之巢"</label>
<description>阿拉科涅虫群的生物武器</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>1.2</drawSize>
</graphicData>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite>ARA_Technology_6SPV</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>3.5</Mass>
<AccuracyTouch>0.5</AccuracyTouch>
<AccuracyShort>0.6</AccuracyShort>
<AccuracyMedium>0.45</AccuracyMedium>
<AccuracyLong>0.3</AccuracyLong>
<RangedWeapon_Cooldown>2.5</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>ArachnaeSwarm.Verb_ShootShotgun</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>1.0</warmupTime>
<defaultProjectile>Bullet_ARA_RW_Basic_SkyHive_Gun</defaultProjectile>
<isMortar>true</isMortar>
<requireLineOfSight>false</requireLineOfSight>
<minRange>3</minRange>
<range>28</range>
<burstShotCount>1</burstShotCount>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
<comps>
<li Class="WulaFallenEmpire.CompProperties_CustomUniqueWeapon" MayRequire="Ludeon.RimWorld.Odyssey">
<forcedTraits>
<li>ARA_Weapon_Damage_Spawn</li>
</forcedTraits>
<numTraitsRange>
<min>1</min>
<max>1</max>
</numTraitsRange>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_RW_Basic_SkyHive_Gun</defName>
<label>天巢种</label>
<graphicData>
<graphicClass>Graphic_Single_AgeSecs</graphicClass>
<texPath>Things/Pawn/Insect/Locust/Locust_north</texPath>
<color>(156,148,125)</color>
<drawSize>(1,1)</drawSize>
<shaderType>TransparentPostLight</shaderType>
</graphicData>
<uiIconScale>0.8</uiIconScale>
<thingClass>ArachnaeSwarm.Projectile_TrackingBullet</thingClass>
<projectile>
<useGraphicClass>True</useGraphicClass>
<shadowSize>1</shadowSize>
<damageDef>ARA_SkyhiveBite</damageDef>
<damageAmountBase>10</damageAmountBase>
<speed>25</speed>
<arcHeightFactor>1</arcHeightFactor>
<flyOverhead>true</flyOverhead>
</projectile>
<modExtensions>
<li Class="ArachnaeSwarm.TrackingBulletDef">
<!-- 追踪速度,数值越高,转向越快,追踪能力越强 -->
<homingSpeed>0.75</homingSpeed>
<!-- 初始发射时的随机散射角度(左右各多少度) -->
<initRotateAngle>35</initRotateAngle>
<!-- 失去目标后多少 Tick 后自毁,可以是一个范围,如 "120~180" -->
<destroyTicksAfterLosingTrack>150</destroyTicksAfterLosingTrack>
<!-- 子弹离目标多近时就直接判定为命中 -->
<impactThreshold>2.1</impactThreshold>
</li>
<li Class="ArachnaeSwarm.ShotgunExtension">
<pelletCount>3</pelletCount>
</li>
</modExtensions>
<comps>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitStream</effecterDef>
</li>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitLaunched</effecterDef>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseMeleeWeapon_Sharp_Quality">
<defName>ARA_MW_Mimic_Niddle</defName>
<label>武装器官"拟线种毒针"</label>
<description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。这根毒针中藏有休眠中的阿拉克涅拟线种虫卵,攻击将感染受害者使其最终成为被拟线虫操控的寄生体。</description>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_MW_Bone_Sword</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>1</drawSize>
</graphicData>
<uiIconScale>1</uiIconScale>
<!-- <equippedAngleOffset>-65</equippedAngleOffset> -->
<techLevel>Animal</techLevel>
<!-- <equippedAngleOffset>-25</equippedAngleOffset> -->
<costStuffCount>0</costStuffCount>
<stuffCategories Inherit="False"/>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<statBases>
<WorkToMake>1000</WorkToMake>
<Mass>5</Mass>
</statBases>
<tools Inherit="False">
<li>
<label></label>
<capacities>
<li>Cut</li>
</capacities>
<power>15</power>
<cooldownTime>1.3</cooldownTime>
<armorPenetration>0.50</armorPenetration>
</li>
<li>
<label></label>
<capacities>
<li>Poke</li>
</capacities>
<power>12</power>
<armorPenetration>0.20</armorPenetration>
<cooldownTime>1.5</cooldownTime>
<extraMeleeDamages>
<li>
<def>ARA_MimicNematodeBite</def>
<amount>4</amount>
</li>
</extraMeleeDamages>
</li>
</tools>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite Inherit="False" />
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
</ThingDef>
</Defs>

View File

@@ -1,622 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="BaseMeleeWeapon_Sharp_Quality">
<defName>ARA_MW_Bone_Sword</defName>
<label>武装器官"骨刃"</label>
<description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。尽管它只是一块坚硬的剑形骨片,但是丝毫不影响那些拥有无穷蛮力的阿拉克涅虫群督虫使用它将侵犯虫巢之敌一一斩首。</description>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_MW_Bone_Sword</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>1</drawSize>
</graphicData>
<uiIconScale>1</uiIconScale>
<!-- <equippedAngleOffset>-65</equippedAngleOffset> -->
<techLevel>Animal</techLevel>
<!-- <equippedAngleOffset>-25</equippedAngleOffset> -->
<costStuffCount>0</costStuffCount>
<stuffCategories Inherit="False"/>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<statBases>
<WorkToMake>1000</WorkToMake>
<Mass>5</Mass>
</statBases>
<tools Inherit="False">
<li>
<label>横扫</label>
<capacities>
<li>Cut</li>
</capacities>
<power>15</power>
<cooldownTime>1.3</cooldownTime>
<armorPenetration>0.50</armorPenetration>
</li>
<li>
<label>下砸</label>
<capacities>
<li>Poke</li>
</capacities>
<power>12</power>
<armorPenetration>0.20</armorPenetration>
<cooldownTime>1.5</cooldownTime>
<extraMeleeDamages>
<li>
<def>Stun</def>
<amount>15</amount>
</li>
</extraMeleeDamages>
</li>
</tools>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite Inherit="False" />
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
</ThingDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_BioforgeIncubator_BoneBase</defName>
<label>投放孵化茧 骨刃器官</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础骨刃武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_BioforgeIncubator_BoneBase_Proj</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_5DIL</requiredResearch>
<failMessage>需要科技 基因节点DIL-5"骨刀" 以解锁此孵化路径</failMessage>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_BioforgeIncubator_BoneBase_Proj</defName>
<projectile>
<spawnsThingDef>ARA_BioforgeIncubator_BoneBase</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_BioforgeIncubator_Base">
<defName>ARA_BioforgeIncubator_BoneBase</defName>
<label>阿拉克涅孵化茧 基础骨片装备</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一个骨片武装器官的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为-20~35°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_MW_Bone_Sword</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Technology_5DIL</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_MW_Bone_Sword</thingDef>
<productionTicks>60000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
</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="BaseHumanMakeableGun">
<defName>ARA_RW_Basic_Fist_Needle_Gun</defName>
<label>武装器官"拳针枪"</label>
<description>阿拉克涅虫群督虫使用基础远程武装器官,外表就像一只拳套,可以通过神经束缠绕接在阿拉克涅督虫的辅肢上。这种武器小巧轻盈,虽然射程很短,但是面对敌人时能喷出一整排的带毒尖刺,把对手扎个透心凉。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Fist_Needle_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>0.75</drawSize>
</graphicData>
<uiIconScale>1.3</uiIconScale>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite Inherit="False" />
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>0.5</Mass>
<AccuracyTouch>0.85</AccuracyTouch>
<AccuracyShort>0.6</AccuracyShort>
<AccuracyMedium>0.45</AccuracyMedium>
<AccuracyLong>0.3</AccuracyLong>
<RangedWeapon_Cooldown>1.25</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>0.25</warmupTime>
<defaultProjectile>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defaultProjectile>
<range>14</range>
<burstShotCount>6</burstShotCount>
<ticksBetweenBurstShots>1</ticksBetweenBurstShots>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>25</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
<tools Inherit="False">
<li>
<label>拳针枪拳击</label>
<capacities>
<li>Poke</li>
</capacities>
<power>10</power>
<armorPenetration>0.25</armorPenetration>
<cooldownTime>1.25</cooldownTime>
<extraMeleeDamages>
<li>
<def>Stun</def>
<amount>12</amount>
</li>
</extraMeleeDamages>
</li>
</tools>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defName>
<label>毒针</label>
<graphicData>
<texPath>Things/Projectile/Bullet_Small</texPath>
<graphicClass>Graphic_Single</graphicClass>
<color>(117, 204, 49, 180)</color>
</graphicData>
<projectile>
<damageDef>ARA_Fist_Needle</damageDef>
<damageAmountBase>2</damageAmountBase>
<speed>40</speed>
</projectile>
</ThingDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_BioforgeIncubator_ToxicNeedleBase</defName>
<label>投放孵化茧 毒针器官</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础毒针武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_BioforgeIncubator_ToxicNeedleBase_Proj</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
<failMessage>需要科技 基因节点PAV-5"毒刺" 以解锁此孵化路径</failMessage>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_BioforgeIncubator_ToxicNeedleBase_Proj</defName>
<projectile>
<spawnsThingDef>ARA_BioforgeIncubator_ToxicNeedleBase</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_BioforgeIncubator_Base">
<defName>ARA_BioforgeIncubator_ToxicNeedleBase</defName>
<label>阿拉克涅孵化茧 基础毒针武器</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一个毒针武装器官的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为0~22°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_RW_Basic_Fist_Needle_Gun</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Technology_5PAV</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_RW_Basic_Fist_Needle_Gun</thingDef>
<productionTicks>40000</productionTicks>
<totalNutritionNeeded>10</totalNutritionNeeded>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>0</minSafeTemperature>
<maxSafeTemperature>22</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>22</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseHumanMakeableGun">
<defName>ARA_RW_Basic_Acid_Bladder_Gun</defName>
<label>武装器官"酸液枪"</label>
<description>阿拉克涅虫群督虫使用基础远程武装器官,可以通过肌肉的瞬间加压喷出一团包含阿拉克涅酸液的液体团。这种酸液团的飞行速度很慢,但是能在目标地点炸开,并灼烧所有粘上酸液的敌人。</description>
<tickerType>Normal</tickerType>
<techLevel>Animal</techLevel>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_RW_Basic_Acid_Bladder_Gun</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>1.2</drawSize>
</graphicData>
<soundInteract>SpitterSpawn</soundInteract>
<recipeMaker>
<recipeUsers Inherit="False" />
<researchPrerequisite Inherit="False" />
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<statBases>
<WorkToMake>1300</WorkToMake>
<!-- <MarketValue>370</MarketValue> -->
<Mass>3.5</Mass>
<AccuracyTouch>0.5</AccuracyTouch>
<AccuracyShort>0.6</AccuracyShort>
<AccuracyMedium>0.45</AccuracyMedium>
<AccuracyLong>0.3</AccuracyLong>
<RangedWeapon_Cooldown>2.5</RangedWeapon_Cooldown>
</statBases>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>1.0</warmupTime>
<forcedMissRadius>1</forcedMissRadius>
<defaultProjectile>Bullet_ARA_RW_Basic_Acid_Bladder_Gun</defaultProjectile>
<isMortar>true</isMortar>
<requireLineOfSight>false</requireLineOfSight>
<minRange>3</minRange>
<range>28</range>
<burstShotCount>1</burstShotCount>
<soundCast>SpitterSpit</soundCast>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
<costList Inherit="False">
<ARA_Carapace>50</ARA_Carapace>
</costList>
<weaponTags>
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
</weaponTags>
<thingSetMakerTags>
<li>RewardStandardQualitySuper</li>
</thingSetMakerTags>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Bullet_ARA_RW_Basic_Acid_Bladder_Gun</defName>
<label>酸液团</label>
<graphicData>
<graphicClass>Graphic_Single_AgeSecs</graphicClass>
<texPath>Things/Projectile/FleshmassSpitterProjectileSheet</texPath>
<drawSize>(.5, .5)</drawSize>
<shaderType>MoteGlow</shaderType>
</graphicData>
<uiIconScale>0.8</uiIconScale>
<thingClass>Projectile_Explosive</thingClass>
<projectile>
<useGraphicClass>True</useGraphicClass>
<shadowSize>1</shadowSize>
<damageDef>ARA_AcidBurn</damageDef>
<spinRate>20</spinRate>
<damageAmountBase>20</damageAmountBase>
<speed>15</speed>
<arcHeightFactor>1</arcHeightFactor>
<explosionRadius>1.75</explosionRadius>
<flyOverhead>true</flyOverhead>
<soundExplode>SpitterSpitLands</soundExplode>
<filth>Filth_SpentAcid</filth>
<filthCount>1</filthCount>
<explosionEffect>Shell_AcidSpitImpact</explosionEffect>
<explosionEffectLifetimeTicks>60</explosionEffectLifetimeTicks>
<doExplosionVFX>false</doExplosionVFX>
</projectile>
<comps>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitStream</effecterDef>
</li>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitLaunched</effecterDef>
</li>
</comps>
</ThingDef>
<AbilityDef ParentName="ARA_CocoonSpew_Base">
<defName>ARA_BioforgeIncubator_AcidBase</defName>
<label>投放孵化茧 酸液器官</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础酸液武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_7VXI</requiredResearch>
<failMessage>需要科技 基因节点VXI-7"外置酸袋" 以解锁此孵化路径</failMessage>
</li>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_BioforgeIncubator_AcidBase_Proj</projectileDef>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_BioforgeIncubator_AcidBase_Proj</defName>
<projectile>
<spawnsThingDef>ARA_BioforgeIncubator_AcidBase</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_BioforgeIncubator_Base">
<defName>ARA_BioforgeIncubator_AcidBase</defName>
<label>阿拉克涅孵化茧 基础酸性武器</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含孵化一个酸性武装器官的营养物质,可以通过阿拉克涅工艺种的交互完成激活进程——参阅茧的超链接,了解其能生产的所有装备的特点。\n\n孵化茧对温度极度敏感该类型的茧适温为10~28°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ARA_RW_Basic_Acid_Bladder_Gun</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Technology_7VXI</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_RW_Basic_Acid_Bladder_Gun</thingDef>
<productionTicks>80000</productionTicks>
<totalNutritionNeeded>30</totalNutritionNeeded>
</li>
</processes>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li>
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>10</minSafeTemperature>
<maxSafeTemperature>28</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>
<!--
当一个生产流程完成时,系统会通过以下三个步骤来确定最终的物品品质:
第 1 步: 计算“基础品质分” (Base Quality Score)
基础品质分代表了在整个生产过程中,理想条件所占的比例。理想条件被严格定义为:燃料充足 且 温度适宜。
公式:
基础品质分 = 在理想条件下度过的时间(ticks) / 生产总需时间(ticks)
C# 代码对应:
baseQuality = (_selectedProcess.productionTicks > 0) ? (float)ticksUnderOptimalConditions / _selectedProcess.productionTicks : 0f;
说明:
ticksUnderOptimalConditions 是一个计数器只有在同时满足燃料充足和温度安全这两个条件的游戏刻Tick它才会加 1。
_selectedProcess.productionTicks 是在 XML 中为该产品定义的总生产时间。
这个得分的范围是 0.0 (0%) 到 1.0 (100%)。如果整个过程都完美无缺,这个分数就是 1.0。
第 2 步: 计算“温度惩罚分” (Temperature Penalty Score)
温度惩罚分是一个独立累加的负面分数。它只在环境温度超出安全范围时才会累积。
公式:
每刻惩罚增加量 = 超出安全范围的度数 × penaltyPerDegreePerTick
温度惩罚分 = 所有惩罚增加量的总和
C# 代码对应:
temperaturePenaltyPercent = Mathf.Min(1f, temperaturePenaltyPercent + tempDelta * Props.penaltyPerDegreePerTick);
说明:
penaltyPerDegreePerTick 是一个可在 XML 中配置的系数代表每超出1度、每刻所产生的惩罚量。
这个惩罚是不可逆的。即使温度恢复正常,已经累积的惩罚也不会减少。
它的最大值被限制在 1.0 (100%),以防止无限累加。
第 3 步: 计算“最终品质分”并映射到品质等级
最终品质分由基础分减去惩罚分得出,这个分数将直接决定物品的品质等级。
公式:
最终品质分 = 基础品质分 - 温度惩罚分
C# 代码对应:
finalQualityScore = Mathf.Clamp01(baseQuality - temperaturePenaltyPercent);
映射到品质等级:
得到 finalQualityScore (一个 0.0 到 1.0 之间的值) 后,系统会通过一系列 if-else if 判断,将其映射到游戏中的 QualityCategory (品质等级)。例如,在我们的代码中:
>= 0.99 -> 传说 (Legendary)
>= 0.90 -> 杰作 (Masterwork)
>= 0.70 -> 优秀 (Excellent)
>= 0.50 -> 良好 (Good)
>= 0.20 -> 普通 (Normal)
>= 0.10 -> 差 (Poor)
< 0.10 -> 劣质 (Awful)
总结
这个系统的核心在于,它鼓励玩家全程维持最佳生产环境。
仅仅保持燃料充足或温度适宜是不够的,必须两者兼顾才能提高“基础品质分”。
同时,必须极力避免温度超出安全范围,因为“温度惩罚分”是纯粹的惩罚,它只会单方面地拉低最终品质,且无法挽回。
这种设计为玩家提供了一个清晰的目标和富有挑战性的过程管理,而不是一个简单的“放置-等待”式生产。
-->
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>10</minSafeTemperature>
<maxSafeTemperature>28</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -1,118 +1,239 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<!-- 1. 加成建筑 "孵化加速器" -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_IncubationAccelerator</defName>
<label>孵化加速器</label>
<description>一个辅助性的生物机械装置,当放置在大型孵化池旁边时,可以加速其内部的孵化过程。</description>
<graphicData>
<texPath>Things/Building/Misc/ToolCabinet</texPath>
<graphicClass>Graphic_Multi</graphicClass>
</graphicData>
<size>(1,1)</size>
<comps>
<!-- 使用原版的 CompFacility -->
<li Class="CompProperties_Facility">
<statOffsets>
<!-- 提供我们自定义的孵化速度加成 -->
<ARA_IncubationSpeedFactor>0.60</ARA_IncubationSpeedFactor>
</statOffsets>
</li>
</comps>
</ThingDef>
<!-- 1. 加成建筑 "孵化加速器" -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_IncubationAccelerator</defName>
<label>孵化加速器</label>
<description>一个辅助性的生物机械装置,当放置在大型孵化池旁边时,可以加速其内部的孵化过程。</description>
<graphicData>
<texPath>Things/Building/Misc/ToolCabinet</texPath>
<graphicClass>Graphic_Multi</graphicClass>
</graphicData>
<size>(1,1)</size>
<comps>
<!-- 使用原版的 CompFacility -->
<li Class="CompProperties_Facility">
<statOffsets>
<!-- 提供我们自定义的孵化速度加成 -->
<ARA_IncubationSpeedFactor>0.60</ARA_IncubationSpeedFactor>
</statOffsets>
</li>
</comps>
</ThingDef>
<!-- 3. 主建筑 "生物孵化池" -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_BioforgeIncubator_Thing</defName>
<label>生物质物品孵化池</label>
<description>一个大型的、需要消耗大量营养物质的孵化设施,可以同时孵化多个单位,并能通过链接外部设备来提高效率。</description>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_BioforgeIncubator</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(5,6)</drawSize>
</graphicData>
<size>(5,5)</size>
<tickerType>Normal</tickerType>
<stuffCategories Inherit="False" />
<costStuffCount>0</costStuffCount>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<castEdgeShadows>false</castEdgeShadows>
<staticSunShadowHeight>0</staticSunShadowHeight>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<pathCost>50</pathCost>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>2800</WorkToBuild>
<Flammability>1.0</Flammability>
</statBases>
<placeWorkers>
<li>PlaceWorker_PreventInteractionSpotOverlap</li>
</placeWorkers>
<fillPercent>0.8</fillPercent>
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>ARA_Buildings</designationCategory>
<uiOrder>2600</uiOrder>
<surfaceType>Item</surfaceType>
<building>
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
</building>
<comps>
<!-- a. 我们新的队列物品生产组件 -->
<li Class="ArachnaeSwarm.CompProperties_QueuedInteractiveProducer">
<!-- 队列和交互设置 -->
<productionQueueLimit>3</productionQueueLimit>
<minNutritionToStart>1.0</minNutritionToStart>
<whitelist>
<li>ArachnaeNode_Race_WeaponSmith</li> <!-- 示例:允许普通殖民者操作 -->
</whitelist>
<!-- 2. 主建筑 "生物孵化池" -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_BioforgeIncubator</defName>
<label>生物质孵化池</label>
<description>一个大型的、需要消耗大量营养物质的孵化设施,可以同时孵化多个单位,并能通过链接外部设备来提高效率。</description>
<graphicData>
<texPath>Things/Building/AncientHeatVent</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(7,7)</drawSize>
</graphicData>
<size>(7,7)</size>
<tickerType>Normal</tickerType>
<stuffCategories Inherit="False"/>
<costStuffCount>0</costStuffCount>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<castEdgeShadows>false</castEdgeShadows>
<staticSunShadowHeight>0</staticSunShadowHeight>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<pathCost>50</pathCost>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>2800</WorkToBuild>
<Flammability>1.0</Flammability>
</statBases>
<placeWorkers>
<li>PlaceWorker_PreventInteractionSpotOverlap</li>
</placeWorkers>
<fillPercent>0.8</fillPercent>
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>ARA_Buildings</designationCategory>
<uiOrder>2600</uiOrder>
<surfaceType>Item</surfaceType>
<building>
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
</building>
<comps>
<!-- 质量系统设置 -->
<minSafeTemperature>10</minSafeTemperature>
<maxSafeTemperature>30</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<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>
<!-- a. 我们自己的队列生产组件 -->
<li Class="ArachnaeSwarm.CompProperties_QueuedPawnSpawner">
<productionQueueLimit>5</productionQueueLimit>
<minNutritionToStart>0.5</minNutritionToStart>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delayTicks>180000</delayTicks>
<totalNutritionNeeded>5.0</totalNutritionNeeded>
</li>
<li>
<pawnKind>ArachnaeNode_Race_ShieldHead</pawnKind>
<delayTicks>180000</delayTicks>
<totalNutritionNeeded>5.0</totalNutritionNeeded>
</li>
<li>
<pawnKind>ArachnaeNode_Race_WeaponSmith</pawnKind>
<delayTicks>180000</delayTicks>
<totalNutritionNeeded>5.0</totalNutritionNeeded>
<!--<requiredResearch>ARA_AdvancedBiology</requiredResearch>-->
</li>
</spawnablePawns>
</li>
<!-- 生产列表 -->
<processes>
<li>
<thingDef>ARA_RW_Basic_Acid_Bladder_Gun</thingDef>
<productionTicks>80000</productionTicks>
<totalNutritionNeeded>30</totalNutritionNeeded>
<requiredResearch>ARA_Technology_7VXI</requiredResearch>
</li>
<li>
<thingDef>ARA_RW_Basic_Fist_Needle_Gun</thingDef>
<productionTicks>40000</productionTicks>
<totalNutritionNeeded>10</totalNutritionNeeded>
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
</li>
</processes>
</li>
<!-- b. 我们的营养燃料组件 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>100.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
</li>
<!-- b. 我们的营养燃料组件 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>100.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>
<!-- c. 原版的设施链接接收组件 -->
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_IncubationAccelerator</li>
</linkableFacilities>
</li>
<!-- c. 原版的设施链接接收组件 -->
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_IncubationAccelerator</li>
</linkableFacilities>
</li>
</comps>
</ThingDef>
</comps>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>ARA_BioforgeIncubator</defName>
<label>生物质孵化池</label>
<description>一个大型的、需要消耗大量营养物质的孵化设施,可以同时孵化多个单位,并能通过链接外部设备来提高效率。</description>
<graphicData>
<texPath>Things/Building/AncientHeatVent</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(7,7)</drawSize>
</graphicData>
<size>(7,7)</size>
<tickerType>Normal</tickerType>
<stuffCategories Inherit="False" />
<costStuffCount>0</costStuffCount>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<castEdgeShadows>false</castEdgeShadows>
<staticSunShadowHeight>0</staticSunShadowHeight>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<pathCost>50</pathCost>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>2800</WorkToBuild>
<Flammability>1.0</Flammability>
</statBases>
<placeWorkers>
<li>PlaceWorker_PreventInteractionSpotOverlap</li>
</placeWorkers>
<fillPercent>0.8</fillPercent>
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>ARA_Buildings</designationCategory>
<uiOrder>2600</uiOrder>
<surfaceType>Item</surfaceType>
<building>
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
</building>
<comps>
<!-- a. 我们自己的队列生产组件 -->
<li Class="ArachnaeSwarm.CompProperties_QueuedPawnSpawner">
<productionQueueLimit>5</productionQueueLimit>
<minNutritionToStart>0.5</minNutritionToStart>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delayTicks>180000</delayTicks>
<totalNutritionNeeded>5.0</totalNutritionNeeded>
</li>
<li>
<pawnKind>ArachnaeNode_Race_ShieldHead</pawnKind>
<delayTicks>180000</delayTicks>
<totalNutritionNeeded>5.0</totalNutritionNeeded>
</li>
<li>
<pawnKind>ArachnaeNode_Race_WeaponSmith</pawnKind>
<delayTicks>180000</delayTicks>
<totalNutritionNeeded>5.0</totalNutritionNeeded>
<!--<requiredResearch>ARA_AdvancedBiology</requiredResearch>-->
</li>
</spawnablePawns>
</li>
<!-- b. 我们的营养燃料组件 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>100.0</fuelCapacity>
<fuelFilter>
<categories>
<li>Foods</li>
</categories>
</fuelFilter>
<fuelGizmoLabel>生物质</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
</li>
<!-- c. 原版的设施链接接收组件 -->
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_IncubationAccelerator</li>
</linkableFacilities>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<TerrainDef ParentName="FloorBase">
<TerrainDef ParentName="NaturalTerrainBase">
<defName>ARA_InsectCreep</defName>
<label>阿拉克涅菌毯</label>
<description>由阿拉克涅虫族所铺设的由真菌、甲壳素分泌物混合得到的地面,会自动在各种拉克涅虫族建筑附近蔓延。这种奇特的结构质地紧密且暗藏大量营养输送组织,可以支撑重型建筑、种植作物、加速其上的阿拉克涅虫族移动速度,但是除了虫族以外没人想踩在这坨软乎乎的活体结构上。</description>
<designationCategory>ARA_Buildings</designationCategory>
<texturePath>Terrain/Surfaces/InsectSludge</texturePath>
<color>(203, 163, 68)</color>
<color>(239, 139, 48)</color>
<pollutionShaderType MayRequire="Ludeon.RimWorld.Biotech">TerrainFadeRoughLinearBurn</pollutionShaderType>
<pollutionOverlayTexturePath>Terrain/Surfaces/PollutionMud</pollutionOverlayTexturePath>
<pollutionColor>(1, 1, 1, 1)</pollutionColor>
<edgeType>FadeRough</edgeType>
<resourcesFractionWhenDeconstructed>0</resourcesFractionWhenDeconstructed>
<renderPrecedence>330</renderPrecedence>
<pathCost>2</pathCost>
<pathCost>10</pathCost>
<generatedFilth>Filth_Slime</generatedFilth>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
@@ -28,7 +28,7 @@
<Beauty>-6</Beauty>
<CleaningTimeFactor>0.25</CleaningTimeFactor>
<Cleanliness>0</Cleanliness>
<Flammability>0.2</Flammability>
<Flammability>0</Flammability>
</statBases>
<fertility>1.25</fertility>
<affordances Inherit="False">
@@ -73,7 +73,7 @@
<building>
<isAirtight>true</isAirtight>
<!-- <isNaturalRock>true</isNaturalRock> -->
<smoothedThing>SmoothedGranite</smoothedThing>
<!-- <smoothedThing>SmoothedGranite</smoothedThing> -->
<blueprintGraphicData>
<texPath>ArachnaeSwarm/Building/Linked/ARA_InsectWall_Blueprint</texPath>
</blueprintGraphicData>
@@ -332,12 +332,14 @@
<size>(3,3)</size>
<stuffCategories Inherit="False"/>
<costStuffCount>0</costStuffCount>
<minifiedDef Inherit="False"/>
<thingCategories Inherit="False"/>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_ResearchBench</texPath>
<graphicClass>Graphic_Single</graphicClass>
<graphicClass>Graphic_Multi</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(3,4.5)</drawSize>
</graphicData>

View File

@@ -52,49 +52,7 @@
</comps>
</ThingDef>
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac_BaseFighter</defName>
<label>阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_Basic_Fighter</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_Basic_Fighter</defName>
<label>阿拉克涅虫卵囊 战士虫</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为-10~22°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Fighter</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Technology_1KYC</li>
</researchPrerequisites>
<comps>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_Fighter</pawnKind>
<delayTicks>12</delayTicks>
<requiredResearch>ARA_Technology_1KYC</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>
<!-- T0 -->
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac</defName>
<label>阿拉克涅虫卵</label>
@@ -102,15 +60,14 @@
<spawnsThingDef>ARA_InteractiveEggSac</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac</defName>
<label>阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为-25~30°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Myrmecocystus</ThingDef>
<ThingDef>ArachnaeNode_Race_ShieldHead</ThingDef>
<ThingDef>ArachnaeNode_Race_WeaponSmith</ThingDef>
<ThingDef>ArachnaeNode_Race_Fighter</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
@@ -119,18 +76,19 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delayTicks>180000</delayTicks>
</li>
<li>
<pawnKind>ArachnaeNode_Race_ShieldHead</pawnKind>
<delayTicks>180000</delayTicks>
<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>
</spawnablePawns>
<whitelist>
<li>ARA_ArachnaeQueen</li>
@@ -146,7 +104,6 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_Start</defName>
<label>初诞阿拉克涅虫卵囊</label>
@@ -189,5 +146,148 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac_Huge</defName>
<label>大型阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_Huge</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_Huge</defName>
<label>大型阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只大型督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为-25~30°C需要小心保护</description>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Myrmecocystus</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
</researchPrerequisites>
</Defs>
<comps>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<spawnablePawns>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delayTicks>180000</delayTicks>
</li>
</spawnablePawns>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<destroyOnSpawn>true</destroyOnSpawn>
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-25</minSafeTemperature>
<maxSafeTemperature>30</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</ThingDef>
<!-- T1 -->
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac_1Stage</defName>
<label>阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_1Stage</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_1Stage</defName>
<label>阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的超链接,了解各个督虫的特点。\n\n卵囊对温度极度敏感该类型的卵适温为-10~22°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>
<comps>
<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>-10</minSafeTemperature>
<maxSafeTemperature>22</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_1Stage</defName>
<label>大型阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_Huge_1Stage</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<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>
</descriptionHyperlinks>
<comps>
<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>
</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>
</Defs>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef Name="ARA_BioforgeIncubator_Base" ParentName="BuildingBase" Abstract="True">
<ThingDef Name="ARA_Cocoon_Base" ParentName="BuildingBase" Abstract="True">
<thingClass>Building</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_BioforgeIncubator</texPath>
<texPath>ArachnaeSwarm/Building/ARA_Cocoon</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(1.1,1.1)</drawSize>
</graphicData>
@@ -38,4 +38,230 @@
</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_Wepaon</defName>
<label>投放武装器官孵化茧</label>
<description>投放一枚武装器官茧,内含可以孵化一套基础武装器官的营养和遗传物质——参阅茧的超链接,了解其能生产的所有装备的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Cocoon_Wepaon_Proj</projectileDef>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_CocoonSpew_Base_Proj">
<defName>ARA_Cocoon_Wepaon_Proj</defName>
<projectile>
<spawnsThingDef>ARA_Cocoon_Wepaon</spawnsThingDef>
</projectile>
</ThingDef>
<ThingDef ParentName="ARA_Cocoon_Base">
<defName>ARA_Cocoon_Wepaon</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>
<researchPrerequisites>
<li>ARA_Technology_5DIL</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_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,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<WeaponCategoryDef>
<defName>ARA_Huge_Weapon_Category</defName>
<label>大型武装器官</label>
<description>这种武装器官相当巨大只有那些大型阿拉克涅督虫体型大于2.0)才能使用此武器。</description>
</WeaponCategoryDef>
<WeaponCategoryDef>
<defName>ARA_Weapon_Damage_Category</defName>
<label>特殊武装器官</label>
<description>这种武装器官除了造成常规伤害外,还能引起其他的效果。</description>
</WeaponCategoryDef>
</Defs>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<WeaponTraitDef>
<defName>ARA_Huge_Weapon</defName>
<label>大型武装器官</label>
<description>这种武装器官相当巨大只有那些大型阿拉克涅督虫体型大于2.0)才能使用此武器。</description>
<commonality>1</commonality>
<weaponCategory>ARA_Huge_Weapon_Category</weaponCategory>
<statOffsets>
</statOffsets>
<statFactors>
</statFactors>
</WeaponTraitDef>
<WeaponTraitDef>
<defName>ARA_Weapon_Damage_Acid</defName>
<label>阿拉克涅酸液</label>
<description>这种武装器官的射弹命中敌人时,会在对方身上留下造成持续性伤害的酸液。</description>
<commonality>1</commonality>
<weaponCategory>ARA_Weapon_Damage_Category</weaponCategory>
<statOffsets>
</statOffsets>
<statFactors>
</statFactors>
</WeaponTraitDef>
<WeaponTraitDef>
<defName>ARA_Weapon_Damage_Toxid</defName>
<label>阿拉克涅毒素</label>
<description>这种武装器官的射弹命中敌人时,会向对方体内注入毒素使其中毒。</description>
<commonality>1</commonality>
<weaponCategory>ARA_Weapon_Damage_Category</weaponCategory>
<statOffsets>
</statOffsets>
<statFactors>
</statFactors>
</WeaponTraitDef>
<WeaponTraitDef>
<defName>ARA_Weapon_Damage_Spawn</defName>
<label>阿拉克涅子巢</label>
<description>这种武装器官的主要攻击方式是释放辅虫,其中一些会直接把辅虫往敌人中投掷,另一些则会使辅虫跟踪和吸附敌军以造成伤害。</description>
<commonality>1</commonality>
<weaponCategory>ARA_Weapon_Damage_Category</weaponCategory>
<statOffsets>
</statOffsets>
<statFactors>
</statFactors>
</WeaponTraitDef>
</Defs>

View File

@@ -17,4 +17,8 @@
<NotProducing>未在生产</NotProducing>
<ARA_NeedArachnaeToStartIncubation>未孵化,需要阿拉克涅工艺种交互</ARA_NeedArachnaeToStartIncubation>
<!-- Added for CompQueuedPawnSpawner -->
<NutritionNeeded>所需营养</NutritionNeeded>
<ARA_Incubate>孵化 {0}</ARA_Incubate>
</LanguageData>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 196 KiB

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -1,14 +1,14 @@
{
"Version": 1,
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\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|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\ara_buildingterrainspawn\\compproperties_delayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_buildingterrainspawn\\compproperties_delayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\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}"
}
],
"DocumentGroupContainers": [
@@ -18,37 +18,36 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"SelectedChildIndex": 1,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "CompDelayedTerrainSpawn.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs",
"RelativeDocumentMoniker": "ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs",
"RelativeToolTip": "ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs",
"ViewState": "AgIAAAAAAAAAAAAAAADwvxcAAAAfAAAAAAAAAA==",
"Title": "Verb_ShootMeltBeam.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\Verb_ShootMeltBeam.cs",
"RelativeDocumentMoniker": "Verb\\Verb_ShootMeltBeam.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\Verb_ShootMeltBeam.cs",
"RelativeToolTip": "Verb\\Verb_ShootMeltBeam.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAyAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-09-05T11:17:51.595Z",
"WhenOpened": "2025-09-09T03:04:00.299Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "CompProperties_DelayedTerrainSpawn.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_BuildingTerrainSpawn\\CompProperties_DelayedTerrainSpawn.cs",
"RelativeDocumentMoniker": "ARA_BuildingTerrainSpawn\\CompProperties_DelayedTerrainSpawn.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\ARA_BuildingTerrainSpawn\\CompProperties_DelayedTerrainSpawn.cs",
"RelativeToolTip": "ARA_BuildingTerrainSpawn\\CompProperties_DelayedTerrainSpawn.cs",
"ViewState": "AgIAAAAAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Title": "CompCleave.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Verb\\CompCleave.cs",
"RelativeDocumentMoniker": "Verb\\CompCleave.cs",
"ToolTip": "D:\\SteamLibrary\\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-05T11:17:48.391Z",
"EditorCaption": ""
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
"WhenOpened": "2025-09-09T03:03:30.118Z"
}
]
}

View File

@@ -112,12 +112,20 @@ namespace ArachnaeSwarm
foreach (var process in Props.processes)
{
yield return new FloatMenuOption("StartProduction".Translate(process.thingDef.label), () =>
if (process.requiredResearch != null && !process.requiredResearch.IsFinished)
{
this._selectedProcess = process;
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_StartInteractiveProduction"), parent);
selPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
});
string disabledText = "StartProduction".Translate(process.thingDef.label) + " (" + "Requires".Translate() + ": " + process.requiredResearch.label + ")";
yield return new FloatMenuOption(disabledText, null);
}
else
{
yield return new FloatMenuOption("StartProduction".Translate(process.thingDef.label), () =>
{
this._selectedProcess = process;
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_StartInteractiveProduction"), parent);
selPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
});
}
}
}

View File

@@ -0,0 +1,273 @@
using RimWorld;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Verse;
using Verse.AI;
using UnityEngine;
namespace ArachnaeSwarm
{
// Data contract for a single production order in the queue
public class QueuedProcessOrder : IExposable
{
public ProcessDef process; // Using the existing ProcessDef
public int productionUntilTick = -1;
// Quality-related fields
public int ticksUnderOptimalConditions;
public float temperaturePenaltyPercent;
public void ExposeData()
{
Scribe_Deep.Look(ref process, "process");
Scribe_Values.Look(ref productionUntilTick, "productionUntilTick", -1);
Scribe_Values.Look(ref ticksUnderOptimalConditions, "ticksUnderOptimalConditions", 0);
Scribe_Values.Look(ref temperaturePenaltyPercent, "temperaturePenaltyPercent", 0f);
}
}
// Properties for the new queued producer component
public class CompProperties_QueuedInteractiveProducer : CompProperties
{
public List<ProcessDef> processes;
public List<PawnKindDef> whitelist;
public int productionQueueLimit = 1;
public float minNutritionToStart = 0.1f;
// Quality-related properties from CompInteractiveProducer
public float minSafeTemperature = 7f;
public float maxSafeTemperature = 32f;
public float penaltyPerDegreePerTick = 0.00001f;
public List<QualityThreshold> qualityThresholds;
public IntRange spawnCount = new IntRange(1, 1);
public CompProperties_QueuedInteractiveProducer()
{
compClass = typeof(CompQueuedInteractiveProducer);
}
}
// The main component logic
public class CompQueuedInteractiveProducer : ThingComp
{
private List<QueuedProcessOrder> productionOrders = new List<QueuedProcessOrder>();
public ProcessDef selectedProcess; // For passing to the JobDriver
private CompRefuelableNutrition _fuelComp;
private CompAffectedByFacilities _facilitiesComp;
public CompProperties_QueuedInteractiveProducer Props => (CompProperties_QueuedInteractiveProducer)props;
private CompRefuelableNutrition FuelComp => _fuelComp ?? (_fuelComp = parent.GetComp<CompRefuelableNutrition>());
private CompAffectedByFacilities FacilitiesComp => _facilitiesComp ?? (_facilitiesComp = parent.GetComp<CompAffectedByFacilities>());
public override void Initialize(CompProperties props)
{
base.Initialize(props);
_fuelComp = parent.GetComp<CompRefuelableNutrition>();
_facilitiesComp = parent.GetComp<CompAffectedByFacilities>();
}
public override IEnumerable<FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
{
if (Props.whitelist == null || !Props.whitelist.Contains(selPawn.kindDef)) yield break;
if (FuelComp != null && (!FuelComp.HasFuel || FuelComp.NutritionStored < Props.minNutritionToStart))
{
yield return new FloatMenuOption("CannotStartProduction".Translate(), null);
yield break;
}
foreach (var process in Props.processes)
{
if (process.requiredResearch != null && !process.requiredResearch.IsFinished)
{
yield return new FloatMenuOption("StartProduction".Translate(process.thingDef.label) + " (" + "Requires".Translate() + ": " + process.requiredResearch.label + ")", null);
}
else
{
yield return new FloatMenuOption("StartProduction".Translate(process.thingDef.label), () =>
{
this.selectedProcess = process;
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_AddProcessToQueueJob"), parent);
selPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
});
}
}
}
public void AddToQueue()
{
if (selectedProcess == null) return;
productionOrders.Add(new QueuedProcessOrder { process = selectedProcess });
selectedProcess = null;
}
public override void CompTick()
{
base.CompTick();
var producingOrders = productionOrders.Where(o => o.productionUntilTick > 0).ToList();
bool hasFuel = FuelComp?.HasFuel ?? true;
float ambientTemperature = parent.AmbientTemperature;
bool isTempSafe = ambientTemperature >= Props.minSafeTemperature && ambientTemperature <= Props.maxSafeTemperature;
// Update progress and penalties for active orders
foreach(var order in producingOrders)
{
if(hasFuel && isTempSafe)
{
order.ticksUnderOptimalConditions++;
}
if (!isTempSafe)
{
float tempDelta = (ambientTemperature > Props.maxSafeTemperature) ? ambientTemperature - Props.maxSafeTemperature : Props.minSafeTemperature - ambientTemperature;
order.temperaturePenaltyPercent = Mathf.Min(1f, order.temperaturePenaltyPercent + tempDelta * Props.penaltyPerDegreePerTick);
}
if (!hasFuel)
{
order.productionUntilTick++; // Pause production
}
}
// Update fuel consumption
if (FuelComp != null)
{
float totalConsumptionRatePerDay = 0f;
if(hasFuel)
{
foreach (var order in producingOrders)
{
if (order.process.totalNutritionNeeded > 0 && order.process.productionTicks > 0)
{
totalConsumptionRatePerDay += (order.process.totalNutritionNeeded / order.process.productionTicks) * 60000f;
}
}
}
FuelComp.currentConsumptionRate = totalConsumptionRatePerDay;
}
// Finish completed orders
productionOrders.RemoveAll(order =>
{
if (order.productionUntilTick > 0 && Find.TickManager.TicksGame >= order.productionUntilTick)
{
FinishProduction(order);
return true;
}
return false;
});
// Start new orders
int currentlyProducingCount = productionOrders.Count(o => o.productionUntilTick > 0);
if (currentlyProducingCount < Props.productionQueueLimit)
{
var waitingOrder = productionOrders.FirstOrDefault(o => o.productionUntilTick == -1);
if (waitingOrder != null)
{
float speedFactor = 1f + (FacilitiesComp?.GetStatOffset(StatDef.Named("ARA_IncubationSpeedFactor")) ?? 0f);
int modifiedDelay = (int)(waitingOrder.process.productionTicks / speedFactor);
waitingOrder.productionUntilTick = Find.TickManager.TicksGame + modifiedDelay;
}
}
}
private (QualityCategory quality, float baseScore, float penalty) GetEstimatedQualityDetails(QueuedProcessOrder order)
{
if (order == null || Props.qualityThresholds.NullOrEmpty())
{
return (QualityCategory.Normal, 0f, 0f);
}
float progress = (order.process.productionTicks > 0) ? (float)order.ticksUnderOptimalConditions / order.process.productionTicks : 1f;
float finalQualityPercent = Mathf.Clamp01(progress - order.temperaturePenaltyPercent);
QualityCategory finalQuality = QualityCategory.Awful;
foreach (var threshold in Props.qualityThresholds.OrderByDescending(q => q.threshold))
{
if (finalQualityPercent >= threshold.threshold)
{
finalQuality = threshold.quality;
break;
}
}
return (finalQuality, progress, order.temperaturePenaltyPercent);
}
private void FinishProduction(QueuedProcessOrder order)
{
var qualityDetails = GetEstimatedQualityDetails(order);
QualityCategory finalQuality = qualityDetails.quality;
for (int i = 0; i < Props.spawnCount.RandomInRange; i++)
{
Thing product = ThingMaker.MakeThing(order.process.thingDef);
product.TryGetComp<CompQuality>()?.SetQuality(finalQuality, ArtGenerationContext.Colony);
GenPlace.TryPlaceThing(product, parent.Position, parent.Map, ThingPlaceMode.Near);
}
}
public override string CompInspectStringExtra()
{
StringBuilder sb = new StringBuilder();
int producingCount = productionOrders.Count(o => o.productionUntilTick > 0);
int queuedCount = productionOrders.Count - producingCount;
sb.AppendLine($"生产槽位: {producingCount} / {Props.productionQueueLimit}");
if (queuedCount > 0) sb.AppendLine($"等待队列: {queuedCount}");
if (FacilitiesComp != null)
{
float speedFactor = 1f + FacilitiesComp.GetStatOffset(StatDef.Named("ARA_IncubationSpeedFactor"));
if(speedFactor != 1f) sb.AppendLine($"生产速度: {speedFactor.ToStringPercent()}");
}
var producingNow = productionOrders.Where(o => o.productionUntilTick > 0).OrderBy(o => o.productionUntilTick);
if (producingNow.Any())
{
sb.AppendLine("正在生产:");
foreach (var order in producingNow)
{
int remainingTicks = order.productionUntilTick - Find.TickManager.TicksGame;
var qualityDetails = GetEstimatedQualityDetails(order);
sb.AppendLine($" - {order.process.thingDef.LabelCap}: {remainingTicks.ToStringTicksToPeriod(true, false, true, true)} (品质: {qualityDetails.quality.GetLabel()})");
}
}
// 添加温度信息
string tempStr = "CurrentTemperature".Translate(parent.AmbientTemperature.ToStringTemperature("F0"));
tempStr += $" ({"SafeTemperatureRange".Translate()}: {Props.minSafeTemperature.ToStringTemperature("F0")} ~ {Props.maxSafeTemperature.ToStringTemperature("F0")})";
sb.AppendLine(tempStr);
return sb.ToString().TrimEnd();
}
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Collections.Look(ref productionOrders, "productionOrders", LookMode.Deep);
Scribe_Deep.Look(ref selectedProcess, "selectedProcess");
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
foreach (Gizmo gizmo in base.CompGetGizmosExtra())
{
yield return gizmo;
}
if (productionOrders.Any())
{
var lastOrder = productionOrders.Last();
yield return new Command_Action
{
defaultLabel = "CommandCancelProduction".Translate() + ": " + lastOrder.process.thingDef.LabelCap,
defaultDesc = "CommandCancelProductionDesc".Translate(),
icon = ContentFinder<Texture2D>.Get("UI/Designators/Cancel"),
action = () =>
{
productionOrders.Remove(lastOrder);
}
};
}
}
}
}

View File

@@ -10,37 +10,32 @@ namespace ArachnaeSwarm
public CompProperties_RefuelableNutrition()
{
compClass = typeof(CompRefuelableNutrition);
// 默认启用这些Gizmo除非在XML中明确设置为false
this.targetFuelLevelConfigurable = true;
this.showAllowAutoRefuelToggle = true;
}
}
[StaticConstructorOnStartup]
public class CompRefuelableNutrition : CompRefuelable
{
private static readonly Texture2D FuelIcon = ContentFinder<Texture2D>.Get("UI/Icons/ThingCategories/FoodMeals");
// This rate is controlled externally, e.g., by a producer comp. Units: nutrition per day.
public float currentConsumptionRate = 0f;
public float NutritionStored => Fuel;
public new CompProperties_RefuelableNutrition Props => (CompProperties_RefuelableNutrition)props;
public override void CompTick()
{
// Call the base tick for things like vacuum logic, but we will handle fuel consumption ourselves.
// 调用基类的Tick让它处理真空等情况。
// 基类的燃料消耗逻辑将因为 fuelConsumptionRate 为0而无效。
base.CompTick();
// External consumption logic
if (currentConsumptionRate > 0)
// 我们自己的动态消耗逻辑
if (currentConsumptionRate > 0 && HasFuel)
{
// Convert per-day rate to per-tick rate and consume
float consumptionPerTick = currentConsumptionRate / 60000f;
ConsumeFuel(consumptionPerTick);
}
}
// Note: The base class's ConsumeFuel is sufficient.
// public void ConsumeFuel(float amount) { ... }
public new void Refuel(List<Thing> fuelThings)
{
@@ -48,49 +43,52 @@ namespace ArachnaeSwarm
if (fuelNeeded < 0.001f) return;
float totalNutritionGained = 0;
List<Thing> thingsToProcess = new List<Thing>(fuelThings);
var thingsToProcess = new List<Thing>(fuelThings);
foreach (var thing in thingsToProcess)
{
if (fuelNeeded <= 0) break;
float nutritionPerUnit = thing.GetStatValue(StatDefOf.Nutrition);
if (nutritionPerUnit <= 0) continue;
int numToTake = Mathf.CeilToInt(fuelNeeded / nutritionPerUnit);
numToTake = Mathf.Min(numToTake, thing.stackCount);
float nutritionFromThis = numToTake * nutritionPerUnit;
base.Refuel(nutritionFromThis);
totalNutritionGained += nutritionFromThis;
thing.SplitOff(numToTake).Destroy();
fuelNeeded = TargetFuelLevel - Fuel;
}
if (totalNutritionGained > 0 && Props.fuelGizmoLabel != null)
{
// Removed PawnUtility.ShouldSendNotificationAbout check as it requires a Pawn.
Messages.Message("MessageRefueled".Translate(parent.LabelShort, totalNutritionGained.ToString("0.##"), Props.fuelGizmoLabel), parent, MessageTypeDefOf.PositiveEvent);
}
}
public override string CompInspectStringExtra()
{
// Build the string from scratch to avoid the base class's incorrect time calculation.
string text = Props.FuelLabel + ": " + Fuel.ToStringDecimalIfSmall() + " / " + Props.fuelCapacity.ToStringDecimalIfSmall();
// If we have a custom consumption rate, calculate and display our own time estimate.
if (currentConsumptionRate > 0f && HasFuel)
{
int numTicks = (int)(Fuel / (currentConsumptionRate / 60000f));
text += " (" + numTicks.ToStringTicksToPeriod() + ")";
}
else if (!HasFuel && !Props.outOfFuelMessage.NullOrEmpty())
{
text += "\n" + Props.outOfFuelMessage;
}
if (Props.targetFuelLevelConfigurable)
{
text += "\n" + "ConfiguredTargetFuelLevel".Translate(TargetFuelLevel.ToStringDecimalIfSmall());
}
return text;
}
// Removed CompGetGizmosExtra override because Command_Refuel is a private class in CompRefuelable.
}
}

View File

@@ -10,11 +10,20 @@ namespace ArachnaeSwarm
public List<ThingDef> blacklist;
}
public class ProcessDef
public class ProcessDef : IExposable
{
public ThingDef thingDef;
public int productionTicks;
public float totalNutritionNeeded;
public ResearchProjectDef requiredResearch;
public void ExposeData()
{
Scribe_Defs.Look(ref thingDef, "thingDef");
Scribe_Values.Look(ref productionTicks, "productionTicks", 0);
Scribe_Values.Look(ref totalNutritionNeeded, "totalNutritionNeeded", 0f);
Scribe_Defs.Look(ref requiredResearch, "requiredResearch");
}
}
public class QualityThreshold

View File

@@ -0,0 +1,35 @@
using System.Collections.Generic;
using RimWorld;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class JobDriver_AddProcessToQueue : JobDriver
{
private const TargetIndex BuildingInd = TargetIndex.A;
protected Building Building => (Building)job.GetTarget(BuildingInd).Thing;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(Building, job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
this.FailOnDespawnedNullOrForbidden(BuildingInd);
yield return Toils_Goto.GotoThing(BuildingInd, PathEndMode.InteractionCell);
Toil work = ToilMaker.MakeToil("MakeNewToils");
work.initAction = delegate
{
// Call the new component's method
Building.GetComp<CompQueuedInteractiveProducer>().AddToQueue();
};
work.defaultCompleteMode = ToilCompleteMode.Instant;
yield return work;
}
}
}

View File

@@ -0,0 +1,154 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using Verse;
using RimWorld;
namespace WulaFallenEmpire
{
public class CompCustomUniqueWeapon : CompUniqueWeapon
{
// 使用 'new' 关键字来明确隐藏基类成员,解决 CS0108 警告
public new CompProperties_CustomUniqueWeapon Props => (CompProperties_CustomUniqueWeapon)props;
private List<WeaponTraitDef> customTraits = new List<WeaponTraitDef>();
// 使用 'new' 关键字隐藏基类属性,解决 CS0506 错误
public new List<WeaponTraitDef> TraitsListForReading => customTraits;
// PostExposeData 是 virtual 的,保留 override
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Collections.Look(ref customTraits, "customTraits", LookMode.Def);
if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
if (customTraits == null) customTraits = new List<WeaponTraitDef>();
SetupCustomTraits(fromSave: true);
}
}
// PostPostMake 是 virtual 的,保留 override
public override void PostPostMake()
{
InitializeCustomTraits();
if (parent.TryGetComp<CompQuality>(out var comp))
{
comp.SetQuality(QualityUtility.GenerateQuality(QualityGenerator.Super), ArtGenerationContext.Outsider);
}
}
private void InitializeCustomTraits()
{
if (customTraits == null) customTraits = new List<WeaponTraitDef>();
customTraits.Clear();
if (Props.forcedTraits != null)
{
foreach (var traitToForce in Props.forcedTraits)
{
if (customTraits.All(t => !t.Overlaps(traitToForce)))
{
customTraits.Add(traitToForce);
}
}
}
IntRange traitRange = Props.numTraitsRange ?? new IntRange(1, 3);
int totalTraitsTarget = Mathf.Max(customTraits.Count, traitRange.RandomInRange);
int missingTraits = totalTraitsTarget - customTraits.Count;
if (missingTraits > 0)
{
// CanAddTrait 现在是我们自己的 'new' 方法
IEnumerable<WeaponTraitDef> possibleTraits = DefDatabase<WeaponTraitDef>.AllDefs.Where(CanAddTrait);
for (int i = 0; i < missingTraits; i++)
{
if (!possibleTraits.Any()) break;
var chosenTrait = possibleTraits.RandomElementByWeight(t => t.commonality);
customTraits.Add(chosenTrait);
possibleTraits = possibleTraits.Where(t => t != chosenTrait && !t.Overlaps(chosenTrait));
}
}
SetupCustomTraits(fromSave: false);
}
private void SetupCustomTraits(bool fromSave)
{
foreach (WeaponTraitDef trait in customTraits)
{
if (trait.abilityProps != null && parent.GetComp<CompEquippableAbilityReloadable>() is CompEquippableAbilityReloadable comp)
{
comp.props = trait.abilityProps;
if (!fromSave)
{
comp.Notify_PropsChanged();
}
}
}
}
// 使用 'new' 关键字隐藏基类方法,解决 CS0506 错误
public new bool CanAddTrait(WeaponTraitDef trait)
{
if (customTraits.Any(t => t == trait || t.Overlaps(t)))
return false;
if (Props.weaponCategories != null && Props.weaponCategories.Any() && !Props.weaponCategories.Contains(trait.weaponCategory))
return false;
if (customTraits.Count == 0 && !trait.canGenerateAlone)
return false;
return true;
}
// --- 下面的方法都是 virtual 的,保留 override ---
public override string TransformLabel(string label) => label;
public override Color? ForceColor() => null;
public override float GetStatOffset(StatDef stat) => customTraits.Sum(t => t.statOffsets.GetStatOffsetFromList(stat));
public override float GetStatFactor(StatDef stat) => customTraits.Aggregate(1f, (current, t) => current * t.statFactors.GetStatFactorFromList(stat));
public override string CompInspectStringExtra()
{
if (customTraits.NullOrEmpty()) return null;
return "WeaponTraits".Translate() + ": " + customTraits.Select(t => t.label).ToCommaList().CapitalizeFirst();
}
public override string CompTipStringExtra()
{
if (customTraits.NullOrEmpty()) return base.CompTipStringExtra();
return "WeaponTraits".Translate() + ": " + customTraits.Select(t => t.label).ToCommaList().CapitalizeFirst();
}
public override IEnumerable<StatDrawEntry> SpecialDisplayStats()
{
if (customTraits.NullOrEmpty()) yield break;
var builder = new StringBuilder();
builder.AppendLine("Stat_ThingUniqueWeaponTrait_Desc".Translate());
builder.AppendLine();
for (int i = 0; i < customTraits.Count; i++)
{
WeaponTraitDef trait = customTraits[i];
builder.AppendLine(trait.LabelCap.Colorize(ColorLibrary.Yellow));
builder.AppendLine(trait.description);
if (i < customTraits.Count - 1) builder.AppendLine();
}
yield return new StatDrawEntry(
parent.def.IsMeleeWeapon ? StatCategoryDefOf.Weapon_Melee : StatCategoryDefOf.Weapon_Ranged,
"Stat_ThingUniqueWeaponTrait_Label".Translate(),
customTraits.Select(t => t.label).ToCommaList().CapitalizeFirst(),
builder.ToString(),
1104);
}
}
}

View File

@@ -0,0 +1,21 @@
using System.Collections.Generic;
using Verse;
using RimWorld;
namespace WulaFallenEmpire
{
public class CompProperties_CustomUniqueWeapon : CompProperties_UniqueWeapon
{
// A list of traits that will always be added to the weapon.
public List<WeaponTraitDef> forcedTraits;
// The range of traits to randomly add. If not defined in XML, a default of 1-3 will be used.
public IntRange? numTraitsRange;
public CompProperties_CustomUniqueWeapon()
{
// Point to the implementation of our custom logic.
this.compClass = typeof(CompCustomUniqueWeapon);
}
}
}

View File

@@ -0,0 +1,23 @@
using RimWorld;
using System.Collections.Generic;
using Verse;
namespace ArachnaeSwarm
{
public class HediffCompProperties_GiveHediffsInRangeToRace : HediffCompProperties
{
public float range;
public TargetingParameters targetingParameters;
public HediffDef hediff;
public ThingDef mote;
public bool hideMoteWhenNotDrafted;
public float initialSeverity = 1f;
public bool onlyPawnsInSameFaction = true;
public List<ThingDef> targetRaces; // 新增:可配置的目标种族列表
public HediffCompProperties_GiveHediffsInRangeToRace()
{
compClass = typeof(HediffComp_GiveHediffsInRangeToRace);
}
}
}

View File

@@ -0,0 +1,63 @@
using RimWorld;
using System.Collections.Generic;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
public class HediffComp_GiveHediffsInRangeToRace : HediffComp
{
private Mote mote;
public HediffCompProperties_GiveHediffsInRangeToRace Props => (HediffCompProperties_GiveHediffsInRangeToRace)props;
public override void CompPostTick(ref float severityAdjustment)
{
if (!parent.pawn.Awake() || parent.pawn.health == null || parent.pawn.health.InPainShock || !parent.pawn.Spawned)
{
return;
}
if (!Props.hideMoteWhenNotDrafted || parent.pawn.Drafted)
{
if (Props.mote != null && (mote == null || mote.Destroyed))
{
mote = MoteMaker.MakeAttachedOverlay(parent.pawn, Props.mote, Vector3.zero);
}
if (mote != null)
{
mote.Maintain();
}
}
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))
{
continue;
}
Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediff);
if (hediff == null)
{
hediff = pawn.health.AddHediff(Props.hediff, pawn.health.hediffSet.GetBrain());
hediff.Severity = Props.initialSeverity;
HediffComp_Link hediffComp_Link = hediff.TryGetComp<HediffComp_Link>();
if (hediffComp_Link != null)
{
hediffComp_Link.drawConnection = true;
hediffComp_Link.other = parent.pawn;
}
}
HediffComp_Disappears hediffComp_Disappears = hediff.TryGetComp<HediffComp_Disappears>();
if (hediffComp_Disappears == null)
{
Log.Error("HediffComp_GiveHediffsInRangeToRace has a hediff in props which does not have a HediffComp_Disappears");
}
else
{
hediffComp_Disappears.ticksToDisappear = 5;
}
}
}
}
}

View File

@@ -4,11 +4,10 @@ using System.Linq;
using System.Text;
using Verse;
using Verse.AI;
using UnityEngine;
namespace ArachnaeSwarm
{
// CompProperties: 在XML中配置组件的属性
public class CompProperties_QueuedPawnSpawner : CompProperties
{
public List<QueuedPawnSpawnEntry> spawnablePawns;
@@ -22,38 +21,22 @@ namespace ArachnaeSwarm
}
}
// 主组件类
public class CompQueuedPawnSpawner : ThingComp
{
private List<QueuedProductionOrder> productionOrders = new List<QueuedProductionOrder>();
// 缓存对其他组件的引用以提高性能
public QueuedPawnSpawnEntry selectedEntry;
private CompRefuelableNutrition _fuelComp;
private CompAffectedByFacilities _facilitiesComp;
public CompProperties_QueuedPawnSpawner Props => (CompProperties_QueuedPawnSpawner)props;
private CompRefuelableNutrition FuelComp
{
get
{
if (_fuelComp == null) _fuelComp = parent.GetComp<CompRefuelableNutrition>();
return _fuelComp;
}
}
private CompAffectedByFacilities FacilitiesComp
{
get
{
if (_facilitiesComp == null) _facilitiesComp = parent.GetComp<CompAffectedByFacilities>();
return _facilitiesComp;
}
}
private CompRefuelableNutrition FuelComp => _fuelComp ?? (_fuelComp = parent.GetComp<CompRefuelableNutrition>());
private CompAffectedByFacilities FacilitiesComp => _facilitiesComp ?? (_facilitiesComp = parent.GetComp<CompAffectedByFacilities>());
public override void Initialize(CompProperties props)
{
base.Initialize(props);
// 在初始化时获取一次避免在每次访问时都调用GetComp
_fuelComp = parent.GetComp<CompRefuelableNutrition>();
_facilitiesComp = parent.GetComp<CompAffectedByFacilities>();
}
@@ -64,39 +47,37 @@ namespace ArachnaeSwarm
if (FuelComp != null && (!FuelComp.HasFuel || FuelComp.NutritionStored < Props.minNutritionToStart))
{
yield return new FloatMenuOption("CannotStartProduction".Translate() + ": " + "NoFuel".Translate(), null);
yield return new FloatMenuOption("CannotStartProduction".Translate(), null);
yield break;
}
foreach (QueuedPawnSpawnEntry entry in Props.spawnablePawns)
foreach (var entry in Props.spawnablePawns)
{
if (entry.pawnKind == null) continue;
if (entry.requiredResearch != null && !entry.requiredResearch.IsFinished)
{
string disabledText = "ARA_Incubate".Translate(entry.pawnKind.label) + " (" + "Requires".Translate() + ": " + entry.requiredResearch.label + ")";
yield return new FloatMenuOption(disabledText, null);
yield return new FloatMenuOption("ARA_Incubate".Translate(entry.pawnKind.label) + " (" + "Requires".Translate() + ": " + entry.requiredResearch.label + ")", null);
}
else
{
string label = "ARA_Incubate".Translate(entry.pawnKind.label);
if (entry.totalNutritionNeeded > 0)
yield return new FloatMenuOption("ARA_Incubate".Translate(entry.pawnKind.label), () =>
{
label += $" ({"NutritionNeeded".Translate()}: {entry.totalNutritionNeeded.ToString("0.0")})";
}
yield return new FloatMenuOption(label, () => AddToQueue(entry, selPawn));
this.selectedEntry = entry;
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_AddToQueueJob"), parent);
selPawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
});
}
}
}
private void AddToQueue(QueuedPawnSpawnEntry entry, Pawn selPawn)
public void AddToQueue()
{
productionOrders.Add(new QueuedProductionOrder { entry = entry });
// 给交互的Pawn一个反馈表示订单已接受
if (selPawn.jobs?.curJob != null)
if (selectedEntry == null)
{
selPawn.jobs.EndCurrentJob(JobCondition.Succeeded);
Log.Error("Tried to add to queue but selectedEntry was null.");
return;
}
productionOrders.Add(new QueuedProductionOrder { entry = selectedEntry });
selectedEntry = null;
}
public override void CompTick()
@@ -106,7 +87,6 @@ namespace ArachnaeSwarm
var producingOrders = productionOrders.Where(o => o.spawnUntilTick > 0).ToList();
bool hasFuel = FuelComp?.HasFuel ?? true;
// 处理无燃料情况:仅暂停生产
if (!hasFuel && FuelComp != null && producingOrders.Any())
{
foreach (var order in producingOrders)
@@ -115,11 +95,9 @@ namespace ArachnaeSwarm
}
}
// 动态计算总燃料消耗速率
if (FuelComp != null)
{
float totalConsumptionRatePerDay = 0f;
// 只计算有燃料时正在生产的订单
if(hasFuel)
{
foreach (var order in producingOrders)
@@ -133,7 +111,6 @@ namespace ArachnaeSwarm
FuelComp.currentConsumptionRate = totalConsumptionRatePerDay;
}
// 检查并完成订单
productionOrders.RemoveAll(order =>
{
if (order.spawnUntilTick > 0 && Find.TickManager.TicksGame >= order.spawnUntilTick)
@@ -145,11 +122,10 @@ namespace ArachnaeSwarm
return false;
});
// 检查并启动新订单
int currentlyProducingCount = productionOrders.Count(o => o.spawnUntilTick > 0);
if (currentlyProducingCount < Props.productionQueueLimit)
{
QueuedProductionOrder waitingOrder = productionOrders.FirstOrDefault(o => o.spawnUntilTick == -1);
var waitingOrder = productionOrders.FirstOrDefault(o => o.spawnUntilTick == -1);
if (waitingOrder != null)
{
float speedFactor = 1f;
@@ -166,8 +142,7 @@ namespace ArachnaeSwarm
public override string CompInspectStringExtra()
{
StringBuilder sb = new StringBuilder();
if (FuelComp != null) sb.AppendLine(FuelComp.CompInspectStringExtra());
int producingCount = productionOrders.Count(o => o.spawnUntilTick > 0);
int queuedCount = productionOrders.Count - producingCount;
@@ -198,6 +173,31 @@ namespace ArachnaeSwarm
{
base.PostExposeData();
Scribe_Collections.Look(ref productionOrders, "productionOrders", LookMode.Deep, new object[0]);
Scribe_Deep.Look(ref selectedEntry, "selectedEntry");
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
foreach (Gizmo gizmo in base.CompGetGizmosExtra())
{
yield return gizmo;
}
if (productionOrders.Any())
{
var lastOrder = productionOrders.Last();
yield return new Command_Action
{
defaultLabel = "CommandCancelProduction".Translate() + ": " + lastOrder.entry.pawnKind.LabelCap,
defaultDesc = "CommandCancelProductionDesc".Translate(),
icon = ContentFinder<Texture2D>.Get("UI/Designators/Cancel"),
action = () =>
{
productionOrders.Remove(lastOrder);
}
};
}
}
}
}

View File

@@ -4,6 +4,7 @@ using Verse;
using RimWorld;
using Verse.AI;
using Verse.AI.Group;
using UnityEngine; // Add this for ContentFinder
namespace ArachnaeSwarm
{
@@ -13,7 +14,8 @@ namespace ArachnaeSwarm
private int spawnUntilTick = -1;
private PawnKindDef spawningPawnKind;
private PawnSpawnEntry selectedEntry;
// This component uses its own PawnSpawnEntry, separate from the Queued spawner
private PawnSpawnEntry selectedEntry;
public bool IsHatching => spawnUntilTick > 0;
public override IEnumerable<FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
@@ -34,20 +36,17 @@ namespace ArachnaeSwarm
{
if (entry.pawnKind == null) continue;
// 检查科技需求
if (entry.requiredResearch != null && !entry.requiredResearch.IsFinished)
{
// 科技未完成,显示灰色不可点击选项
string disabledText = "ARA_Incubate".Translate(entry.pawnKind.label) + " (" + "Requires".Translate() + ": " + entry.requiredResearch.label + ")";
yield return new FloatMenuOption(disabledText, null);
}
else
{
// 科技已完成或无需求,显示正常选项
yield return new FloatMenuOption("ARA_Incubate".Translate(entry.pawnKind.label), () =>
{
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_IncubateJob"), parent);
this.selectedEntry = entry; // 保存整个入口信息
this.selectedEntry = entry;
selPawn.jobs.TryTakeOrderedJob(job);
});
}
@@ -55,7 +54,6 @@ namespace ArachnaeSwarm
}
}
public void StartIncubation()
{
if (this.selectedEntry == null) return;
@@ -73,8 +71,6 @@ namespace ArachnaeSwarm
}
}
private void SpawnPawn(PawnKindDef pawnKind)
{
try
@@ -138,7 +134,6 @@ namespace ArachnaeSwarm
}
}
public override string CompInspectStringExtra()
{
if (spawnUntilTick > 0)
@@ -161,7 +156,31 @@ namespace ArachnaeSwarm
base.PostExposeData();
Scribe_Values.Look(ref spawnUntilTick, "spawnUntilTick", -1);
Scribe_Defs.Look(ref spawningPawnKind, "spawningPawnKind");
// selectedEntry is transient and does not need to be saved.
// selectedEntry is not saved because the interaction is a one-off action.
}
// Moved to the correct position, at the class level.
public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
foreach (var g in base.CompGetGizmosExtra())
{
yield return g;
}
if (IsHatching)
{
yield return new Command_Action
{
defaultLabel = "CommandCancelProduction".Translate(),
defaultDesc = "CommandCancelProductionDesc".Translate(),
icon = ContentFinder<Texture2D>.Get("UI/Designators/Cancel"),
action = () =>
{
spawnUntilTick = -1;
spawningPawnKind = null;
}
};
}
}
}
}

View File

@@ -0,0 +1,35 @@
using System.Collections.Generic;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class JobDriver_AddToQueue : JobDriver
{
private const TargetIndex IncubatorInd = TargetIndex.A;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(job.GetTarget(IncubatorInd), job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
this.FailOnDespawnedNullOrForbidden(IncubatorInd);
yield return Toils_Goto.GotoThing(IncubatorInd, PathEndMode.Touch);
Toil addToQueue = new Toil();
addToQueue.initAction = () =>
{
CompQueuedPawnSpawner comp = job.GetTarget(IncubatorInd).Thing.TryGetComp<CompQueuedPawnSpawner>();
if (comp != null)
{
comp.AddToQueue();
}
};
addToQueue.defaultCompleteMode = ToilCompleteMode.Instant;
yield return addToQueue;
}
}
}

View File

@@ -0,0 +1,85 @@
using RimWorld;
using Verse;
using Verse.Sound;
using System.Collections.Generic;
using System.Linq;
namespace ArachnaeSwarm
{
public class CompAbilityEffect_DRM_Deaddustpop : CompAbilityEffect
{
public new CompProperties_AbilityDRM_Deaddustpop Props
{
get
{
return (CompProperties_AbilityDRM_Deaddustpop)this.props;
}
}
private Pawn Pawn
{
get
{
return this.parent.pawn;
}
}
private List<IntVec3> AffectedCells(LocalTargetInfo target)
{
return GenRadial.RadialCellsAround(target.Cell, Props.smokeRadius, true).ToList();
}
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
GenExplosion.DoExplosion(
center: target.Cell,
map: this.parent.pawn.MapHeld,
radius: this.Props.smokeRadius,
damType: this.Props.damageDef,
instigator: null,
damAmount: this.Props.damageAmount,
armorPenetration: this.Props.armorPenetration,
// 明确命名关键参数,避免顺序错误
postExplosionSpawnThingDef: this.Props.postExplosionSpawnThingDef,
postExplosionSpawnChance: this.Props.postExplosionSpawnChance,
postExplosionSpawnThingCount: this.Props.postExplosionSpawnThingCount,
postExplosionGasType: this.Props.gasType,
// 需要补充的参数(根据实际需求填写)
flammabilityChanceCurve: null,
overrideCells: this.AffectedCells(target), // 明确传递实际需要的值
postExplosionSpawnSingleThingDef: null,
preExplosionSpawnSingleThingDef: null
);
}
public override void DrawEffectPreview(LocalTargetInfo target)
{
GenDraw.DrawRadiusRing(target.Cell, this.Props.smokeRadius);
}
}
public class CompProperties_AbilityDRM_Deaddustpop : CompProperties_AbilityEffect
{
public CompProperties_AbilityDRM_Deaddustpop()
{
this.compClass = typeof(CompAbilityEffect_DRM_Deaddustpop);
}
public float smokeRadius;
public SoundDef explosionSound;
public GasType gasType;
public DamageDef damageDef;
public float postExplosionSpawnChance = 0f;
public int postExplosionSpawnThingCount = 1;
public ThingDef postExplosionSpawnThingDef = null;
public int damageAmount = -1;
public float armorPenetration = -1f;
}
}

View File

@@ -68,11 +68,16 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ARA_CustomUniqueWeapon\CompCustomUniqueWeapon.cs" />
<Compile Include="ARA_CustomUniqueWeapon\CompProperties_CustomUniqueWeapon.cs" />
<Compile Include="ARA_GiveHediffsInRangeToRace\HediffCompProperties_GiveHediffsInRangeToRace.cs" />
<Compile Include="ARA_GiveHediffsInRangeToRace\HediffComp_GiveHediffsInRangeToRace.cs" />
<Compile Include="ARA_SpawnPawnFromList\CompProperties_SpawnPawnFromList.cs" />
<Compile Include="ARA_SpawnPawnFromList\CompSpawnPawnFromList.cs" />
<Compile Include="ARA_SpawnPawnFromList\JobDriver_Incubate.cs" />
<Compile Include="ARA_SpawnPawnFromList\CompQueuedPawnSpawner.cs" />
<Compile Include="ARA_SpawnPawnFromList\ProductionContracts.cs" />
<Compile Include="ARA_SpawnPawnFromList\JobDriver_AddToQueue.cs" />
<Compile Include="ARA_QueenAbility\CompProperties_AbilitySprayLiquidMulti.cs" />
<Compile Include="ARA_QueenAbility\CompAbilityEffect_SprayLiquidMulti.cs" />
<Compile Include="DRM_HediffCurseFlame\Hediff_CurseFlame.cs" />
@@ -87,6 +92,18 @@
<Compile Include="ARA_HiveMind\CompAbilityEffect_BindDrone.cs" />
<Compile Include="ARA_HiveMind\CompProperties_AbilityBindDrone.cs" />
<Compile Include="ARA_SpawnPawnFromList\JobGiver_MaintainBuildings.cs" />
<Compile Include="Verb\CompCleave.cs" />
<Compile Include="Verb\CompMultiStrike.cs" />
<Compile Include="Verb\VerbPropertiesExplosiveBeam.cs" />
<Compile Include="Verb\VerbProperties_Excalibur.cs" />
<Compile Include="Verb\VerbProperties_WeaponStealBeam.cs" />
<Compile Include="Verb\Verb_MeleeAttack_Cleave.cs" />
<Compile Include="Verb\Verb_MeleeAttack_MultiStrike.cs" />
<Compile Include="Verb\Verb_ShootArc.cs" />
<Compile Include="Verb\Verb_ShootBeamExplosive.cs" />
<Compile Include="Verb\Verb_ShootMeltBeam.cs" />
<Compile Include="Verb\Verb_ShootShotgun.cs" />
<Compile Include="Verb\Verb_ShootWeaponStealBeam.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="ARA_CompHediffGiver\CompHediffGiver.cs" />
@@ -107,9 +124,9 @@
<Compile Include="ARA_BuildingTerrainSpawn\CompDelayedTerrainSpawn.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="WULA_AutoMechCarrier\CompAutoMechCarrier.cs" />
<Compile Include="WULA_AutoMechCarrier\CompProperties_AutoMechCarrier.cs" />
<Compile Include="WULA_AutoMechCarrier\PawnProductionEntry.cs" />
<Compile Include="ARA_AutoMechCarrier\CompAutoMechCarrier.cs" />
<Compile Include="ARA_AutoMechCarrier\CompProperties_AutoMechCarrier.cs" />
<Compile Include="ARA_AutoMechCarrier\PawnProductionEntry.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="ARA_CompInteractiveProducer\CompInteractiveProducer.cs" />
@@ -117,6 +134,8 @@
<Compile Include="ARA_CompInteractiveProducer\CompRefuelableNutrition.cs" />
<Compile Include="ARA_CompInteractiveProducer\DataContracts.cs" />
<Compile Include="ARA_CompInteractiveProducer\CompTemperatureRuinableDamage.cs" />
<Compile Include="ARA_CompInteractiveProducer\CompQueuedInteractiveProducer.cs" />
<Compile Include="ARA_CompInteractiveProducer\JobDriver_AddProcessToQueue.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="ARA_HuggingFace\Hediff_Possession.cs" />
@@ -134,12 +153,44 @@
</ItemGroup>
<ItemGroup>
<Compile Include="HediffComp_Temperature.cs" />
<Compile Include="CompPawnFlight.cs" />
<Compile Include="CompProperties_PawnFlight.cs" />
<Compile Include="HarmonyPatches.cs" />
<Compile Include="OPToxicGas.cs" />
<Compile Include="PawnRenderNodeWorker_AttachmentBody_NoFlight.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="CompAbilityEffect_LaunchMultiProjectile.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Abilities\CompAbilityEffect_TrackingCharge.cs" />
<Compile Include="Abilities\CompProperties_TrackingCharge.cs" />
<Compile Include="Abilities\PawnFlyer_TrackingCharge.cs" />
<Compile Include="Abilities\Verb_CastAbilityTrackingCharge.cs" />
<Compile Include="Abilities\CompAbilityEffect_DRM_Deaddustpop.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="HediffComp_SpawnPawnOnRemoved.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Projectiles\BulletWithTrail.cs" />
<Compile Include="Projectiles\ExplosiveTrackingBulletDef.cs" />
<Compile Include="Projectiles\Projectile_ConfigurableHellsphereCannon.cs" />
<Compile Include="Projectiles\Projectile_CruiseMissile.cs" />
<Compile Include="Projectiles\Projectile_ExplosiveTrackingBullet.cs" />
<Compile Include="Projectiles\Projectile_ExplosiveWithTrail.cs" />
<Compile Include="Projectiles\Projectile_TrackingBullet.cs" />
<Compile Include="Projectiles\Projectile_WulaPenetratingBeam.cs" />
<Compile Include="Projectiles\Projectile_WulaPenetratingBullet.cs" />
<Compile Include="Projectiles\TrackingBulletDef.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="HediffComp_NecroticTransformation.cs" />
<Compile Include="Hediff_NecroticVirus_Configurable.cs" />
<Compile Include="NecroticTransformationUtility.cs" />
<Compile Include="ProphecyGearEffect.cs" />
<Compile Include="Hediff_ConfigurableMutant.cs" />
<Compile Include="HediffComp_Symbiosis.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- 自定义清理任务删除obj文件夹中的临时文件 -->

View File

@@ -0,0 +1,44 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityLaunchMultiProjectile : CompProperties_AbilityLaunchProjectile
{
public int numProjectiles = 1;
public CompProperties_AbilityLaunchMultiProjectile()
{
compClass = typeof(CompAbilityEffect_LaunchMultiProjectile);
}
}
public class CompAbilityEffect_LaunchMultiProjectile : CompAbilityEffect
{
public new CompProperties_AbilityLaunchMultiProjectile Props => (CompProperties_AbilityLaunchMultiProjectile)props;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
for (int i = 0; i < Props.numProjectiles; i++)
{
LaunchProjectile(target);
}
}
private void LaunchProjectile(LocalTargetInfo target)
{
if (Props.projectileDef != null)
{
Pawn pawn = parent.pawn;
Projectile projectile = (Projectile)GenSpawn.Spawn(Props.projectileDef, pawn.Position, pawn.Map);
projectile.Launch(pawn, pawn.DrawPos, target, target, ProjectileHitFlags.IntendedTarget, parent.verb.preventFriendlyFire);
}
}
public override bool AICanTargetNow(LocalTargetInfo target)
{
return target.Pawn != null;
}
}
}

View File

@@ -0,0 +1,14 @@
using Verse;
namespace ArachnaeSwarm
{
/// <summary>
/// A marker component that holds custom flight properties.
/// The actual flight logic is handled by Harmony patches that check for this component
/// and use its properties to override or trigger vanilla flight behavior.
/// </summary>
public class CompPawnFlight : ThingComp
{
public CompProperties_PawnFlight Props => (CompProperties_PawnFlight)props;
}
}

View File

@@ -0,0 +1,49 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public enum FlightCondition
{
Drafted
}
public class CompProperties_PawnFlight : CompProperties
{
// --- Custom Flight Logic ---
public FlightCondition flightCondition = FlightCondition.Drafted;
// --- Vanilla PawnKindDef Flight Parameters ---
[NoTranslate]
public string flyingAnimationFramePathPrefix;
[NoTranslate]
public string flyingAnimationFramePathPrefixFemale;
public int flyingAnimationFrameCount;
public int flyingAnimationTicksPerFrame = -1;
public float flyingAnimationDrawSize = 1f;
public bool flyingAnimationDrawSizeIsMultiplier;
public bool flyingAnimationInheritColors;
// --- Vanilla PawnKindLifeStage Flight Parameters ---
// Note: These are normally defined per lifestage, we define them once here for simplicity.
// The harmony patch will need to inject these into the correct lifestage at runtime.
public AnimationDef flyingAnimationEast;
public AnimationDef flyingAnimationNorth;
public AnimationDef flyingAnimationSouth;
public AnimationDef flyingAnimationEastFemale;
public AnimationDef flyingAnimationNorthFemale;
public AnimationDef flyingAnimationSouthFemale;
public CompProperties_PawnFlight()
{
compClass = typeof(CompPawnFlight);
}
}
}

View File

@@ -0,0 +1,81 @@
using HarmonyLib;
using Verse;
using RimWorld;
using Verse.AI;
namespace ArachnaeSwarm
{
[HarmonyPatch]
public static class FlightHarmonyPatches
{
// Corrected Patch 1: The method signature now correctly matches the static target method.
[HarmonyPrefix]
[HarmonyPatch(typeof(Pawn_FlightTracker), "GetBestFlyAnimation")]
public static bool GetBestFlyAnimation_Prefix(Pawn pawn, ref AnimationDef __result) // Correct parameters: Pawn pawn, not __instance and ___pawn
{
var flightComp = pawn?.TryGetComp<CompPawnFlight>();
if (flightComp == null) // No props check needed, as the crash was due to wrong signature
{
return true;
}
var compProps = flightComp.Props;
AnimationDef selectedAnim = null;
if (pawn.gender == Gender.Female && compProps.flyingAnimationNorthFemale != null)
{
switch (pawn.Rotation.AsInt)
{
case 0: selectedAnim = compProps.flyingAnimationNorthFemale; break;
case 1: selectedAnim = compProps.flyingAnimationEastFemale; break;
case 2: selectedAnim = compProps.flyingAnimationSouthFemale; break;
case 3: selectedAnim = compProps.flyingAnimationEastFemale ?? compProps.flyingAnimationEast; break;
}
}
else
{
switch (pawn.Rotation.AsInt)
{
case 0: selectedAnim = compProps.flyingAnimationNorth; break;
case 1: selectedAnim = compProps.flyingAnimationEast; break;
case 2: selectedAnim = compProps.flyingAnimationSouth; break;
case 3: selectedAnim = compProps.flyingAnimationEast; break;
}
}
if (selectedAnim != null)
{
__result = selectedAnim;
return false;
}
return true;
}
// Patch 2 remains correct as Notify_JobStarted is a non-static method.
[HarmonyPrefix]
[HarmonyPatch(typeof(Pawn_FlightTracker), "Notify_JobStarted")]
public static bool Notify_JobStarted_Prefix(Job job, Pawn_FlightTracker __instance, Pawn ___pawn)
{
var flightComp = ___pawn?.TryGetComp<CompPawnFlight>();
if (flightComp == null || __instance == null || !__instance.CanEverFly || ___pawn == null || ___pawn.Dead)
{
return true;
}
var compProps = flightComp.Props;
bool shouldBeFlying = (compProps.flightCondition == FlightCondition.Drafted && ___pawn.Drafted);
if (shouldBeFlying)
{
if (!__instance.Flying) __instance.StartFlying();
job.flying = true;
}
else
{
if (__instance.Flying) __instance.ForceLand();
job.flying = false;
}
return false;
}
}
}

View File

@@ -0,0 +1,31 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
/// <summary>
/// XML配置类用于在HediffDef的comp中指定转化后的MutantDef
/// </summary>
public class HediffCompProperties_NecroticTransformation : HediffCompProperties
{
// 在XML中需要指定的MutantDef的defName
public MutantDef mutantDef;
// 在XML中配置触发转变所需的严重性阈值
public float triggerSeverity = 0.7f;
public HediffCompProperties_NecroticTransformation()
{
compClass = typeof(HediffComp_NecroticTransformation);
}
}
/// <summary>
/// HediffComp用于在运行时存储和提供由XML定义的MutantDef
/// </summary>
public class HediffComp_NecroticTransformation : HediffComp
{
// 属性用于方便地从Comp中获取配置
public HediffCompProperties_NecroticTransformation Props => (HediffCompProperties_NecroticTransformation)props;
}
}

View File

@@ -0,0 +1,104 @@
using RimWorld;
using Verse;
using System.Collections.Generic;
using System.Linq;
namespace ArachnaeSwarm
{
/// <summary>
/// Defines the properties for HediffComp_SpawnPawnOnRemoved.
/// You must specify the pawnKindDef to spawn.
/// </summary>
public class HediffCompProperties_SpawnPawnOnRemoved : HediffCompProperties
{
public List<PawnKindDef> pawnKindDefs; // 更改为列表
public int spawnCount = 1; // 新增生成数量
public float? fixedBiologicalAge; // 新增用于XML配置的固定生物年龄
public FloatRange? biologicalAgeRange; // 新增用于XML配置的生物年龄范围
public HediffCompProperties_SpawnPawnOnRemoved()
{
this.compClass = typeof(HediffComp_SpawnPawnOnRemoved);
}
}
/// <summary>
/// Spawns a specified pawn when the parent hediff is removed.
/// The pawn's faction is determined by the hediff's instigator.
/// </summary>
public class HediffComp_SpawnPawnOnRemoved : HediffComp
{
// This field will store the faction of the original attacker.
private Faction casterFaction;
public HediffCompProperties_SpawnPawnOnRemoved Props => (HediffCompProperties_SpawnPawnOnRemoved)this.props;
/// <summary>
/// Called after the hediff is added. We use this to capture the instigator's faction.
/// </summary>
public override void CompPostPostAdd(DamageInfo? dinfo)
{
base.CompPostPostAdd(dinfo);
if (dinfo.HasValue && dinfo.Value.Instigator != null)
{
this.casterFaction = dinfo.Value.Instigator.Faction;
}
}
/// <summary>
/// Called when the hediff is removed. This is where we spawn the pawn.
/// </summary>
public override void CompPostPostRemoved()
{
base.CompPostPostRemoved();
if (this.Pawn == null || this.Pawn.Map == null || Props.pawnKindDefs.NullOrEmpty())
{
Log.Warning("ArachnaeSwarm: HediffComp_SpawnPawnOnRemoved tried to spawn a pawn but required data was missing (Pawn, Map, or pawnKindDefs).");
return;
}
Map map = this.Pawn.Map;
IntVec3 loc = this.Pawn.Position;
// If casterFaction is null, default to the player's faction
if (this.casterFaction == null)
{
this.casterFaction = Faction.OfPlayer;
}
for (int i = 0; i < Props.spawnCount; i++)
{
PawnKindDef selectedPawnKindDef = Props.pawnKindDefs.RandomElement();
Pawn newPawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(
kind: selectedPawnKindDef,
faction: this.casterFaction, // Use the stored faction
context: PawnGenerationContext.NonPlayer,
tile: -1,
forceGenerateNewPawn: true,
fixedBiologicalAge: Props.fixedBiologicalAge, // 使用XML配置的固定生物年龄
biologicalAgeRange: Props.biologicalAgeRange // 使用XML配置的生物年龄范围
));
if (newPawn != null)
{
GenSpawn.Spawn(newPawn, loc, map, WipeMode.Vanish);
}
else
{
Log.Error($"ArachnaeSwarm: Failed to generate pawn of kind {selectedPawnKindDef.defName}.");
}
}
}
/// <summary>
/// Ensures the casterFaction is saved and loaded with the game.
/// </summary>
public override void CompExposeData()
{
base.CompExposeData();
Scribe_References.Look(ref this.casterFaction, "casterFaction");
}
}
}

View File

@@ -0,0 +1,61 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
/// <summary>
/// XML配置类定义共生关系
/// </summary>
public class HediffCompProperties_Symbiosis : HediffCompProperties
{
// 实现共存所需的Hediff
public HediffDef requiredHediff;
// 共存状态下的最大严重性
public float newMaxSeverity = 0.9f;
public HediffCompProperties_Symbiosis()
{
compClass = typeof(HediffComp_Symbiosis);
}
}
/// <summary>
/// HediffComp实现共生逻辑
/// </summary>
public class HediffComp_Symbiosis : HediffComp
{
private HediffCompProperties_Symbiosis Props => (HediffCompProperties_Symbiosis)props;
// 重写CompPostTick它会在游戏每一帧在计算完严重性增量之后应用增量之前被调用
public override void CompPostTick(ref float severityAdjustment)
{
base.CompPostTick(ref severityAdjustment);
// 检查宿主Pawn是否存在以及配置是否完整
if (this.Pawn == null || Props.requiredHediff == null)
{
return;
}
// 检查Pawn是否拥有“共存”所需的Hediff
if (this.Pawn.health.hediffSet.HasHediff(Props.requiredHediff))
{
// 如果当前严重性已经达到或超过上限
if (this.parent.Severity >= Props.newMaxSeverity)
{
// 将当前严重性强制拉回到上限
this.parent.Severity = Props.newMaxSeverity;
// 并且阻止任何将要发生的严重性增加将增量设为0
severityAdjustment = 0;
}
// 如果当前严重性加上即将发生的增量会超过上限
else if (this.parent.Severity + severityAdjustment > Props.newMaxSeverity)
{
// 重新计算增量,使其恰好达到上限
severityAdjustment = Props.newMaxSeverity - this.parent.Severity;
}
}
}
}
}

View File

@@ -0,0 +1,373 @@
using System.Collections.Generic;
using RimWorld;
using UnityEngine;
using Verse;
using Verse.AI;
using Verse.AI.Group;
using Verse.Sound;
namespace ArachnaeSwarm
{
public class HediffCompProperties_ConfigurableMutant : HediffCompProperties
{
// --- 可配置的Hediff ---
public HediffDef risingHediff;
public HediffDef corpseHediff;
// --- 可配置的时间和范围 ---
public FloatRange resurrectionSecondsRange = new FloatRange(5f, 10f);
public FloatRange stunSecondsRange = new FloatRange(1f, 3f);
public FloatRange alertSecondsRange = new FloatRange(0.5f, 3f);
public IntRange selfRaiseHoursRange = new IntRange(3, 4);
public IntRange checkForTargetTicksInterval = new IntRange(900, 1800);
// --- 可配置的杂项值 ---
public float particleSpawnMTBSeconds = 1f;
public float extinguishFireMTB = 45f;
public float bioferriteOnDeathChance = 0.04f;
public int bioferriteAmountOnDeath = 10;
public HediffCompProperties_ConfigurableMutant()
{
this.compClass = typeof(HediffComp_ConfigurableMutant);
}
}
public class HediffComp_ConfigurableMutant : HediffComp
{
public HediffCompProperties_ConfigurableMutant Props => (HediffCompProperties_ConfigurableMutant)this.props;
}
public class Hediff_ConfigurableMutant : HediffWithComps
{
// 运行时状态字段,保持不变
public float headRotation;
private float resurrectTimer;
private float selfRaiseTimer;
private float alertTimer;
private int nextTargetCheckTick = -99999;
private Thing alertedTarget;
private Effecter riseEffecter;
private Sustainer riseSustainer;
private float corpseDamagePct = 1f;
private HediffComp_ConfigurableMutant PropsComp => this.TryGetComp<HediffComp_ConfigurableMutant>();
public bool IsRising => PropsComp?.Props.risingHediff != null && pawn.health.hediffSet.HasHediff(PropsComp.Props.risingHediff);
public override void PostMake()
{
base.PostMake();
headRotation = Rand.RangeSeeded(-20f, 20f, pawn.thingIDNumber);
if (!pawn.Dead)
{
pawn.timesRaisedAsShambler++;
}
}
public override void PostAdd(DamageInfo? dinfo)
{
if (!ModLister.CheckAnomaly("Shambler"))
{
pawn.health.RemoveHediff(this);
}
else
{
base.PostAdd(dinfo);
}
}
public override void Notify_Spawned()
{
base.Notify_Spawned();
pawn.Map.mapPawns.RegisterShambler(pawn);
}
public override void TickInterval(int delta)
{
base.TickInterval(delta);
var compProps = PropsComp?.Props;
if (compProps == null) return; // 如果没有Comp则不执行任何操作
if (IsRising)
{
if ((float)Find.TickManager.TicksGame > resurrectTimer)
{
FinishRising();
}
if (!pawn.Spawned) return;
if ((float)Find.TickManager.TicksGame > resurrectTimer - 15f)
{
riseSustainer?.End();
}
else if (IsRising)
{
if (riseSustainer == null || riseSustainer.Ended)
{
riseSustainer = SoundDefOf.Pawn_Shambler_Rise.TrySpawnSustainer(SoundInfo.InMap(pawn, MaintenanceType.PerTick));
}
if (riseEffecter == null)
{
riseEffecter = EffecterDefOf.ShamblerRaise.Spawn(pawn, pawn.Map);
}
if (pawn.Drawer.renderer.CurAnimation != AnimationDefOf.ShamblerRise)
{
pawn.Drawer.renderer.SetAnimation(AnimationDefOf.ShamblerRise);
}
riseSustainer.Maintain();
riseEffecter.EffectTick(pawn, TargetInfo.Invalid);
}
return;
}
if (Rand.MTBEventOccurs(compProps.particleSpawnMTBSeconds, 60f, 1f))
{
FleckMaker.ThrowShamblerParticles(pawn);
}
if (pawn.IsBurning() && !pawn.Downed && Rand.MTBEventOccurs(compProps.extinguishFireMTB, 60f, 1f))
{
((Fire)pawn.GetAttachment(ThingDefOf.Fire))?.Destroy();
pawn.records.Increment(RecordDefOf.FiresExtinguished);
}
if (pawn.Spawned && pawn.mutant != null && !pawn.mutant.IsPassive && !pawn.Drafted)
{
if (Find.TickManager.TicksGame > nextTargetCheckTick)
{
nextTargetCheckTick = Find.TickManager.TicksGame + compProps.checkForTargetTicksInterval.RandomInRange;
Thing thing = MutantUtility.FindShamblerTarget(pawn);
if (thing != null)
{
Notify_DelayedAlert(thing);
MutantUtility.ActivateNearbyShamblers(pawn, thing);
}
}
if (alertedTarget != null && (float)Find.TickManager.TicksGame > alertTimer)
{
pawn.mindState.enemyTarget = alertedTarget;
pawn.mindState.lastEngageTargetTick = Find.TickManager.TicksGame; // 直接给public字段赋值绕过internal方法
alertedTarget = null;
if (DebugViewSettings.drawShamblerAlertMote)
{
MoteMaker.MakeColonistActionOverlay(pawn, ThingDefOf.Mote_ShamblerAlert);
}
SoundDefOf.Pawn_Shambler_Alert.PlayOneShot(pawn);
}
}
if (ShouldSelfRaise())
{
StartRising();
}
}
private bool ShouldSelfRaise()
{
if (pawn.DevelopmentalStage == DevelopmentalStage.Baby) return false;
return pawn.Downed && pawn.CarriedBy == null && (float)Find.TickManager.TicksGame > selfRaiseTimer;
}
public void StartRising(int lifespanTicks = -1)
{
var compProps = PropsComp?.Props;
if (compProps?.risingHediff == null)
{
Log.Error($"[ConfigurableMutant] risingHediff is not defined in XML for {this.def.defName}");
return;
}
if (!pawn.Dead && !pawn.Downed)
{
Log.Error("Tried to raise non dead/downed pawn as shambler");
if(pawn.mutant != null) pawn.mutant.Turn(clearLord: true);
return;
}
MutantUtility.RestoreBodyParts(pawn);
pawn.Notify_DisabledWorkTypesChanged();
if (!pawn.Dead || ResurrectionUtility.TryResurrect(pawn, new ResurrectionParams { noLord = true, restoreMissingParts = false, removeDiedThoughts = false }))
{
pawn.jobs?.EndCurrentJob(JobCondition.InterruptForced);
resurrectTimer = Find.TickManager.TicksGame + compProps.resurrectionSecondsRange.RandomInRange.SecondsToTicks();
pawn.health.AddHediff(compProps.risingHediff);
}
}
private void CancelRising()
{
var risingHediff = PropsComp?.Props.risingHediff;
if (risingHediff == null) return;
riseSustainer?.End();
resurrectTimer = -99999f;
if (pawn.health.hediffSet.TryGetHediff(risingHediff, out var hediff))
{
pawn.health.RemoveHediff(hediff);
}
if (!pawn.Dead)
{
pawn.Kill(null, null);
}
}
private void FinishRising(bool stun = true)
{
var compProps = PropsComp?.Props;
if (compProps?.risingHediff != null && pawn.health.hediffSet.TryGetHediff(compProps.risingHediff, out var hediff))
{
pawn.health.RemoveHediff(hediff);
}
if (pawn.ParentHolder is Pawn_CarryTracker pawn_CarryTracker)
{
pawn_CarryTracker.TryDropCarriedThing(pawn_CarryTracker.pawn.Position, ThingPlaceMode.Near, out var _);
pawn_CarryTracker.pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
}
if (pawn.mutant != null && !pawn.mutant.HasTurned)
{
pawn.mutant.Turn();
}
pawn.timesRaisedAsShambler++;
MutantUtility.RestoreUntilNotDowned(pawn);
if (pawn.Spawned && stun)
{
pawn.Rotation = Rot4.South;
if(compProps != null)
pawn.stances.stunner.StunFor(compProps.stunSecondsRange.RandomInRange.SecondsToTicks(), pawn, addBattleLog: false, showMote: false);
}
pawn.Drawer.renderer.SetAnimation(null);
StartSelfRaiseTimer();
}
private void StartSelfRaiseTimer()
{
var selfRaiseHoursRange = PropsComp?.Props.selfRaiseHoursRange ?? new IntRange(3, 4);
selfRaiseTimer = Find.TickManager.TicksGame + 2500 * selfRaiseHoursRange.RandomInRange;
}
public override void Notify_PawnPostApplyDamage(DamageInfo dinfo, float totalDamageDealt)
{
base.Notify_PawnPostApplyDamage(dinfo, totalDamageDealt);
if (dinfo.Instigator != null && pawn.HostileTo(dinfo.Instigator))
{
if (pawn.Spawned && dinfo.Instigator is IAttackTarget && dinfo.Instigator.Spawned && pawn.CanSee(dinfo.Instigator))
{
pawn.mindState.enemyTarget = dinfo.Instigator;
pawn.mindState.lastEngageTargetTick = Find.TickManager.TicksGame; // 直接给public字段赋值绕过internal方法
pawn.jobs.EndCurrentJob(JobCondition.InterruptOptional);
pawn.GetLord()?.Notify_PawnAcquiredTarget(pawn, dinfo.Instigator);
}
MutantUtility.ActivateNearbyShamblers(pawn, dinfo.Instigator);
}
}
public void Notify_DelayedAlert(Thing target)
{
var alertSecondsRange = PropsComp?.Props.alertSecondsRange ?? new FloatRange(0.5f, 3f);
if (pawn.mutant != null && !pawn.mutant.IsPassive && !pawn.Drafted && pawn.mindState.enemyTarget == null)
{
alertTimer = Find.TickManager.TicksGame + alertSecondsRange.RandomInRange.SecondsToTicks();
alertedTarget = target;
pawn.GetLord()?.Notify_PawnAcquiredTarget(pawn, target);
}
}
public override void Notify_Downed()
{
StartSelfRaiseTimer();
}
public override void Notify_PawnKilled()
{
corpseDamagePct = pawn.health.summaryHealth.SummaryHealthPercent;
base.Notify_PawnKilled();
}
public override void Notify_PawnDied(DamageInfo? dinfo, Hediff culprit = null)
{
if (IsRising)
{
CancelRising();
}
var compProps = PropsComp?.Props;
if (compProps != null && pawn.timesRaisedAsShambler == 1 && Rand.Chance(compProps.bioferriteOnDeathChance) && pawn.SpawnedOrAnyParentSpawned)
{
Thing thing = ThingMaker.MakeThing(ThingDefOf.Bioferrite);
thing.stackCount = compProps.bioferriteAmountOnDeath;
GenPlace.TryPlaceThing(thing, pawn.PositionHeld, pawn.MapHeld, ThingPlaceMode.Near, out var lastResultingThing);
lastResultingThing.SetForbidden(value: true);
}
if (pawn.Corpse != null)
{
pawn.Corpse.HitPoints = Mathf.Max(Mathf.RoundToInt((float)pawn.Corpse.MaxHitPoints * corpseDamagePct), 10);
}
if (compProps?.corpseHediff != null)
{
pawn.health.AddHediff(compProps.corpseHediff);
}
base.Notify_PawnDied(dinfo, culprit);
}
public override void PreRemoved()
{
pawn.MapHeld?.mapPawns.DeregisterShambler(pawn);
base.PreRemoved();
}
public override void PostRemoved()
{
base.PostRemoved();
if (pawn.Dead) return;
if (IsRising) CancelRising();
if (pawn.IsMutant)
{
if (pawn.mutant.HasTurned) pawn.mutant.Revert();
else pawn.mutant = null;
}
}
public override IEnumerable<Gizmo> GetGizmos()
{
foreach (Gizmo gizmo in base.GetGizmos())
{
yield return gizmo;
}
if (DebugSettings.ShowDevGizmos && pawn.Downed && !IsRising)
{
var command_Action = new Command_Action
{
defaultLabel = "Self Raise",
action = () => StartRising()
};
yield return command_Action;
}
}
public override string GetInspectString()
{
if (ShouldSelfRaise()) return "ShamblerRegenerating".Translate();
if (IsRising) return "ShamblerRising".Translate();
if (pawn.CurJobDef == JobDefOf.Wait_Wander || pawn.CurJobDef == JobDefOf.Wait_MaintainPosture) return "ShamblerStanding".Translate();
if (pawn.CurJobDef == JobDefOf.GotoWander || pawn.CurJobDef == JobDefOf.Goto) return "ShamblerShuffling".Translate();
return "";
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref alertTimer, "alertTimer", 0f);
Scribe_Values.Look(ref nextTargetCheckTick, "nextTargetCheckTick", 0);
Scribe_References.Look(ref alertedTarget, "alertedTarget");
Scribe_Values.Look(ref resurrectTimer, "resurrectTimer", 0f);
Scribe_Values.Look(ref selfRaiseTimer, "selfRaiseTimer", 0f);
Scribe_Values.Look(ref headRotation, "headRotation", 0f);
}
}
}

View File

@@ -0,0 +1,128 @@
using RimWorld;
using Verse;
using UnityEngine;
using System.Linq;
namespace ArachnaeSwarm
{
public class Hediff_NecroticVirus : HediffWithComps
{
private const int EffectInterval = 600;
// 属性来获取我们的自定义Comp
private HediffComp_NecroticTransformation PropsComp => this.TryGetComp<HediffComp_NecroticTransformation>();
public override void Notify_PawnDied(DamageInfo? dinfo, Hediff culprit = null)
{
base.Notify_PawnDied(dinfo, culprit);
TransformToMutant();
}
public override void PostTick()
{
base.PostTick();
if (pawn.IsHashIntervalTick(EffectInterval) && pawn.Spawned)
{
ShowVirusEffects();
}
}
private void TransformToMutant()
{
var comp = PropsComp;
if (comp == null || comp.Props.mutantDef == null)
{
Log.Error($"[NecroticVirus] HediffComp_NecroticTransformation or its mutantDef is not configured in XML for {this.def.defName}.");
return;
}
// 检查严重性是否达到XML中配置的阈值
if (this.Severity < comp.Props.triggerSeverity)
{
return;
}
try
{
if (pawn.Corpse == null || pawn.Corpse.Destroyed)
{
return;
}
Map map = pawn.Corpse.Map;
IntVec3 position = pawn.Corpse.Position;
// 使用我们自己的、更安全的检查方法
if (!NecroticTransformationUtility.CanResurrect(pawn.Corpse))
{
Log.Warning($"[NecroticVirus] Pawn {pawn.LabelShort} does not meet conditions for resurrection.");
return;
}
Faction faction = GetHostileFaction();
// **调用我们自己的工具方法传入从XML获取的mutantDef**
NecroticTransformationUtility.ResurrectAsCustomMutant(pawn, comp.Props.mutantDef, faction);
// **关键修复在成功转化后立即移除导致转化的Hediff本身防止其残留**
pawn.health.RemoveHediff(this);
// 添加转化特效
FleckMaker.ThrowSmoke(position.ToVector3Shifted(), map, 1.5f);
FleckMaker.ThrowDustPuff(position.ToVector3Shifted(), map, 1.2f);
// 发送转化消息
if (PawnUtility.ShouldSendNotificationAbout(pawn))
{
Messages.Message(
"NecroticVirus_TransformationMessage".Translate(pawn.LabelShortCap, pawn.LabelShortCap),
new LookTargets(position, map),
MessageTypeDefOf.NegativeEvent
);
}
}
catch (System.Exception ex)
{
Log.Error($"[NecroticVirus] Error during transformation: {ex}");
}
}
private Faction GetHostileFaction()
{
if (pawn.Faction != null && pawn.Faction.HostileTo(Faction.OfPlayer))
{
return pawn.Faction;
}
Faction entitiesFaction = Find.FactionManager.AllFactions.FirstOrDefault(f => f.def.defName == "Entities");
if (entitiesFaction != null && !entitiesFaction.defeated)
{
return entitiesFaction;
}
return Find.FactionManager.RandomEnemyFaction(allowNonHumanlike: true, allowHidden: false, allowDefeated: false);
}
private void ShowVirusEffects()
{
if (pawn == null || !pawn.Spawned) return;
Vector3 pos = pawn.DrawPos;
Map map = pawn.Map;
float sizeMultiplier = 1f;
if (CurStageIndex == 1) sizeMultiplier = 1.2f;
if (CurStageIndex == 2) sizeMultiplier = 1.5f;
FleckMaker.ThrowMicroSparks(pos, map);
FleckMaker.ThrowDustPuff(pos, map, 0.8f * sizeMultiplier);
}
public override string TipStringExtra
{
get
{
return base.TipStringExtra + "\n" + "NecroticVirus_EffectTip".Translate();
}
}
}
}

View File

@@ -0,0 +1,83 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public static class NecroticTransformationUtility
{
/// <summary>
/// 检查一个尸体是否可以被我们的逻辑转化为变异体。
/// 这是对原版 MutantUtility.CanResurrectAsShambler 的复制,但移除了对 canBecomeShambler 的检查。
/// </summary>
public static bool CanResurrect(Corpse corpse, bool ignoreIndoors = false)
{
// 只保留最核心、最必要的检查,移除所有可能导致不稳定的条件
if (corpse?.InnerPawn == null) return false;
if (!corpse.InnerPawn.RaceProps.IsFlesh) return false;
return true;
}
/// <summary>
/// 将一个Pawn复活为指定的自定义变异体.
/// 这个方法是模仿原版 MutantUtility.ResurrectAsShambler,
/// 但允许传入一个自定义的 MutantDef.
/// </summary>
public static void ResurrectAsCustomMutant(Pawn pawn, MutantDef mutantDef, Faction faction = null, int lifespanTicks = -1)
{
if (pawn?.Corpse == null || mutantDef == null)
{
return;
}
RotStage rotStage = pawn.Corpse.GetRotStage();
// 创建并附加Pawn_MutantTracker使用我们从XML传入的mutantDef
pawn.mutant = new Pawn_MutantTracker(pawn, mutantDef, rotStage);
// **调用原版健康再生方法此方法会读取MutantDef中的配置如removeAllInjuries并执行**
MutantUtility.RegenerateHealth(pawn);
// 添加变异体核心Hediff
Hediff hediff = pawn.health.AddHediff(mutantDef.hediff);
// 如果是我们自己的可配置变异体Hediff则调用其上升动画
if (hediff is Hediff_ConfigurableMutant configurableMutant)
{
configurableMutant.StartRising(lifespanTicks);
}
// 设置生命周期
var disappearsComp = hediff.TryGetComp<HediffComp_DisappearsAndKills>();
if (disappearsComp != null)
{
if (lifespanTicks > 0)
{
disappearsComp.disappearsAfterTicks = lifespanTicks;
disappearsComp.ticksToDisappear = lifespanTicks;
}
else
{
disappearsComp.disabled = true;
}
}
// 如果没有提供派系,则尝试使用变异体定义的默认派系
if (faction == null && mutantDef.defaultFaction != null)
{
faction = Find.FactionManager.FirstFactionOfDef(mutantDef.defaultFaction);
}
// 设置派系
if (faction != null && pawn.Faction != faction)
{
pawn.SetFaction(faction);
}
// 移除 pawn.mutant.Turn(clearLord: true);
// Turn() 方法应该由 Hediff_Shambler.FinishRising() 在复活过程的最后阶段调用,
// 而不应该由我们在这里手动调用。
// Hediff_Shambler 的 StartRising() 会启动这个流程。
}
}
}

View File

@@ -0,0 +1,187 @@
using RimWorld;
using System.Collections.Generic;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
public class OPToxicGas : Gas
{
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
base.SpawnSetup(map, true);
this.destroyTick = Find.TickManager.TicksGame + this.def.gas.expireSeconds.RandomInRange.SecondsToTicks();
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look<int>(ref this.destroyTick, "destroyTick", 0, false);
}
protected override void Tick()
{
bool flag = this.destroyTick <= Find.TickManager.TicksGame;
if (flag)
{
this.Destroy(DestroyMode.Vanish);
}
this.graphicRotation += this.graphicRotationSpeed;
bool flag2 = !base.Destroyed && Find.TickManager.TicksGame % OPToxicDefGetValue.OPToxicGetSevUpVal(this.def) == 0;
if (flag2)
{
Map map = base.Map;
IntVec3 position = base.Position;
List<Thing> thingList = position.GetThingList(map);
bool flag3 = thingList.Count > 0;
if (flag3)
{
for (int i = 0; i < thingList.Count; i++)
{
bool flag4 = thingList[i] is Pawn && !(thingList[i] as Pawn).RaceProps.IsMechanoid && thingList[i].Position == position;
if (flag4)
{
this.DoOPToxicGas(this, thingList[i]);
}
}
}
}
}
public void DoOPToxicGas(Thing Gas, Thing targ)
{
Pawn pawn = targ as Pawn;
bool flag = pawn != null && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Breathing);
if (flag)
{
HediffDef namedSilentFail = DefDatabase<HediffDef>.GetNamedSilentFail(OPToxicDefGetValue.OPToxicGetHediff(Gas.def));
bool flag2 = namedSilentFail != null;
if (flag2)
{
Pawn_HealthTracker health = pawn.health;
bool flag3 = health == null;
Hediff hediff;
if (flag3)
{
hediff = null;
}
else
{
HediffSet hediffSet = health.hediffSet;
hediff = ((hediffSet != null) ? hediffSet.GetFirstHediffOfDef(namedSilentFail, false) : null);
}
float num = 1f - pawn.GetStatValue(StatDefOf.ToxicResistance, true, -1);
float num2 = OPToxicDefGetValue.OPToxicGetSev(Gas.def);
bool flag4 = num2 < 0.01f;
if (flag4)
{
num2 = 0.01f;
}
float num3 = Rand.Range(0.01f * num, num2 * num);
bool flag5 = hediff != null && num3 > 0f;
if (flag5)
{
hediff.Severity += num3;
}
else
{
Hediff hediff2 = HediffMaker.MakeHediff(namedSilentFail, pawn, null);
hediff2.Severity = num3;
pawn.health.AddHediff(hediff2, null, null, null);
}
}
}
}
}
public class OPToxicDefGetValue
{
public static string OPToxicGetHediff(ThingDef thingdef)
{
bool flag = thingdef.HasModExtension<OPToxicDefs>();
string result;
if (flag)
{
result = thingdef.GetModExtension<OPToxicDefs>().OPToxicHediff;
}
else
{
result = null;
}
return result;
}
public static float OPToxicGetSev(ThingDef thingdef)
{
bool flag = thingdef.HasModExtension<OPToxicDefs>();
float result;
if (flag)
{
result = thingdef.GetModExtension<OPToxicDefs>().OPToxicSeverity;
}
else
{
result = 0f;
}
return result;
}
public static int OPToxicGetSevUpVal(ThingDef thingdef)
{
bool flag = thingdef.HasModExtension<OPToxicDefs>();
int result;
if (flag)
{
result = thingdef.GetModExtension<OPToxicDefs>().OPSevUpTickPeriod;
}
else
{
result = 120;
}
return result;
}
}
public class OPToxicDefs : DefModExtension
{
public string OPToxicHediff;
public float OPToxicSeverity;
public int OPSevUpTickPeriod = 120;
}
public class DamageWorker_OPToxic : DamageWorker
{
public override void ExplosionStart(Explosion explosion, List<IntVec3> cellsToAffect)
{
bool flag = this.def.explosionHeatEnergyPerCell > float.Epsilon;
if (flag)
{
GenTemperature.PushHeat(explosion.Position, explosion.Map, this.def.explosionHeatEnergyPerCell * (float)cellsToAffect.Count);
}
FleckMaker.Static(explosion.Position, explosion.Map, FleckDefOf.ExplosionFlash, explosion.radius * 6f);
FleckMaker.Static(explosion.Position, explosion.Map, FleckDefOf.ExplosionFlash, explosion.radius * 6f);
this.ExplosionVisualEffectCenter(explosion);
}
public override DamageWorker.DamageResult Apply(DamageInfo dinfo, Thing victim)
{
DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult();
bool flag = victim.def.category == ThingCategory.Pawn && victim.def.useHitPoints && dinfo.Def.harmsHealth;
if (flag)
{
float amount = dinfo.Amount;
damageResult.totalDamageDealt = (float)Mathf.Min(victim.HitPoints, GenMath.RoundRandom(amount));
victim.HitPoints -= Mathf.RoundToInt(damageResult.totalDamageDealt);
bool flag2 = victim.HitPoints <= 0;
if (flag2)
{
victim.HitPoints = 0;
victim.Kill(new DamageInfo?(dinfo), null);
}
}
return damageResult;
}
}
}

View File

@@ -0,0 +1,22 @@
using Verse;
using UnityEngine;
namespace ArachnaeSwarm
{
public class PawnRenderNodeWorker_AttachmentBody_NoFlight : PawnRenderNodeWorker_AttachmentBody
{
public override bool CanDrawNow(PawnRenderNode node, PawnDrawParms parms)
{
if (parms.pawn.Flying)
{
return false;
}
return base.CanDrawNow(node, parms);
}
public override Vector3 ScaleFor(PawnRenderNode node, PawnDrawParms parms)
{
return base.ScaleFor(node, parms);
}
}
}

View File

@@ -0,0 +1,98 @@
using System.Collections.Generic;
using System.Reflection;
using RimWorld;
using UnityEngine;
using Verse;
using Verse.AI;
using Verse.Sound;
namespace ArachnaeSwarm
{
public class BulletWithTrail : Bullet
{
private TrackingBulletDef trackingDefInt;
private int Fleck_MakeFleckTick;
private Vector3 lastTickPosition;
public TrackingBulletDef TrackingDef
{
get
{
if (trackingDefInt == null)
{
trackingDefInt = def.GetModExtension<TrackingBulletDef>();
if (trackingDefInt == null)
{
Log.ErrorOnce($"TrackingBulletDef for {this.def.defName} is null. Creating a default instance.", this.thingIDNumber ^ 0x12345678);
this.trackingDefInt = new TrackingBulletDef();
}
}
return trackingDefInt;
}
}
public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null)
{
base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef);
lastTickPosition = origin;
}
protected override void Tick()
{
base.Tick();
// 处理拖尾特效
if (TrackingDef != null && TrackingDef.tailFleckDef != null)
{
Fleck_MakeFleckTick++;
if (Fleck_MakeFleckTick >= TrackingDef.fleckDelayTicks)
{
if (Fleck_MakeFleckTick >= (TrackingDef.fleckDelayTicks + TrackingDef.fleckMakeFleckTickMax))
{
Fleck_MakeFleckTick = TrackingDef.fleckDelayTicks;
}
Map map = base.Map;
int randomInRange = TrackingDef.fleckMakeFleckNum.RandomInRange;
Vector3 currentPosition = base.ExactPosition;
Vector3 previousPosition = lastTickPosition;
for (int i = 0; i < randomInRange; i++)
{
float num = (currentPosition - previousPosition).AngleFlat();
float velocityAngle = TrackingDef.fleckAngle.RandomInRange + num;
float randomInRange2 = TrackingDef.fleckScale.RandomInRange;
float randomInRange3 = TrackingDef.fleckSpeed.RandomInRange;
FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, TrackingDef.tailFleckDef, randomInRange2);
dataStatic.rotation = (currentPosition - previousPosition).AngleFlat();
dataStatic.rotationRate = TrackingDef.fleckRotation.RandomInRange;
dataStatic.velocityAngle = velocityAngle;
dataStatic.velocitySpeed = randomInRange3;
map.flecks.CreateFleck(dataStatic);
}
}
}
lastTickPosition = base.ExactPosition;
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref Fleck_MakeFleckTick, "Fleck_MakeFleckTick", 0);
Scribe_Values.Look(ref lastTickPosition, "lastTickPosition", Vector3.zero);
if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
if (this.trackingDefInt == null)
{
this.trackingDefInt = this.def.GetModExtension<TrackingBulletDef>();
if (this.trackingDefInt == null)
{
Log.ErrorOnce($"TrackingBulletDef is null for projectile {this.def.defName} after PostLoadInit. Creating a default instance.", this.thingIDNumber ^ 0x12345678);
this.trackingDefInt = new TrackingBulletDef();
}
}
}
}
}
}

View File

@@ -0,0 +1,29 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public class ExplosiveTrackingBulletDef : DefModExtension
{
public float explosionRadius = 1.9f;
public DamageDef damageDef;
public int explosionDelay = 0;
public SoundDef soundExplode;
public FleckDef preExplosionFlash;
public ThingDef postExplosionSpawnThingDef;
public float postExplosionSpawnChance = 0f;
public int postExplosionSpawnThingCount = 1;
public GasType? gasType; // 修改为可空类型
public ThingDef postExplosionSpawnThingDefWater; // 新增
public ThingDef preExplosionSpawnThingDef; // 新增
public float preExplosionSpawnChance = 0f; // 新增
public int preExplosionSpawnThingCount = 0; // 新增
public float screenShakeFactor = 1f; // 新增
public bool applyDamageToExplosionCellsNeighbors = false;
public bool doExplosionDamageAfterThingDestroyed = false;
public float preExplosionSpawnMinMeleeThreat = -1f;
public float explosionChanceToStartFire = 0f; // 从bool改为float并设置默认值
public bool explosionDamageFalloff = false;
public bool doExplosionVFX = true;
}
}

View File

@@ -0,0 +1,93 @@
using Verse;
using RimWorld;
using System.Collections.Generic;
namespace ArachnaeSwarm
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XML<4D><4C> <projectile> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
/// </summary>
public class ProjectileProperties_ConfigurableHellsphereCannon : ProjectileProperties
{
// --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> explosionChanceToStartFire ---
// ʹ<><CAB9> 'new' <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ֶ<EFBFBD>
public new float explosionRadius = 4.9f;
public new float explosionChanceToStartFire = 0f; // <--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>XML<4D><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public new bool applyDamageToExplosionCellsNeighbors = false;
public new ThingDef preExplosionSpawnThingDef = null;
public new float preExplosionSpawnChance = 0f;
public new int preExplosionSpawnThingCount = 1;
public new ThingDef postExplosionSpawnThingDef = null;
public new float postExplosionSpawnChance = 0f;
public new int postExplosionSpawnThingCount = 1;
public new GasType? postExplosionGasType = null;
public new float screenShakeFactor = 1f;
public new ThingDef postExplosionSpawnThingDefWater = null;
public new ThingDef postExplosionSpawnSingleThingDef = null;
public new ThingDef preExplosionSpawnSingleThingDef = null;
// <20><>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD>Ҫ 'new' <20>ؼ<EFBFBD><D8BC><EFBFBD>
public SoundDef explosionSound = null;
public bool damageFalloff = false;
public bool doVisualEffects = true;
public bool doSoundEffects = true;
public float? postExplosionGasRadiusOverride = null;
public int postExplosionGasAmount = 255;
public float? direction = null;
public FloatRange? affectedAngle = null;
public float excludeRadius = 0f;
public SimpleCurve flammabilityChanceCurve = null;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><E0A3AC>XML<4D>е<EFBFBD> <thingClass> ָ<><D6B8><EFBFBD><EFBFBD>
/// </summary>
public class Projectile_ConfigurableHellsphereCannon : Projectile
{
public ProjectileProperties_ConfigurableHellsphereCannon Props => (ProjectileProperties_ConfigurableHellsphereCannon)def.projectile;
protected override void Impact(Thing hitThing, bool blockedByShield = false)
{
Map map = base.Map;
base.Impact(hitThing, blockedByShield);
GenExplosion.DoExplosion(
center: base.Position,
map: map,
radius: Props.explosionRadius,
damType: base.DamageDef,
instigator: launcher,
damAmount: DamageAmount,
armorPenetration: ArmorPenetration,
explosionSound: Props.explosionSound,
weapon: equipmentDef,
projectile: def,
intendedTarget: intendedTarget.Thing,
postExplosionSpawnThingDef: Props.postExplosionSpawnThingDef,
postExplosionSpawnChance: Props.postExplosionSpawnChance,
postExplosionSpawnThingCount: Props.postExplosionSpawnThingCount,
postExplosionGasType: Props.postExplosionGasType,
postExplosionGasRadiusOverride: Props.postExplosionGasRadiusOverride,
postExplosionGasAmount: Props.postExplosionGasAmount,
applyDamageToExplosionCellsNeighbors: Props.applyDamageToExplosionCellsNeighbors,
preExplosionSpawnThingDef: Props.preExplosionSpawnThingDef,
preExplosionSpawnChance: Props.preExplosionSpawnChance,
preExplosionSpawnThingCount: Props.preExplosionSpawnThingCount,
// --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ֶ<EFBFBD> ---
chanceToStartFire: Props.explosionChanceToStartFire, // <--- <20><><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>
damageFalloff: Props.damageFalloff,
direction: Props.direction,
affectedAngle: Props.affectedAngle,
doVisualEffects: Props.doVisualEffects,
propagationSpeed: base.DamageDef.expolosionPropagationSpeed,
excludeRadius: Props.excludeRadius,
doSoundEffects: Props.doSoundEffects,
postExplosionSpawnThingDefWater: Props.postExplosionSpawnThingDefWater,
screenShakeFactor: Props.screenShakeFactor,
flammabilityChanceCurve: Props.flammabilityChanceCurve,
postExplosionSpawnSingleThingDef: Props.postExplosionSpawnSingleThingDef,
preExplosionSpawnSingleThingDef: Props.preExplosionSpawnSingleThingDef
);
}
}
}

View File

@@ -0,0 +1,194 @@
using RimWorld;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
public class CruiseMissileProperties : DefModExtension
{
public DamageDef customDamageDef;
public int customDamageAmount = 5;
public float customExplosionRadius = 1.1f;
public SoundDef customSoundExplode;
public bool useSubExplosions = true;
public int subExplosionCount = 3;
public float subExplosionRadius = 1.9f;
public int subExplosionDamage = 30;
public float subExplosionSpread = 6f;
public DamageDef subDamageDef;
public SoundDef subSoundExplode;
// 新增的弹道配置参数
public float bezierArcHeightFactor = 0.05f; // 贝塞尔曲线高度因子
public float bezierMinArcHeight = 2f; // 贝塞尔曲线最小高度
public float bezierMaxArcHeight = 6f; // 贝塞尔曲线最大高度
public float bezierHorizontalOffsetFactor = 0.1f; // 贝塞尔曲线水平偏移因子
public float bezierSideOffsetFactor = 0.2f; // 贝塞尔曲线侧向偏移因子
public float bezierRandomOffsetScale = 0.5f; // 贝塞尔曲线随机偏移缩放
}
public class Projectile_CruiseMissile : Projectile_Explosive
{
private CruiseMissileProperties settings;
private bool flag2;
private Vector3 Randdd;
private Vector3 position2;
public Vector3 ExPos;
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
base.SpawnSetup(map, respawningAfterLoad);
settings = def.GetModExtension<CruiseMissileProperties>() ?? new CruiseMissileProperties();
}
private void RandFactor()
{
// 调整随机范围用于控制C形弹道的随机偏移
Randdd = new Vector3(
Rand.Range(-settings.bezierRandomOffsetScale, settings.bezierRandomOffsetScale), // X轴的随机偏移
Rand.Range(0f, 0f), // Y轴高度不进行随机保持平稳
Rand.Range(-settings.bezierRandomOffsetScale, settings.bezierRandomOffsetScale) // Z轴的随机偏移
);
flag2 = true;
}
public Vector3 BPos(float t)
{
if (!flag2) RandFactor();
// 计算水平距离
float horizontalDistance = Vector3.Distance(new Vector3(origin.x, 0, origin.z),
new Vector3(destination.x, 0, destination.z));
// 动态调整控制点高度使其更扁平使用XML配置的高度因子
float arcHeight = Mathf.Clamp(horizontalDistance * settings.bezierArcHeightFactor, settings.bezierMinArcHeight, settings.bezierMaxArcHeight);
// 计算从起点到终点的方向向量
Vector3 direction = (destination - origin).normalized;
// 计算垂直于方向向量的水平向量用于侧向偏移确保C形弯曲方向一致
Vector3 perpendicularDirection = Vector3.Cross(direction, Vector3.up).normalized;
// 调整控制点以形成扁平 C 形使用XML配置的偏移因子
// P1: 在起点附近,向前偏移,向上偏移,并向一侧偏移
Vector3 p1 = origin + direction * horizontalDistance * settings.bezierHorizontalOffsetFactor + Vector3.up * arcHeight + perpendicularDirection * horizontalDistance * settings.bezierSideOffsetFactor + Randdd;
// P2: 在终点附近,向后偏移,向上偏移,并向同一侧偏移
Vector3 p2 = destination - direction * horizontalDistance * settings.bezierHorizontalOffsetFactor + Vector3.up * arcHeight + perpendicularDirection * horizontalDistance * settings.bezierSideOffsetFactor + Randdd;
return BezierCurve(origin, p1, p2, destination, t);
}
private Vector3 BezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
{
float u = 1 - t;
return u * u * u * p0
+ 3 * u * u * t * p1
+ 3 * u * t * t * p2
+ t * t * t * p3;
}
private IEnumerable<IntVec3> GetValidCells(Map map)
{
if (map == null || settings == null) yield break;
var cells = GenRadial.RadialCellsAround(
base.Position,
settings.subExplosionSpread,
false
).Where(c => c.InBounds(map));
var randomizedCells = cells.InRandomOrder().Take(settings.subExplosionCount);
foreach (var cell in randomizedCells)
{
yield return cell;
}
}
protected override void Impact(Thing hitThing, bool blockedByShield = false)
{
var map = base.Map;
base.Impact(hitThing, blockedByShield);
DoExplosion(
base.Position,
map,
settings.customExplosionRadius,
settings.customDamageDef,
settings.customDamageAmount,
settings.customSoundExplode
);
if (settings.useSubExplosions)
{
foreach (var cell in GetValidCells(map))
{
DoExplosion(
cell,
map,
settings.subExplosionRadius,
settings.subDamageDef,
settings.subExplosionDamage,
settings.subSoundExplode
);
}
}
}
private void DoExplosion(IntVec3 pos, Map map, float radius, DamageDef dmgDef, int dmgAmount, SoundDef sound)
{
GenExplosion.DoExplosion(
pos,
map,
radius,
dmgDef,
launcher,
dmgAmount,
ArmorPenetration,
sound
);
}
protected override void DrawAt(Vector3 position, bool flip = false)
{
position2 = BPos(DistanceCoveredFraction - 0.01f);
ExPos = position = BPos(DistanceCoveredFraction);
base.DrawAt(position, flip);
}
protected override void Tick()
{
if (intendedTarget.Thing is Pawn pawn && pawn.Spawned && !pawn.Destroyed)
{
if ((pawn.Dead || pawn.Downed) && DistanceCoveredFraction < 0.6f)
{
FindNextTarget(pawn.DrawPos);
}
destination = pawn.DrawPos;
}
base.Tick();
}
private void FindNextTarget(Vector3 center)
{
var map = base.Map;
if (map == null) return;
foreach (IntVec3 cell in GenRadial.RadialCellsAround(IntVec3.FromVector3(center), 7f, true))
{
if (!cell.InBounds(map)) continue;
Pawn target = cell.GetFirstPawn(map);
if (target != null && target.Faction.HostileTo(launcher?.Faction))
{
intendedTarget = target;
return;
}
}
intendedTarget = CellRect.CenteredOn(IntVec3.FromVector3(center), 7).RandomCell;
}
}
}

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