43 Commits

Author SHA1 Message Date
ProjectKoi-Kalo\Kalo
c43bc0f0bb 暂存 2025-09-07 18:41:35 +08:00
ProjectKoi-Kalo\Kalo
b954781675 暂存 2025-09-07 18:26:43 +08:00
ProjectKoi-Kalo\Kalo
acfc078f91 暂存 2025-09-07 18:10:03 +08:00
ProjectKoi-Kalo\Kalo
b28594c604 暂存 2025-09-07 17:27:06 +08:00
ProjectKoi-Kalo\Kalo
7a6d5380e1 暂存 2025-09-07 17:11:53 +08:00
ProjectKoi-Kalo\Kalo
b6f9e6193a 暂存1 2025-09-07 16:49:34 +08:00
ProjectKoi-Kalo\Kalo
6e53b19e20 zz暂存 2025-09-07 15:28:24 +08:00
Tourswen
db3e576e1a Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-07 14:09:24 +08:00
Tourswen
e9bbd8d6ea 战士种完工 2025-09-07 14:09:03 +08:00
ProjectKoi-Kalo\Kalo
b0d411f66d Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-07 14:03:19 +08:00
ProjectKoi-Kalo\Kalo
e996fedfee 改图层 2025-09-07 14:03:17 +08:00
Tourswen
66e94fbf62 技能调整,科技树调整 2025-09-07 12:59:49 +08:00
Tourswen
f2af6b526b 技能优化 2025-09-07 11:59:41 +08:00
Tourswen
a75add9a59 战士种代码,科技树补全 2025-09-07 11:18:49 +08:00
Tourswen
eec1e2a3bf 两个建筑的贴图 2025-09-06 21:23:43 +08:00
ProjectKoi-Kalo\Kalo
25bd3019df 补科技和温度 2025-09-06 16:01:54 +08:00
ProjectKoi-Kalo\Kalo
a963f83818 暂存 2025-09-06 15:38:01 +08:00
ProjectKoi-Kalo\Kalo
8b8b8addae 暂存 2025-09-06 15:17:29 +08:00
ProjectKoi-Kalo\Kalo
514b7ff0f9 2025-09-06 15:08:02 +08:00
ProjectKoi-Kalo\Kalo
13a9b23b71 暂存 2025-09-06 14:48:28 +08:00
ProjectKoi-Kalo\Kalo
359ab98f58 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-06 13:52:18 +08:00
ProjectKoi-Kalo\Kalo
aabe7e9541 自动绑定 2025-09-06 13:52:16 +08:00
Tourswen
816ae30c19 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-06 13:39:07 +08:00
Tourswen
e6650d0b14 原虫的身体,刺针枪素材,以及其他 2025-09-06 13:38:40 +08:00
ProjectKoi-Kalo\Kalo
3983c53e72 暂存重写CompDelayedTerrainSpawn 2025-09-06 13:20:53 +08:00
Tourswen
472be4418c comps修复 2025-09-05 19:19:32 +08:00
Tourswen
ddb493cc75 补酸枪贴图细节 2025-09-05 18:05:54 +08:00
ProjectKoi-Kalo\Kalo
64afb0cbd6 补上传 2025-09-05 17:34:06 +08:00
ProjectKoi-Kalo\Kalo
11d3d5d340 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-05 17:12:51 +08:00
ProjectKoi-Kalo\Kalo
a3d15c30e8 暂存 2025-09-05 17:10:45 +08:00
Tourswen
8f94e4903b 补设定,寄生前hediff,工艺种身体及其他 2025-09-05 17:09:47 +08:00
Tourswen
d8c2dc165b 虫族床的码,一些描述更改 2025-09-05 15:47:20 +08:00
ProjectKoi-Kalo\Kalo
a84e7bbb94 扫地和hediff 2025-09-05 13:53:55 +08:00
ProjectKoi-Kalo\Kalo
3a3c30087a 暂存 2025-09-05 13:35:41 +08:00
ProjectKoi-Kalo\Kalo
c87c88a681 加key值 2025-09-05 12:57:38 +08:00
ProjectKoi-Kalo\Kalo
f2db87b7b4 整理 2025-09-05 12:52:17 +08:00
Tourswen
4449cf0e9b 酸枪,刺针枪代码,科技 2025-09-05 12:01:32 +08:00
Tourswen
a226443064 Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-05 00:39:21 +08:00
Tourswen
ce818c56f0 细节补充 2025-09-05 00:38:45 +08:00
ProjectKoi-Kalo\Kalo
f3e87bdd40 调图层? 2025-09-05 00:28:25 +08:00
ProjectKoi-Kalo\Kalo
3d0bc51391 存修蜂巢断联 2025-09-04 23:22:51 +08:00
ProjectKoi-Kalo\Kalo
e220192bbe Merge branch '抱脸虫'
# Conflicts:
#	1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml
2025-09-04 23:04:49 +08:00
Tourswen
f6071f3bea 骨刀,酸炮,以及其他若干 2025-09-04 22:09:48 +08:00
123 changed files with 4188 additions and 654 deletions

40
.gitignore vendored Normal file
View File

@@ -0,0 +1,40 @@
# 忽略包含敏感信息的环境变量文件
.env
# 忽略 Python 缓存文件
__pycache__/
*.pyc
*.pyo
*.pyd
# 忽略 VSCode 设置
.vscode/
# MCP Server generated files
Source/MCP/*.log
# Visual Studio/C# 编译和临时文件
[Bb]in/
[Oo]bj/
.vs/
*.suo
*.user
*.userosscache
*.sln.docstates
# Kilo Code MCP vector cache
Source/MCP/vector_cache/
Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
Source/MCP/pid.txt
# Kilo Code logs
.kilocode/logs/
# MCP Knowledge Base Cache and Logs
*.log
MCP/vector_cache/*.txt
MCP/mcpserver.log
# Exclude MCP local RAG folder
MCP/local_rag/
Data

Binary file not shown.

View File

@@ -4,7 +4,7 @@
<defName>ARA_BindDrone</defName>
<label>信息素标记</label>
<description>使用信息素标记一只阿拉克涅督虫,受到标记的督虫和其麾下的辅虫将誓死效忠于女皇种,并与其建立心灵链接。</description>
<iconPath>UI/Commands/EggSpew</iconPath> <!-- Placeholder: You'll need to create this icon -->
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_BindDrone</iconPath> <!-- Placeholder: You'll need to create this icon -->
<hotKey>Misc1</hotKey>
<jobDef>CastAbilityOnThing</jobDef>
@@ -32,13 +32,9 @@
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_EggSpew</defName>
<label>生育虫卵</label>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<AbilityDef Name="ARA_EggSpew_Base" Abstract="True">
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
@@ -46,7 +42,7 @@
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>1</range>
<warmupTime>12</warmupTime>
<warmupTime>7</warmupTime>
<soundCast>AcidSpray_Resolve</soundCast>
<violent>false</violent>
<targetable>false</targetable>
@@ -55,9 +51,6 @@
</targetParams>
</verbProperties>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>4</needCost>
@@ -69,10 +62,63 @@
</li>
</comps>
</AbilityDef>
<ThingDef Name="ARA_EggSpew_Base_Proj" ParentName="BaseGrenadeProjectile" Abstract="True">
<thingClass>Projectile_SpawnsThing</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_EggSac</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>
<damageDef>Bullet</damageDef>
<speed>21</speed>
<damageAmountBase>0</damageAmountBase>
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
</projectile>
</ThingDef>
<AbilityDef ParentName="ARA_EggSpew_Base">
<defName>ARA_EggSpew</defName>
<label>生育虫卵</label>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac</projectileDef>
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac</defName>
<label>阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac</spawnsThingDef>
</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>
<ThingDef ParentName="ARA_EggSpew_Base_Proj">
<defName>ARA_Proj_EggSac_BaseFighter</defName>
<label>阿拉克涅虫卵</label>
<projectile>
<spawnsThingDef>ARA_InteractiveEggSac_Basic_Fighter</spawnsThingDef>
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_EggSpewBioforgeIncubator</defName>
<label>生育孵化茧</label>
<label>生育孵化茧 基础酸性武器</label>
<description>孵化茧</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange>
@@ -103,16 +149,31 @@
</li>
</comps>
</AbilityDef>
<ThingDef ParentName="BaseGrenadeProjectile">
<defName>ARA_Proj_BioforgeIncubator</defName>
<label>阿拉克涅孵化茧</label>
<thingClass>Projectile_SpawnsThing</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_BioforgeIncubator</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>
<damageDef>Bullet</damageDef>
<speed>21</speed>
<damageAmountBase>0</damageAmountBase>
<spawnsThingDef>ARA_BioforgeIncubator_AcidBase</spawnsThingDef>
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_AcidSprayBurst</defName>
<defName>ARA_AcidSprayBurst_Queen</defName>
<label>女皇种酸液轰炸</label>
<description>阿拉克涅女皇种向目标地点喷射大量腐蚀性酸液,喷射将持续数秒以完全覆盖一片区域。</description>
<iconPath>UI/Abilities/AcidSpray</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange> <!-- 2 hours -->
<aiCanUse>true</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
@@ -143,19 +204,51 @@
<requiredPart>ARA_Acid_sac</requiredPart>
<failMessage>酸囊受损或缺失,无法喷射酸液</failMessage>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_6VXI</requiredResearch>
<failMessage>需要科技 基因节点VXI-6"酸囊" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
<ThingDef>
<defName>ARA_Proj_StrongSludgeSpray</defName>
<label>阿拉克涅虫族酸液</label>
<thingClass>Projectile_Liquid</thingClass>
<category>Projectile</category>
<tickerType>Normal</tickerType>
<altitudeLayer>Projectile</altitudeLayer>
<useHitPoints>False</useHitPoints>
<neverMultiSelect>True</neverMultiSelect>
<graphicData>
<texPath>Things/Projectile/SludgeSpray</texPath>
<graphicClass>Graphic_Random</graphicClass>
<shaderType>MoteGlow</shaderType>
<drawSize>0.85</drawSize>
</graphicData>
<projectile>
<damageDef>ARA_AcidBurn</damageDef>
<speed>25</speed>
<damageAmountBase>2</damageAmountBase>
<arcHeightFactor>0.4</arcHeightFactor>
<armorPenetrationBase>0.1</armorPenetrationBase>
<stoppingPower>1</stoppingPower>
<shadowSize>0</shadowSize>
<spawnTerrain>ARA_InsectCreep</spawnTerrain>
<terrainChance>0.75</terrainChance>
<filth>Filth_SpentAcid</filth>
<filthCount>1</filthCount>
<filthChance>0.25</filthChance>
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_AcidSprayBurst_Myrmecocystus</defName>
<label>蜜罐种酸液轰炸</label>
<description>阿拉克涅蜜罐种向目标地点喷射大量腐蚀性酸液,虽然不如女皇种所喷射的酸雨那样强劲,但是虫酸的伤害依然是实打实的。</description>
<defName>ARA_AcidSprayBurst</defName>
<label>酸液轰炸</label>
<description>阿拉克涅督虫向目标地点喷射大量腐蚀性酸液,虽然不如女皇种所喷射的酸雨那样强劲,但是虫酸的伤害依然是实打实的。</description>
<iconPath>UI/Abilities/AcidSpray</iconPath>
<cooldownTicksRange>12000</cooldownTicksRange> <!-- 2 hours -->
<aiCanUse>true</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
@@ -186,72 +279,52 @@
<requiredPart>ARA_Acid_sac</requiredPart>
<failMessage>酸囊受损或缺失,无法喷射酸液</failMessage>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_6VXI</requiredResearch>
<failMessage>需要科技 基因节点VXI-6"酸囊" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_Toxic_Needle_Fire</defName>
<label>毒针连射</label>
<description>阿拉克涅督虫使用可以喷射剧毒尾针的毒针腺对敌方进行一轮射击。</description>
<writeCombatLog>True</writeCombatLog>
<showPsycastEffects>False</showPsycastEffects>
<cooldownTicksRange>6000</cooldownTicksRange>
<iconPath>UI/Abilities/AcidSpray</iconPath>
<verbProperties>
<verbClass>Verb_AbilityShoot</verbClass>
<defaultProjectile>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defaultProjectile>
<range>24.9</range>
<soundCast>Heatspikes_Shot</soundCast>
<soundCastTail>Heatspikes_Tail</soundCastTail>
<muzzleFlashScale>9</muzzleFlashScale>
<ticksBetweenBurstShots>6</ticksBetweenBurstShots>
<warmupTime>0</warmupTime>
<burstShotCount>12</burstShotCount>
<accuracyTouch>0.9</accuracyTouch>
<accuracyShort>0.8</accuracyShort>
<accuracyMedium>0.7</accuracyMedium>
<accuracyLong>0.6</accuracyLong>
<ai_IsWeapon>false</ai_IsWeapon>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>0.1</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityBodyPartCheck">
<requiredPart>ARA_Toxic_Needle</requiredPart>
<failMessage>毒针腺受损或缺失,无法发射毒针</failMessage>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityResearchPrereq">
<requiredResearch>ARA_Technology_5PAV</requiredResearch>
<failMessage>需要科技 基因节点PAV-5"毒刺" 以解锁技能</failMessage>
</li>
</comps>
</AbilityDef>
<ThingDef>
<defName>ARA_Proj_StrongSludgeSpray</defName>
<label>阿拉克涅虫族酸液</label>
<thingClass>Projectile_Liquid</thingClass>
<category>Projectile</category>
<tickerType>Normal</tickerType>
<altitudeLayer>Projectile</altitudeLayer>
<useHitPoints>False</useHitPoints>
<neverMultiSelect>True</neverMultiSelect>
<graphicData>
<texPath>Things/Projectile/SludgeSpray</texPath>
<graphicClass>Graphic_Random</graphicClass>
<shaderType>MoteGlow</shaderType>
<drawSize>0.85</drawSize>
</graphicData>
<projectile>
<damageDef>ARA_AcidBurn</damageDef>
<speed>25</speed>
<damageAmountBase>2</damageAmountBase>
<arcHeightFactor>0.4</arcHeightFactor>
<armorPenetrationBase>0.1</armorPenetrationBase>
<stoppingPower>1</stoppingPower>
<shadowSize>0</shadowSize>
<spawnTerrain>ARA_InsectCreep</spawnTerrain>
<terrainChance>0.75</terrainChance>
<filth>Filth_Slime</filth>
<filthCount>1</filthCount>
<filthChance>0.25</filthChance>
</projectile>
</ThingDef>
<ThingDef ParentName="BaseGrenadeProjectile">
<defName>ARA_Proj_EggSac</defName>
<label>阿拉克涅虫卵</label>
<thingClass>Projectile_SpawnsThing</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_EggSac</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>
<damageDef>Bullet</damageDef>
<speed>21</speed>
<damageAmountBase>0</damageAmountBase>
<spawnsThingDef>ARA_InteractiveEggSac</spawnsThingDef>
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
</projectile>
</ThingDef>
<ThingDef ParentName="BaseGrenadeProjectile">
<defName>ARA_Proj_BioforgeIncubator</defName>
<label>阿拉克涅孵化茧</label>
<thingClass>Projectile_SpawnsThing</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_EggSac</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<projectile>
<damageDef>Bullet</damageDef>
<speed>21</speed>
<damageAmountBase>0</damageAmountBase>
<spawnsThingDef>ARA_BioforgeIncubator</spawnsThingDef>
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_BaseRace_Acid_Launcher</defName>
@@ -264,15 +337,16 @@
<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>
<targetable>false</targetable>
<targetParams>
<canTargetSelf>false</canTargetSelf>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</verbProperties>
<comps>
@@ -284,10 +358,6 @@
<needCost>0.5</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
<!-- <li Class="ArachnaeSwarm.CompProperties_AbilityBodyPartCheck">
<requiredPart>ARA_Ovary</requiredPart>
<failMessage>卵巢受损或缺失,无法生育</failMessage>
</li> -->
</comps>
</AbilityDef>
<ThingDef ParentName="BaseGrenadeProjectile">
@@ -296,8 +366,8 @@
<thingClass>Projectile_SpawnsPawnZeroAge</thingClass>
<uiIconPath>Wula/Things/WULA_Attack_Cat/WULA_Cat_Thin_south</uiIconPath>
<graphicData>
<texPath>Wula/Things/WULA_Attack_Cat/WULA_Cat_Thin_south</texPath>
<graphicClass>Graphic_Single</graphicClass>
<texPath>Things/Pawn/Animal/Spelopede/Spelopede</texPath>
<graphicClass>Graphic_Multi</graphicClass>
</graphicData>
<projectile>
<speed>41</speed>
@@ -307,4 +377,44 @@
<damageAmountBase>10</damageAmountBase>
</projectile>
</ThingDef>
<AbilityDef>
<defName>ARA_Ability_Possess</defName>
<label>原虫种突袭寄生</label>
<description>跃向目标,随后尝试使用长尾刺穿对象并截断其神经中枢信号,以自己的控制信号取而代之,进而完全侵占目标躯体。\n\n被侵占躯体的对象视为阿拉克涅虫族的一员需要接受女皇种的信息素标记并且不再拥有感情和高级需求仅作为躯壳活着。目标的技能熟练度和背景故事会替换为原虫种的技能熟练度和背景故事一旦宿主死亡原虫种将从宿主身上逃离。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_Possess</iconPath>
<cooldownTicksRange>800</cooldownTicksRange>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<hotKey>Misc1</hotKey>
<verbProperties>
<!-- 使用我们新的Verb -->
<verbClass>ArachnaeSwarm.Verb_JumpAndCastOnLanding</verbClass>
<warmupTime>1.0</warmupTime>
<range>9.9</range>
<requireLineOfSight>true</requireLineOfSight>
<soundCast>Longjump_Jump</soundCast>
<soundLanding>Longjump_Land</soundLanding>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetSelf>false</canTargetSelf>
<canTargetLocations>false</canTargetLocations>
</targetParams>
</verbProperties>
<comps>
<!-- comps部分现在只包含夺舍效果因为跳跃由Verb处理 -->
<li Class="ArachnaeSwarm.CompProperties_AbilityPossess">
<!-- Base success chance range (60% to 100%) -->
<successChance>0.1</successChance>
<!-- Bonus success chance per point of damage dealt (1%) -->
<successChanceBonusPerDamage>0.01</successChanceBonusPerDamage>
<!-- Optional: Hediff to apply on successful possession -->
<hediffToApplyOnSuccess>ARA_HiveMindDrone</hediffToApplyOnSuccess>
<!-- Optional: A list of race ThingDefs that cannot be possessed -->
<raceBlacklist>
<li>ArachnaeQueen_Race</li>
</raceBlacklist>
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- ==================== Ability Def ==================== -->
<AbilityDef>
<defName>ARA_Ability_Possess</defName>
<label>阿拉克涅寄生</label>
<description>将你的意识注入另一个生物的身体,完全占据它。</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<cooldownTicksRange>600</cooldownTicksRange>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>1.5</warmupTime>
<range>5.9</range>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetSelf>false</canTargetSelf>
<canTargetLocations>false</canTargetLocations>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityPossess"/>
</comps>
</AbilityDef>
</Defs>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- 1. Definition for the PawnFlyer itself -->
<ThingDef ParentName="PawnFlyerBase">
<defName>ARA_Flyer_TrackingCharge</defName>
<thingClass>ArachnaeSwarm.PawnFlyer_TrackingCharge</thingClass>
<pawnFlyer>
<flightSpeed>0.5</flightSpeed>
<heightFactor>0</heightFactor>
</pawnFlyer>
</ThingDef>
<!-- 2. The final Ability Definition -->
<AbilityDef>
<defName>ARA_Ability_TrackingCharge</defName>
<label>追踪冲撞</label>
<description>阿拉克涅盾头种对目标发起蓄势冲撞,对路径上的一切造成伤害。飞行的距离越远,伤害越高。</description>
<iconPath>UI/Commands/WarTrumpet</iconPath> <!-- Placeholder Icon -->
<cooldownTicksRange>600</cooldownTicksRange>
<verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
<label>tracking charge</label>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>true</canTargetAnimals>
<canTargetMechs>true</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
</targetParams>
<range>60</range>
<warmupTime>1.0</warmupTime>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_TrackingCharge">
<homingSpeed>1.5</homingSpeed>
<initialDamage>15</initialDamage>
<damagePerTile>2</damagePerTile>
<inertiaDistance>6</inertiaDistance>
<collisionDamageDef>Blunt</collisionDamageDef>
<flyerDef>ARA_Flyer_TrackingCharge</flyerDef>
<collisionRadius>1.5</collisionRadius> <!-- Larger collision radius -->
<impactSound>Pawn_Melee_BigBash_HitPawn</impactSound>
<damageHostileOnly>true</damageHostileOnly> <!-- Set to false to damage everyone in the path -->
</li>
<li Class="CompProperties_AbilityEffecterOnCaster">
<effecterDef>WarTrumpet</effecterDef>
<maintainTicks>20</maintainTicks> <!-- Long enough for the "2nd wave" to spawn -->
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -15,9 +15,6 @@
<Shooting>2</Shooting>
<Melee>2</Melee>
</skillGains>
<forcedHediffs>
<li>ARA_HiveMindMaster</li>
</forcedHediffs>
<spawnCategories>
<li>ArachnaeQueen_spawnCategoriesA</li>
@@ -56,10 +53,6 @@
<li>ArachnaeNode_spawnCategoriesA</li>
</spawnCategories>
<forcedHediffs>
<li>ARA_HiveMindDrone</li>
</forcedHediffs>
<requiresSpawnCategory>true</requiresSpawnCategory>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
@@ -68,7 +61,24 @@
<titleShort>蜜罐种</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅蜜罐种督虫。基因的选择性表达使其长出了肿胀的囊袋和复杂的口器,这使得她可以吞噬那些未经过处理的尸体和各种杂食或是将其进一步分解,并通过消化器官将其转变为阿拉克涅虫蜜以供其他虫族食用。\n\n[PAWN_nameDef]在战斗中并不是一个值得正视的对手,她没有可以接入武装器官的副肢,脆弱臃肿的特性也决定了她几乎无法躲开任何攻击。</description>
<slot>Adulthood</slot>
<requiredWorkTags>Cooking</requiredWorkTags>
<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>
<Cooking>5</Cooking>
</skillGains>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_Myrmecocystus</li>
@@ -80,6 +90,24 @@
<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>
<Mining>5</Mining>
</skillGains>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_ShieldHead</li>
@@ -89,13 +117,61 @@
<defName>Arachnae_Node_BS_Adult_WeaponSmith</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>
<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>
<Construction>5</Construction>
</skillGains>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_WeaponSmith</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_Fighter</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>5</Shooting>
<Melee>5</Melee>
</skillGains>
<spawnCategories>
<li>ArachnaeNode_spawnCategories_Fighter</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_Facehugger</defName>

View File

@@ -14,7 +14,7 @@
<!-- 背部组织,仅包含骨骼和甲片 -->
<li>
<def>ARA_Dorsum</def>
<coverage>0</coverage>
<coverage>0.25</coverage>
<groups>
<li>Torso</li>
</groups>
@@ -42,7 +42,7 @@
<!-- 胸部组织,包含骨骼和各类重点维生器官 -->
<li>
<def>ARA_Sternum</def>
<coverage>0</coverage>
<coverage>0.25</coverage>
<groups>
<li>Torso</li>
</groups>
@@ -156,7 +156,7 @@
<def>ARA_Tail</def>
<height>Bottom</height>
<depth>Inside</depth>
<coverage>0</coverage>
<coverage>0.25</coverage>
<groups>
<li>Torso</li>
</groups>
@@ -583,17 +583,29 @@
<BodyPartDef>
<defName>ARA_Dorsum</defName>
<label>背部组织群</label>
<conceptual>true</conceptual>
<hitPoints>50</hitPoints>
<permanentInjuryChanceFactor>0.5</permanentInjuryChanceFactor>
<skinCovered>true</skinCovered>
<solid>false</solid>
<bleedRate>0.25</bleedRate>
</BodyPartDef>
<BodyPartDef>
<defName>ARA_Sternum</defName>
<label>胸部组织群</label>
<conceptual>true</conceptual>
<hitPoints>50</hitPoints>
<permanentInjuryChanceFactor>0.5</permanentInjuryChanceFactor>
<skinCovered>true</skinCovered>
<solid>false</solid>
<bleedRate>0.25</bleedRate>
</BodyPartDef>
<BodyPartDef>
<defName>ARA_Tail</defName>
<label>尾部组织群</label>
<conceptual>true</conceptual>
<hitPoints>50</hitPoints>
<permanentInjuryChanceFactor>0.5</permanentInjuryChanceFactor>
<skinCovered>true</skinCovered>
<solid>false</solid>
<bleedRate>0.25</bleedRate>
</BodyPartDef>
<BodyPartDef>
<defName>ARA_Exoskeleton_Dorsum</defName>
@@ -658,6 +670,15 @@
<solid>false</solid>
<bleedRate>1.5</bleedRate>
</BodyPartDef>
<BodyPartDef>
<defName>ARA_Toxic_Needle</defName>
<label>毒针腺</label>
<hitPoints>10</hitPoints>
<permanentInjuryChanceFactor>0.1</permanentInjuryChanceFactor>
<skinCovered>false</skinCovered>
<solid>false</solid>
<bleedRate>1.5</bleedRate>
</BodyPartDef>
<BodyPartGroupDef>
<defName>ARA_Genitalias</defName>
@@ -669,6 +690,11 @@
<label>酸腺器官</label>
<listOrder>125</listOrder>
</BodyPartGroupDef>
<BodyPartGroupDef>
<defName>ARA_Toxic_Needles</defName>
<label>毒针器官</label>
<listOrder>126</listOrder>
</BodyPartGroupDef>
<BodyDef>
<defName>ArachnaeMyrmecocystus_Body</defName>
@@ -1395,4 +1421,745 @@
</parts>
</corePart>
</BodyDef>
<BodyDef>
<defName>ArachnaeWeaponSmith_Body</defName>
<label>阿拉克涅工艺种</label> <!-- EN: beetle-like with claw -->
<corePart>
<def>Torso</def>
<height>Middle</height>
<depth>Outside</depth>
<groups>
<li>Torso</li>
</groups>
<parts>
<li>
<def>Ribcage</def>
<coverage>0.036</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Sternum</def>
<coverage>0.015</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Pelvis</def>
<coverage>0.025</coverage>
<height>Bottom</height>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Spine</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Stomach</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Heart</def>
<coverage>0.020</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Lung</def>
<customLabel>左肺</customLabel>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Lung</def>
<customLabel>右肺</customLabel>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Kidney</def>
<customLabel>左肾</customLabel>
<coverage>0.017</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Kidney</def>
<customLabel>右肾</customLabel>
<coverage>0.017</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Liver</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Neck</def>
<coverage>0.075</coverage>
<height>Top</height>
<groups>
<li>Neck</li>
</groups>
<parts>
<li>
<def>Head</def>
<coverage>0.80</coverage>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
<li>HeadAttackTool</li>
</groups>
<parts>
<li>
<def>Skull</def>
<coverage>0.18</coverage>
<depth>Inside</depth>
<groups>
<li>UpperHead</li>
<li>Eyes</li>
<li>FullHead</li>
</groups>
<parts>
<li>
<def>Brain</def>
<coverage>0.8</coverage>
<groups>
<li>UpperHead</li>
<li>Eyes</li>
<li>FullHead</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Eye</def>
<customLabel>left eye</customLabel>
<coverage>0.07</coverage>
<groups>
<li>FullHead</li>
<li>Eyes</li>
</groups>
<woundAnchorTag>LeftEye</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<visibleHediffRots>
<li>South</li>
<li>West</li>
</visibleHediffRots>
</li>
<li>
<def>Eye</def>
<customLabel>right eye</customLabel>
<coverage>0.07</coverage>
<groups>
<li>FullHead</li>
<li>Eyes</li>
</groups>
<woundAnchorTag>RightEye</woundAnchorTag>
<visibleHediffRots>
<li>South</li>
<li>East</li>
</visibleHediffRots>
</li>
<li>
<def>Ear</def>
<customLabel>左耳</customLabel>
<coverage>0.07</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Ear</def>
<customLabel>右耳</customLabel>
<coverage>0.07</coverage>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Nose</def>
<coverage>0.10</coverage>
<groups>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Jaw</def>
<coverage>0.15</coverage>
<groups>
<li>Teeth</li>
<li>FullHead</li>
<li>Mouth</li>
</groups>
<parts>
<li>
<def>Tongue</def>
<coverage>0.001</coverage>
<depth>Inside</depth>
<groups>
<li>FullHead</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Shoulder</def>
<customLabel>左肩</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>LeftShoulder</woundAnchorTag>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Arm</def>
<customLabel>左辅肢</customLabel>
<coverage>0.77</coverage>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Hand</def>
<customLabel>左手</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Hands</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Shoulder</def>
<customLabel>右肩</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>RightShoulder</woundAnchorTag>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Arm</def>
<customLabel>右辅肢</customLabel>
<coverage>0.77</coverage>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Hand</def>
<customLabel>右手</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Hands</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Waist</def>
<coverage>0</coverage>
<height>Bottom</height>
<groups>
<li>Waist</li>
</groups>
</li>
<li>
<def>Leg</def>
<customLabel>左腿</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<woundAnchorTag>LeftLeg</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<parts>
<li>
<def>Foot</def>
<customLabel>左足</customLabel>
<coverage>0.1</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Feet</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Leg</def>
<customLabel>右腿</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<woundAnchorTag>RightLeg</woundAnchorTag>
<parts>
<li>
<def>Foot</def>
<customLabel>右足</customLabel>
<coverage>0.1</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
</parts>
</li>
<li>
<def>ARA_Dorsum</def>
<height>Bottom</height>
<depth>Inside</depth>
<coverage>0.25</coverage>
<groups>
<li>Torso</li>
</groups>
<parts>
<!-- 甲片,防御作用 -->
<li>
<def>ARA_Chitin_Shell</def>
<coverage>0.5</coverage>
<depth>Outside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Arm</def>
<customLabel>左辅肢(其二)</customLabel>
<coverage>0.17</coverage>
<groups>
<li>Arms</li>
</groups>
</li>
<li>
<def>Arm</def>
<customLabel>右辅肢(其二)</customLabel>
<coverage>0.17</coverage>
<groups>
<li>Arms</li>
</groups>
</li>
</parts>
</li>
</parts>
</corePart>
</BodyDef>
<BodyDef>
<defName>ArachnaeFighter_Body</defName>
<label>阿拉克涅战士种</label> <!-- EN: beetle-like with claw -->
<corePart>
<def>Torso</def>
<height>Middle</height>
<depth>Outside</depth>
<groups>
<li>Torso</li>
</groups>
<parts>
<li>
<def>Ribcage</def>
<coverage>0.036</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Sternum</def>
<coverage>0.015</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Pelvis</def>
<coverage>0.025</coverage>
<height>Bottom</height>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Spine</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Stomach</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Heart</def>
<coverage>0.020</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Lung</def>
<customLabel>左肺</customLabel>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Lung</def>
<customLabel>右肺</customLabel>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Kidney</def>
<customLabel>左肾</customLabel>
<coverage>0.017</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Kidney</def>
<customLabel>右肾</customLabel>
<coverage>0.017</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Liver</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Neck</def>
<coverage>0.075</coverage>
<height>Top</height>
<groups>
<li>Neck</li>
</groups>
<parts>
<li>
<def>Head</def>
<coverage>0.80</coverage>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
<li>HeadAttackTool</li>
</groups>
<parts>
<li>
<def>Skull</def>
<coverage>0.18</coverage>
<depth>Inside</depth>
<groups>
<li>UpperHead</li>
<li>Eyes</li>
<li>FullHead</li>
</groups>
<parts>
<li>
<def>Brain</def>
<coverage>0.8</coverage>
<groups>
<li>UpperHead</li>
<li>Eyes</li>
<li>FullHead</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Eye</def>
<customLabel>left eye</customLabel>
<coverage>0.07</coverage>
<groups>
<li>FullHead</li>
<li>Eyes</li>
</groups>
<woundAnchorTag>LeftEye</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<visibleHediffRots>
<li>South</li>
<li>West</li>
</visibleHediffRots>
</li>
<li>
<def>Eye</def>
<customLabel>right eye</customLabel>
<coverage>0.07</coverage>
<groups>
<li>FullHead</li>
<li>Eyes</li>
</groups>
<woundAnchorTag>RightEye</woundAnchorTag>
<visibleHediffRots>
<li>South</li>
<li>East</li>
</visibleHediffRots>
</li>
<li>
<def>Ear</def>
<customLabel>左耳</customLabel>
<coverage>0.07</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Ear</def>
<customLabel>右耳</customLabel>
<coverage>0.07</coverage>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Nose</def>
<coverage>0.10</coverage>
<groups>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Jaw</def>
<coverage>0.15</coverage>
<groups>
<li>Teeth</li>
<li>FullHead</li>
<li>Mouth</li>
</groups>
<parts>
<li>
<def>Tongue</def>
<coverage>0.001</coverage>
<depth>Inside</depth>
<groups>
<li>FullHead</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Shoulder</def>
<customLabel>左肩</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>LeftShoulder</woundAnchorTag>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Arm</def>
<customLabel>左辅肢</customLabel>
<coverage>0.77</coverage>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Hand</def>
<customLabel>左手</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Hands</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Shoulder</def>
<customLabel>右肩</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>RightShoulder</woundAnchorTag>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Arm</def>
<customLabel>右辅肢</customLabel>
<coverage>0.77</coverage>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Hand</def>
<customLabel>右手</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Hands</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Waist</def>
<coverage>0</coverage>
<height>Bottom</height>
<groups>
<li>Waist</li>
</groups>
</li>
<li>
<def>Leg</def>
<customLabel>左腿</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<woundAnchorTag>LeftLeg</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<parts>
<li>
<def>Foot</def>
<customLabel>左足</customLabel>
<coverage>0.1</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Feet</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Leg</def>
<customLabel>右腿</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<woundAnchorTag>RightLeg</woundAnchorTag>
<parts>
<li>
<def>Foot</def>
<customLabel>右足</customLabel>
<coverage>0.1</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
</parts>
</li>
<!-- 尾部组织群 -->
<li>
<def>ARA_Tail</def>
<height>Bottom</height>
<depth>Inside</depth>
<coverage>0.25</coverage>
<groups>
<li>Torso</li>
</groups>
<parts>
<!-- 甲片,防御作用 -->
<li>
<def>ARA_Chitin_Shell</def>
<coverage>0.01</coverage>
<depth>Outside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<!-- 酸囊 -->
<li>
<def>ARA_Acid_sac</def>
<coverage>0.005</coverage>
<depth>Inside</depth>
<groups>
<li>ARA_Acid_sacs</li>
</groups>
</li>
<!-- 毒针腺 -->
<li>
<def>ARA_Toxic_Needle</def>
<coverage>0.005</coverage>
<depth>Inside</depth>
<groups>
<li>ARA_Toxic_Needles</li>
</groups>
</li>
</parts>
</li>
</parts>
</corePart>
</BodyDef>
</Defs>

View File

@@ -14,8 +14,26 @@
<hediff>AcidBurn</hediff>
<scaleDamageToBuildingsBasedOnFlammability>false</scaleDamageToBuildingsBasedOnFlammability>
</DamageDef>
<DamageDef ParentName="Bullet">
<defName>ARA_Fist_Needle</defName>
<label>刺针毒素</label>
<workerClass>DamageWorker_AddInjury</workerClass>
<armorCategory>Sharp</armorCategory>
<hediff>Cut</hediff>
<hediffSolid>Crack</hediffSolid>
<additionalHediffs>
<li>
<hediff>ToxicBuildup</hediff>
<severityPerDamageDealt>0.02</severityPerDamageDealt>
<victimSeverityScaling>ToxicResistance</victimSeverityScaling>
<inverseStatScaling>true</inverseStatScaling>
<victimSeverityScalingByInvBodySize>true</victimSeverityScalingByInvBodySize>
</li>
</additionalHediffs>
<applyAdditionalHediffsIfHuntingForFood>false</applyAdditionalHediffsIfHuntingForFood>
</DamageDef>
<DamageDef ParentName="CutBase">
<defName>ARA_AcidCut</defName>
<defName>ARA_AcidCut_Damage</defName>
<label>酸性撕咬</label>
<workerClass>DamageWorker_AddInjury</workerClass>
<deathMessage>{0} 被携带酸液的巨颚咬死了。</deathMessage>

View File

@@ -138,5 +138,116 @@
<FacialAnimation.SkinTypeDef ParentName="ArachnaeNode_Skin" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_ShieldHead_SkinNormal</defName>
<raceName>ArachnaeNode_Race_ShieldHead</raceName>
</FacialAnimation.SkinTypeDef>
<FacialAnimation.BrowTypeDef ParentName="ArachnaeNode_Brow" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_BrowNormal</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.BrowTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeA" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_EyeNormal</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeB" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_EyeNormal2</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeC" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_EyeNormal3</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeD" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_EyeNormal4</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.HeadTypeDef ParentName="ArachnaeNode_Head" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_HeadNormal</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.HeadTypeDef>
<FacialAnimation.LidTypeDef ParentName="ArachnaeNode_Lid" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_LidNormal</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.LidTypeDef>
<FacialAnimation.MouthTypeDef ParentName="ArachnaeNode_Mouth" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_MouthNormal</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.MouthTypeDef>
<FacialAnimation.SkinTypeDef ParentName="ArachnaeNode_Skin" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_WeaponSmith_SkinNormal</defName>
<raceName>ArachnaeNode_Race_WeaponSmith</raceName>
</FacialAnimation.SkinTypeDef>
<FacialAnimation.BrowTypeDef ParentName="ArachnaeNode_Brow" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_BrowNormal</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.BrowTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeA" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_EyeNormal</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeB" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_EyeNormal2</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeC" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_EyeNormal3</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeD" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_EyeNormal4</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.HeadTypeDef ParentName="ArachnaeNode_Head" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_HeadNormal</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.HeadTypeDef>
<FacialAnimation.LidTypeDef ParentName="ArachnaeNode_Lid" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_LidNormal</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.LidTypeDef>
<FacialAnimation.MouthTypeDef ParentName="ArachnaeNode_Mouth" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_MouthNormal</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.MouthTypeDef>
<FacialAnimation.SkinTypeDef ParentName="ArachnaeNode_Skin" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Facehugger_SkinNormal</defName>
<raceName>ArachnaeNode_Race_Facehugger</raceName>
</FacialAnimation.SkinTypeDef>
<FacialAnimation.BrowTypeDef ParentName="ArachnaeNode_Brow" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_BrowNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.BrowTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeA" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_EyeNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeB" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_EyeNormal2</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeC" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_EyeNormal3</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.EyeballTypeDef ParentName="ArachnaeNode_EyeD" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_EyeNormal4</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.EyeballTypeDef>
<FacialAnimation.HeadTypeDef ParentName="ArachnaeNode_Head" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_HeadNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.HeadTypeDef>
<FacialAnimation.LidTypeDef ParentName="ArachnaeNode_Lid" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_LidNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.LidTypeDef>
<FacialAnimation.MouthTypeDef ParentName="ArachnaeNode_Mouth" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_MouthNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.MouthTypeDef>
<FacialAnimation.SkinTypeDef ParentName="ArachnaeNode_Skin" MayRequire="Nals.FacialAnimation">
<defName>ArachnaeNode_Race_Fighter_SkinNormal</defName>
<raceName>ArachnaeNode_Race_Fighter</raceName>
</FacialAnimation.SkinTypeDef>
</Defs>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<HairDef>
<!--<HairDef>
<defName>ARA_Scattered_Hair_Long</defName>
<label>散发(长)</label>
<hairGender>Female</hairGender>
@@ -9,5 +9,5 @@
<styleTags>
<li>ARA_HiveNode_Style</li>
</styleTags>
</HairDef>
</HairDef>-->
</Defs>

View File

@@ -2,17 +2,24 @@
<Defs>
<HediffDef>
<defName>ARA_HiveMindMaster</defName>
<label>阿拉克涅主巢</label>
<description>虫群意识的中心节点, 作为主脑统御整个阿拉克涅虫群.</description>
<label>阿拉克涅女皇种</label>
<description>阿拉克涅女皇种是虫群意识的中心节点, 作为主脑统御整个阿拉克涅虫群。其体内拥有大量未分化的修复细胞,可以以常人无法想象的速度自行治愈所有的创伤。</description>
<hediffClass>ArachnaeSwarm.Hediff_HiveMindMaster</hediffClass>
<defaultLabelColor>(0.8, 0.3, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>true</scenarioCanAdd>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>100</maxSeverity>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindMaster">
<scanIntervalTicks>3200</scanIntervalTicks>
</li>
</comps>
<stages>
<li>
<label>连接至 {0} 个虫群工蜂</label>
<minSeverity>0</minSeverity>
<foodPoisoningChanceFactor>0</foodPoisoningChanceFactor>
<regeneration>500</regeneration>
<!-- Stat offsets will be added here later -->
<disablesNeeds>
<li>Joy</li>
@@ -30,12 +37,12 @@
<HediffDef>
<defName>ARA_HiveMindDrone</defName>
<label>阿拉克涅工蜂</label>
<description>阿拉克涅工蜂通过心灵与阿拉克涅女皇种相链接。如果女皇死亡,工蜂也将停止生命活动。</description>
<label>阿拉克涅督虫</label>
<description>阿拉克涅督虫通过心灵与阿拉克涅女皇种相链接。如果女皇死亡,督虫也将停止生命活动。</description>
<hediffClass>ArachnaeSwarm.Hediff_HiveMindDrone</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>true</scenarioCanAdd>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindDrone">
<unlinkedDieDelayTicks>6400</unlinkedDieDelayTicks> <!-- Default to 30 seconds -->
@@ -43,13 +50,14 @@
<li Class="HediffCompProperties_MessageAfterTicks">
<ticks>1</ticks>
<letterLabel>{0_labelShort} 诞生</letterLabel>
<letterText>一只新的阿拉克涅督虫 {0_labelShort} 已经破茧而出!她正在四处徘徊,等待女皇种与其建立链接——使用阿拉克涅女皇种的信息素标记技能完成链接,否则督虫将在一段时间后死亡!</letterText>
<letterText>一只新的阿拉克涅督虫 {0_labelShort} 已经破茧而出!她正在四处徘徊,等待女皇种的指示——使用阿拉克涅女皇种的信息素标记技能完成链接,或者等待其自行建立链接。</letterText>
<letterType>HumanPregnancy</letterType>
</li>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
<foodPoisoningChanceFactor>0</foodPoisoningChanceFactor>
<disablesNeeds>
<li>Mood</li>
<li>Joy</li>
@@ -63,4 +71,18 @@
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_HiveMindWorker</defName>
<label>阿拉克涅辅虫</label>
<description>阿拉克涅辅虫通过心灵与阿拉克涅督虫种相链接。如果督虫死亡,辅虫也将停止生命活动。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
</comps>
<stages>
</stages>
</HediffDef>
</Defs>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>ARA_Possession</defName>
<label>阿拉克涅原虫</label>
@@ -14,30 +13,28 @@
<li>
<nodeClass>PawnRenderNode_AttachmentHead</nodeClass>
<workerClass>PawnRenderNodeWorker_FlipWhenCrawling</workerClass>
<texPath>ArachnaeSwarm/Things/ARA_HiveNode/Heads/Average_Normal</texPath>
<texPath>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Facehugger_Upperhead</texPath>
<colorType>Skin</colorType>
<parentTagDef>Head</parentTagDef>
<useSkinShader>true</useSkinShader>
<useRottenColor>true</useRottenColor>
<useSkinShader>false</useSkinShader>
<useRottenColor>false</useRottenColor>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
<drawSize>0.85</drawSize>
<drawData>
<dataNorth>
<offset>(0, 0, 0.2)</offset>
</dataNorth>
<dataEast>
<offset>(0, 0, 0.2)</offset>
</dataEast>
<dataSouth>
<offset>(0, 0, 0.2)</offset>
</dataSouth>
<dataWest>
<offset>(0, 0, 0.2)</offset>
</dataWest>
<defaultData>
<layer>70</layer>
</defaultData>
</drawData>
</li>
<li>
<nodeClass>PawnRenderNode_AttachmentHead</nodeClass>
<workerClass>PawnRenderNodeWorker_FlipWhenCrawling</workerClass>
<texPath>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Base</texPath>
<colorType>Skin</colorType>
<parentTagDef>Head</parentTagDef>
<useSkinShader>true</useSkinShader>
<useRottenColor>true</useRottenColor>
<rotDrawMode>Fresh, Rotting</rotDrawMode>
<drawData>
<defaultData>
<layer>70</layer>
<layer>800</layer>
</defaultData>
</drawData>
</li>
@@ -57,6 +54,40 @@
</disablesNeeds>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_Facehugger_LowOperation</defName>
<label>阿拉克涅原虫</label>
<description>脱离了宿主的阿拉克涅原虫不仅非常脆弱,其小小的身躯也无法让其承担专业性工作。</description>
<hediffClass>ArachnaeSwarm.Hediff_Possession</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<stages>
<li>
<capMods>
<!-- <li>
<capacity>Consciousness</capacity>
<setMax>0.3</setMax>
</li> -->
<li>
<capacity>Talking</capacity>
<setMax>0</setMax>
</li>
<li>
<capacity>Manipulation</capacity>
<setMax>0.2</setMax>
</li>
<li>
<capacity>Moving</capacity>
<setMax>0.25</setMax>
</li>
</capMods>
</li>
</stages>
</HediffDef>
</Defs>

View File

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

View File

@@ -14,7 +14,8 @@
<canBeScattered>false</canBeScattered>
<abilities>
<li>ARA_EggSpew</li>
<li>ARA_AcidSprayBurst</li>
<li>ARA_EggSpew_BaseFighter</li>
<li>ARA_AcidSprayBurst_Queen</li>
<li>ARA_BindDrone</li>
</abilities>
<xenotypeSet>
@@ -43,7 +44,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>8.0</value>
<value>2.0</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
@@ -52,7 +53,7 @@
<label>阿拉克涅女皇种</label>
<race>ArachnaeQueen_Race</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>2.55</invNutrition>
<invNutrition>0</invNutrition>
<backstoryFiltersOverride>
<li>
<categories>
@@ -104,7 +105,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>8.0</value>
<value>2.0</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
@@ -123,7 +124,7 @@
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_AcidSprayBurst_Myrmecocystus</li>
<li>ARA_AcidSprayBurst</li>
</abilities>
<apparelTags>
</apparelTags>
@@ -146,6 +147,9 @@
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
<abilities>
<li>ARA_Ability_TrackingCharge</li>
</abilities>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_WeaponSmith</defName>
@@ -168,6 +172,50 @@
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Facehugger</defName>
<label>阿拉克涅原虫种</label>
<race>ArachnaeNode_Race_Facehugger</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>0</invNutrition>
<backstoryFiltersOverride>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategories_Facehugger</li>
</categories>
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_Ability_Possess</li>
</abilities>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Fighter</defName>
<label>阿拉克涅战士种</label>
<race>ArachnaeNode_Race_Fighter</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>0</invNutrition>
<backstoryFiltersOverride>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategories_Fighter</li>
</categories>
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_BaseRace_Acid_Launcher</li>
<li>ARA_AcidSprayBurst</li>
<li>ARA_Toxic_Needle_Fire</li>
</abilities>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef Name="ARA_InsectKindBase" ParentName="AnimalKindBase" Abstract="True">
<defaultFactionType>PlayerColony</defaultFactionType>
@@ -179,7 +227,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>8.0</value>
<value>2.0</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
@@ -271,4 +319,26 @@
</li>
</lifeStages>
</PawnKindDef>
<PawnKindDef ParentName="ARA_InsectKindBase">
<defName>ArachnaeBase_Race_Maid</defName>
<label>阿拉克涅家政种</label>
<race>ArachnaeBase_Race_Maid</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>
</Defs>

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ResearchProjectDef Abstract="True" Name="ARA_techBase">
<techLevel>Animal</techLevel>
<tab>ARA_ResearchTab</tab>
<heldByFactionCategoryTags Inherit="False" />
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Base_Technology</defName>
<label>基础基因序列获取</label>
<description>解锁虫群的基础科技,允许孵化基本的辅虫和武装器官</description>
<baseCost>100</baseCost>
<researchViewX>0.00</researchViewX>
<researchViewY>3.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
</ResearchProjectDef>
<!-- 酸类发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_6VXI</defName>
<label>基因节点VXI-6"酸囊"</label>
<description>使拥有酸囊的虫族允许喷射强酸击退敌人。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>0.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_7VXI</defName>
<label>基因节点VXI-7"外置酸袋"</label>
<description>允许工艺种孵化新的酸类武器茧</description>
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>0.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_6VXI</li>
</prerequisites>
</ResearchProjectDef>
<!-- 孵化发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_1KYC</defName>
<label>基因节点KYC-1"武斗虫"</label>
<description>允许女皇种孵化新的虫族——战士种和跃袭种。</description>
<baseCost>150</baseCost>
<researchViewX>1.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_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>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2WMT</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_4KYC</defName>
<label>基因节点KYC-4"原虫"</label>
<description>允许女皇种孵化新的虫族——原虫种,一种可以寄生在别的种族身上以控制它们的特殊督虫。</description>
<baseCost>150</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2WMT</li>
</prerequisites>
</ResearchProjectDef>
<!-- 硬壳发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_4DIL</defName>
<label>基因节点DIL-4"编织"</label>
<description>允许工艺种孵化覆壳茧,为虫族提供基础防具。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>5.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<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>
<label>基因节点PAV-5"毒刺"</label>
<description>允许工艺种孵化新的毒针类武器茧,并允许部分带毒针的虫族进行毒针喷射。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>4.40</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<!-- 工艺种进化 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_2WMT</defName>
<label>基因节点WMT-2"进化"</label>
<description>允许女皇种为工艺种执行进化手术,使其可以孵化更复杂的茧。</description>
<baseCost>150</baseCost>
<researchViewX>4.50</researchViewX>
<researchViewY>3.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
<!-- 建筑发展 -->
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Technology_5SHL</defName>
<label>基因节点SHL-5"光瘤"</label>
<description>允许虫族建造一种可以提供直射光源以供植物生长的特殊菌瘤。</description>
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>1.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
</ResearchProjectDef>
</Defs>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<Defs>
<ResearchTabDef>
<defName>ARA_ResearchTab</defName>
<label>阿拉克涅虫群进化</label>
<generalTitle>阿拉克涅虫群进化探索</generalTitle>
<generalDescription>探索、改进阿拉克涅虫群的生命形态,以孵化更强的个体和创造更先进的武装器官等虫群装备。\n\n只有阿拉克涅虫族才能进行这个科技树的研究</generalDescription>
</ResearchTabDef>
</Defs>

View File

@@ -5,7 +5,7 @@
<label>新阿拉克涅虫巢</label>
<description>一只阿拉克涅虫族女皇种降落在荒无人烟的边缘世界,准备着手建立属于自己的虫巢。</description>
<scenario>
<summary>以一只阿拉克涅虫族女皇种为初始殖民者开始游戏。</summary>
<summary>以一只阿拉克涅虫族女皇种为初始殖民者开始游戏附带4枚初诞阿拉克涅虫卵囊</summary>
<playerFaction>
<def>PlayerFaction</def>
<factionDef>ARA_New_Hive</factionDef>
@@ -52,7 +52,7 @@
<li Class="ScenPart_StartingThing_Defined">
<def>StartingThing_Defined</def>
<thingDef>ARA_InsectJelly</thingDef>
<count>60</count>
<count>200</count>
</li>
<li Class="ScenPart_StartingThing_Defined">
<def>StartingThing_Defined</def>
@@ -62,7 +62,7 @@
<li Class="ScenPart_StartingThing_Defined">
<def>StartingThing_Defined</def>
<thingDef>ARA_InteractiveEggSac_Start</thingDef>
<count>3</count>
<count>4</count>
</li>
<!-- 附近的物品 -->
<li Class="ScenPart_ScatterThingsNearPlayerStart">
@@ -81,6 +81,11 @@
<thingDef>Steel</thingDef>
<count>720</count>
</li>
<!-- 初始科技 -->
<li Class="ScenPart_StartingResearch">
<def>StartingResearch</def>
<project>ARA_Base_Technology</project>
</li>
</parts>
</scenario>
</ScenarioDef>

View File

@@ -7,6 +7,8 @@
<LeatherAmount>0</LeatherAmount>
<ArmorRating_Blunt>0.1</ArmorRating_Blunt>
<ArmorRating_Sharp>0.1</ArmorRating_Sharp>
<ComfyTemperatureMin>-3000</ComfyTemperatureMin>
<ComfyTemperatureMax>3000</ComfyTemperatureMax>
<Wildness>0</Wildness>
</statBases>
<uiIconScale>1.1</uiIconScale>
@@ -61,6 +63,22 @@
<workerClass>DeathActionWorker_Vanish</workerClass>
</deathAction> -->
</race>
<comps>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_TemperatureRegulation</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindWorker</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ArachnaeBase_Race">
<defName>ArachnaeBase_Race_Slavey</defName>
@@ -139,6 +157,28 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="ArachnaeBase_Race">
<defName>ArachnaeBase_Race_Maid</defName>
<label>阿拉克涅家政种</label>
<description>阿拉克涅辅虫之一,智力低下,可以执行清洁工作,注定在度过短暂的时光后死亡。</description>
<race>
<specialTrainables>
<li>ARA_Cleaning</li>
</specialTrainables>
</race>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AdvancedTraining">
<trainables>
<li>
<trainable>ARA_Cleaning</trainable>
<trainInstantly>true</trainInstantly>
<setWanted>true</setWanted>
</li>
</trainables>
<disableAllSkillDecay>true</disableAllSkillDecay> <!-- 阻止这个动物的所有技能衰减 -->
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseDrone" MayRequire="Ludeon.RimWorld.Odyssey">
<defName>ArachnaeBase_Race_Acid</defName>
<label>阿拉克涅酸嗜种</label>
@@ -183,4 +223,21 @@
</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>

View File

@@ -18,6 +18,9 @@
<humanRecipeImport>false</humanRecipeImport>
<!-- 睡觉定义 -->
<canLayDown>true</canLayDown>
<validBeds>
<li>ARA_NodeNest</li>
</validBeds>
<!-- 各种零件定义 -->
<alienPartGenerator Inherit="False">
<!-- 允许的头部 -->
@@ -71,28 +74,114 @@
</colorChannels>
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<name>ArachnaeNode Hair</name>
<userCustomizable>true</userCustomizable>
<path>ArachnaeSwarm/Hair/ARA_Scattered_Hair_Long</path>
<inFrontOfBody>true</inFrontOfBody>
<layerInvert>false</layerInvert>
<colorChannel>hair</colorChannel>
<defaultOffset>Center</defaultOffset>
<drawSize>1</drawSize>
<alignWithHead>true</alignWithHead>
<scaleWithPawnDrawsize>true</scaleWithPawnDrawsize>
<useSkipFlags>
<li></li>
</useSkipFlags>
<conditions>
<BodyPart>
<bodyPart>Head</bodyPart>
</BodyPart>
<Posture>
<drawnStanding>true</drawnStanding>
<drawnInBed>true</drawnInBed>
<drawnLaying>true</drawnLaying>
</Posture>
<RotStage>Fresh,Rotting</RotStage>
</conditions>
<offsets>
<west>
<layerOffset>-0.274</layerOffset>
</west>
<south>
<layerOffset>-0.274</layerOffset>
</south>
<north>
<layerOffset>-0.274</layerOffset>
</north>
<east>
<layerOffset>-0.274</layerOffset>
</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>
<useSkipFlags>
<li></li>
</useSkipFlags>
<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>
<offsets>
<south>
<offset>(0,0.32)</offset>
<layerOffset>-0.273</layerOffset>
</south>
<north>
<offset>(0,0.32)</offset>
<layerOffset>-0.275</layerOffset>
</north>
<east>
<offset>(-0.1,0.39)</offset>
<layerOffset>-0.273</layerOffset>
</east>
<west>
<offset>(-0.1,0.39)</offset>
<layerOffset>-0.273</layerOffset>
</west>
</offsets>
<inFrontOfBody>true</inFrontOfBody>
<!-- <conditions>
<conditions>
<BodyPart>
<bodyPart>WULA_Addons_Antenna_Bodypart</bodyPart>
<bodyPart>Head</bodyPart>
<drawWithoutPart>false</drawWithoutPart>
</BodyPart>
</conditions> -->
</conditions>
</li>
</bodyAddons>
<!-- 图像放大 -->
@@ -277,6 +366,13 @@
<li>ARA_InsectJelly</li>
</whiteFoodList>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
<!-- 武器列表 -->
<weaponList>
<li>ARA_RW_Basic_Acid_Bladder_Gun</li>
<li>ARA_RW_Basic_Fist_Needle_Gun</li>
<li>ARA_MW_Bone_Sword</li>
</weaponList>
<onlyUseRaceRestrictedWeapons>true</onlyUseRaceRestrictedWeapons>
<!-- 可以穿戴的衣服 -->
<apparelList>
</apparelList>
@@ -461,8 +557,8 @@
<!-- 在野外采集的营养 -->
<ForagedNutritionPerDay>0</ForagedNutritionPerDay>
<ComfyTemperatureMin>-80</ComfyTemperatureMin>
<ComfyTemperatureMax>32</ComfyTemperatureMax>
<ComfyTemperatureMin>-3000</ComfyTemperatureMin>
<ComfyTemperatureMax>3000</ComfyTemperatureMax>
</statBases>
<race>
@@ -522,7 +618,7 @@
</race>
<!-- 工具设置(攻击方式) -->
<tools Inherit="False"><!-- 必须写禁止继承不然会把HUMANLIKE的攻击方式继承过来导致红字找不到部件报错 -->
<tools Inherit="False">
<li>
<label>头颚</label>
<capacities>
@@ -564,6 +660,13 @@
<li MayRequire="Nals.FacialAnimation">
<compClass>FacialAnimation.FacialAnimationControllerComp</compClass>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindDrone</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
<!--<li>
<compClass>FacialAnimation.EmotionControllerComp</compClass>
</li>
@@ -575,7 +678,7 @@
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_Myrmecocystus</defName>
<label>阿拉克涅蜜罐种</label>
<description>阿拉克涅督虫之一,拥有非常广泛的食谱,可以吞下许多未经处理的生物并将其分解为阿拉克涅虫蜜,以滋养虫群。这种督虫非常脆弱,并且没有可以接入武装器官的副肢。\n\n作为督虫她可以繁育并监管若干阿拉克涅食腐种辅虫,以协助巢穴播种和收割作物</description>
<description>阿拉克涅督虫之一,拥有非常广泛的食谱,可以吞下许多未经处理的生物并将其分解为阿拉克涅虫蜜,以滋养虫群。这种督虫非常脆弱,并且没有可以接入武装器官的副肢,除了生产虫蜜外能执行烹饪工作。\n\n作为督虫她可以繁育并监管若干阿拉克涅苦役种辅虫,以协助巢穴进行搬运工作</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -585,11 +688,8 @@
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Myrmecocystus_Addons_Stomach</path>
<inFrontOfBody>false</inFrontOfBody>
<!-- <conditions>
<BodyPart>
<bodyPart>WULA_Addons_Antenna_Bodypart</bodyPart>
</BodyPart>
</conditions> -->
<conditions>
</conditions>
</li>
</bodyAddons>
</alienPartGenerator>
@@ -602,6 +702,8 @@
<li>ARA_InsectJelly</li>
</blackFoodList>
<onlyEatRaceRestrictedFood>false</onlyEatRaceRestrictedFood>
<!-- 武器列表 -->
<weaponList Inherit="False"/>
</raceRestriction>
</alienRace>
<comps>
@@ -620,8 +722,8 @@
<cooldownTicks>9999</cooldownTicks>
<productionQueue>
<li>
<pawnKind>ArachnaeBase_Race_Scavenger</pawnKind>
<count>2</count>
<pawnKind>ArachnaeBase_Race_Slavey</pawnKind>
<count>4</count>
<cooldownTicks>1000</cooldownTicks>
</li>
</productionQueue>
@@ -678,7 +780,7 @@
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_ShieldHead</defName>
<label>阿拉克涅盾头种</label>
<description>阿拉克涅督虫之一,拥有过度生长而覆盖头部和腿部的甲壳,防御力超群的同时还可以定时剥落甲壳素供虫巢使用。尽管她笨重缓慢但是仍不失为一个坚韧的战士。\n\n作为督虫她可以繁育并监管若干阿拉克涅坚颚种辅虫以协助巢穴开采矿脉。</description>
<description>阿拉克涅督虫之一,拥有过度生长而覆盖头部和腿部的甲壳,防御力超群的同时还可以定时剥落甲壳素供虫巢使用。坚韧的鳌刺挥舞起来非常缓慢但是可以破开岩壁,以完成虫群的采矿工作。\n\n作为督虫她可以繁育并监管若干阿拉克涅坚颚种辅虫以协助巢穴开采矿脉。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -705,30 +807,27 @@
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_ShieldBody</path>
<inFrontOfBody>true</inFrontOfBody>
<offsets>
<south>
<!-- <layerOffset>0.25</layerOffset> -->
<layerOffset>-0.275</layerOffset>
</south>
<north>
<layerOffset>-0.6</layerOffset>
<layerOffset>-0.275</layerOffset>
</north>
<east>
<!-- same structure repeated -->
<layerOffset>-0.275</layerOffset>
</east>
<west>
<!-- optional, mirrors east if omitted -->
<layerOffset>-0.275</layerOffset>
</west>
</offsets>
<inFrontOfBody>true</inFrontOfBody>
<layerInvert>false</layerInvert>
</li>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<raceRestriction>
<!-- 食物列表 -->
<foodList>
<li>ARA_InsectJelly</li>
</foodList>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
</raceRestriction>
</alienRace>
@@ -805,7 +904,7 @@
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_WeaponSmith</defName>
<label>阿拉克涅工艺种</label>
<description>阿拉克涅督虫之一,天生牛马。\n\n作为督虫她可以繁育并监管若干阿拉克涅坚颚种辅虫,以协助巢穴开采矿脉</description>
<description>阿拉克涅督虫之一,是少数拥有结茧能力的非女皇种阿拉克涅虫族——她们可以排出一枚器官茧,这枚茧将按照其信息素所标定的方向定向演化出一个武装器官,以供虫群使用。除此之外,她们的辅肢比普通的虫族更加复杂灵活,这使得她们不仅可以执行手工、建造、艺术等复杂的工作,也可以操作武装器官——虽然她们本身极度脆弱。\n\n作为督虫她可以繁育并监管若干阿拉克涅家政种辅虫,以协助巢穴进行清洁工作</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
@@ -813,49 +912,18 @@
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_ShieldHead</path>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_WeaponSmith</path>
<inFrontOfBody>false</inFrontOfBody>
<offsets>
<south>
<offset>(0,0.32)</offset>
</south>
<north>
<offset>(0,0.32)</offset>
<layerOffset>-0.275</layerOffset>
</north>
<east>
<offset>(-0.1,0.32)</offset>
</east>
<west>
<offset>(-0.1,0.32)</offset>
</west>
</offsets>
<inFrontOfBody>true</inFrontOfBody>
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_ShieldBody</path>
<inFrontOfBody>true</inFrontOfBody>
<offsets>
<south>
<!-- <layerOffset>0.25</layerOffset> -->
</south>
<north>
<layerOffset>-0.6</layerOffset>
</north>
<east>
<!-- same structure repeated -->
</east>
<west>
<!-- optional, mirrors east if omitted -->
</west>
</offsets>
</li>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<raceRestriction>
<!-- 食物列表 -->
<foodList>
<li>ARA_InsectJelly</li>
</foodList>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
</raceRestriction>
</alienRace>
@@ -870,8 +938,9 @@
<cooldownTicks>9999</cooldownTicks>
<productionQueue>
<li>
<pawnKind>ArachnaeBase_Race_Slavey</pawnKind>
<count>2</count>
<!-- <pawnKind>ArachnaeBase_Race_Slavey</pawnKind> -->
<pawnKind>ArachnaeBase_Race_Maid</pawnKind>
<count>3</count>
<cooldownTicks>1000</cooldownTicks>
</li>
</productionQueue>
@@ -882,16 +951,16 @@
<!-- 基础属性设置 -->
<statBases>
<!-- 移动速度 -->
<MoveSpeed>2</MoveSpeed>
<MoveSpeed>3.5</MoveSpeed>
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<EatingSpeed>5</EatingSpeed>
<MaxNutrition>1</MaxNutrition>
<!-- <EatingSpeed>5</EatingSpeed> -->
<MaxNutrition>2</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>50</MeatAmount>
<LeatherAmount>80</LeatherAmount>
<MeatAmount>40</MeatAmount>
<LeatherAmount>10</LeatherAmount>
<MeleeDodgeChance>0.75</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->
@@ -902,20 +971,157 @@
<!-- <TradePriceImprovement>0.5</TradePriceImprovement> -->
<!-- 自带的甲壳可以防御外部攻击 -->
<ArmorRating_Blunt>1</ArmorRating_Blunt>
<ArmorRating_Sharp>1.25</ArmorRating_Sharp>
<ArmorRating_Heat>1</ArmorRating_Heat>
<ArmorRating_Blunt>0.1</ArmorRating_Blunt>
<ArmorRating_Sharp>0.1</ArmorRating_Sharp>
<ArmorRating_Heat>0.05</ArmorRating_Heat>
</statBases>
<race>
<!-- 身体类型 -->
<body>ArachnaeWeaponSmith_Body</body>
<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_Facehugger</defName>
<label>阿拉克涅原虫种</label>
<description>阿拉克涅督虫之一,呈现高度未分化状态的特殊督虫,可以通过独特的神经链接管控制受害者的身体,并释放灵能信号以使得周围的人忽略其存在。\n\n不同于普通阿拉克涅虫族高度未分化的身体决定了其无法孕育任何辅虫在完成寄生前也无法进行任何工作。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
<alienPartGenerator>
<!-- 额外身体部件 -->
<bodyAddons>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<!-- 图形,留空 -->
<graphicPaths Inherit="False">
<!-- 皮肤颜色 -->
<skinColor>(1,1,1,1)</skinColor>
<!-- 皮肤着色器 -->
<skinShader>Cutout</skinShader>
<body>ArachnaeSwarm/Things/ARA_Facehugger/Bodies/</body>
<head>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Heads/</path>
</head>
<skeleton>Things/Pawn/Humanlike/Bodies/Dessicated/Dessicated_Thin</skeleton>
<stump>ArachnaeSwarm/Things/ARA_Facehugger/Bodies/Naked_Thin</stump>
</graphicPaths>
<!-- 种族的允许和禁止特化设置 -->
<raceRestriction>
<!-- 武器列表 -->
<weaponList Inherit="False"/>
</raceRestriction>
</alienRace>
<statBases>
<MoveSpeed>5</MoveSpeed>
<EatingSpeed>5</EatingSpeed>
<MaxNutrition>1</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>20</MeatAmount>
<LeatherAmount>5</LeatherAmount>
<MeleeDodgeChance>1.5</MeleeDodgeChance>
</statBases>
<race>
<body>ArachnaeMyrmecocystus_Body</body>
<!-- 身形大小 -->
<baseBodySize>2</baseBodySize>
<!-- 血量上限 -->
<baseHealthScale>5</baseHealthScale>
<!-- 蜜罐虫的寿命很低 -->
<lifeExpectancy>2</lifeExpectancy>
<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">
<hediffs>
<li>ARA_Facehugger_LowOperation</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</AlienRace.ThingDef_AlienRace>
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_Fighter</defName>
<label>阿拉克涅战士种</label>
<description>阿拉克涅督虫之一,是巢穴中真正的战士,除了战斗外也可以进行狩猎和搬运。其拥有强大的可塑性基因,随着科技的解锁其将获得更多的能力。\n\n作为督虫她可以向敌人投射寿命有限但是非常恼人的阿拉克涅酸噬种辅虫以阻止敌人的远程火力开火。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
<alienPartGenerator>
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Claw</path>
<inFrontOfBody>true</inFrontOfBody>
</li>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Addons_Fighter_Tail</path>
<inFrontOfBody>false</inFrontOfBody>
<offsets>
<north>
<layerOffset>-0.275</layerOffset>
</north>
</offsets>
</li>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<raceRestriction>
<onlyEatRaceRestrictedFood>true</onlyEatRaceRestrictedFood>
</raceRestriction>
</alienRace>
<comps>
</comps>
<!-- 基础属性设置 -->
<statBases>
<!-- 移动速度 -->
<MoveSpeed>4.5</MoveSpeed>
<!-- <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>
<race>
<!-- 身体类型 -->
<body>ArachnaeFighter_Body</body>
<baseBodySize>0.85</baseBodySize>
<baseHealthScale>2</baseHealthScale>
<lifeExpectancy>5</lifeExpectancy>
<lifeStageAges Inherit="False">
<li>
<def>ArachnaeNode_Myrmecocystus_Adult</def>

View File

@@ -4,8 +4,8 @@
<statBases>
<MarketValue>1750</MarketValue>
<MoveSpeed>4.6</MoveSpeed>
<ComfyTemperatureMin>-80</ComfyTemperatureMin>
<ComfyTemperatureMax>32</ComfyTemperatureMax>
<ComfyTemperatureMin>-3000</ComfyTemperatureMin>
<ComfyTemperatureMax>3000</ComfyTemperatureMax>
<RoyalFavorValue>3</RoyalFavorValue>
</statBases>
<tools>
@@ -217,6 +217,13 @@
<minMonolithLevelForStudy>1</minMonolithLevelForStudy>
<requiresImprisonment>true</requiresImprisonment>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_TemperatureRegulation</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</ThingDef>
<AlienRace.ThingDef_AlienRace Name="ARA_QueenBase" ParentName="ARA_PawnBase">
@@ -394,7 +401,10 @@
<li>
<key>HairDef</key>
<value>
<hasStyle>false</hasStyle>
<hasStyle>true</hasStyle>
<styleTagsOverride>
<li>Bald</li>
</styleTagsOverride>
</value>
</li>
<!-- 纹身 -->
@@ -739,7 +749,13 @@
</recipes>
<comps>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindMaster</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</AlienRace.ThingDef_AlienRace>
</Defs>

View File

@@ -1,115 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- ==================== Pawn Kind Def ==================== -->
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Facehugger</defName>
<label>阿拉克涅原虫种</label>
<race>ArachnaeNode_Race_Facehugger</race>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>0</invNutrition>
<backstoryFiltersOverride>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategories_Facehugger</li>
</categories>
</li>
</backstoryFiltersOverride>
<abilities>
<li>ARA_Ability_Possess</li>
</abilities>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<!-- 定义阿拉克涅节点虫种族 -->
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
<defName>ArachnaeNode_Race_Facehugger</defName>
<label>阿拉克涅原虫种</label>
<description>阿拉克涅原虫,通过独特的神经链接管伸入受害者身体来接管受害者的身体。不同于普通阿拉克涅虫族,阿拉克涅原虫种拥有自我意识,不需要女皇种的监管。</description>
<alienRace>
<generalSettings>
<!-- 各种零件定义 -->
<alienPartGenerator>
<!-- 额外身体部件 -->
<bodyAddons>
<li>
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Myrmecocystus_Addons_Stomach</path>
<inFrontOfBody>false</inFrontOfBody>
<!-- <conditions>
<BodyPart>
<bodyPart>WULA_Addons_Antenna_Bodypart</bodyPart>
</BodyPart>
</conditions> -->
</li>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<!-- 种族的允许和禁止特化设置 -->
<raceRestriction>
<!-- 食物列表 -->
<whiteFoodList Inherit="False"/>
<blackFoodList>
<li>ARA_InsectJelly</li>
</blackFoodList>
<onlyEatRaceRestrictedFood>false</onlyEatRaceRestrictedFood>
</raceRestriction>
</alienRace>
<comps>
<li Class="ArachnaeSwarm.CompProperties_MilkableArachnae">
<milkDef>ARA_InsectJelly</milkDef>
<milkIntervalDays>3</milkIntervalDays>
<milkAmount>4</milkAmount>
</li>
</comps>
<!-- 基础属性设置 -->
<statBases>
<!-- 移动速度 -->
<MoveSpeed>2</MoveSpeed>
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<EatingSpeed>5</EatingSpeed>
<MaxNutrition>1</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>70</MeatAmount>
<LeatherAmount>10</LeatherAmount>
<MeleeDodgeChance>0.5</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->
<!-- <NegotiationAbility>1</NegotiationAbility> -->
<!-- <SellPriceFactor>1</SellPriceFactor> -->
<!-- <SocialImpact>1</SocialImpact> -->
<!-- <TradePriceImprovement>0.5</TradePriceImprovement> -->
<!-- 自带的甲壳可以防御外部攻击 -->
<ArmorRating_Blunt>0.18</ArmorRating_Blunt>
<ArmorRating_Sharp>0.27</ArmorRating_Sharp>
<ArmorRating_Heat>0.2</ArmorRating_Heat>
</statBases>
<race>
<foodType>OmnivoreHuman,CarnivoreAnimal,OvivoreAnimal,VegetarianRoughAnimal</foodType>
<!-- 身体类型 -->
<body>ArachnaeMyrmecocystus_Body</body>
<!-- 身形大小 -->
<baseBodySize>2.5</baseBodySize>
<!-- 血量上限 -->
<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>
</Defs>

View File

@@ -0,0 +1,250 @@
<?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 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>
<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>
</Defs>

View File

@@ -3,7 +3,7 @@
<TerrainDef ParentName="FloorBase">
<defName>ARA_InsectCreep</defName>
<label>阿拉克涅菌毯</label>
<description>由阿拉克涅虫族所铺设的由真菌、甲壳素分泌物混合得到的地面,会自动在各种拉克涅虫族建筑附近蔓延。这种奇特的结构质地紧密且暗藏大量营养输送组织,可以支撑重型建筑、种植特殊作物、加速其上的阿拉克涅虫族移动速度,但是除了虫族以外没人想踩在这坨软乎乎的活体结构上。</description>
<description>由阿拉克涅虫族所铺设的由真菌、甲壳素分泌物混合得到的地面,会自动在各种拉克涅虫族建筑附近蔓延。这种奇特的结构质地紧密且暗藏大量营养输送组织,可以支撑重型建筑、种植作物、加速其上的阿拉克涅虫族移动速度,但是除了虫族以外没人想踩在这坨软乎乎的活体结构上。</description>
<designationCategory>ARA_Buildings</designationCategory>
<texturePath>Terrain/Surfaces/InsectSludge</texturePath>
<color>(203, 163, 68)</color>
@@ -15,6 +15,9 @@
<renderPrecedence>330</renderPrecedence>
<pathCost>2</pathCost>
<generatedFilth>Filth_Slime</generatedFilth>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
</researchPrerequisites>
<filthAcceptanceMask>
<li>Unnatural</li>
</filthAcceptanceMask>
@@ -78,7 +81,12 @@
<artificialForMeditationPurposes>false</artificialForMeditationPurposes>
</building>
<useStuffTerrainAffordance>false</useStuffTerrainAffordance>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
</researchPrerequisites>
<!-- <terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded> -->
<!-- <tickerType>Normal</tickerType> -->
<repairEffect>EatVegetarian</repairEffect>
<costStuffCount>0</costStuffCount>
<stuffCategories Inherit="False"/>
@@ -132,23 +140,21 @@
<leaveResourcesWhenKilled>false</leaveResourcesWhenKilled>
<selectable>true</selectable>
<tickerType>Normal</tickerType>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
</researchPrerequisites>
<!-- <rotatable>false</rotatable> -->
<!--<soundImpactDefault>BulletImpact_Metal</soundImpactDefault>-->
<useStuffTerrainAffordance>false</useStuffTerrainAffordance>
<stuffCategories Inherit="False"></stuffCategories>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
<!-- <terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded> -->
<designationCategory>ARA_Buildings</designationCategory>
<holdsRoof>true</holdsRoof>
<staticSunShadowHeight>1.0</staticSunShadowHeight>
<blockLight>true</blockLight>
<drawerType>RealtimeOnly</drawerType>
<repairEffect>EatVegetarian</repairEffect>
<comps>
<li Class="CompProperties_Breakdownable"/>
<li Class="CompProperties_Forbiddable">
<allowNonPlayer>true</allowNonPlayer>
</li>
</comps>
<damageMultipliers Inherit="False">
<li>
<damageDef>Bomb</damageDef>
@@ -189,6 +195,17 @@
<uiIconPath>ArachnaeSwarm/Building/Door/ARA_InsectDoor_Icon</uiIconPath>
<designationHotKey>Misc2</designationHotKey>
<constructionSkillPrerequisite>6</constructionSkillPrerequisite>
<comps>
<li Class="CompProperties_Breakdownable"/>
<li Class="CompProperties_Forbiddable">
<allowNonPlayer>true</allowNonPlayer>
</li>
<li Class="CompProperties_Power">
<compClass>CompPowerTrader</compClass>
<basePowerConsumption>0</basePowerConsumption>
<transmitsPower>true</transmitsPower>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BuildingNaturalBase">
@@ -207,6 +224,10 @@
<designationCategory>ARA_Buildings</designationCategory>
<repairEffect>EatVegetarian</repairEffect>
<filthLeaving>Filth_Slime</filthLeaving>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
</researchPrerequisites>
<!-- <thingCategories>
<li>BuildingsSpecial</li>
</thingCategories> -->
@@ -219,20 +240,6 @@
<costList>
<ARA_InsectJelly>3</ARA_InsectJelly>
</costList>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(220,210,171,0)</glowColor>
</li>
<!-- <li Class="CompProperties_Lifespan">
<lifespanTicks>1200000</lifespanTicks>
</li> -->
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<delayTicks>60</delayTicks> <!-- 60 ticks = 1 second -->
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>6</spawnRadius>
</li>
</comps>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Tumor</texPath>
<graphicClass>Graphic_Single</graphicClass>
@@ -247,26 +254,37 @@
<placeWorkers>
<li>PlaceWorker_GlowRadius</li>
</placeWorkers>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(220,210,171,0)</glowColor>
</li>
<li Class="CompProperties_Lifespan">
<lifespanTicks>1200000</lifespanTicks>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>6</spawnRadius>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BuildingNaturalBase">
<defName>ARA_Tumor_SunLamp</defName>
<label>阿拉克涅巨型菌</label>
<description>一个比普通菌瘤更大的菌瘤,内部的发光器官亮的难以想象,可以支持作物的光照条件,但是其寿命比普通菌瘤要短得多。</description>
<label>阿拉克涅</label>
<description>一个比普通菌瘤更大的菌瘤,内部的发光器官亮的难以想象,可以支持作物的光照条件,但是其寿命比普通菌瘤要短得多,并且不会蔓延菌毯</description>
<thingClass>Building_SunLamp</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Tumor</texPath>
<texPath>ArachnaeSwarm/Building/ARA_Tumor_SunLamp</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(3, 3)</drawSize>
<shadowData>
<volume>(0.3, 0.6, 0.3)</volume>
<offset>(0,0,-0.1)</offset>
<volume>(1.3, 1.6, 1)</volume>
<offset>(-0.5,0,-0.1)</offset>
</shadowData>
<damageData>
<rect>(0.2,0.2,0.6,0.6)</rect>
</damageData>
</graphicData>
<size>(2,2)</size>
<size>(3,3)</size>
<blockWind>true</blockWind>
<tickerType>Normal</tickerType>
<tickerType>Rare</tickerType>
<statBases>
<WorkToBuild>600</WorkToBuild>
<Mass>4.5</Mass>
@@ -276,6 +294,10 @@
<ARA_InsectJelly>10</ARA_InsectJelly>
</costList>
<uiOrder>2995</uiOrder>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<researchPrerequisites>
<li>ARA_Technology_5SHL</li>
</researchPrerequisites>
<comps>
<li Class="CompProperties_Glower">
<overlightRadius>7.0</overlightRadius>
@@ -283,6 +305,9 @@
<glowColor>(220,210,171,0)</glowColor>
<colorPickerEnabled>true</colorPickerEnabled>
</li>
<li Class="CompProperties_Lifespan">
<lifespanTicks>600000</lifespanTicks>
</li>
<!-- <li Class="CompProperties_Schedule">
<startTime>0.25</startTime>
<endTime>0.8</endTime>
@@ -302,53 +327,41 @@
<ThingDef ParentName="BenchBase">
<defName>ARA_ResearchBench</defName>
<label>阿拉克涅研究台</label>
<description>A simple bench with writing implements and simple measurement devices. Researchers work here to discover new things.</description>
<description>一个供阿拉克涅女皇种和智囊种进行研究的活体结构,可以让虫群尽情地探索变异和进化方向。</description>
<thingClass>Building_ResearchBench</thingClass>
<size>(3,2)</size>
<stuffCategories>
<li>Metallic</li>
<li>Woody</li>
<li>Stony</li>
</stuffCategories>
<costStuffCount>75</costStuffCount>
<size>(3,3)</size>
<stuffCategories Inherit="False"/>
<costStuffCount>0</costStuffCount>
<costList>
<Steel>25</Steel>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<graphicData>
<texPath>Things/Building/Production/ResearchBenchSimple</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<texPath>ArachnaeSwarm/Building/ARA_ResearchBench</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(5,4)</drawSize>
<damageData>
<cornerTL>Damage/Corner</cornerTL>
<cornerTR>Damage/Corner</cornerTR>
<cornerBL>Damage/Corner</cornerBL>
<cornerBR>Damage/Corner</cornerBR>
</damageData>
<drawSize>(3,4.5)</drawSize>
</graphicData>
<castEdgeShadows>true</castEdgeShadows>
<staticSunShadowHeight>0.20</staticSunShadowHeight>
<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>
<ResearchSpeedFactor>0.75</ResearchSpeedFactor>
</statBases>
<placeWorkers>
<li>PlaceWorker_PreventInteractionSpotOverlap</li>
<li>PlaceWorker_DrawLinesToBookcasesInRoom</li>
</placeWorkers>
<fillPercent>0.5</fillPercent>
<fillPercent>0.8</fillPercent>
<interactionCellOffset>(0,0,-1)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>Production</designationCategory>
<designationCategory>ARA_Buildings</designationCategory>
<uiOrder>2600</uiOrder>
<surfaceType>Item</surfaceType>
<building>
<paintable>true</paintable>
<workTableRoomRole>Laboratory</workTableRoomRole>
<workTableNotInRoomRoleFactor>0.8</workTableNotInRoomRoleFactor>
</building>
@@ -356,6 +369,63 @@
<li Class="CompProperties_ReportWorkSpeed">
<workSpeedStat>ResearchSpeedFactor</workSpeedStat>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>4</spawnRadius>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BasicBedBase">
<defName>ARA_NodeNest</defName>
<thingClass>Building_Bed</thingClass>
<label>阿拉克涅督虫巢穴</label>
<description>供阿拉克涅督虫栖息的巢穴,由几丁质甲壳、肌肉和结缔组织形成的“被窝”对督虫来说是非常好的补充精力的场地。</description>
<tickerType>Normal</tickerType>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_NodeNest</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<shaderType>CutoutComplex</shaderType>
<drawSize>(2,2)</drawSize>
</graphicData>
<staticSunShadowHeight Inherit="False" IsNull="True" />
<castEdgeShadows>False</castEdgeShadows>
<statBases>
<Comfort>0.75</Comfort>
<MaxHitPoints>140</MaxHitPoints>
<Beauty>1</Beauty>
<WorkToBuild>800</WorkToBuild>
<Mass>30</Mass>
<Flammability>1.0</Flammability>
<BedRestEffectiveness>1.2</BedRestEffectiveness>
<Comfort>0.80</Comfort>
<ImmunityGainSpeedFactor>1.1</ImmunityGainSpeedFactor>
<MedicalTendQualityOffset>0.10</MedicalTendQualityOffset>
<SurgerySuccessChanceFactor>1.1</SurgerySuccessChanceFactor>
</statBases>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<size>(1,2)</size>
<costList>
<ARA_InsectJelly>3</ARA_InsectJelly>
<ARA_Carapace>15</ARA_Carapace>
</costList>
<uiOrder>2010</uiOrder>
<fillPercent>0.5</fillPercent>
<designationCategory>ARA_Buildings</designationCategory>
<researchPrerequisites Inherit="False">
<li>ARA_Base_Technology</li>
</researchPrerequisites>
<stuffCategories Inherit="False" IsNull="True" />
<building>
<paintable>false</paintable>
<bed_showSleeperBody>true</bed_showSleeperBody>
<bed_healPerDay>10</bed_healPerDay>
<bed_defaultMedical>false</bed_defaultMedical>
</building>
<comps>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>3</spawnRadius>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -1,24 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef Name="ARA_InteractiveEggSac" ParentName="BuildingNaturalBase">
<defName>ARA_InteractiveEggSac</defName>
<label>阿拉克涅虫卵囊-休眠中</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的具体信息,了解各个督虫的特点。</description>
<ThingDef Name="ARA_InteractiveEggSac_Base" ParentName="BuildingNaturalBase" Abstract="True">
<thingClass>Building</thingClass>
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Myrmecocystus</ThingDef>
<ThingDef>ArachnaeNode_Race_ShieldHead</ThingDef>
</descriptionHyperlinks>
<category>Building</category>
<size>(1,1)</size>
<minifiedDef>MinifiedThing</minifiedDef>
<thingCategories>
<!-- <minifiedDef>MinifiedThing</minifiedDef> -->
<!-- <thingCategories>
<li>BuildingsMisc</li>
</thingCategories>
</thingCategories> -->
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_EggSac</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(1.5,1.5)</drawSize>
<drawSize>(1.2,1.2)</drawSize>
<shadowData>
<volume>(0.8, 0.8, 0.3)</volume>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
@@ -47,10 +43,81 @@
<glowRadius>6</glowRadius>
<glowColor>(113,141,117,0)</glowColor>
</li>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>4.6</spawnRadius>
</li>
</comps>
</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>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Base_Technology</li>
</researchPrerequisites>
<comps>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<pawnKinds>
<li>ArachnaeNode_Race_Myrmecocystus</li>
<li>ArachnaeNode_Race_ShieldHead</li>
<li>ArachnaeNode_Race_WeaponSmith</li>
</pawnKinds>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<pawnKindDelays>
<li>
<pawnKind>ArachnaeNode_Race_Myrmecocystus</pawnKind>
<delay>180000</delay>
</li>
<li>
<pawnKind>ArachnaeNode_Race_ShieldHead</pawnKind>
<delay>180000</delay>
</li>
<li>
<pawnKind>ArachnaeNode_Race_WeaponSmith</pawnKind>
<delay>180000</delay>
</li>
</pawnKindDelays>
<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>
<ThingDef ParentName="ARA_InteractiveEggSac_Base">
<defName>ARA_InteractiveEggSac_Start</defName>
<label>初诞阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种初到此地所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程。\n\n初诞卵囊可以抵御极端天气并且拥有极快的孵化速度但是它们只能支持少数几种虫族的孵化。</description>
<minifiedDef Inherit="False" />
<thingCategories Inherit="False" />
<descriptionHyperlinks>
<ThingDef>ArachnaeNode_Race_Myrmecocystus</ThingDef>
<ThingDef>ArachnaeNode_Race_ShieldHead</ThingDef>
<ThingDef>ArachnaeNode_Race_WeaponSmith</ThingDef>
</descriptionHyperlinks>
<comps>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<pawnKinds>
<li>ArachnaeNode_Race_Myrmecocystus</li>
<li>ArachnaeNode_Race_ShieldHead</li>
<li>ArachnaeNode_Race_WeaponSmith</li>
</pawnKinds>
<whitelist>
<li>ARA_ArachnaeQueen</li>
@@ -71,33 +138,49 @@
</pawnKindDelays>
<destroyOnSpawn>true</destroyOnSpawn>
</li>
<li Class="CompProperties_Maintainable">
<ticksHealthy>60000</ticksHealthy>
<ticksNeedsMaintenance>60000</ticksNeedsMaintenance>
<damagePerTickRare>10</damagePerTickRare>
</li>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>
<li Class="CompProperties_SpawnerFilth">
<filthDef>Filth_Slime</filthDef>
<spawnCountOnSpawn>10</spawnCountOnSpawn>
<spawnMtbHours>4</spawnMtbHours>
<spawnRadius>5</spawnRadius>
</li>
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<delayTicks>60</delayTicks> <!-- 60 ticks = 1 second -->
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>4.6</spawnRadius>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>-300</minSafeTemperature>
<maxSafeTemperature>100</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</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>
<ThingDef ParentName="ARA_InteractiveEggSac">
<defName>ARA_InteractiveEggSac_Start</defName>
<label>初诞阿拉克涅虫卵囊-休眠中</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅女皇种初到此地所诞之卵,内含哺育一只新督虫所需的营养和遗传物质,可以通过阿拉克涅女皇种的交互完成激活进程——参阅虫卵的具体信息,了解各个督虫的特点。</description>
<minifiedDef Inherit="False" />
<thingCategories Inherit="False" />
<comps>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<pawnKinds>
<li>ArachnaeNode_Race_Fighter</li>
</pawnKinds>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<pawnKindDelays>
<li>
<pawnKind>ArachnaeNode_Race_Fighter</pawnKind>
<delay>12</delay>
</li>
</pawnKindDelays>
<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,15 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="BuildingBase">
<defName>ARA_BioforgeIncubator</defName>
<label>阿拉克涅孵化茧</label>
<description>一个脆弱、易燃、黏滑的囊状物,是阿拉克涅工艺种所诞之卵,内含哺育阿拉克涅武器种虫族所需的营养和遗传物质,可以通过阿拉克涅工艺种的交互完成激活进程。孵化茧对温度极度敏感,遭受极端温度将会受损需要小心保护。</description>
<ThingDef Name="ARA_BioforgeIncubator_Base" ParentName="BuildingBase" Abstract="True">
<thingClass>Building</thingClass>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_EggSac</texPath>
<texPath>ArachnaeSwarm/Building/ARA_BioforgeIncubator</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(1.5,1.5)</drawSize>
<drawSize>(1.1,1.1)</drawSize>
</graphicData>
<size>(1,1)</size>
<altitudeLayer>Building</altitudeLayer>
@@ -36,31 +32,41 @@
<spawnMtbHours>4</spawnMtbHours>
<spawnRadius>5</spawnRadius>
</li>
</comps>
</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>Biomass</fuelLabel>
<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>Gun_ChainShotgun</thingDef>
<productionTicks>60000</productionTicks>
<totalNutritionNeeded>20</totalNutritionNeeded>
</li>
<li>
<thingDef>Gun_AssaultRifle</thingDef>
<productionTicks>60000</productionTicks>
<totalNutritionNeeded>15</totalNutritionNeeded>
<thingDef>ARA_RW_Basic_Acid_Bladder_Gun</thingDef>
<productionTicks>80000</productionTicks>
<totalNutritionNeeded>30</totalNutritionNeeded>
</li>
</processes>
@@ -69,8 +75,8 @@
</whitelist>
<spawnCount>1</spawnCount>
<destroyOnSpawn>True</destroyOnSpawn>
<minSafeTemperature>18</minSafeTemperature>
<maxSafeTemperature>23</maxSafeTemperature>
<minSafeTemperature>10</minSafeTemperature>
<maxSafeTemperature>28</maxSafeTemperature>
<penaltyPerDegreePerTick>0.00001</penaltyPerDegreePerTick>
<damagePerTickWhenUnfueled>0.2</damagePerTickWhenUnfueled>
<minNutritionToStart>1.0</minNutritionToStart>
@@ -102,7 +108,6 @@
</li>
</qualityThresholds>
<!--
<![CDATA[
当一个生产流程完成时,系统会通过以下三个步骤来确定最终的物品品质:
第 1 步: 计算“基础品质分” (Base Quality Score)
@@ -161,19 +166,181 @@
仅仅保持燃料充足或温度适宜是不够的,必须两者兼顾才能提高“基础品质分”。
同时,必须极力避免温度超出安全范围,因为“温度惩罚分”是纯粹的惩罚,它只会单方面地拉低最终品质,且无法挽回。
这种设计为玩家提供了一个清晰的目标和富有挑战性的过程管理,而不是一个简单的“放置-等待”式生产。
]]>
-->
</li>
<li Class="ArachnaeSwarm.CompProperties_TemperatureRuinableDamage">
<minSafeTemperature>13</minSafeTemperature>
<minSafeTemperature>10</minSafeTemperature>
<maxSafeTemperature>28</maxSafeTemperature>
<progressPerDegreePerTick>0.00005</progressPerDegreePerTick>
<damagePerTick>0.001</damagePerTick>
<damagePerTick>0.005</damagePerTick>
<recoveryRate>0.001</recoveryRate>
</li>
</comps>
</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="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>
</Defs>

View File

@@ -332,6 +332,13 @@
<li Class="ArachnaeSwarm.JobGiver_Grower" />
</subNodes>
</li>
<!-- OUR CUSTOM LOGIC INJECTION FOR CLEANING -->
<li Class="ArachnaeSwarm.ThinkNode_ConditionalAnimalShouldDoCleaningWork">
<subNodes>
<li Class="ArachnaeSwarm.JobGiver_Cleaner" />
</subNodes>
</li>
</subNodes>
</li>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<TrainableDef>
<defName>ARA_Cleaning</defName>
<label>清洁</label>
<description>允许该生物执行清洁任务。</description>
<!-- 标记为特殊训练,这样它就会被 PawnColumnWorker_Trainable_Special 统一管理 -->
<specialTrainable>true</specialTrainable>
<!-- 训练难度和所需智力 -->
<difficulty>5</difficulty>
<requiredTrainability>Advanced</requiredTrainability>
<!-- 训练所需步骤 -->
<steps>3</steps>
<!-- 在UI中的排序 -->
<listPriority>100</listPriority>
</TrainableDef>
</Defs>

View File

@@ -11,4 +11,15 @@
<ARA_BindDrone_AlreadyBound>目标 {0} 已绑定到 {1}。</ARA_BindDrone_AlreadyBound>
<ARA_BindDrone_NoMasterHediff>施法者 {0} 没有“ARA_HiveMindMaster”的 hediff。</ARA_BindDrone_NoMasterHediff>
<!-- Possession Ability Keys -->
<ARA_MustBeHumanlike>目标必须是类人生物。</ARA_MustBeHumanlike>
<ARA_AlreadyPossessed>{0} 已被寄生。</ARA_AlreadyPossessed>
<ARA_CannotPossessRace>无法寄生 {0} 种族。</ARA_CannotPossessRace>
<!-- Hive Mind Tooltips -->
<ARA_TipString_LinkedTo>链接至: {0}</ARA_TipString_LinkedTo>
<ARA_TipString_NotLinked>未链接至任何女皇种。</ARA_TipString_NotLinked>
<ARA_TipString_ControlledDrones>控制的虫族:</ARA_TipString_ControlledDrones>
<ARA_TipString_NoDronesBound>尚未绑定任何虫族。</ARA_TipString_NoDronesBound>
</LanguageData>

View File

@@ -14,7 +14,7 @@
<Producing>正在生产 {0}</Producing>
<TimeLeft>剩余时间</TimeLeft>
<ProjectedQuality>预计品质</ProjectedQuality>
<TemperaturePenalty>温度惩罚</TemperaturePenalty>
<NotProducing>未在生产</NotProducing>
<ARA_NeedArachnaeToStartIncubation>未孵化,需要阿拉克涅工艺种交互</ARA_NeedArachnaeToStartIncubation>
</LanguageData>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -1,7 +1,16 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [],
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\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|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}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
@@ -9,8 +18,34 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": -1,
"SelectedChildIndex": 0,
"Children": [
{
"$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==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-09-05T11:17:51.595Z",
"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==",
"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}"

View File

@@ -3,47 +3,45 @@ using Verse;
namespace ArachnaeSwarm
{
/// <summary>
/// Spawns terrain around the parent thing instantly upon spawning.
/// Despite the class name, this component does NOT use any delay or Tick-based updates.
/// The logic runs only ONCE during the PostSpawnSetup phase for maximum performance.
/// There is no background counting or any process that continues after the spawn.
/// </summary>
public class CompDelayedTerrainSpawn : ThingComp
{
private CompProperties_DelayedTerrainSpawn Props => (CompProperties_DelayedTerrainSpawn)props;
private int ticksToSpawn;
private bool started;
/// <summary>
/// This is the ONLY time this component's logic runs. It is called by the game when the object is created on the map.
/// </summary>
/// <param name="respawningAfterLoad">True if loading from a save, which we will ignore.</param>
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
StartDelayedSpawn();
}
public override void CompTick()
{
base.CompTick();
if (started)
{
ticksToSpawn--;
if (ticksToSpawn <= 0)
// We only run this logic for brand new objects, not for objects loaded from a save file.
if (!respawningAfterLoad)
{
DoTerrainSpawn();
}
}
}
private void StartDelayedSpawn()
{
started = true;
ticksToSpawn = Props.delayTicks;
}
/// <summary>
/// This method performs the one-time action of spawning terrain.
/// It includes strong safety checks to prevent errors if the object is not fully initialized.
/// </summary>
private void DoTerrainSpawn()
{
if (parent.Destroyed)
// Safety Check: We ensure the object and its map exist before trying to do anything.
// If these conditions are not met, the method does nothing and simply stops.
if (parent == null || parent.Destroyed || parent.Map == null || Props.terrainToSpawn == null)
{
return;
return; // Stop execution if anything is not ready.
}
if (Props.terrainToSpawn != null)
{
// The core logic: iterate through nearby cells and change their terrain.
foreach (IntVec3 current in GenRadial.RadialCellsAround(parent.Position, Props.spawnRadius, true))
{
if (current.InBounds(parent.Map) && current.Walkable(parent.Map))
@@ -52,6 +50,8 @@ namespace ArachnaeSwarm
}
}
}
}
// NOTICE: There is NO CompTick() method here. This component does not perform any updates after it has spawned.
// NOTICE: There is NO ExposeData() method for timers because there are NO timers to save.
}
}

View File

@@ -2,14 +2,18 @@ using Verse;
namespace ArachnaeSwarm
{
/// <summary>
/// Properties for the CompDelayedTerrainSpawn component.
/// The logic has been optimized to run instantly on spawn, so the 'delayTicks' field is no longer used.
/// </summary>
public class CompProperties_DelayedTerrainSpawn : CompProperties
{
public int delayTicks = 0;
public TerrainDef terrainToSpawn;
public float spawnRadius = 0f;
public CompProperties_DelayedTerrainSpawn()
{
// The component logic now runs instantly, but the class name is kept for compatibility.
compClass = typeof(CompDelayedTerrainSpawn);
}
}

View File

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public class CompHediffGiver : ThingComp
{
public CompProperties_HediffGiver Props => (CompProperties_HediffGiver)this.props;
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
// 只有当thing是pawn时才添加hediff
if (this.parent is Pawn pawn)
{
AddHediffsToPawn(pawn);
}
}
private void AddHediffsToPawn(Pawn pawn)
{
// 检查是否有hediff列表
if (Props.hediffs == null || Props.hediffs.Count == 0)
return;
// 检查概率
if (Props.addChance < 1.0f && Rand.Value > Props.addChance)
return;
// 为每个hediff添加到pawn
foreach (HediffDef hediffDef in Props.hediffs)
{
// 检查是否允许重复添加
if (!Props.allowDuplicates && pawn.health.hediffSet.HasHediff(hediffDef))
continue;
// 添加hediff
pawn.health.AddHediff(hediffDef);
}
}
}
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_HediffGiver : CompProperties
{
// 要添加的hediff列表
public List<HediffDef> hediffs;
// 添加hediff的概率0-1之间
public float addChance = 1.0f;
// 是否允许重复添加相同的hediff
public bool allowDuplicates = false;
public CompProperties_HediffGiver()
{
this.compClass = typeof(CompHediffGiver);
}
}
}

View File

@@ -226,6 +226,10 @@ namespace ArachnaeSwarm
return sb.ToString().TrimEnd();
}
if (!InProduction)
{
return "ARA_NeedArachnaeToStartIncubation".Translate();
}
return null;
}

View File

@@ -0,0 +1,44 @@
using Verse;
namespace ArachnaeSwarm
{
public class HediffCompProperties_HiveMindMaster : HediffCompProperties
{
public int scanIntervalTicks = 60; // Default to 1 second
public HediffCompProperties_HiveMindMaster()
{
this.compClass = typeof(HediffComp_HiveMindMaster);
}
}
public class HediffComp_HiveMindMaster : HediffComp
{
private Hediff_HiveMindMaster parentHediff;
private HediffCompProperties_HiveMindMaster Props => (HediffCompProperties_HiveMindMaster)this.props;
public override void CompPostMake()
{
base.CompPostMake();
parentHediff = (Hediff_HiveMindMaster)this.parent;
// Immediately try to bind drones when the hediff is first applied.
parentHediff.TryBindAllAvailableDrones();
}
public override void CompPostTick(ref float severityAdjustment)
{
base.CompPostTick(ref severityAdjustment);
// Periodically check for new unbound drones based on XML value.
if (Find.TickManager.TicksGame % Props.scanIntervalTicks == 0)
{
if (parentHediff == null)
{
parentHediff = (Hediff_HiveMindMaster)this.parent;
}
parentHediff.TryBindAllAvailableDrones();
}
}
}
}

View File

@@ -42,18 +42,7 @@ namespace ArachnaeSwarm
{
get
{
// Only remove if base ShouldRemove is true, OR if pawn is dead
// We do NOT want to remove it just because target is invalid, as the Comp will handle delayed death
if (base.ShouldRemove && pawn.Dead)
{
return true;
}
// Also remove if pawn is no longer spawned or on a map
if (!pawn.Spawned || pawn.Map == null)
{
return true;
}
return false; // Let the Comp handle the unlinked death
return this.pawn.Dead;
}
}
@@ -61,13 +50,23 @@ namespace ArachnaeSwarm
{
base.PostRemoved();
// Deregister from the master when this hediff is removed
// Ensure target is a Pawn and not dead before attempting to deregister
if (this.target is Pawn master && master != null && !master.Destroyed && !master.Dead)
if (this.target is Pawn master && master != null && !master.Destroyed)
{
var masterHediff = master.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindMaster")) as Hediff_HiveMindMaster;
masterHediff?.DeregisterDrone(this.pawn);
}
}
public override string TipStringExtra
{
get
{
if (this.target is Pawn master && master != null)
{
return "ARA_TipString_LinkedTo".Translate(master.LabelShortCap);
}
return "ARA_TipString_NotLinked".Translate();
}
}
// PostTick logic moved to HediffComp_HiveMindDrone
}
}

View File

@@ -5,12 +5,38 @@ using Verse;
namespace ArachnaeSwarm
{
public class Hediff_HiveMindMaster : Hediff
public class Hediff_HiveMindMaster : HediffWithComps
{
private List<Pawn> drones = new List<Pawn>();
public override string LabelInBrackets => drones.Count.ToString();
public override bool ShouldRemove => false;
public override string TipStringExtra
{
get
{
if (drones.NullOrEmpty())
{
return "\n" + "ARA_TipString_NoDronesBound".Translate().Colorize(ColoredText.SubtleGrayColor);
}
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
stringBuilder.AppendLine("\n" + "ARA_TipString_ControlledDrones".Translate().Colorize(ColoredText.TipSectionTitleColor));
foreach (var drone in drones)
{
string backstoryInfo = "";
if (drone.story?.TitleShort is string adulthoodTitle && !adulthoodTitle.NullOrEmpty())
{
backstoryInfo = $" ({adulthoodTitle.Colorize(ColoredText.SubtleGrayColor)})";
}
stringBuilder.AppendLine($" - {drone.LabelShortCap}{backstoryInfo}");
}
return stringBuilder.ToString();
}
}
public override void ExposeData()
{
base.ExposeData();
@@ -55,6 +81,41 @@ namespace ArachnaeSwarm
return true;
}
public void TryBindAllAvailableDrones()
{
if (this.pawn?.Map == null) return;
// First, clean up any dead, despawned, or destroyed drones from the list.
int removedCount = drones.RemoveAll(drone => drone == null || drone.Dead || drone.Destroyed);
// Find all pawns on the map that could be potential drones
List<Pawn> potentialDrones = this.pawn.Map.mapPawns.AllPawnsSpawned
.Where(p => p.health.hediffSet.HasHediff(HediffDef.Named("ARA_HiveMindDrone")))
.ToList();
int boundCount = 0;
foreach (var drone in potentialDrones)
{
Hediff_HiveMindDrone droneHediff = drone.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindDrone")) as Hediff_HiveMindDrone;
// Check if the drone is unlinked (target is null) and not already in our list
if (droneHediff != null && droneHediff.target == null && !drones.Contains(drone))
{
droneHediff.target = this.pawn; // Set the drone's target to this master
drones.Add(drone);
Log.Message($"[ArachnaeSwarm] Master {this.pawn.LabelShort} automatically bound drone {drone.LabelShort}.");
boundCount++;
}
}
// Update severity if anything changed (drones were added or removed)
if (boundCount > 0 || removedCount > 0)
{
UpdateSeverity();
}
}
public void DeregisterDrone(Pawn drone)
{
if (drones.Contains(drone))

View File

@@ -0,0 +1,166 @@
using RimWorld;
using RimWorld.Planet;
using Verse;
using UnityEngine;
using System.Linq;
using System.Collections.Generic;
namespace ArachnaeSwarm
{
public class CompAbilityEffect_Possess : CompAbilityEffect, ICompAbilityEffectOnJumpCompleted
{
public new CompProperties_AbilityPossess Props => (CompProperties_AbilityPossess)props;
public override bool Valid(LocalTargetInfo target, bool throwMessages = false)
{
Pawn targetPawn = target.Pawn;
if (targetPawn == null) return false;
if (!targetPawn.RaceProps.Humanlike)
{
if (throwMessages) Messages.Message("ARA_MustBeHumanlike".Translate(), targetPawn, MessageTypeDefOf.RejectInput, false);
return false;
}
if (targetPawn.health.hediffSet.HasHediff(HediffDef.Named("ARA_Possession")))
{
if (throwMessages) Messages.Message("ARA_AlreadyPossessed".Translate(targetPawn.LabelShort), targetPawn, MessageTypeDefOf.RejectInput, false);
return false;
}
if (Props.raceBlacklist.Contains(targetPawn.def))
{
if (throwMessages) Messages.Message("ARA_CannotPossessRace".Translate(targetPawn.def.label), targetPawn, MessageTypeDefOf.RejectInput, false);
return false;
}
return base.Valid(target, throwMessages);
}
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
DoPossession(this.parent.pawn, target.Pawn);
}
private void DoPossession(Pawn caster, Pawn targetPawn)
{
if (targetPawn == null || caster == null) return;
Log.Message($"[夺舍] 开始执行。施法者: {caster.LabelShort}, 目标: {targetPawn.LabelShort}");
// 1. 捕获原宿主的完整数据,用于死亡后恢复尸体
OriginalPawnData originalHostData = new OriginalPawnData();
originalHostData.CaptureData(targetPawn);
Log.Message($"[夺舍] 已捕获原始宿主 {targetPawn.LabelShort} 的完整数据。");
// 2. 备份原宿主的技能,用于后续合并
var originalTargetSkills = new Dictionary<SkillDef, (int level, Passion passion)>();
if (targetPawn.skills != null)
{
foreach (var skill in targetPawn.skills.skills)
{
originalTargetSkills[skill.def] = (skill.levelInt, skill.passion);
}
}
// 3. 准备抱脸虫和Hediff
Pawn originalCaster = PawnGenerator.GeneratePawn(caster.kindDef, caster.Faction);
PawnDataUtility.TransferSoul(caster, originalCaster); // 确保克隆体有完全一致的数据
Hediff_Possession hediff = (Hediff_Possession)HediffMaker.MakeHediff(HediffDef.Named("ARA_Possession"), targetPawn);
hediff.originalHostData = originalHostData; // 将宿主数据存入Hediff
// 4. 将抱脸虫存入Hediff
if (hediff.casterContainer.TryAdd(originalCaster, true))
{
Log.Message($"[夺舍] 成功将 {caster.LabelShort} 的原始副本存入Hediff。");
// 5. 灵魂转移,此时 targetPawn 的技能被 caster 的技能覆盖
PawnDataUtility.TransferSoul(caster, targetPawn);
// 夺舍成功后,原始的抱脸虫应该消失
if (!caster.Destroyed)
{
caster.Destroy(DestroyMode.Vanish);
}
// 6. 技能合并:在灵魂转移后,直接在最终的身体 (targetPawn) 上进行合并
if (targetPawn.skills != null)
{
Log.Message("[夺舍] 开始合并技能...");
foreach (var skillRecord in targetPawn.skills.skills)
{
if (originalTargetSkills.TryGetValue(skillRecord.def, out var originalSkill))
{
// 比较等级
if (originalSkill.level > skillRecord.levelInt)
{
skillRecord.levelInt = originalSkill.level;
}
// 比较热情
if (originalSkill.passion > skillRecord.passion)
{
skillRecord.passion = originalSkill.passion;
}
}
}
Log.Message("[夺舍] 技能合并完成。");
}
// 7. 将Hediff添加到最终身体上
targetPawn.health.AddHediff(hediff);
if (Props.hediffToApplyOnSuccess != null)
{
targetPawn.health.AddHediff(Props.hediffToApplyOnSuccess, null, null);
Log.Message($"[夺舍] 成功为 {targetPawn.LabelShort} 添加额外Hediff: {Props.hediffToApplyOnSuccess.defName}");
}
Log.Message($"[夺舍] {targetPawn.LabelShort} (原 {caster.LabelShort}) 夺舍完成。");
}
else
{
Log.Error($"[夺舍] 无法将 {caster.LabelShort} 的副本存入Hediff。中止操作。");
if(originalCaster != null && !originalCaster.Destroyed) originalCaster.Destroy();
}
}
public void OnJumpCompleted(IntVec3 JUMPINPOS_UNUSED, LocalTargetInfo landingTarget)
{
Pawn caster = this.parent.pawn;
if (caster == null || !(landingTarget.Thing is Pawn targetPawn)) return;
Verb bestMeleeVerb = caster.meleeVerbs.TryGetMeleeVerb(targetPawn);
if (bestMeleeVerb == null)
{
Log.Warning($"[Possess] Caster {caster.LabelShort} has no melee verb.");
return;
}
float damageAmount = bestMeleeVerb.verbProps.AdjustedMeleeDamageAmount(bestMeleeVerb, caster);
float armorPenetration = bestMeleeVerb.verbProps.AdjustedArmorPenetration(bestMeleeVerb, caster);
DamageDef damageDef = bestMeleeVerb.verbProps.meleeDamageDef;
var dinfo = new DamageInfo(damageDef, damageAmount, armorPenetration, -1, caster);
DamageWorker.DamageResult damageResult = targetPawn.TakeDamage(dinfo);
Log.Message($"[Possess] Dealt {damageResult.totalDamageDealt} damage to {targetPawn.LabelShort} using {damageDef.defName}.");
if (damageResult.totalDamageDealt > 0)
{
float baseChance = Props.successChance.RandomInRange;
float bonusFromDamage = damageResult.totalDamageDealt * Props.successChanceBonusPerDamage;
float finalChance = Mathf.Clamp01(baseChance + bonusFromDamage);
Log.Message($"[Possess] Base chance: {baseChance}, Bonus: {bonusFromDamage}, Final chance: {finalChance}");
if (Rand.Chance(finalChance))
{
Log.Message($"[Possess] Success! Applying possession effect.");
DoPossession(caster, targetPawn);
}
else
{
Log.Message($"[Possess] Failed possession check.");
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
using RimWorld;
using Verse;
using System.Collections.Generic;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityPossess : CompProperties_AbilityEffect
{
public FloatRange successChance = new FloatRange(0.6f, 1.0f);
public float successChanceBonusPerDamage = 0.01f;
public List<ThingDef> raceBlacklist = new List<ThingDef>();
// Optional: A hediff to apply to the victim upon successful possession.
public HediffDef hediffToApplyOnSuccess;
public CompProperties_AbilityPossess()
{
this.compClass = typeof(CompAbilityEffect_Possess);
}
}
}

View File

@@ -6,14 +6,15 @@ namespace ArachnaeSwarm
{
public class Hediff_Possession : HediffWithComps, IThingHolder
{
private ThingOwner innerContainer;
public ThingOwner casterContainer;
public OriginalPawnData originalHostData;
public Hediff_Possession()
{
this.innerContainer = new ThingOwner<Thing>(this, false, LookMode.Deep);
this.casterContainer = new ThingOwner<Thing>(this, false, LookMode.Deep);
}
public Pawn StoredCasterPawn => innerContainer.Count > 0 ? innerContainer[0] as Pawn : null;
public Pawn StoredCasterPawn => casterContainer.Count > 0 ? casterContainer[0] as Pawn : null;
public IThingHolder ParentHolder => this.pawn;
@@ -24,7 +25,7 @@ namespace ArachnaeSwarm
public ThingOwner GetDirectlyHeldThings()
{
return innerContainer;
return casterContainer;
}
// PostAdd现在只在游戏加载时起作用我们不需要在这里做任何特殊操作。
@@ -37,19 +38,36 @@ namespace ArachnaeSwarm
Pawn deadBody = this.pawn;
Pawn storedCaster = this.StoredCasterPawn;
if (storedCaster == null)
if (originalHostData != null)
{
Log.Message($"[夺舍结束] 正在将 {deadBody.LabelShort}'s 的灵魂恢复为原始宿主数据。");
originalHostData.RestoreData(deadBody);
// 恢复数据后移除可能存在的无人机Hediff
Hediff droneHediff = deadBody.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindDrone"));
if (droneHediff != null)
{
deadBody.health.RemoveHediff(droneHediff);
Log.Message($"[夺舍结束] 已从 {deadBody.LabelShort} 的尸体上移除 ARA_HiveMindDrone Hediff。");
}
}
else
{
Log.Error("Possessed pawn died, but no original host data was found to restore.");
}
if (storedCaster != null)
{
EjectCaster();
}
else
{
Log.Error("Possessed pawn died, but no caster soul was found inside.");
return;
}
Log.Message($"Host {deadBody.LabelShort} died. Transferring experience back to {storedCaster.LabelShort} and ejecting.");
PawnDataUtility.TransferSoul(deadBody, storedCaster);
this.EjectContents();
}
public void EjectContents()
public void EjectCaster()
{
if (StoredCasterPawn == null) return;
@@ -68,13 +86,14 @@ namespace ArachnaeSwarm
}
Log.Message($"[夺舍] 准备在地图 {map.ToString()} 的位置 {cell.ToString()} 处重生 {StoredCasterPawn.LabelShort}。");
this.innerContainer.TryDropAll(cell, map, ThingPlaceMode.Near);
this.casterContainer.TryDropAll(cell, map, ThingPlaceMode.Near);
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Deep.Look(ref innerContainer, "innerContainer", this);
Scribe_Deep.Look(ref casterContainer, "casterContainer", this);
Scribe_Deep.Look(ref originalHostData, "originalHostData");
}
}
}

View File

@@ -0,0 +1,180 @@
using RimWorld;
using Verse;
using System.Collections.Generic;
using System.Linq;
using RimWorld.Planet;
namespace ArachnaeSwarm
{
// A container for all essential data of a pawn that needs to be restored.
public class OriginalPawnData : IExposable
{
// Core Identity
public Name name;
public BackstoryDef childhood;
public BackstoryDef adulthood;
public List<Trait> traits = new List<Trait>();
public Faction faction;
// Growth & Experience
public List<SkillRecordData> skills = new List<SkillRecordData>();
// Mind & Settings
public List<Thought_Memory> memories = new List<Thought_Memory>();
public Dictionary<WorkTypeDef, int> workSettings = new Dictionary<WorkTypeDef, int>();
public List<TimeAssignmentDef> timetable;
public HostilityResponseMode hostilityResponse;
public MedicalCareCategory medCare;
public bool selfTend;
public ApparelPolicy apparelPolicy;
public DrugPolicy drugPolicy;
public FoodPolicy foodPolicy;
// DLC & Social
public Ideo ideo;
public List<RoyalTitleData> royalTitles = new List<RoyalTitleData>();
public void ExposeData()
{
Scribe_Deep.Look(ref name, "name");
Scribe_Defs.Look(ref childhood, "childhood");
Scribe_Defs.Look(ref adulthood, "adulthood");
Scribe_Collections.Look(ref traits, "traits", LookMode.Deep);
Scribe_References.Look(ref faction, "faction");
Scribe_Collections.Look(ref skills, "skills", LookMode.Deep);
Scribe_Collections.Look(ref memories, "memories", LookMode.Deep);
Scribe_Collections.Look(ref workSettings, "workSettings", LookMode.Def, LookMode.Value);
Scribe_Collections.Look(ref timetable, "timetable", LookMode.Def);
Scribe_Values.Look(ref hostilityResponse, "hostilityResponse");
Scribe_Values.Look(ref medCare, "medCare");
Scribe_Values.Look(ref selfTend, "selfTend");
Scribe_References.Look(ref apparelPolicy, "apparelPolicy");
Scribe_References.Look(ref drugPolicy, "drugPolicy");
Scribe_References.Look(ref foodPolicy, "foodPolicy");
if (ModsConfig.IdeologyActive) Scribe_References.Look(ref ideo, "ideo");
if (ModsConfig.RoyaltyActive)
{
Scribe_Collections.Look(ref royalTitles, "royalTitles", LookMode.Deep);
}
}
// Populates this object with data from a living pawn.
public void CaptureData(Pawn pawn)
{
this.name = pawn.Name;
this.childhood = pawn.story.Childhood;
this.adulthood = pawn.story.Adulthood;
this.traits = new List<Trait>(pawn.story.traits.allTraits);
this.faction = pawn.Faction;
this.skills = pawn.skills.skills.Select(s => new SkillRecordData
{
def = s.def,
level = s.levelInt,
xpSinceLastLevel = s.xpSinceLastLevel,
passion = s.passion
}).ToList();
if (pawn.needs?.mood?.thoughts?.memories != null) this.memories = new List<Thought_Memory>(pawn.needs.mood.thoughts.memories.Memories);
if (pawn.workSettings != null) this.workSettings = DefDatabase<WorkTypeDef>.AllDefs.ToDictionary(def => def, def => pawn.workSettings.GetPriority(def));
if (pawn.timetable != null) this.timetable = new List<TimeAssignmentDef>(pawn.timetable.times);
if (pawn.playerSettings != null)
{
this.hostilityResponse = pawn.playerSettings.hostilityResponse;
this.medCare = pawn.playerSettings.medCare;
this.selfTend = pawn.playerSettings.selfTend;
}
if (pawn.outfits != null) this.apparelPolicy = pawn.outfits.CurrentApparelPolicy;
if (pawn.drugs != null) this.drugPolicy = pawn.drugs.CurrentPolicy;
if (pawn.foodRestriction != null) this.foodPolicy = pawn.foodRestriction.CurrentFoodPolicy;
if (ModsConfig.IdeologyActive && pawn.ideo != null) this.ideo = pawn.ideo.Ideo;
if (ModsConfig.RoyaltyActive && pawn.royalty != null)
{
this.royalTitles = pawn.royalty.AllTitlesForReading.Select(t => new RoyalTitleData { defName = t.def.defName, faction = t.faction }).ToList();
}
}
// Applies the stored data back to a living pawn.
public void RestoreData(Pawn pawn)
{
pawn.Name = this.name;
pawn.story.Childhood = this.childhood;
pawn.story.Adulthood = this.adulthood;
pawn.story.traits.allTraits.Clear();
this.traits.ForEach(t => pawn.story.traits.GainTrait(t));
if (pawn.Faction != this.faction) pawn.SetFaction(this.faction);
pawn.skills.skills.Clear();
this.skills.ForEach(s => pawn.skills.skills.Add(new SkillRecord(pawn, s.def) { levelInt = s.level, xpSinceLastLevel = s.xpSinceLastLevel, passion = s.passion }));
if (pawn.needs?.mood?.thoughts?.memories != null)
{
pawn.needs.mood.thoughts.memories.Memories.Clear();
this.memories.ForEach(m => pawn.needs.mood.thoughts.memories.TryGainMemory(m));
}
if (pawn.workSettings != null)
{
pawn.workSettings.EnableAndInitialize();
foreach(var ws in this.workSettings) pawn.workSettings.SetPriority(ws.Key, ws.Value);
}
if (pawn.timetable != null) pawn.timetable.times = new List<TimeAssignmentDef>(this.timetable);
if (pawn.playerSettings != null)
{
pawn.playerSettings.hostilityResponse = this.hostilityResponse;
pawn.playerSettings.medCare = this.medCare;
pawn.playerSettings.selfTend = this.selfTend;
}
if (pawn.outfits != null) pawn.outfits.CurrentApparelPolicy = this.apparelPolicy;
if (pawn.drugs != null) pawn.drugs.CurrentPolicy = this.drugPolicy;
if (pawn.foodRestriction != null) pawn.foodRestriction.CurrentFoodPolicy = this.foodPolicy;
if (ModsConfig.IdeologyActive && pawn.ideo != null && this.ideo != null) pawn.ideo.SetIdeo(this.ideo);
if (ModsConfig.RoyaltyActive && pawn.royalty != null)
{
pawn.royalty.AllTitlesForReading.Clear();
pawn.royalty.AllFactionPermits.Clear(); // Clear existing permits on the body
this.royalTitles.ForEach(t => {
RoyalTitleDef titleDef = DefDatabase<RoyalTitleDef>.GetNamed(t.defName, false);
if (titleDef != null)
{
pawn.royalty.SetTitle(t.faction, titleDef, true, false, false);
}
});
pawn.royalty.UpdateAvailableAbilities();
}
pawn.Drawer.renderer.SetAllGraphicsDirty();
}
}
public class SkillRecordData : IExposable
{
public SkillDef def;
public int level;
public float xpSinceLastLevel;
public Passion passion;
public void ExposeData()
{
Scribe_Defs.Look(ref def, "def");
Scribe_Values.Look(ref level, "level");
Scribe_Values.Look(ref xpSinceLastLevel, "xpSinceLastLevel");
Scribe_Values.Look(ref passion, "passion");
}
}
public class RoyalTitleData : IExposable
{
public Faction faction;
public string defName;
public void ExposeData()
{
Scribe_References.Look(ref faction, "faction");
Scribe_Values.Look(ref defName, "defName");
}
}
}

View File

@@ -17,6 +17,9 @@ namespace ArachnaeSwarm
Log.Message($"Beginning soul transfer from {soulSource.LabelShort} to {bodyTarget.LabelShort}.");
bool isPossessing = soulSource.def.defName == "ARA_HuggingFace";
Log.Message(isPossessing ? "[夺舍] 模式:抱脸虫 -> 宿主" : "[回归] 模式:宿主 -> 抱脸虫");
// --- 1. Core Identity ---
bodyTarget.Name = soulSource.Name;
bodyTarget.story.Childhood = soulSource.story.Childhood;
@@ -37,6 +40,7 @@ namespace ArachnaeSwarm
}
// --- 2. Growth & Experience ---
// 技能合并逻辑已移出,这里只做纯粹的数据覆盖
if (bodyTarget.skills != null) bodyTarget.skills.skills.Clear();
if (soulSource.skills != null)
{
@@ -52,6 +56,7 @@ namespace ArachnaeSwarm
}
}
if (bodyTarget.records != null && soulSource.records != null)
{
foreach (RecordDef recordDef in DefDatabase<RecordDef>.AllDefs)

View File

@@ -0,0 +1,72 @@
using RimWorld;
using RimWorld.Utility;
using UnityEngine;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class Verb_JumpAndCastOnLanding : Verb_CastAbility
{
// 1. A private field to store our specific target, separate from what the base class does.
private LocalTargetInfo capturedTarget;
// 2. Capture the reliable target information early.
public override bool TryStartCastOn(LocalTargetInfo castTarg, LocalTargetInfo destTarg, bool surpriseAttack = false, bool canHitNonTargetPawns = true, bool preventFriendlyFire = false, bool nonInterruptingSelfCast = false)
{
Log.Message($"[Verb_JumpAndCastOnLanding] TryStartCastOn: Capturing our dedicated target: {castTarg.Thing?.LabelShort ?? "null"}.");
this.capturedTarget = castTarg;
return base.TryStartCastOn(castTarg, destTarg, surpriseAttack, canHitNonTargetPawns, preventFriendlyFire, nonInterruptingSelfCast);
}
// --- Copied and adapted methods from Verb_CastAbilityJump ---
public virtual ThingDef JumpFlyerDef => ThingDefOf.PawnFlyer;
public override float EffectiveRange => this.verbProps.range;
public override void DrawHighlight(LocalTargetInfo target)
{
if (target.IsValid && JumpUtility.ValidJumpTarget(CasterPawn, caster.Map, target.Cell))
{
GenDraw.DrawTargetHighlightWithLayer(target.CenterVector3, AltitudeLayer.MetaOverlays);
}
GenDraw.DrawRadiusRing(caster.Position, EffectiveRange, Color.white, (IntVec3 c) => GenSight.LineOfSight(caster.Position, c, caster.Map) && JumpUtility.ValidJumpTarget(caster, caster.Map, c));
}
public override bool ValidateTarget(LocalTargetInfo target, bool showMessages = true)
{
if (!base.ValidateTarget(target, showMessages)) return false;
if (!JumpUtility.ValidJumpTarget(CasterPawn, caster.Map, target.Cell)) return false;
return true;
}
// --- Our custom implementation of TryCastShot ---
protected override bool TryCastShot()
{
// The physical destination for the jump. This might be adjusted by the game. We let it be.
LocalTargetInfo physicalTarget = this.currentTarget;
// Our dedicated logical target, captured earlier and guaranteed to be the Pawn.
LocalTargetInfo logicalTargetForUs = this.capturedTarget;
if (logicalTargetForUs == null || !logicalTargetForUs.HasThing)
{
Log.Error($"[Verb_JumpAndCastOnLanding] TryCastShot: Our captured target is invalid!");
return false;
}
Log.Message($"[Verb_JumpAndCastOnLanding] TryCastShot: Using our captured target '{logicalTargetForUs.Thing.LabelShort}' for logic, and letting game use '{physicalTarget.Cell}' for jump physics.");
bool jumpStarted = JumpUtility.DoJump(
CasterPawn,
physicalTarget, // For the jump itself
this.ReloadableCompSource,
verbProps,
this.ability,
logicalTargetForUs, // For our logic on landing
this.JumpFlyerDef
);
return jumpStarted;
}
}
}

View File

@@ -0,0 +1,33 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityResearchPrereq : CompProperties_AbilityEffect
{
public ResearchProjectDef requiredResearch;
public string failMessage = "Research not completed.";
public CompProperties_AbilityResearchPrereq()
{
compClass = typeof(CompAbilityEffect_ResearchPrereq);
}
}
public class CompAbilityEffect_ResearchPrereq : CompAbilityEffect
{
public new CompProperties_AbilityResearchPrereq Props => (CompProperties_AbilityResearchPrereq)props;
public override bool GizmoDisabled(out string reason)
{
if (Props.requiredResearch != null && !Props.requiredResearch.IsFinished)
{
reason = Props.failMessage;
return true;
}
reason = null;
return false;
}
}
}

View File

@@ -0,0 +1,16 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
[DefOf]
public static class ARA_TrainableDefOf_Cleaning
{
public static TrainableDef ARA_Cleaning;
static ARA_TrainableDefOf_Cleaning()
{
DefOfHelper.EnsureInitializedInCtor(typeof(ARA_TrainableDefOf_Cleaning));
}
}
}

View File

@@ -0,0 +1,53 @@
using Verse;
using Verse.AI;
using RimWorld;
namespace ArachnaeSwarm
{
public class JobGiver_Cleaner : ThinkNode_JobGiver
{
private WorkGiver_ArachnaeClean _workGiver;
public override void ResolveReferences()
{
base.ResolveReferences();
// We instantiate our custom WorkGiver here.
// It doesn't need a Def because it's not a standard game WorkGiver.
_workGiver = new WorkGiver_ArachnaeClean();
}
protected override Job TryGiveJob(Pawn pawn)
{
if (_workGiver == null)
{
Log.ErrorOnce("JobGiver_Cleaner's WorkGiver is null. ResolveReferences was not called.", 91354);
return null;
}
// The WorkGiver will handle both filth and snow.
// We just need to find the closest potential job.
// The logic is simplified here; the real work is in the WorkGiver.
// Find the closest filth to clean
Thing closestFilth = _workGiver.FindClosestFilth(pawn);
if (closestFilth != null)
{
Job filthJob = _workGiver.JobOnThing(pawn, closestFilth);
if (filthJob != null) return filthJob;
}
// If no filth, check if there's any snow to clear at all before searching
if (pawn.Map.areaManager.SnowOrSandClear.TrueCount > 0)
{
IntVec3 closestSnowCell = _workGiver.FindClosestSnow(pawn);
if (closestSnowCell.IsValid)
{
Job snowJob = _workGiver.JobOnCell(pawn, closestSnowCell);
if (snowJob != null) return snowJob;
}
}
return null;
}
}
}

View File

@@ -0,0 +1,21 @@
using Verse;
using Verse.AI;
using RimWorld;
namespace ArachnaeSwarm
{
public class ThinkNode_ConditionalAnimalShouldDoCleaningWork : ThinkNode_Conditional
{
protected override bool Satisfied(Pawn pawn)
{
if (pawn.training == null)
{
return false;
}
// Check if the animal has learned and is set to perform "Cleaning"
return pawn.training.HasLearned(ARA_TrainableDefOf_Cleaning.ARA_Cleaning) &&
pawn.training.GetWanted(ARA_TrainableDefOf_Cleaning.ARA_Cleaning);
}
}
}

View File

@@ -0,0 +1,99 @@
using System.Collections.Generic;
using Verse;
using Verse.AI;
using RimWorld;
namespace ArachnaeSwarm
{
public class WorkGiver_ArachnaeClean : WorkGiver_Scanner
{
private const int MinTicksSinceThickened = 600;
public override PathEndMode PathEndMode => PathEndMode.Touch;
// --- Filth Cleaning Logic ---
public Thing FindClosestFilth(Pawn pawn)
{
return GenClosest.ClosestThing_Global(
pawn.Position,
pawn.Map.listerFilthInHomeArea.FilthInHomeArea,
maxDistance: 9999f,
validator: t => HasJobOnThing(pawn, t)
);
}
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
{
if (!(t is Filth filth)) return false;
if (!filth.Map.areaManager.Home[filth.Position]) return false;
if (filth.Fogged() || !pawn.CanReserve(t, 1, -1, null, forced)) return false;
if (filth.TicksSinceThickened < MinTicksSinceThickened) return false;
return true;
}
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
{
Job job = JobMaker.MakeJob(JobDefOf.Clean);
job.AddQueuedTarget(TargetIndex.A, t);
// Simplified multi-clean logic from original WorkGiver_CleanFilth
int num = 15;
for (int i = 0; i < 100; i++)
{
IntVec3 c = t.Position + GenRadial.RadialPattern[i];
if (c.InBounds(pawn.Map))
{
List<Thing> thingList = c.GetThingList(pawn.Map);
foreach(var thing in thingList)
{
if (thing != t && HasJobOnThing(pawn, thing, forced))
{
job.AddQueuedTarget(TargetIndex.A, thing);
}
}
}
if (job.GetTargetQueue(TargetIndex.A).Count >= num) break;
}
return job;
}
// --- Snow Clearing Logic ---
public IntVec3 FindClosestSnow(Pawn pawn)
{
IntVec3 bestCell = IntVec3.Invalid;
float bestDistSq = float.MaxValue;
// Efficiently iterate through the designated snow clear area
foreach (IntVec3 cell in pawn.Map.areaManager.SnowOrSandClear.ActiveCells)
{
// Check for a valid job on the cell first
if (HasJobOnCell(pawn, cell))
{
float distSq = pawn.Position.DistanceToSquared(cell);
if (distSq < bestDistSq && pawn.CanReach(cell, PathEndMode.Touch, Danger.Deadly))
{
bestDistSq = distSq;
bestCell = cell;
}
}
}
return bestCell;
}
public override bool HasJobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
{
// The check for SnowOrSandClear area is implicitly handled by the caller (FindClosestSnow)
// We only need to check the snow depth and reservation status.
if (pawn.Map.snowGrid.GetDepth(c) < 0.2f) return false;
if (!pawn.CanReserve(c, 1, -1, null, forced)) return false;
return true;
}
public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
{
return JobMaker.MakeJob(JobDefOf.ClearSnow, c);
}
}
}

View File

@@ -0,0 +1,10 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompAbilityEffect_TrackingCharge : CompAbilityEffect
{
public new CompProperties_TrackingCharge Props => (CompProperties_TrackingCharge)this.props;
}
}

View File

@@ -0,0 +1,23 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_TrackingCharge : CompProperties_AbilityEffect
{
public float homingSpeed = 1.0f;
public float initialDamage = 10f;
public float damagePerTile = 2f;
public float inertiaDistance = 3f;
public DamageDef collisionDamageDef;
public ThingDef flyerDef;
public float collisionRadius = 1.5f;
public SoundDef impactSound;
public bool damageHostileOnly = true;
public CompProperties_TrackingCharge()
{
this.compClass = typeof(CompAbilityEffect_TrackingCharge);
}
}
}

View File

@@ -0,0 +1,157 @@
using RimWorld;
using UnityEngine;
using Verse;
using System.Reflection;
using System.Linq;
using Verse.AI;
using System.Collections.Generic;
using Verse.Sound;
namespace ArachnaeSwarm
{
public class PawnFlyer_TrackingCharge : PawnFlyer
{
// --- Public fields to be set by the Verb ---
public float homingSpeed;
public float initialDamage;
public float damagePerTile;
public float inertiaDistance;
public DamageDef collisionDamageDef;
public LocalTargetInfo primaryTarget;
public float collisionRadius;
public SoundDef impactSound;
public bool damageHostileOnly;
public int maxFlightTicks;
// --- Internal state ---
private bool homing = true;
private bool hasHitPrimaryTarget = false;
private Vector3 exactPosition;
// --- Reflection Fields ---
private static FieldInfo TicksFlyingInfo;
private static FieldInfo TicksFlightTimeInfo;
private static FieldInfo StartVecInfo;
private static FieldInfo DestCellInfo;
private static FieldInfo PawnWasDraftedInfo;
private static FieldInfo PawnCanFireAtWillInfo;
private static FieldInfo JobQueueInfo;
private static FieldInfo InnerContainerInfo;
static PawnFlyer_TrackingCharge()
{
TicksFlyingInfo = typeof(PawnFlyer).GetField("ticksFlying", BindingFlags.Instance | BindingFlags.NonPublic);
TicksFlightTimeInfo = typeof(PawnFlyer).GetField("ticksFlightTime", BindingFlags.Instance | BindingFlags.NonPublic);
StartVecInfo = typeof(PawnFlyer).GetField("startVec", BindingFlags.Instance | BindingFlags.NonPublic);
DestCellInfo = typeof(PawnFlyer).GetField("destCell", BindingFlags.Instance | BindingFlags.NonPublic);
PawnWasDraftedInfo = typeof(PawnFlyer).GetField("pawnWasDrafted", BindingFlags.NonPublic | BindingFlags.Instance);
PawnCanFireAtWillInfo = typeof(PawnFlyer).GetField("pawnCanFireAtWill", BindingFlags.NonPublic | BindingFlags.Instance);
JobQueueInfo = typeof(PawnFlyer).GetField("jobQueue", BindingFlags.NonPublic | BindingFlags.Instance);
InnerContainerInfo = typeof(PawnFlyer).GetField("innerContainer", BindingFlags.NonPublic | BindingFlags.Instance);
}
// Custom initializer called by the Verb
public void StartFlight(Pawn pawn, IntVec3 finalDest)
{
var innerContainer = (ThingOwner)InnerContainerInfo.GetValue(this);
StartVecInfo.SetValue(this, pawn.TrueCenter());
DestCellInfo.SetValue(this, finalDest);
PawnWasDraftedInfo.SetValue(this, pawn.Drafted);
if (pawn.drafter != null) PawnCanFireAtWillInfo.SetValue(this, pawn.drafter.FireAtWill);
if (pawn.CurJob != null) pawn.jobs.SuspendCurrentJob(JobCondition.InterruptForced);
JobQueueInfo.SetValue(this, pawn.jobs.CaptureAndClearJobQueue());
if (pawn.Spawned) pawn.DeSpawn(DestroyMode.WillReplace);
if (!innerContainer.TryAdd(pawn))
{
Log.Error("Could not add pawn to tracking flyer.");
pawn.Destroy();
}
}
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
base.SpawnSetup(map, respawningAfterLoad);
if (!respawningAfterLoad)
{
this.exactPosition = base.DrawPos;
}
}
protected override void Tick()
{
// --- THE CORRECT APPROACH ---
// Let the base class handle all flight mechanics (position, timing, etc.)
// We only intervene to do two things:
// 1. Continuously update the destination to "steer" the flyer.
// 2. Perform our own collision checks (for primary target and AOE).
if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned)
{
// Steer the flyer by constantly updating its destination cell.
DestCellInfo.SetValue(this, primaryTarget.Thing.Position);
}
// --- Primary Target Collision Check ---
if (!hasHitPrimaryTarget && primaryTarget.HasThing && primaryTarget.Thing.Spawned)
{
if ((this.DrawPos - primaryTarget.Thing.DrawPos).sqrMagnitude < this.collisionRadius * this.collisionRadius)
{
// --- Impact! ---
if (this.impactSound != null)
{
SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.Position, this.Map));
}
Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this);
float distance = (this.DrawPos - startPosition).magnitude;
float calculatedDamage = this.initialDamage + (distance * this.damagePerTile);
var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn);
primaryTarget.Thing.TakeDamage(dinfo);
hasHitPrimaryTarget = true;
homing = false;
Vector3 direction = (this.DrawPos - startPosition).normalized;
IntVec3 inertiaEndPos = (this.DrawPos + (direction * this.inertiaDistance)).ToIntVec3();
DestCellInfo.SetValue(this, inertiaEndPos);
}
}
// --- AOE Damage Logic ---
float distanceTravelled = ((Vector3)StartVecInfo.GetValue(this) - this.DrawPos).magnitude;
float currentAOEDamage = this.initialDamage + (distanceTravelled * this.damagePerTile);
foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, this.collisionRadius, false))
{
if (thing != this.FlyingPawn && thing != this && thing != primaryTarget.Thing)
{
if (thing is Pawn pawn && !pawn.Downed)
{
if (!this.damageHostileOnly || pawn.HostileTo(this.FlyingPawn))
{
var aoeDinfo = new DamageInfo(this.collisionDamageDef, currentAOEDamage, 1f, -1, this.FlyingPawn);
pawn.TakeDamage(aoeDinfo);
}
}
else if (thing.def.destroyable && thing.def.building != null)
{
var aoeDinfo = new DamageInfo(this.collisionDamageDef, currentAOEDamage, 1f, -1, this.FlyingPawn);
thing.TakeDamage(aoeDinfo);
}
}
}
// Let the base class do its thing. This is crucial.
base.Tick();
}
protected override void RespawnPawn()
{
// This is the correct place to call the base method.
base.RespawnPawn();
}
}
}

View File

@@ -0,0 +1,67 @@
using RimWorld;
using Verse;
using System.Linq;
namespace ArachnaeSwarm
{
public class Verb_CastAbilityTrackingCharge : Verb_CastAbility
{
protected override bool TryCastShot()
{
var props = this.ability.def.comps?.OfType<CompProperties_TrackingCharge>().FirstOrDefault();
if (props == null)
{
Log.Error("Verb_CastAbilityTrackingCharge requires CompProperties_TrackingCharge on the ability def.");
return false;
}
if (props.flyerDef == null)
{
Log.Error("CompProperties_TrackingCharge requires a flyerDef.");
return false;
}
// --- Best Practice: Cache Map and Position FIRST ---
// Per MCP analysis, Caster.Map is the most reliable source.
// Cache this before ANY other logic.
Map map = this.Caster.Map;
if (map == null)
{
Log.Error($"Verb_CastAbilityTrackingCharge: Caster {this.Caster.LabelCap} has a null map. Cannot cast.");
return false;
}
if (this.CasterPawn == null || !this.CasterPawn.Spawned)
{
return false;
}
// --- This is now a fully custom Thing, so we spawn it directly ---
var trackingCharge = (PawnFlyer_TrackingCharge)ThingMaker.MakeThing(props.flyerDef);
// Inject properties
trackingCharge.homingSpeed = props.homingSpeed;
trackingCharge.initialDamage = props.initialDamage;
trackingCharge.damagePerTile = props.damagePerTile;
trackingCharge.inertiaDistance = props.inertiaDistance;
trackingCharge.collisionDamageDef = props.collisionDamageDef;
trackingCharge.primaryTarget = this.currentTarget;
trackingCharge.collisionRadius = props.collisionRadius;
trackingCharge.impactSound = props.impactSound;
trackingCharge.damageHostileOnly = props.damageHostileOnly;
// Setup and spawn
trackingCharge.StartFlight(this.CasterPawn, this.currentTarget.Cell);
GenSpawn.Spawn(trackingCharge, this.CasterPawn.Position, map); // Use the cached map
// --- FIX for Comp Effects ---
// --- The Standard Pattern to trigger Comps like EffecterOnCaster ---
// After our custom verb logic (spawning the flyer) is done,
// we call the ability's Activate method with invalid targets.
// This triggers the standard Comp cycle without re-casting the verb.
this.ability.Activate(LocalTargetInfo.Invalid, LocalTargetInfo.Invalid);
return true;
}
}
}

View File

@@ -73,27 +73,31 @@
<Compile Include="ARA_SpawnPawnFromList\JobDriver_Incubate.cs" />
<Compile Include="ARA_QueenAbility\CompProperties_AbilitySprayLiquidMulti.cs" />
<Compile Include="ARA_QueenAbility\CompAbilityEffect_SprayLiquidMulti.cs" />
<Compile Include="Hediffs\Hediff_CurseFlame.cs" />
<Compile Include="DRM_HediffCurseFlame\Hediff_CurseFlame.cs" />
<Compile Include="ARA_QueenAbility\CompAbilityEffect_NeedCost.cs" />
<Compile Include="ARA_QueenAbility\CompAbilityEffect_BodyPartCheck.cs" />
<Compile Include="ARA_QueenAbility\CompAbilityEffect_ResearchPrereq.cs" />
<Compile Include="ARA_HiveMind\Hediff_HiveMindMaster.cs" />
<Compile Include="ARA_HiveMind\Hediff_HiveMindDrone.cs" />
<Compile Include="ARA_HiveMind\HediffCompProperties_HiveMindDrone.cs" />
<Compile Include="ARA_HiveMind\HediffComp_HiveMindDrone.cs" />
<Compile Include="ARA_HiveMind\HediffComp_HiveMindMaster.cs" />
<Compile Include="ARA_HiveMind\CompAbilityEffect_BindDrone.cs" />
<Compile Include="ARA_HiveMind\CompProperties_AbilityBindDrone.cs" />
<Compile Include="JobGiver_MaintainBuildings.cs" />
<Compile Include="ARA_SpawnPawnFromList\JobGiver_MaintainBuildings.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Work\CompMilkableArachnae.cs" />
<Compile Include="Work\CompProperties_MilkableArachnae.cs" />
<Compile Include="ARA_CompHediffGiver\CompHediffGiver.cs" />
<Compile Include="ARA_CompHediffGiver\CompProperties_HediffGiver.cs" />
<Compile Include="ARA_CompMilkableArachnae\CompMilkableArachnae.cs" />
<Compile Include="ARA_CompMilkableArachnae\CompProperties_MilkableArachnae.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainHarmony.cs" />
<Compile Include="ARA_TrainingWork\ThinkNode_ConditionalAnimalShouldDoGrowingWork.cs" />
<Compile Include="ARA_TrainingWork\JobPlant\ThinkNode_ConditionalAnimalShouldDoGrowingWork.cs" />
<Compile Include="ARA_TrainingWork\CompAdvancedTraining.cs" />
<Compile Include="ARA_TrainingWork\JobGiver_Grower.cs" />
<Compile Include="ARA_TrainingWork\WorkGiver_ArachnaeSow.cs" />
<Compile Include="ARA_TrainingWork\JobPlant\JobGiver_Grower.cs" />
<Compile Include="ARA_TrainingWork\JobPlant\WorkGiver_ArachnaeSow.cs" />
<Compile Include="ARA_TrainingWork\TrainingSystem_Patcher.cs" />
</ItemGroup>
<ItemGroup>
@@ -106,17 +110,34 @@
<Compile Include="WULA_AutoMechCarrier\PawnProductionEntry.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="CompInteractiveProducer.cs" />
<Compile Include="JobDriver_StartProduction.cs" />
<Compile Include="CompRefuelableNutrition.cs" />
<Compile Include="DataContracts.cs" />
<Compile Include="CompTemperatureRuinableDamage.cs" />
<Compile Include="ARA_CompInteractiveProducer\CompInteractiveProducer.cs" />
<Compile Include="ARA_CompInteractiveProducer\JobDriver_StartProduction.cs" />
<Compile Include="ARA_CompInteractiveProducer\CompRefuelableNutrition.cs" />
<Compile Include="ARA_CompInteractiveProducer\DataContracts.cs" />
<Compile Include="ARA_CompInteractiveProducer\CompTemperatureRuinableDamage.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Possession\Hediff_Possession.cs" />
<Compile Include="Possession\PawnDataUtility.cs" />
<Compile Include="Possession\CompAbilityEffect_Possess.cs" />
<Compile Include="Possession\CompProperties_AbilityPossess.cs" />
<Compile Include="ARA_HuggingFace\Hediff_Possession.cs" />
<Compile Include="ARA_HuggingFace\PawnDataUtility.cs" />
<Compile Include="ARA_HuggingFace\CompAbilityEffect_Possess.cs" />
<Compile Include="ARA_HuggingFace\CompProperties_AbilityPossess.cs" />
<Compile Include="ARA_HuggingFace\Verb_JumpAndCastOnLanding.cs" />
<Compile Include="ARA_HuggingFace\OriginalPawnData.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="ARA_TrainingWork\JobClean\ARA_TrainableDefOf_Cleaning.cs" />
<Compile Include="ARA_TrainingWork\JobClean\JobGiver_Cleaner.cs" />
<Compile Include="ARA_TrainingWork\JobClean\ThinkNode_ConditionalAnimalShouldDoCleaningWork.cs" />
<Compile Include="ARA_TrainingWork\JobClean\WorkGiver_ArachnaeClean.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="HediffComp_Temperature.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" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- 自定义清理任务删除obj文件夹中的临时文件 -->

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