14 Commits

Author SHA1 Message Date
ProjectKoi-Kalo\Kalo
f3381f5d62 暂存翻译 2025-09-01 20:54:36 +08:00
ProjectKoi-Kalo\Kalo
e6d855924f 暂存 2025-09-01 20:39:33 +08:00
ProjectKoi-Kalo\Kalo
315156f705 暂存 2025-09-01 19:34:25 +08:00
ProjectKoi-Kalo\Kalo
5330c9e84f Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-01 18:52:43 +08:00
ProjectKoi-Kalo\Kalo
9e75459d1f 节点虫暂存 2025-09-01 18:52:40 +08:00
Tourswen
d10cb48592 修红字 2025-09-01 18:30:01 +08:00
Tourswen
d72909063f 调整文件位置 2025-09-01 17:28:55 +08:00
Tourswen
dd6ddccc9a Merge branch 'master' of https://git.ra3battle.cn/Kalospacer/ArachnaeSwarm 2025-09-01 17:24:54 +08:00
Tourswen
b218494149 女皇种背景、描述、技能修改 2025-09-01 17:23:15 +08:00
ProjectKoi-Kalo\Kalo
9ab3300ac6 暂存 2025-09-01 16:56:48 +08:00
ProjectKoi-Kalo\Kalo
e58fac54f8 存食物需求的ability 2025-09-01 16:42:08 +08:00
Tourswen
3203db0728 Update ARA_Bodyparts.xml 2025-09-01 15:03:54 +08:00
Tourswen
0d53f76a98 Update ARA_Bodyparts.xml 2025-09-01 15:00:40 +08:00
ProjectKoi-Kalo\Kalo
fc51e18424 调吐酸 2025-09-01 14:16:51 +08:00
29 changed files with 2035 additions and 1048 deletions

Binary file not shown.

View File

@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<AbilityDef>
<AbilityDef>
<defName>ARA_EggSpew</defName>
<label>生育虫卵</label>
<description>向目标区域发射一个卵囊和酸性污泥喷射。污泥会粘在目标上并灼烧它们</description>
<description>从卵巢中排出一颗休眠的虫卵,阿拉克涅女皇种可以通过与其交互将其激活,并选择孵化的督虫虫族类型——参阅虫卵的具体信息,了解各个督虫的特点</description>
<iconPath>UI/Commands/EggSpew</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange> <!-- 2 hours -->
<cooldownTicksRange>5000</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
@@ -14,24 +13,34 @@
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<range>14.9</range>
<warmupTime>0.25</warmupTime>
<range>1</range>
<warmupTime>12</warmupTime>
<soundCast>AcidSpray_Resolve</soundCast>
<violent>false</violent>
<targetable>false</targetable>
<targetParams>
<canTargetLocations>true</canTargetLocations>
<canTargetSelf>True</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="CompProperties_AbilityLaunchProjectile">
<projectileDef>ARA_Proj_EggSac</projectileDef>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>4</needCost>
<failMessage>食物不足</failMessage>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityBodyPartCheck">
<requiredPart>ARA_Ovary</requiredPart>
<failMessage>卵巢受损或缺失,无法生育</failMessage>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_AcidSprayBurst</defName>
<label>酸液连射</label>
<description>快速连续喷射多次腐蚀性酸液,覆盖一片区域。</description>
<label>女皇种酸液轰炸</label>
<description>阿拉克涅女皇种向目标地点喷射大量腐蚀性酸液,喷射将持续数秒以完全覆盖一片区域。</description>
<iconPath>UI/Abilities/AcidSpray</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange> <!-- 2 hours -->
<aiCanUse>true</aiCanUse>
@@ -52,13 +61,18 @@
<li Class="ArachnaeSwarm.CompProperties_AbilitySprayLiquidMulti">
<!-- CompProperties_AbilitySprayLiquid 的属性 -->
<projectileDef>ARA_Proj_StrongSludgeSpray</projectileDef>
<numCellsToHit>6</numCellsToHit>
<numCellsToHit>13</numCellsToHit>
<sprayEffecter>AcidSpray_Directional</sprayEffecter>
<!-- CompProperties_AbilitySprayLiquidMulti 新增的属性 -->
<shotCount>32</shotCount> <!-- 总共发射5次 -->
<ticksBetweenShots>3</ticksBetweenShots> <!-- 每次发射间隔12 Ticks (0.2秒) -->
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<needDef>Food</needDef>
<needCost>0.5</needCost>
<failMessage>食物不足</failMessage>
</li>
</comps>
</AbilityDef>
@@ -78,7 +92,7 @@
<drawSize>0.85</drawSize>
</graphicData>
<projectile>
<damageDef>AcidBurn</damageDef>
<damageDef>ARA_AcidBurn</damageDef>
<speed>25</speed>
<damageAmountBase>18</damageAmountBase>
<arcHeightFactor>0.4</arcHeightFactor>
@@ -108,5 +122,4 @@
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
</projectile>
</ThingDef>
</Defs>
</Defs>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<AbilityDef ParentName="AbilityTouchBase">
<defName>ARA_BindDrone</defName>
<label>虫群联结</label>
<description>Allows the hive mind master to bind with an unlinked drone, bringing it under direct psychic control.</description>
<iconPath>UI/Commands/EggSpew</iconPath> <!-- Placeholder: You'll need to create this icon -->
<jobDef>CastAbilityOnThing</jobDef>
<targetRequired>true</targetRequired>
<cooldownTicksRange>60</cooldownTicksRange> <!-- 1 second cooldown -->
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>0.5</warmupTime>
<range>99</range> <!-- Short range, like touch -->
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>true</canTargetAnimals>
<canTargetMechs>false</canTargetMechs>
<canTargetCorpses>false</canTargetCorpses>
<canTargetSelf>false</canTargetSelf>
</targetParams>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityBindDrone">
<!-- No custom properties needed for now -->
</li>
</comps>
</AbilityDef>
</Defs>

View File

@@ -1,39 +1,77 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<AlienRace.AlienBackstoryDef Name="DragonianBackStory" Abstract="True">
<bodyTypeMale>ARA_QUEEN_Thin</bodyTypeMale>
<bodyTypeFemale>ARA_QUEEN_Thin</bodyTypeFemale>
<AlienRace.AlienBackstoryDef Name="ARA_BaseBackStory" Abstract="True">
<requiresSpawnCategory>true</requiresSpawnCategory>
</AlienRace.AlienBackstoryDef>
<!-- 일반 --> <!-- 유년기 -->
<AlienRace.AlienBackstoryDef>
<defName>Arachnae_BS</defName>
<title>阿拉克涅虫族</title>
<titleShort>阿拉克涅虫族</titleShort>
<description>[PAWN_nameDef]是阿拉克涅虫族.</description>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Queen_BS_Child_1</defName>
<title>本能猎手</title>
<titleShort>本能猎手</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅虫族女皇种,她与上百个姐妹一起降生并被封闭在繁育腔室中。\n\n当封堵女皇种繁育腔室的蜂蜡被工蜂打开时[PAWN_nameDef]屹立于腔室之中——浑身沾满血液和组织液,脚下踏着姐妹们残破的肢体和身躯——她是毫无疑问的从生存游戏中胜出的唯一赢家。</description>
<slot>Childhood</slot>
<skillGains>
<Shooting>2</Shooting>
<Melee>2</Melee>
</skillGains>
<forcedHediffs>
<li>ARA_HiveMindMaster</li>
</forcedHediffs>
<spawnCategories>
<li>ArachnaeQueen_spawnCategoriesA</li>
</spawnCategories>
<requiresSpawnCategory>true</requiresSpawnCategory>
</AlienRace.AlienBackstoryDef>
<!-- 일반 --> <!-- 성년기 -->
<AlienRace.AlienBackstoryDef ParentName="DragonianBackStory">
<defName>Arachnae_BS_B</defName>
<title>阿拉克涅女皇种</title>
<titleShort>阿拉克涅女皇种</titleShort>
<description>[PAWN_nameDef]是阿拉克涅女皇种.</description>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Queen_BS_Adult_1</defName>
<title>王道征途</title>
<titleShort>王道征途</titleShort>
<description>[PAWN_nameDef]顺利地在虫巢中长大后,她离开了生养她的巢穴并来到一片陌生的地域,着手准备建立自己的势力。\n\n[PAWN_nameDef]知道自己势单力薄,比起其他娇生惯养的姐妹,她在很多事情上更愿意亲力亲为。</description>
<slot>Adulthood</slot>
<skillGains>
<Shooting>3</Shooting>
<Melee>3</Melee>
<Medicine>3</Medicine>
<Intellectual>3</Intellectual>
<Social>3</Social>
</skillGains>
<workDisables>ManualDumb,Mining,PlantWork,Animals,Crafting,Cooking,Constructing,Hunting</workDisables>
<spawnCategories>
<li>ArachnaeQueen_spawnCategoriesB</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Child_1</defName>
<title>阿拉克涅虫族</title>
<titleShort>阿拉克涅虫族</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅虫族。</description>
<slot>Childhood</slot>
<spawnCategories>
<li>ArachnaeNode_spawnCategoriesA</li>
</spawnCategories>
<forcedHediffs>
<li>ARA_HiveMindDrone</li>
</forcedHediffs>
<requiresSpawnCategory>true</requiresSpawnCategory>
</AlienRace.AlienBackstoryDef>
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
<defName>Arachnae_Node_BS_Adult_1</defName>
<title>阿拉克涅督虫种</title>
<titleShort>阿拉克涅督虫种</titleShort>
<description>[PAWN_nameDef]是一只阿拉克涅督虫种。</description>
<slot>Adulthood</slot>
<spawnCategories>
<li>ArachnaeNode_spawnCategoriesB</li>
</spawnCategories>
</AlienRace.AlienBackstoryDef>
</Defs>

View File

@@ -14,7 +14,7 @@
<!-- 背部组织,仅包含骨骼和甲片 -->
<li>
<def>ARA_Dorsum</def>
<coverage>0.036</coverage>
<coverage>0</coverage>
<groups>
<li>Torso</li>
</groups>
@@ -42,7 +42,7 @@
<!-- 胸部组织,包含骨骼和各类重点维生器官 -->
<li>
<def>ARA_Sternum</def>
<coverage>0.036</coverage>
<coverage>0</coverage>
<groups>
<li>Torso</li>
</groups>
@@ -74,7 +74,7 @@
<li>Torso</li>
</groups>
</li>
<!---->
<!--,4个 -->
<li>
<def>Lung</def>
<customLabel>左肺(其一)</customLabel>
@@ -111,7 +111,7 @@
<li>Torso</li>
</groups>
</li>
<!-- 肾脏 -->
<!-- 肾脏,2个 -->
<li>
<def>Kidney</def>
<customLabel>left kidney</customLabel>
@@ -130,7 +130,7 @@
<li>Torso</li>
</groups>
</li>
<!-- 肝脏 -->
<!-- 肝脏,2个 -->
<li>
<def>Liver</def>
<coverage>0.025</coverage>
@@ -154,13 +154,43 @@
<!-- 尾部组织群 -->
<li>
<def>ARA_Tail</def>
<coverage>0.025</coverage>
<coverage>0</coverage>
<height>Bottom</height>
<depth>Inside</depth>
<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_Gonad</def>
<coverage>0.005</coverage>
<depth>Outside</depth>
<groups>
<li>ARA_Genitalias</li>
</groups>
</li>
<!-- 卵巢 -->
<li>
<def>ARA_Ovary</def>
<coverage>0.01</coverage>
<depth>Outside</depth>
<groups>
<li>ARA_Genitalias</li>
</groups>
</li>
</parts>
</li>
<!-- 脖子往上头部 -->
<li>
<def>Neck</def>
<coverage>0.075</coverage>
@@ -178,6 +208,15 @@
<li>HeadAttackTool</li>
</groups>
<parts>
<!-- 甲片,防御作用 -->
<li>
<def>ARA_Chitin_Shell</def>
<coverage>0.02</coverage>
<depth>Outside</depth>
<groups>
<li>UpperHead</li>
</groups>
</li>
<li>
<def>Skull</def>
<coverage>0.18</coverage>
@@ -277,9 +316,10 @@
</li>
</parts>
</li>
<!-- 左右副肢体 -->
<li>
<def>Shoulder</def>
<customLabel>left shoulder</customLabel>
<customLabel>左副肢关节</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>LeftShoulder</woundAnchorTag>
<flipGraphic>true</flipGraphic>
@@ -289,93 +329,39 @@
<parts>
<li>
<def>Clavicle</def>
<customLabel>left clavicle</customLabel>
<customLabel>左副肢外骨骼</customLabel>
<coverage>0.09</coverage>
<height>Top</height>
<depth>Inside</depth>
<depth>Outside</depth>
<flipGraphic>true</flipGraphic>
<groups>
<li>Torso</li>
<li>Shoulders</li>
</groups>
</li>
<li>
<def>Arm</def>
<customLabel>left arm</customLabel>
<customLabel>左副肢</customLabel>
<coverage>0.77</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Humerus</def>
<customLabel>left humerus</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Arms</li>
</groups>
</li>
<li>
<def>Radius</def>
<customLabel>left radius</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Arms</li>
</groups>
</li>
<li>
<def>Hand</def>
<customLabel>left hand</customLabel>
<customLabel>左鳌钳</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<flipGraphic>true</flipGraphic>
<groups>
<li>Hands</li>
<li>HeadClaw</li>
</groups>
<parts>
<li>
<def>Finger</def>
<customLabel>left pinky</customLabel>
<coverage>0.06</coverage>
<groups>
<li>Hands</li>
<li>LeftHand</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>left ring finger</customLabel>
<coverage>0.07</coverage>
<groups>
<li>Hands</li>
<li>LeftHand</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>left middle finger</customLabel>
<coverage>0.08</coverage>
<groups>
<li>Hands</li>
<li>LeftHand</li>
<li>MiddleFingers</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>left index finger</customLabel>
<coverage>0.07</coverage>
<groups>
<li>Hands</li>
<li>LeftHand</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>left thumb</customLabel>
<coverage>0.08</coverage>
<customLabel>右鳌钳口</customLabel>
<coverage>0.14</coverage>
<groups>
<li>Hands</li>
<li>LeftHand</li>
@@ -389,102 +375,52 @@
</li>
<li>
<def>Shoulder</def>
<customLabel>right shoulder</customLabel>
<customLabel>右副肢关节</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>RightShoulder</woundAnchorTag>
<woundAnchorTag>LeftShoulder</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Clavicle</def>
<customLabel>right clavicle</customLabel>
<customLabel>右副肢外骨骼</customLabel>
<coverage>0.09</coverage>
<height>Top</height>
<depth>Inside</depth>
<depth>Outside</depth>
<flipGraphic>true</flipGraphic>
<groups>
<li>Torso</li>
<li>Shoulders</li>
</groups>
</li>
<li>
<def>Arm</def>
<customLabel>right arm</customLabel>
<customLabel>右副肢</customLabel>
<coverage>0.77</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Humerus</def>
<customLabel>right humerus</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Arms</li>
</groups>
</li>
<li>
<def>Radius</def>
<customLabel>right radius</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Arms</li>
</groups>
</li>
<li>
<def>Hand</def>
<customLabel>right hand</customLabel>
<customLabel>右鳌钳</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<flipGraphic>true</flipGraphic>
<groups>
<li>Hands</li>
<li>HeadClaw</li>
</groups>
<parts>
<li>
<def>Finger</def>
<customLabel>right pinky</customLabel>
<coverage>0.06</coverage>
<customLabel>右鳌钳口</customLabel>
<coverage>0.14</coverage>
<groups>
<li>Hands</li>
<li>RightHand</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>right ring finger</customLabel>
<coverage>0.07</coverage>
<groups>
<li>Hands</li>
<li>RightHand</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>right middle finger</customLabel>
<coverage>0.08</coverage>
<groups>
<li>Hands</li>
<li>RightHand</li>
<li>MiddleFingers</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>right index finger</customLabel>
<coverage>0.07</coverage>
<groups>
<li>Hands</li>
<li>RightHand</li>
</groups>
</li>
<li>
<def>Finger</def>
<customLabel>right thumb</customLabel>
<coverage>0.08</coverage>
<groups>
<li>Hands</li>
<li>RightHand</li>
<li>LeftHand</li>
</groups>
</li>
</parts>
@@ -493,17 +429,20 @@
</li>
</parts>
</li>
<!-- 腰尾链接 -->
<li>
<def>Waist</def>
<customLabel>体节分界</customLabel>
<coverage>0</coverage>
<height>Bottom</height>
<groups>
<li>Waist</li>
</groups>
</li>
<!-- 四条腿 -->
<li>
<def>Leg</def>
<customLabel>left leg</customLabel>
<customLabel>左前腿</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
@@ -512,154 +451,120 @@
<woundAnchorTag>LeftLeg</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<parts>
<!-- 甲片,防御作用 -->
<li>
<def>ARA_Chitin_Shell</def>
<coverage>0.02</coverage>
<depth>Outside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
<!-- 骨骼 -->
<li>
<def>Femur</def>
<customLabel>left femur</customLabel>
<customLabel>左前腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
<li>
<def>Tibia</def>
<customLabel>left tibia</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
<li>
<def>Foot</def>
<customLabel>left foot</customLabel>
<coverage>0.1</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Feet</li>
</groups>
<parts>
<li>
<def>Toe</def>
<customLabel>left little toe</customLabel>
<coverage>0.06</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>left fourth toe</customLabel>
<coverage>0.07</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>left middle toe</customLabel>
<coverage>0.08</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>left second toe</customLabel>
<coverage>0.09</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>left big toe</customLabel>
<coverage>0.09</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Leg</def>
<customLabel>right leg</customLabel>
<customLabel>右前腿</customLabel>
<coverage>0.14</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<woundAnchorTag>RightLeg</woundAnchorTag>
<woundAnchorTag>LeftLeg</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<parts>
<!-- 甲片,防御作用 -->
<li>
<def>ARA_Chitin_Shell</def>
<coverage>0.02</coverage>
<depth>Outside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
<!-- 骨骼 -->
<li>
<def>Femur</def>
<customLabel>right femur</customLabel>
<customLabel>右前腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
</parts>
</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>Tibia</def>
<customLabel>right tibia</customLabel>
<def>ARA_Chitin_Shell</def>
<coverage>0.02</coverage>
<depth>Outside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
<!-- 骨骼 -->
<li>
<def>Femur</def>
<customLabel>左后腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
</parts>
</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>right foot</customLabel>
<coverage>0.1</coverage>
<def>ARA_Chitin_Shell</def>
<coverage>0.02</coverage>
<depth>Outside</depth>
<groups>
<li>Feet</li>
<li>Legs</li>
</groups>
</li>
<!-- 骨骼 -->
<li>
<def>Femur</def>
<customLabel>右后腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
<parts>
<li>
<def>Toe</def>
<customLabel>right little toe</customLabel>
<coverage>0.06</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>right fourth toe</customLabel>
<coverage>0.07</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>right middle toe</customLabel>
<coverage>0.08</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>right second toe</customLabel>
<coverage>0.09</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
<li>
<def>Toe</def>
<customLabel>right big toe</customLabel>
<coverage>0.09</coverage>
<groups>
<li>Feet</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
@@ -717,51 +622,163 @@
</tags>
<destroyableByDamage>false</destroyableByDamage>
</BodyPartDef>
<BodyPartDef>
<defName></defName>
<label>中央能源炉</label>
<hitPoints>120</hitPoints>
<skinCovered>false</skinCovered>
<!-- <solid>true</solid> -->
<tags>
<li>BloodPumpingSource</li>
<li>BreathingSource</li>
<li>BloodFiltrationKidney</li>
<li>BloodFiltrationLiver</li>
<li>MetabolismSource</li>
<li>EatingSource</li>
<li>Spine</li>
<li>Pelvis</li>
<li>ManipulationLimbSegment</li>
<li>TalkingSource</li>
</tags>
<spawnThingOnRemoved>WULA_Energy_Furnace_Base</spawnThingOnRemoved>
</BodyPartDef>
<BodyPartDef>
<defName>WULA_Addons_Antenna_Bodypart</defName>
<label>上行链路天线</label>
<defName>ARA_Gonad</defName>
<label>性腺</label>
<hitPoints>30</hitPoints>
<permanentInjuryChanceFactor>0</permanentInjuryChanceFactor>
<skinCovered>false</skinCovered>
<!-- <solid>true</solid> -->
<bleedRate>0</bleedRate>
<destroyableByDamage>false</destroyableByDamage>
<tags>
<li>ConsciousnessSource</li>
</tags>
<solid>false</solid>
<bleedRate>2</bleedRate>
</BodyPartDef>
<BodyPartDef>
<defName>WULA_Skeleton_Bodypart</defName>
<label>合金骨架</label>
<hitPoints>30</hitPoints>
<defName>ARA_Ovary</defName>
<label>卵巢</label>
<hitPoints>50</hitPoints>
<permanentInjuryChanceFactor>0</permanentInjuryChanceFactor>
<skinCovered>false</skinCovered>
<solid>true</solid>
<bleedRate>0</bleedRate>
<destroyableByDamage>false</destroyableByDamage>
<tags>
<li>ManipulationLimbSegment</li>
</tags>
<solid>false</solid>
<bleedRate>2</bleedRate>
</BodyPartDef>
</Defs>
<BodyPartGroupDef>
<defName>ARA_Genitalias</defName>
<label>女皇生殖器官</label>
<listOrder>120</listOrder>
</BodyPartGroupDef>
<!-- EN: beetle-like with claw -->
<BodyDef>
<defName>ARA_BeetleLikeWithClaw</defName>
<label>带头颚甲虫类</label> <!-- EN: beetle-like with claw -->
<corePart>
<def>Shell</def>
<customLabel></customLabel> <!-- EN: shell -->
<height>Middle</height>
<depth>Outside</depth>
<parts>
<li>
<def>Elytra</def>
<customLabel>左鞘翅</customLabel> <!-- EN: left elytra -->
<coverage>0.05</coverage>
</li>
<li>
<def>Elytra</def>
<customLabel>右鞘翅</customLabel> <!-- EN: right elytra -->
<coverage>0.05</coverage>
</li>
<li>
<def>Stomach</def>
<coverage>0.05</coverage>
<depth>Inside</depth>
</li>
<li>
<def>InsectHeart</def>
<customLabel>心脏</customLabel> <!-- EN: heart -->
<coverage>0.03</coverage>
<depth>Inside</depth>
</li>
<li>
<def>Pronotum</def>
<customLabel>前胸背板</customLabel> <!-- EN: pronotum -->
<coverage>0.18</coverage>
<height>Top</height>
<parts>
<li>
<def>InsectHead</def>
<customLabel></customLabel> <!-- EN: head -->
<coverage>0.65</coverage>
<groups>
<li>HeadAttackTool</li>
</groups>
<parts>
<li>
<def>Brain</def>
<coverage>0.2</coverage>
<depth>Inside</depth>
</li>
<li>
<def>Eye</def>
<customLabel>左眼</customLabel> <!-- EN: left eye -->
<coverage>0.12</coverage>
</li>
<li>
<def>Eye</def>
<customLabel>右眼</customLabel> <!-- EN: right eye -->
<coverage>0.12</coverage>
</li>
<li>
<def>Antenna</def>
<customLabel>左触角</customLabel> <!-- EN: left antenna -->
<coverage>0.08</coverage>
</li>
<li>
<def>Antenna</def>
<customLabel>右触角</customLabel> <!-- EN: right antenna -->
<coverage>0.08</coverage>
</li>
<li>
<def>InsectNostril</def>
<customLabel></customLabel> <!-- EN: nostril -->
<coverage>0.06</coverage>
</li>
<li>
<def>InsectMouth</def>
<customLabel>口器</customLabel> <!-- EN: mouth -->
<coverage>0.08</coverage>
<groups>
<li>Mouth</li>
</groups>
</li>
<li>
<def>HeadClaw</def>
<customLabel>头颚</customLabel> <!-- EN: head claw -->
<coverage>0.15</coverage>
<groups>
<li>HeadClaw</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>InsectLeg</def>
<customLabel>左前肢</customLabel> <!-- EN: front left leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>右前肢</customLabel> <!-- EN: front right leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>左中肢</customLabel> <!-- EN: middle left leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>右中肢</customLabel> <!-- EN: middle right leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>左后肢</customLabel> <!-- EN: rear left leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>右后肢</customLabel> <!-- EN: rear right leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
</parts>
</corePart>
</BodyDef>
</Defs>

View File

@@ -1,137 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<!-- EN: beetle-like with claw -->
<BodyDef>
<defName>ARA_BeetleLikeWithClaw</defName>
<label>带头颚甲虫类</label> <!-- EN: beetle-like with claw -->
<corePart>
<def>Shell</def>
<customLabel></customLabel> <!-- EN: shell -->
<height>Middle</height>
<depth>Outside</depth>
<parts>
<li>
<def>Elytra</def>
<customLabel>左鞘翅</customLabel> <!-- EN: left elytra -->
<coverage>0.05</coverage>
</li>
<li>
<def>Elytra</def>
<customLabel>右鞘翅</customLabel> <!-- EN: right elytra -->
<coverage>0.05</coverage>
</li>
<li>
<def>Stomach</def>
<coverage>0.05</coverage>
<depth>Inside</depth>
</li>
<li>
<def>InsectHeart</def>
<customLabel>心脏</customLabel> <!-- EN: heart -->
<coverage>0.03</coverage>
<depth>Inside</depth>
</li>
<li>
<def>Pronotum</def>
<customLabel>前胸背板</customLabel> <!-- EN: pronotum -->
<coverage>0.18</coverage>
<height>Top</height>
<parts>
<li>
<def>InsectHead</def>
<customLabel></customLabel> <!-- EN: head -->
<coverage>0.65</coverage>
<groups>
<li>HeadAttackTool</li>
</groups>
<parts>
<li>
<def>Brain</def>
<coverage>0.2</coverage>
<depth>Inside</depth>
</li>
<li>
<def>Eye</def>
<customLabel>左眼</customLabel> <!-- EN: left eye -->
<coverage>0.12</coverage>
</li>
<li>
<def>Eye</def>
<customLabel>右眼</customLabel> <!-- EN: right eye -->
<coverage>0.12</coverage>
</li>
<li>
<def>Antenna</def>
<customLabel>左触角</customLabel> <!-- EN: left antenna -->
<coverage>0.08</coverage>
</li>
<li>
<def>Antenna</def>
<customLabel>右触角</customLabel> <!-- EN: right antenna -->
<coverage>0.08</coverage>
</li>
<li>
<def>InsectNostril</def>
<customLabel></customLabel> <!-- EN: nostril -->
<coverage>0.06</coverage>
</li>
<li>
<def>InsectMouth</def>
<customLabel>口器</customLabel> <!-- EN: mouth -->
<coverage>0.08</coverage>
<groups>
<li>Mouth</li>
</groups>
</li>
<li>
<def>HeadClaw</def>
<customLabel>头颚</customLabel> <!-- EN: head claw -->
<coverage>0.15</coverage>
<groups>
<li>HeadClaw</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>InsectLeg</def>
<customLabel>左前肢</customLabel> <!-- EN: front left leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>右前肢</customLabel> <!-- EN: front right leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>左中肢</customLabel> <!-- EN: middle left leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>右中肢</customLabel> <!-- EN: middle right leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>左后肢</customLabel> <!-- EN: rear left leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
<li>
<def>InsectLeg</def>
<customLabel>右后肢</customLabel> <!-- EN: rear right leg -->
<coverage>0.06</coverage>
<height>Bottom</height>
</li>
</parts>
</corePart>
</BodyDef>
</Defs>

View File

@@ -1,393 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!--<BodyTypeDef Abstract="True" Name="Juvenile">
<headOffset>(0.04, 0.34)</headOffset>
<bedOffset>-0.08</bedOffset>
<bodyNakedGraphicPath>Things/Pawn/Humanlike/Bodies/Naked_Child</bodyNakedGraphicPath>
<bodyDessicatedGraphicPath>Things/Pawn/Humanlike/Bodies/Dessicated/Dessicated_Child</bodyDessicatedGraphicPath>
</BodyTypeDef>
<BodyTypeDef ParentName="Juvenile">
<defName>Baby</defName>
<woundScale>0.5</woundScale>
<bodyGraphicScale>(0.5, 0.5)</bodyGraphicScale>
<woundAnchors>
<li>
<rotation>South</rotation>
<group>Torso</group>
<offset>(0,0,-0.04)</offset>
<range>0.1</range>
<debugColor>(1,0,0,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>LeftLeg</tag>
<offset>(0.04,0,-0.08)</offset>
<range>0.02</range>
<debugColor>(0,1,0,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>RightLeg</tag>
<offset>(-0.04,0,-0.08)</offset>
<range>0.02</range>
<debugColor>(0,0,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>LeftShoulder</tag>
<offset>(0.04,0,0.075)</offset>
<range>0.06</range>
<debugColor>(1,1,0,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>RightShoulder</tag>
<offset>(-0.04,0,0.075)</offset>
<range>0.06</range>
<debugColor>(1,0,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<group>FullHead</group>
<offset>(0, 0, 0.15)</offset>
<range>0.07</range>
<layer>Head</layer>
<debugColor>(0,1,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>RightEye</tag>
<canMirror>false</canMirror>
<offset>(-0.0455, 0, 0.215)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(1,1,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>LeftEye</tag>
<canMirror>false</canMirror>
<offset>(0.0455, 0, 0.215)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(0,0,0,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<group>FullHead</group>
<offset>(-0.025, 0, 0.18)</offset>
<range>0.06</range>
<layer>Head</layer>
<debugColor>(0,1,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<group>Torso</group>
<offset>(0,0,-0.07)</offset>
<range>0.1</range>
<debugColor>(1,0,0,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>LeftShoulder</tag>
<offset>(-0.03,0,0.065)</offset>
<range>0.03</range>
<canMirror>false</canMirror>
<debugColor>(1,1,0,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>LeftLeg</tag>
<offset>(-0.03,0,-0.1)</offset>
<range>0.03</range>
<canMirror>false</canMirror>
<debugColor>(0,1,0,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>RightShoulder</tag>
<offset>(0.03,0,0.065)</offset>
<range>0.03</range>
<canMirror>false</canMirror>
<debugColor>(1,0,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>RightLeg</tag>
<offset>(0.05,0,-0.1)</offset>
<range>0.03</range>
<canMirror>false</canMirror>
<debugColor>(0,0,1,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>RightEye</tag>
<canMirror>false</canMirror>
<narrowCrown>true</narrowCrown>
<offset>(0.008, 0, 0.19)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(1,1,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>LeftEye</tag>
<canMirror>false</canMirror>
<narrowCrown>true</narrowCrown>
<offset>(-0.008, 0, 0.19)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(0,0,0,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>RightEye</tag>
<canMirror>false</canMirror>
<offset>(0.06, 0, 0.2)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(1,1,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>LeftEye</tag>
<canMirror>false</canMirror>
<offset>(-0.06, 0, 0.2)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(0,0,0,1)</debugColor>
</li>
</woundAnchors>
<attachPoints>
<li>
<offset>(-.1, 0, .25)</offset>
<type>PlatformRestraint0</type>
</li>
<li>
<offset>(.1, 0, .25)</offset>
<type>PlatformRestraint1</type>
</li>
<li>
<offset>(.1, 0, -.2)</offset>
<type>PlatformRestraint2</type>
</li>
<li>
<offset>(-.1, 0, -.2)</offset>
<type>PlatformRestraint3</type>
</li>
</attachPoints>
<attachPointsDessicated>
<li>
<offset>(-.1, 0, .25)</offset>
<type>PlatformRestraint0</type>
</li>
<li>
<offset>(.1, 0, .25)</offset>
<type>PlatformRestraint1</type>
</li>
<li>
<offset>(.1, 0, -.2)</offset>
<type>PlatformRestraint2</type>
</li>
<li>
<offset>(-.1, 0, -.2)</offset>
<type>PlatformRestraint3</type>
</li>
</attachPointsDessicated>
</BodyTypeDef>
<BodyTypeDef ParentName="Juvenile">
<defName>Child</defName>
<woundScale>0.7</woundScale>
<bodyGraphicScale>(0.6, 0.65)</bodyGraphicScale>
<woundAnchors>
<li>
<rotation>South</rotation>
<group>Torso</group>
<offset>(0,0,-0.07)</offset>
<range>0.1</range>
<debugColor>(1,0,0,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>LeftLeg</tag>
<offset>(0.05,0,-0.12)</offset>
<range>0.03</range>
<debugColor>(0,1,0,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>RightLeg</tag>
<offset>(-0.05,0,-0.12)</offset>
<range>0.03</range>
<debugColor>(0,0,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>LeftShoulder</tag>
<offset>(0.06,0,0.025)</offset>
<range>0.07</range>
<debugColor>(1,1,0,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>RightShoulder</tag>
<offset>(-0.06,0,0.025)</offset>
<range>0.07</range>
<debugColor>(1,0,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<group>FullHead</group>
<offset>(0, 0, 0.2)</offset>
<range>0.1</range>
<layer>Head</layer>
<debugColor>(0,1,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>RightEye</tag>
<canMirror>false</canMirror>
<offset>(-0.073, 0, 0.18)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(1,1,1,1)</debugColor>
</li>
<li>
<rotation>South</rotation>
<tag>LeftEye</tag>
<canMirror>false</canMirror>
<offset>(0.073, 0, 0.18)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(0,0,0,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<group>FullHead</group>
<offset>(-0.12, 0, 0.21)</offset>
<range>0.12</range>
<layer>Head</layer>
<debugColor>(0,1,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<group>Torso</group>
<offset>(0,0,-0.07)</offset>
<range>0.12</range>
<debugColor>(1,0,0,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>LeftShoulder</tag>
<offset>(-0.03,0,0.1)</offset>
<range>0.066</range>
<canMirror>false</canMirror>
<debugColor>(1,1,0,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>LeftLeg</tag>
<offset>(-0.03,0,-0.13)</offset>
<range>0.03</range>
<canMirror>false</canMirror>
<debugColor>(0,1,0,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>RightShoulder</tag>
<offset>(0.035,0,0.007)</offset>
<range>0.066</range>
<canMirror>false</canMirror>
<debugColor>(1,0,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>RightLeg</tag>
<offset>(0.05,0,-0.15)</offset>
<range>0.03</range>
<canMirror>false</canMirror>
<debugColor>(0,0,1,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>RightEye</tag>
<canMirror>false</canMirror>
<narrowCrown>true</narrowCrown>
<offset>(0.08, 0, 0.2)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(1,1,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>LeftEye</tag>
<canMirror>false</canMirror>
<narrowCrown>true</narrowCrown>
<offset>(-0.08, 0, 0.2)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(0,0,0,1)</debugColor>
</li>
<li>
<rotation>East</rotation>
<tag>RightEye</tag>
<canMirror>false</canMirror>
<offset>(0.11, 0, 0.2)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(1,1,1,1)</debugColor>
</li>
<li>
<rotation>West</rotation>
<tag>LeftEye</tag>
<canMirror>false</canMirror>
<offset>(-0.11, 0, 0.2)</offset>
<range>0</range>
<layer>Head</layer>
<debugColor>(0,0,0,1)</debugColor>
</li>
</woundAnchors>
<attachPoints>
<li>
<offset>(-.22, 0, .1)</offset>
<type>PlatformRestraint0</type>
</li>
<li>
<offset>(.22, 0, .1)</offset>
<type>PlatformRestraint1</type>
</li>
<li>
<offset>(.1, 0, -.4)</offset>
<type>PlatformRestraint2</type>
</li>
<li>
<offset>(-.1, 0, -.4)</offset>
<type>PlatformRestraint3</type>
</li>
</attachPoints>
<attachPointsDessicated>
<li>
<offset>(-.22, 0, .1)</offset>
<type>PlatformRestraint0</type>
</li>
<li>
<offset>(.22, 0, .1)</offset>
<type>PlatformRestraint1</type>
</li>
<li>
<offset>(.1, 0, -.4)</offset>
<type>PlatformRestraint2</type>
</li>
<li>
<offset>(-.1, 0, -.4)</offset>
<type>PlatformRestraint3</type>
</li>
</attachPointsDessicated>
</BodyTypeDef> -->
<BodyTypeDef>
<defName>ARA_QUEEN_Thin</defName>
<headOffset>(0.09, 0.34)</headOffset>
@@ -579,5 +191,4 @@
</li>
</attachPointsDessicated>
</BodyTypeDef>
</Defs>

View File

@@ -18,7 +18,7 @@
</comps>
<modExtensions>
<li Class="ArachnaeSwarm.CurseFlameModExt">
<damageDefName>ARA_AcidBurn</damageDefName>
<damageDefName>AcidBurn</damageDefName>
<damageRange>1~5</damageRange>
<damageIntervalTicks>40</damageIntervalTicks>
</li>
@@ -85,5 +85,5 @@
</li>
</stages>
</HediffDef>
</Defs>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>ARA_HiveMindMaster</defName>
<label>阿拉克涅主巢</label>
<description>虫群意识的中心节点, 作为主脑统御整个阿拉克涅虫群.</description>
<hediffClass>ArachnaeSwarm.Hediff_HiveMindMaster</hediffClass>
<defaultLabelColor>(0.8, 0.3, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>true</scenarioCanAdd>
<maxSeverity>100</maxSeverity>
<stages>
<li>
<label>连接至 {0} 个虫群工蜂</label>
<minSeverity>0</minSeverity>
<!-- Stat offsets will be added here later -->
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_HiveMindDrone</defName>
<label>阿拉克涅工蜂</label>
<description>阿拉克涅工蜂通过心灵与阿拉克涅女皇种相链接。如果女皇死亡,工蜂也将停止生命活动。</description>
<hediffClass>ArachnaeSwarm.Hediff_HiveMindDrone</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>true</scenarioCanAdd>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindDrone">
<unlinkedDieDelayTicks>6400</unlinkedDieDelayTicks> <!-- Default to 30 seconds -->
</li>
</comps>
<stages>
</stages>
</HediffDef>
</Defs>

View File

@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnKindDef Name="ArachnaeQueenBasePawnKind" Abstract="True">
<race>ArachnaeQueen_Race</race>
<combatPower>30</combatPower>
<combatPower>500</combatPower>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<initialWillRange>2~40</initialWillRange>
<initialResistanceRange>2~40</initialResistanceRange>
<initialWillRange>99~99</initialWillRange>
<initialResistanceRange>99~99</initialResistanceRange>
<maxGenerationAge>30</maxGenerationAge>
<!-- <minGenerationAge>4</minGenerationAge> -->
<minGenerationAge>10</minGenerationAge>
<canBeScattered>false</canBeScattered>
<abilities>
<li>ARA_EggSpew</li>
<li>ARA_AcidSprayBurst</li>
<li>ARA_BindDrone</li>
</abilities>
<xenotypeSet>
<xenotypeChances>
@@ -42,7 +42,6 @@
<startingHediffs>
</startingHediffs>
</PawnKindDef>
<PawnKindDef Name="ArachnaeQueen_Colonist" ParentName="ArachnaeQueenBasePawnKind">
<defName>ARA_ArachnaeQueen</defName>
<label>阿拉克涅女皇种</label>
@@ -60,4 +59,61 @@
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
<PawnKindDef Name="ArachnaeNodeABasePawnKind" Abstract="True">
<race>ArachnaeNodeA_Race</race>
<combatPower>50</combatPower>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<initialWillRange>99~99</initialWillRange>
<initialResistanceRange>99~99</initialResistanceRange>
<maxGenerationAge>30</maxGenerationAge>
<minGenerationAge>10</minGenerationAge>
<canBeScattered>false</canBeScattered>
<abilities>
</abilities>
<xenotypeSet>
<xenotypeChances>
<Baseliner MayRequire="Ludeon.RimWorld.Biotech">0</Baseliner>
<Dirtmole MayRequire="Ludeon.RimWorld.Biotech">0</Dirtmole>
<Genie MayRequire="Ludeon.RimWorld.Biotech">0</Genie>
<Hussar MayRequire="Ludeon.RimWorld.Biotech">0</Hussar>
<Sanguophage MayRequire="Ludeon.RimWorld.Biotech">0</Sanguophage>
<Neanderthal MayRequire="Ludeon.RimWorld.Biotech">0</Neanderthal>
<Pigskin MayRequire="Ludeon.RimWorld.Biotech">0</Pigskin>
<Impid MayRequire="Ludeon.RimWorld.Biotech">0</Impid>
<Waster MayRequire="Ludeon.RimWorld.Biotech">0</Waster>
<Yttakin MayRequire="Ludeon.RimWorld.Biotech">0</Yttakin>
<Highmate MayRequire="Ludeon.RimWorld.Biotech">0</Highmate>
</xenotypeChances>
</xenotypeSet>
<useFactionXenotypes>false</useFactionXenotypes>
<requiredWorkTags>
<li>Violent</li>
</requiredWorkTags>
<startingHediffs>
</startingHediffs>
</PawnKindDef>
<PawnKindDef Name="ArachnaeNodeA_Colonist" ParentName="ArachnaeNodeABasePawnKind">
<defName>ARA_ArachnaeNodeA</defName>
<label>阿拉克涅督虫种</label>
<defaultFactionType>PlayerColony</defaultFactionType>
<invNutrition>2.55</invNutrition>
<backstoryFiltersOverride>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategoriesB</li>
</categories>
</li>
</backstoryFiltersOverride>
<apparelTags>
</apparelTags>
<apparelMoney>0</apparelMoney>
</PawnKindDef>
</Defs>

View File

@@ -42,18 +42,11 @@
<!-- 定义阿拉克涅女皇种族继承自Arachnae_PawnBase -->
<AlienRace.ThingDef_AlienRace ParentName="Arachnae_PawnBase" Name="ArachnaeQueenBase">
<!-- 伤害倍数设置 -->
<damageMultipliers>
</damageMultipliers>
<!-- 组件设置 -->
<comps>
</comps>
<!-- 定义名称 -->
<defName>ArachnaeQueen_Race</defName>
<!-- 显示标签 -->
<label>阿拉克涅女皇种</label>
<!-- 描述 -->
<description>总之是阿拉克涅女皇原型机咯</description>
<description>阿拉克涅女皇种是阿拉克涅虫巢中唯一可以生育督虫的个体,并且是虫巢意识金字塔的核心,肩负着引领阿拉克涅虫群前进的伟大使命。她与麾下的虫族的灵能链接所构成的蜂群意识网络可以使得虫群以极高的效率运转,但是一旦女皇种死亡,其麾下的虫群将全部死亡!</description>
<uiIconScale>1.0</uiIconScale>
<!-- 外星种族设置 -->
<alienRace>
<!-- 通用设置 -->
@@ -204,24 +197,6 @@
</disallowedTraits>
<!-- 强制种族特性条目 -->
<forcedRaceTraitEntries>
<li>
<options>
<li>
<defName Degree="1">Beauty</defName>
</li>
<li>
<defName Degree="2">Beauty</defName>
</li>
</options>
<count>1</count>
<chance>100</chance>
</li>
<li>
<defName Degree="2">NaturalMood</defName>
<chance>100</chance>
<commonalityMale>0</commonalityMale>
<commonalityFemale>100</commonalityFemale>
</li>
</forcedRaceTraitEntries>
<!-- 外星种族部位生成器 -->
@@ -289,7 +264,6 @@
</alienPartGenerator>
</generalSettings>
<!-- 图形路径设置 -->
<graphicPaths> <!-- 纹理 -->
<!-- 皮肤颜色 -->
@@ -488,9 +462,9 @@
</alienRace>
<!-- 基础属性设置 -->
<statBases> <!-- 能力值 -->
<statBases>
<!-- 市场价值 -->
<MarketValue>2000</MarketValue> <!-- 价格 -->
<MarketValue>2000</MarketValue>
<RoyalFavorValue>5</RoyalFavorValue>
<!-- 移动速度 -->
@@ -501,7 +475,7 @@
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<EatingSpeed>2</EatingSpeed>
<!-- 女皇很长时间才需要补充一次食物 -->
<MaxNutrition>5</MaxNutrition>
<MaxNutrition>0.5</MaxNutrition>
<!-- 女皇的负重,设为0以避免女皇能背东西 -->
<CarryingCapacity>0</CarryingCapacity>
@@ -547,107 +521,126 @@
<!-- 工具设置(攻击方式) -->
<tools>
<li>
<label>head claw</label>
<label>头顶</label>
<capacities>
<li>Poke</li>
</capacities>
<power>16</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
<chanceFactor>0.01</chanceFactor>
</li>
<li>
<label>踩踏</label>
<capacities>
<li>Blunt</li>
<li>Poke</li>
</capacities>
<power>35</power>
<cooldownTime>2.5</cooldownTime>
<linkedBodyPartsGroup>Legs</linkedBodyPartsGroup>
</li>
<li>
<label>腿部穿刺</label>
<capacities>
<li>Stab</li>
</capacities>
<power>50</power>
<cooldownTime>3</cooldownTime>
<linkedBodyPartsGroup>Legs</linkedBodyPartsGroup>
</li>
<li>
<label>钳击</label>
<capacities>
<li>Cut</li>
</capacities>
<power>30</power>
<cooldownTime>2.6</cooldownTime>
<linkedBodyPartsGroup>HeadClaw</linkedBodyPartsGroup>
</li>
<li>
<label>head</label>
<capacities>
<li>Blunt</li>
</capacities>
<power>14</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
<chanceFactor>0.2</chanceFactor>
<linkedBodyPartsGroup>Hands</linkedBodyPartsGroup>
</li>
</tools>
<race>
<!-- 身体类型 -->
<body>ArachnaeQueen_Body</body>
<fleshType>Normal</fleshType>
<!-- 思考树 -->
<thinkTreeMain>Humanlike</thinkTreeMain>
<thinkTreeConstant>HumanlikeConstant</thinkTreeConstant>
<intelligence>Humanlike</intelligence>
<makesFootprints>true</makesFootprints>
<lifeExpectancy>850</lifeExpectancy>
<!-- 肉和皮革的定义 -->
<leatherDef>Leather_Light</leatherDef>
<specificMeatDef>Meat_Megaspider</specificMeatDef>
<nameCategory>HumanStandard</nameCategory>
<bloodDef>Filth_BloodInsect</bloodDef> <!---->
<bloodSmearDef>Filth_BloodSmear</bloodSmearDef>
<!-- 身形大小 -->
<baseBodySize>10</baseBodySize>
<!-- 血量上限 -->
<baseHealthScale>10</baseHealthScale>
<!-- 食物类型,可以在种族限制定义,不需要在这改 -->
<foodType>OmnivoreHuman</foodType>
<!-- 妊娠天数,对女皇来说没啥用 -->
<gestationPeriodDays>60</gestationPeriodDays>
<meatMarketValue>1.85</meatMarketValue>
<renderTree>Humanlike</renderTree>
<!-- 无法被异常尸体锁定 -->
<hasUnnaturalCorpse>false</hasUnnaturalCorpse>
<lifeStageAges>
<li>
<def>EusocialInsectAdult</def>
<soundWounded>Pawn_HiveQueen_Wounded</soundWounded>
<soundDeath>Pawn_HiveQueen_Death</soundDeath>
<soundCall>Pawn_HiveQueen_Call</soundCall>
<soundAngry>Pawn_HiveQueen_Angry</soundAngry>
</li>
</lifeStageAges>
<!-- 什么年龄段可以做什么工作 -->
<lifeStageWorkSettings MayRequire="Ludeon.RimWorld.Biotech">
<Firefighter>0</Firefighter>
<Patient>0</Patient>
<Doctor>0</Doctor>
<PatientBedRest>0</PatientBedRest>
<Childcare MayRequire="Ludeon.RimWorld.Biotech">0</Childcare>
<BasicWorker>0</BasicWorker>
<Warden>0</Warden>
<Handling>0</Handling>
<Cooking>0</Cooking>
<Hunting>0</Hunting>
<Construction>0</Construction>
<Growing>0</Growing>
<Mining>0</Mining>
<PlantCutting>0</PlantCutting>
<Smithing>0</Smithing>
<Tailoring>0</Tailoring>
<Art>0</Art>
<Crafting>0</Crafting>
<Hauling>0</Hauling>
<Cleaning>0</Cleaning>
<Research>0</Research>
<DarkStudy MayRequire="Ludeon.RimWorld.Anomaly">0</DarkStudy>
</lifeStageWorkSettings>
<soundMeleeHitPawn>Pawn_Melee_BigBash_HitPawn</soundMeleeHitPawn>
<soundMeleeHitBuilding>Pawn_Melee_BigBash_HitBuilding</soundMeleeHitBuilding>
<soundMeleeMiss>Pawn_Melee_BigBash_Miss</soundMeleeMiss>
<soundMeleeDodge>Pawn_MeleeDodge</soundMeleeDodge>
<!-- 阴影绘制 -->
<specialShadowData>
<volume>(0.3, 0.8, 0.4)</volume>
<offset>(0,0,-0.3)</offset>
</specialShadowData>
<!-- 生成时的年龄曲线 -->
<ageGenerationCurve>
<points>
<li MayRequire="Ludeon.RimWorld.Biotech">(0,0)</li>
<li>(100,0)</li>
<li>(150,1)</li>
<li>(200,0)</li>
</points>
</ageGenerationCurve>
<race>
<!-- 身体类型 -->
<body>ArachnaeQueen_Body</body>
<fleshType>Normal</fleshType>
<!-- 思考树 -->
<thinkTreeMain>Humanlike</thinkTreeMain>
<thinkTreeConstant>HumanlikeConstant</thinkTreeConstant>
<intelligence>Humanlike</intelligence>
<makesFootprints>true</makesFootprints>
<lifeExpectancy>300</lifeExpectancy>
<!-- 肉和皮革的定义 -->
<leatherDef>Leather_Light</leatherDef>
<specificMeatDef>Meat_Megaspider</specificMeatDef>
<nameCategory>HumanStandard</nameCategory>
<bloodDef>Filth_BloodInsect</bloodDef>
<bloodSmearDef>Filth_BloodSmear</bloodSmearDef>
<!-- 身形大小 -->
<baseBodySize>10</baseBodySize>
<!-- 血量上限 -->
<baseHealthScale>10</baseHealthScale>
<!-- 食物类型,可以在种族限制定义,不需要在这改 -->
<foodType>OmnivoreHuman</foodType>
<!-- 妊娠天数,对女皇来说没啥用 -->
<gestationPeriodDays>60</gestationPeriodDays>
<meatMarketValue>1.85</meatMarketValue>
<renderTree>Humanlike</renderTree>
<!-- 无法被异常尸体锁定 -->
<hasUnnaturalCorpse>false</hasUnnaturalCorpse>
<lifeStageAges>
<li>
<def>EusocialInsectAdult</def>
<soundWounded>Pawn_HiveQueen_Wounded</soundWounded>
<soundDeath>Pawn_HiveQueen_Death</soundDeath>
<soundCall>Pawn_HiveQueen_Call</soundCall>
<soundAngry>Pawn_HiveQueen_Angry</soundAngry>
</li>
</lifeStageAges>
<!-- 什么年龄段可以做什么工作 -->
<lifeStageWorkSettings MayRequire="Ludeon.RimWorld.Biotech">
<Firefighter>0</Firefighter>
<Patient>0</Patient>
<Doctor>0</Doctor>
<PatientBedRest>0</PatientBedRest>
<Childcare MayRequire="Ludeon.RimWorld.Biotech">0</Childcare>
<BasicWorker>0</BasicWorker>
<Warden>0</Warden>
<Handling>0</Handling>
<Cooking>0</Cooking>
<Hunting>0</Hunting>
<Construction>0</Construction>
<Growing>0</Growing>
<Mining>0</Mining>
<PlantCutting>0</PlantCutting>
<Smithing>0</Smithing>
<Tailoring>0</Tailoring>
<Art>0</Art>
<Crafting>0</Crafting>
<Hauling>0</Hauling>
<Cleaning>0</Cleaning>
<Research>0</Research>
<DarkStudy MayRequire="Ludeon.RimWorld.Anomaly">0</DarkStudy>
</lifeStageWorkSettings>
<soundMeleeHitPawn>Pawn_Melee_BigBash_HitPawn</soundMeleeHitPawn>
<soundMeleeHitBuilding>Pawn_Melee_BigBash_HitBuilding</soundMeleeHitBuilding>
<soundMeleeMiss>Pawn_Melee_BigBash_Miss</soundMeleeMiss>
<soundMeleeDodge>Pawn_MeleeDodge</soundMeleeDodge>
<!-- 阴影绘制 -->
<specialShadowData>
<volume>(0.3, 0.8, 0.4)</volume>
<offset>(0,0,-0.3)</offset>
</specialShadowData>
<!-- 生成时的年龄曲线 -->
<ageGenerationCurve>
<points>
<li MayRequire="Ludeon.RimWorld.Biotech">(0,0)</li>
<li>(20,0)</li>
<li>(25,1)</li>
<li>(30,0)</li>
</points>
</ageGenerationCurve>
<hediffGiverSets>
<li>OrganicStandard</li>
@@ -678,16 +671,7 @@
<li MayRequire="Ludeon.RimWorld.Biotech">TerminatePregnancy</li>
</recipes>
<!-- <comps>
<li Class="CompProperties_SpreadSludge">
<mtbTicks>15000</mtbTicks>
<abilityDef>ARA_EggSpew</abilityDef>
</li>
<li Class="CompProperties_LetterOnRevealed">
<label>Hive queen</label>
<text>You've discovered the center of the nest. It's guarded by a massive insect queen!</text>
<letterDef>ThreatBig</letterDef>
</li>
</comps> -->
</AlienRace.ThingDef_AlienRace>
</Defs>

View File

@@ -0,0 +1,632 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- 定义阿拉克涅节点虫种族继承自Arachnae_PawnBase -->
<AlienRace.ThingDef_AlienRace ParentName="Arachnae_PawnBase" Name="ArachnaeNodeBase" Abstract="True">
<uiIconScale>1.0</uiIconScale>
<!-- 外星种族设置 -->
<alienRace>
<!-- 通用设置 -->
<generalSettings>
<!-- 新生儿背景故事过滤器 -->
<newbornBackstoryFilter>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategoriesB</li>
</categories>
<commonality>1</commonality>
</li>
</newbornBackstoryFilter>
<!-- 儿童背景故事过滤器 -->
<childBackstoryFilter>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategoriesB</li>
</categories>
<commonality>1</commonality>
</li>
</childBackstoryFilter>
<!-- 成人背景故事过滤器 -->
<adultBackstoryFilter>
<li>
<categories>
<li>ArachnaeNode_spawnCategoriesA</li>
<li>ArachnaeNode_spawnCategoriesB</li>
</categories>
<commonality>1</commonality>
</li>
</adultBackstoryFilter>
<!-- 进入下一个生命阶段的时间只有一个0岁生命阶段 -->
<growthAges MayRequire="Ludeon.RimWorld.Biotech">
<li>0</li>
</growthAges>
<!-- 种族基因 -->
<raceGenes>
</raceGenes>
<!-- 男性生成概率 -->
<maleGenderProbability>0</maleGenderProbability>
<!-- 免疫年龄疾病 -->
<immuneToAge>true</immuneToAge>
<!-- 从humanrace继承手术 -->
<humanRecipeImport>false</humanRecipeImport>
<!-- 可以躺下,为否则站着睡觉 -->
<canLayDown>true</canLayDown>
<!-- 在社交冲突中能造成的最大伤害 -->
<maxDamageForSocialfight>25</maxDamageForSocialfight>
<!-- 免疫har框架的异种歧视 -->
<immuneToXenophobia>false</immuneToXenophobia>
<!-- 生成成年人背景的年龄 -->
<minAgeForAdulthood>0</minAgeForAdulthood>
<!-- 禁止的特性 -->
<disallowedTraits>
<li>
<defName>DrugDesire</defName>
<chance>100</chance>
</li>
<li>
<defName>Nerves</defName>
<chance>100</chance>
</li>
<li>
<defName>Neurotic</defName>
<chance>100</chance>
</li>
<li>
<defName>Industriousness</defName>
<chance>100</chance>
</li>
<li>
<defName>ShootingAccuracy</defName>
<chance>100</chance>
</li>
<li>
<defName>Bloodlust</defName>
<chance>100</chance>
</li>
<li>
<defName>Abrasive</defName>
<chance>100</chance>
</li>
<li>
<defName>TooSmart</defName>
<chance>100</chance>
</li>
<li>
<defName>Greedy</defName>
<chance>100</chance>
</li>
<li>
<defName>Jealous</defName>
<chance>100</chance>
</li>
<li>
<defName>Ascetic</defName>
<chance>100</chance>
</li>
<li>
<defName>Pyromaniac</defName>
<chance>100</chance>
</li>
<li>
<defName>Transhumanist</defName>
<chance>100</chance>
</li>
<li>
<defName>BodyPurist</defName>
<chance>10</chance>
</li>
<li>
<defName>DislikesMen</defName>
<chance>100</chance>
</li>
<li>
<defName>DislikesWomen</defName>
<chance>100</chance>
</li>
</disallowedTraits>
<!-- 强制种族特性条目 -->
<forcedRaceTraitEntries>
</forcedRaceTraitEntries>
</generalSettings>
<!-- 头发胡子纹身设置,全部空开 -->
<styleSettings>
<li>
<key>HairDef</key>
<value>
<hasStyle>false</hasStyle>
</value>
</li>
<li>
<key>BeardDef</key>
<value>
<hasStyle>false</hasStyle>
</value>
</li>
<li>
<key>TattooDef</key>
<value>
<hasStyle>false</hasStyle>
</value>
</li>
</styleSettings>
<!-- 关系设置 -->
<relationSettings> <!-- 关系 -->
<!-- 恋人关系概率修正 -->
<relationChanceModifierLover>0</relationChanceModifierLover>
<!-- 前恋人关系概率修正 -->
<relationChanceModifierExLover>0</relationChanceModifierExLover>
<!-- 订婚关系概率修正 -->
<relationChanceModifierFiance>0</relationChanceModifierFiance>
<!-- 配偶关系概率修正 -->
<relationChanceModifierSpouse>0</relationChanceModifierSpouse>
<!-- 前配偶关系概率修正 -->
<relationChanceModifierExSpouse>0</relationChanceModifierExSpouse>
<!-- 父母关系概率修正 -->
<relationChanceModifierParent>0</relationChanceModifierParent>
<!-- 子女关系概率修正 -->
<relationChanceModifierChild>0</relationChanceModifierChild>
<!-- 兄弟姐妹关系概率修正 -->
<relationChanceModifierSibling>0</relationChanceModifierSibling>
</relationSettings> <!-- 关系 -->
<!-- 种族限制设置 -->
<raceRestriction> <!-- 种族限制 -->
<!-- 仅使用种族限制的服装 -->
<onlyUseRaceRestrictedApparel>true</onlyUseRaceRestrictedApparel> <!-- 种族服装限制设置 -->
<!-- 服装列表 -->
<apparelList> <!-- 服装 -->
</apparelList> <!-- 服装 -->
<!-- 白名单服装列表 -->
<whiteApparelList>
</whiteApparelList>
<!-- 建筑列表 -->
<buildingList> <!-- 建筑 -->
</buildingList> <!-- 建筑 -->
<!-- 武器列表 -->
<weaponList> <!-- 武器 -->
</weaponList> <!-- 武器 -->
<!-- 研究列表 -->
<researchList> <!-- 研究 -->
</researchList> <!-- 研究 -->
<!-- 配方列表 -->
<recipeList> <!-- 制作 -->
</recipeList> <!-- 制作 -->
<!-- 特性列表 -->
<traitList> <!-- 特性 -->
</traitList> <!-- 特性 -->
<!-- 植物列表 -->
<plantList> <!-- 植物 -->
</plantList> <!-- 植物 -->
<!-- 食物列表 -->
<foodList>
</foodList>
<!-- 黑名单内源性基因类别 -->
<blackEndoCategories>
<li>Melanin</li>
<li>HairColor</li>
<li MayRequire="Ludeon.RimWorld.Biotech">BodyType</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Ears</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Nose</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Voice</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Headbone</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Head</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Jaw</li>
</blackEndoCategories>
<!-- 黑名单基因列表 -->
<blackGeneList>
<li MayRequire="Ludeon.RimWorld.Biotech">Furskin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Brow_Heavy</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Hair_BaldOnly</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Beard_Always</li>
<li MayRequire="Ludeon.RimWorld.Biotech">FacialRidges</li>
</blackGeneList>
<!-- 黑名单基因标签 -->
<blackGeneTags>
<li MayRequire="Ludeon.RimWorld.Biotech">EyeColor</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Tail</li>
<li MayRequire="Ludeon.RimWorld.Biotech">BeardStyle</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Fur</li>
</blackGeneTags>
<!-- 异种类型列表 -->
<xenotypeList>
</xenotypeList>
<!-- 黑名单异种类型列表 -->
<blackXenotypeList MayRequire="Ludeon.RimWorld.Biotech">
<!-- <li MayRequire="Ludeon.RimWorld.Biotech">Baseliner</li> -->
<li MayRequire="Ludeon.RimWorld.Biotech">Dirtmole</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Genie</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Hussar</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Sanguophage</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Neanderthal</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Pigskin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Impid</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Waster</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Yttakin</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Highmate</li>
<li MayRequire="Ludeon.RimWorld.Odyssey">Starjack</li>
</blackXenotypeList>
<!-- 仅使用种族限制的异种类型 -->
<onlyUseRaceRestrictedXenotypes>true</onlyUseRaceRestrictedXenotypes> <!-- asd -->
</raceRestriction>
<!-- 思想设置 -->
<thoughtSettings>
<!-- 无法接收的思想 -->
<cannotReceiveThoughts>
<li>Naked</li>
<li>ApparelDamaged</li>
<li>ProsthophileHappy</li>
<li>ProsthophobeUnhappy</li>
<li>BrawlerUnhappy</li>
<li>PyromaniacHappy</li>
<li>Greedy</li>
<li>Jealous</li>
<li>SharedBed</li>
<li>AteWithoutTable</li>
<li>SleptOutside</li>
<li>SleptOnGround</li>
<li>SleptInCold</li>
<li>SleptInHeat</li>
<li>Ugly</li>
<li>AteKibble</li>
<li>AteInsectMeatDirect</li>
<li>AteInsectMeatAsIngredient</li>
<li>AteRawFood</li>
<li>AteHumanlikeMeatDirect</li>
<li>AteHumanlikeMeatAsIngredient</li>
<li>KnowButcheredHumanlikeCorpse</li>
<li>ButcheredHumanlikeCorpseOpinion</li>
<li>AteRawHumanlikeMeat</li>
</cannotReceiveThoughts>
</thoughtSettings>
</alienRace>
<race>
<fleshType>Normal</fleshType>
<!-- 思考树 -->
<thinkTreeMain>Humanlike</thinkTreeMain>
<thinkTreeConstant>HumanlikeConstant</thinkTreeConstant>
<intelligence>Humanlike</intelligence>
<makesFootprints>true</makesFootprints>
<lifeExpectancy>300</lifeExpectancy>
<!-- 肉和皮革的定义 -->
<leatherDef>Leather_Light</leatherDef>
<specificMeatDef>Meat_Megaspider</specificMeatDef>
<nameCategory>HumanStandard</nameCategory>
<bloodDef>Filth_BloodInsect</bloodDef>
<bloodSmearDef>Filth_BloodSmear</bloodSmearDef>
<!-- 食物类型,可以在种族限制定义,不需要在这改 -->
<foodType>OmnivoreHuman</foodType>
<!-- 妊娠天数,对女皇来说没啥用 -->
<gestationPeriodDays>60</gestationPeriodDays>
<meatMarketValue>1.85</meatMarketValue>
<renderTree>Humanlike</renderTree>
<!-- 无法被异常尸体锁定 -->
<hasUnnaturalCorpse>false</hasUnnaturalCorpse>
<!-- 什么年龄段可以做什么工作 -->
<lifeStageWorkSettings MayRequire="Ludeon.RimWorld.Biotech">
<Firefighter>0</Firefighter>
<Patient>0</Patient>
<Doctor>0</Doctor>
<PatientBedRest>0</PatientBedRest>
<Childcare MayRequire="Ludeon.RimWorld.Biotech">0</Childcare>
<BasicWorker>0</BasicWorker>
<Warden>0</Warden>
<Handling>0</Handling>
<Cooking>0</Cooking>
<Hunting>0</Hunting>
<Construction>0</Construction>
<Growing>0</Growing>
<Mining>0</Mining>
<PlantCutting>0</PlantCutting>
<Smithing>0</Smithing>
<Tailoring>0</Tailoring>
<Art>0</Art>
<Crafting>0</Crafting>
<Hauling>0</Hauling>
<Cleaning>0</Cleaning>
<Research>0</Research>
<DarkStudy MayRequire="Ludeon.RimWorld.Anomaly">0</DarkStudy>
</lifeStageWorkSettings>
<!-- 生成时的年龄曲线 -->
<ageGenerationCurve>
<points>
<li MayRequire="Ludeon.RimWorld.Biotech">(0,0)</li>
<li>(20,0)</li>
<li>(25,1)</li>
<li>(30,0)</li>
</points>
</ageGenerationCurve>
<hediffGiverSets>
<li>OrganicStandard</li>
<li>Human</li>
</hediffGiverSets>
</race>
<!-- 可以施加使用的手术类型 -->
<recipes>
<li>ExciseCarcinoma</li>
<li>AdministerMechSerumHealer</li>
<li>RemoveBodyPart</li>
<li>Euthanize</li>
<li>Anesthetize</li>
<li>CureScaria</li>
<li MayRequire="Ludeon.RimWorld.Royalty">CureBloodRot</li>
<li MayRequire="Ludeon.RimWorld.Royalty">CureAbasia</li>
<li MayRequire="Ludeon.RimWorld.Biotech">Vasectomy</li>
<li MayRequire="Ludeon.RimWorld.Biotech">ReverseVasectomy</li>
<li MayRequire="Ludeon.RimWorld.Biotech">TubalLigation</li>
<li MayRequire="Ludeon.RimWorld.Biotech">ExtractOvum</li>
<li MayRequire="Ludeon.RimWorld.Biotech">ExtractHemogenPack</li>
<li MayRequire="Ludeon.RimWorld.Biotech">BloodTransfusion</li>
<li MayRequire="Ludeon.RimWorld.Biotech">ImplantXenogerm</li>
<li MayRequire="Ludeon.RimWorld.Biotech">ImplantIUD</li>
<li MayRequire="Ludeon.RimWorld.Biotech">RemoveIUD</li>
<li MayRequire="Ludeon.RimWorld.Biotech">TerminatePregnancy</li>
</recipes>
</AlienRace.ThingDef_AlienRace>
<!-- 定义阿拉克涅节点虫种族继承自Arachnae_PawnBase -->
<AlienRace.ThingDef_AlienRace ParentName="ArachnaeNodeBase">
<defName>ArachnaeNodeA_Race</defName>
<label>阿拉克涅督虫种-小A</label>
<description>阿拉克涅督虫种是照顾女皇的管家。就是这样。</description>
<alienRace>
<!-- 通用设置 -->
<generalSettings>
<!-- 繁殖设置 -->
<reproduction>
<!-- 子代Pawn类型定义 -->
<childKindDef>ARA_ArachnaeNodeA</childKindDef>
<!-- 女性生育能力年龄因子 -->
<femaleFertilityAgeFactor>
<points>
<li>(1, 1)</li>
<li>(9999, 1)</li>
</points>
</femaleFertilityAgeFactor>
<!-- 男性生育能力年龄因子 -->
<maleFertilityAgeFactor>
<points>
<li>(1, 1)</li>
<li>(9999, 1)</li>
</points>
</maleFertilityAgeFactor>
</reproduction>
<!-- 外星种族部位生成器 -->
<alienPartGenerator>
<!-- 边框缩放比例 -->
<borderScale>2.5</borderScale> <!-- 图像显示范围大小 -->
<!-- 图集缩放比例 -->
<atlasScale>2.5</atlasScale> <!-- 图像质量 -->
<!-- 头部类型 -->
<headTypes> <!-- 头部 -->
<li>ARA_QUEEN_Female_AverageNormalA</li>
</headTypes> <!-- 头部 -->
<!-- 身体类型 -->
<bodyTypes> <!-- 身体 -->
<li>Thin</li>
</bodyTypes> <!-- 身体 -->
<!-- 图像放大 -->
<customDrawSize>(2.5,2.5)</customDrawSize>
<customHeadDrawSize>(1.0,1.0)</customHeadDrawSize>
<customPortraitDrawSize>(1,1)</customPortraitDrawSize>
<!-- 头部位置 -->
<headOffset>(0,0)</headOffset>
<headOffsetDirectional>
</headOffsetDirectional>
<!-- 头发变色计算直接设置到9999避免触发 -->
<oldHairAgeRange>9999~9999</oldHairAgeRange>
<!-- 皮肤颜色通道,勿动(衣服已经和皮肤画在一起了) -->
<colorChannels Inherit="False">
<li>
<name>skin</name>
<first Class="ColorGenerator_Options">
<options>
<li>
<weight>100</weight>
<only>(255,240,234)</only>
</li>
</options>
</first>
<second Class="AlienRace.ColorGenerator_CustomAlienChannel">
<colorChannel>skin_1</colorChannel>
</second>
</li>
<li> <!--헤어컬러-->
<name>hair</name>
<first Class="ColorGenerator_Options">
<options>
<li>
<weight>100</weight>
<only>(255,255,255)</only>
</li>
</options>
</first>
<second Class="ColorGenerator_Single">
<color>(35, 20, 120)</color>
</second>
</li>
</colorChannels>
<!-- 身体附加组件 -->
<bodyAddons>
</bodyAddons>
</alienPartGenerator>
</generalSettings>
<!-- 图形路径设置 -->
<graphicPaths> <!-- 纹理 -->
<!-- 皮肤颜色 -->
<skinColor>(154,125,94,1)</skinColor>
<!-- 皮肤着色器 -->
<skinShader>Cutout</skinShader>
<!-- 头部纹理路径 -->
<head>Pawns/General/Invisible/Inv</head>
<!-- 身体纹理路径 -->
<body>Things/Pawn/Animal/Megaspider/Megaspider</body>
<!-- 骨骼纹理路径 -->
<skeleton>Things/Pawn/Animal/Megaspider/Dessicated_Megaspider</skeleton>
<!-- 残肢纹理路径 -->
<stump>Things/Pawn/Animal/Megaspider/Megaspider</stump>
<!-- 服装设置 -->
<apparel>
<bodyTypeFallback>Thin</bodyTypeFallback>
<femaleBodyTypeFallback>Thin</femaleBodyTypeFallback>
</apparel>
</graphicPaths> <!-- 纹理 -->
</alienRace>
<!-- 基础属性设置 -->
<statBases>
<!-- 市场价值 -->
<MarketValue>500</MarketValue>
<RoyalFavorValue>5</RoyalFavorValue>
<!-- 移动速度 -->
<MoveSpeed>3.60</MoveSpeed>
<Mass>50</Mass>
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
<EatingSpeed>2</EatingSpeed>
<!-- 女皇很长时间才需要补充一次食物 -->
<MaxNutrition>0.5</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>45</MeatAmount>
<LeatherAmount>50</LeatherAmount>
<!-- 疼痛休克,女皇很难因为疼痛而倒下,虽并不是像机器人一样不会休克 -->
<PainShockThreshold>1</PainShockThreshold>
<!-- 女皇非常擅长灵能,以维持蜂群的蜂巢意识链接 -->
<PsychicSensitivity>1</PsychicSensitivity>
<!-- 女皇的崩溃概率 -->
<MentalBreakThreshold>0</MentalBreakThreshold>
<!-- 女皇的高耸身躯和强健循环系统使得很难被毒倒下 -->
<ToxicResistance>0.95</ToxicResistance>
<ToxicEnvironmentResistance MayRequire="Ludeon.RimWorld.Biotech">0.95</ToxicEnvironmentResistance>
<!-- 女皇的甲壳可以抵御火焰侵袭,难以燃烧-->
<Flammability>0.1</Flammability>
<!-- 女皇的庞大申请很难闪开近战 -->
<MeleeDodgeChance>1.0</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>
<!-- 虫群拥有惊人的愈合速度 -->
<InjuryHealingFactor>5</InjuryHealingFactor>
<!-- 在野外采集的营养 -->
<ForagedNutritionPerDay>0</ForagedNutritionPerDay>
<!-- 污物规模,虫群污物规模都较大 -->
<FilthRate>8</FilthRate>
<Wildness>0.99</Wildness>
</statBases>
<!-- 工具设置(攻击方式) -->
<tools>
<li>
<label>head claw</label>
<capacities>
<li>Cut</li>
</capacities>
<power>12</power>
<cooldownTime>2.6</cooldownTime>
<linkedBodyPartsGroup>HeadClaw</linkedBodyPartsGroup>
</li>
<li>
<label>head</label>
<capacities>
<li>Blunt</li>
</capacities>
<power>7</power>
<cooldownTime>2</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
<chanceFactor>0.2</chanceFactor>
</li>
</tools>
<race>
<!-- 身体类型 -->
<body>BeetleLikeWithClaw</body>
<!-- 身形大小 -->
<baseBodySize>1.2</baseBodySize>
<!-- 血量上限 -->
<baseHealthScale>2.5</baseHealthScale>
<lifeStageAges>
<li>
<def>EusocialInsectAdult</def>
<soundWounded>Pawn_BigInsect_Pain</soundWounded>
<soundDeath>Pawn_BigInsect_Death</soundDeath>
<soundCall>Pawn_BigInsect_Call</soundCall>
<soundAngry>Pawn_BigInsect_Angry</soundAngry>
</li>
</lifeStageAges>
<soundMeleeHitPawn>Pawn_Melee_BigBash_HitPawn</soundMeleeHitPawn>
<soundMeleeHitBuilding>Pawn_Melee_BigBash_HitBuilding</soundMeleeHitBuilding>
<soundMeleeMiss>Pawn_Melee_BigBash_Miss</soundMeleeMiss>
<soundMeleeDodge>Pawn_MeleeDodge</soundMeleeDodge>
<!-- 阴影绘制 -->
<specialShadowData>
<volume>(0.5, 0.7, 0.43)</volume>
<offset>(0,0,-0.1)</offset>
</specialShadowData>
</race>
</AlienRace.ThingDef_AlienRace>
</Defs>

View File

@@ -1,17 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="BuildingNaturalBase">
<defName>ARA_InteractiveEggSac</defName>
<label>可交互的虫卵囊</label>
<description>一个黏滑的囊状物,可以通过交互来孵化特定的昆虫</description>
<thingClass>Building</thingClass>
<label>阿拉克涅虫卵囊-休眠中</label>
<description>一个脆弱、易燃、黏滑的囊状物,,是阿拉克涅女皇种所诞之卵,内含哺育一只新督虫所需的营养和遗传物质——可以通过阿拉克涅女皇种的交互完成激活进程</description>
<thingClass>ArachnaeSwarm.Building_Incubator</thingClass>
<category>Building</category>
<size>(1,1)</size>
<minifiedDef>MinifiedThing</minifiedDef>
<thingCategories>
<li>BuildingsMisc</li>
</thingCategories>
<graphicData>
<texPath>Things/Building/EggSac</texPath>
<graphicClass>Graphic_Random</graphicClass>
<drawSize>(1.5,1.5)</drawSize>
<texPath>Things/Building/EggSac</texPath>
<graphicClass>Graphic_Random</graphicClass>
<drawSize>(1.5,1.5)</drawSize>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
@@ -20,40 +23,47 @@
<tickerType>Normal</tickerType>
<terrainAffordanceNeeded>Light</terrainAffordanceNeeded>
<statBases>
<MaxHitPoints>200</MaxHitPoints>
<Flammability>0.4</Flammability>
<Beauty>-6</Beauty>
<Mass>10</Mass>
<MaxHitPoints>20</MaxHitPoints>
<Flammability>1</Flammability>
<Beauty>-6</Beauty>
</statBases>
<building>
<isInert>true</isInert>
<claimable>false</claimable>
<deconstructible>false</deconstructible>
<repairable>false</repairable>
<quickTargetable>true</quickTargetable>
<isTargetable>true</isTargetable>
<expandHomeArea>false</expandHomeArea>
<isInert>true</isInert>
<!-- <claimable>false</claimable> -->
<deconstructible>false</deconstructible>
<repairable>false</repairable>
<quickTargetable>true</quickTargetable>
<isTargetable>true</isTargetable>
<expandHomeArea>false</expandHomeArea>
</building>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(113,141,117,0)</glowColor>
</li>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<pawnKinds>
<li>Megascarab</li>
<li>Spelopede</li>
<li>Megaspider</li>
</pawnKinds>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<delay>300</delay> <!-- 5 seconds -->
<destroyOnSpawn>true</destroyOnSpawn>
</li>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(113,141,117,0)</glowColor>
</li>
<li Class="ArachnaeSwarm.CompProperties_SpawnPawnFromList">
<pawnKinds>
<li>Megascarab</li>
<li>Spelopede</li>
<li>Megaspider</li>
<li>ARA_ArachnaeNodeA</li>
</pawnKinds>
<whitelist>
<li>ARA_ArachnaeQueen</li>
</whitelist>
<delay>300</delay> <!-- 5 seconds -->
<destroyOnSpawn>true</destroyOnSpawn>
<hatchingGraphicData>
<texPath>Things/Building/Natural/Hive</texPath>
<graphicClass>Graphic_Random</graphicClass>
<drawSize>1.6</drawSize>
</hatchingGraphicData>
</li>
<li Class="CompProperties_SpawnEffecterOnDestroy">
<effect>CocoonDestroyed</effect>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
<ARA_AlertUnlinkedDroneLabel>未连接的虫群工蜂</ARA_AlertUnlinkedDroneLabel>
<ARA_AlertUnlinkedDroneExplanation>地图上存在未连接到阿拉克涅女皇种的虫群工蜂。这些工蜂将在一段时间后死亡。请尽快将它们与阿拉克涅女皇种连接。</ARA_AlertUnlinkedDroneExplanation>
</LanguageData>

View File

@@ -73,7 +73,17 @@
<Compile Include="JobDriver_Incubate.cs" />
<Compile Include="CompProperties_AbilitySprayLiquidMulti.cs" />
<Compile Include="CompAbilityEffect_SprayLiquidMulti.cs" />
<Compile Include="Building_Incubator.cs" />
<Compile Include="Hediffs\Hediff_CurseFlame.cs" />
<Compile Include="CompAbilityEffect_NeedCost.cs" />
<Compile Include="CompAbilityEffect_BodyPartCheck.cs" />
<Compile Include="Hediff_HiveMindMaster.cs" />
<Compile Include="Hediff_HiveMindDrone.cs" />
<Compile Include="HediffCompProperties_HiveMindDrone.cs" />
<Compile Include="HediffComp_HiveMindDrone.cs" />
<Compile Include="CompAbilityEffect_BindDrone.cs" />
<Compile Include="CompProperties_AbilityBindDrone.cs" />
<Compile Include="Alert_UnlinkedHiveMindDrone.cs" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -0,0 +1,22 @@
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
public class Building_Incubator : Building
{
public CompSpawnPawnFromList SpawnComp => GetComp<CompSpawnPawnFromList>();
public override Graphic Graphic
{
get
{
if (SpawnComp != null && SpawnComp.IsHatching && SpawnComp.Props.hatchingGraphicData != null)
{
return SpawnComp.Props.hatchingGraphicData.Graphic;
}
return base.Graphic;
}
}
}
}

View File

@@ -0,0 +1,108 @@
using RimWorld;
using Verse;
using System.Linq; // For LINQ operations
namespace ArachnaeSwarm
{
public class CompAbilityEffect_BindDrone : CompAbilityEffect
{
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
Pawn dronePawn = target.Pawn;
Pawn masterPawn = parent.pawn; // The pawn casting the ability
if (masterPawn != null && dronePawn != null)
{
Hediff_HiveMindMaster masterHediff = masterPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindMaster")) as Hediff_HiveMindMaster;
if (masterHediff != null)
{
if (masterHediff.TryBindDrone(dronePawn))
{
Messages.Message($"Successfully bound {dronePawn.LabelShort} to {masterPawn.LabelShort}'s hive mind.", MessageTypeDefOf.PositiveEvent, historical: false);
}
else
{
Messages.Message($"Failed to bind {dronePawn.LabelShort} to {masterPawn.LabelShort}'s hive mind. Check logs for details.", MessageTypeDefOf.NegativeEvent, historical: false);
}
}
else
{
Log.Error($"[ArachnaeSwarm] Master {masterPawn.LabelShort} tried to bind a drone but does not have Hediff_HiveMindMaster.");
}
}
}
public override bool Valid(LocalTargetInfo target, bool throwMessages = false)
{
if (!base.Valid(target, throwMessages))
{
return false;
}
Pawn dronePawn = target.Pawn;
Pawn masterPawn = parent.pawn;
// Target must be a pawn
if (dronePawn == null)
{
if (throwMessages)
{
Messages.Message("MustTargetPawn".Translate(parent.def.label), MessageTypeDefOf.RejectInput, historical: false);
}
return false;
}
// Target must be on the same map as the caster
if (dronePawn.Map != masterPawn.Map)
{
if (throwMessages)
{
Messages.Message("CannotTargetDifferentMap".Translate(), MessageTypeDefOf.RejectInput, historical: false);
}
return false;
}
// Target must have ARA_HiveMindDrone hediff
Hediff_HiveMindDrone droneHediff = dronePawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindDrone")) as Hediff_HiveMindDrone;
if (droneHediff == null)
{
if (throwMessages)
{
Messages.Message($"Target {dronePawn.LabelShort} does not have the 'ARA_HiveMindDrone' hediff.", MessageTypeDefOf.RejectInput, historical: false);
}
return false;
}
// Target must not be already bound to another master
if (droneHediff.target != null && droneHediff.target != masterPawn)
{
if (throwMessages)
{
Messages.Message($"Target {dronePawn.LabelShort} is already bound to {droneHediff.target.LabelShort}.", MessageTypeDefOf.RejectInput, historical: false);
}
return false;
}
// Caster must have ARA_HiveMindMaster hediff
Hediff_HiveMindMaster masterHediff = masterPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindMaster")) as Hediff_HiveMindMaster;
if (masterHediff == null)
{
if (throwMessages)
{
Messages.Message($"Caster {masterPawn.LabelShort} does not have the 'ARA_HiveMindMaster' hediff.", MessageTypeDefOf.RejectInput, historical: false);
}
return false;
}
// All checks passed
return true;
}
public override bool CanApplyOn(LocalTargetInfo target, LocalTargetInfo dest)
{
return Valid(target);
}
}
}

View File

@@ -0,0 +1,49 @@
using System.Linq;
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityBodyPartCheck : CompProperties_AbilityEffect
{
public BodyPartDef requiredPart;
public float minimumHealth = 0.8f;
public string failMessage = "Missing or damaged body part.";
public CompProperties_AbilityBodyPartCheck()
{
compClass = typeof(CompAbilityEffect_BodyPartCheck);
}
}
public class CompAbilityEffect_BodyPartCheck : CompAbilityEffect
{
public new CompProperties_AbilityBodyPartCheck Props => (CompProperties_AbilityBodyPartCheck)props;
public override bool GizmoDisabled(out string reason)
{
Pawn caster = parent.pawn;
if (caster != null && caster.health != null && caster.health.hediffSet != null)
{
var part = caster.health.hediffSet.GetNotMissingParts()
.FirstOrDefault(p => p.def == Props.requiredPart);
if (part == null)
{
reason = Props.failMessage;
return true;
}
float partHealth = caster.health.hediffSet.GetPartHealth(part) / part.def.GetMaxHealth(caster);
if (partHealth < Props.minimumHealth)
{
reason = Props.failMessage;
return true;
}
}
reason = null;
return false;
}
}
}

View File

@@ -0,0 +1,54 @@
using RimWorld;
using RimWorld.Planet;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityNeedCost : CompProperties_AbilityEffect
{
public NeedDef needDef;
public float needCost;
public string failMessage;
public CompProperties_AbilityNeedCost()
{
compClass = typeof(CompAbilityEffect_NeedCost);
}
}
public class CompAbilityEffect_NeedCost : CompAbilityEffect
{
public new CompProperties_AbilityNeedCost Props => (CompProperties_AbilityNeedCost)props;
public override bool GizmoDisabled(out string reason)
{
Pawn caster = parent.pawn;
if (caster != null && caster.needs != null)
{
if (caster.needs.TryGetNeed(Props.needDef, out Need need))
{
if (need.CurLevel < Props.needCost)
{
reason = Props.failMessage;
return true;
}
}
}
reason = null;
return false;
}
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
Pawn caster = parent.pawn;
if (caster != null && caster.needs != null)
{
if (caster.needs.TryGetNeed(Props.needDef, out Need need))
{
need.CurLevel -= Props.needCost;
}
}
}
}
}

View File

@@ -0,0 +1,13 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityBindDrone : CompProperties_AbilityEffect
{
public CompProperties_AbilityBindDrone()
{
this.compClass = typeof(CompAbilityEffect_BindDrone);
}
}
}

View File

@@ -13,6 +13,7 @@ namespace ArachnaeSwarm
public bool destroyOnSpawn = false;
public IntRange spawnCount = new IntRange(1, 1);
public Type lordJob;
public GraphicData hatchingGraphicData;
public CompProperties_SpawnPawnFromList()
{

View File

@@ -13,6 +13,7 @@ namespace ArachnaeSwarm
private int spawnUntilTick = -1;
private PawnKindDef spawningPawnKind;
private PawnKindDef selectedPawnKind;
public bool IsHatching => spawnUntilTick > 0;
public override IEnumerable<FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
{
@@ -40,6 +41,7 @@ namespace ArachnaeSwarm
}
}
public void StartIncubation()
{
spawningPawnKind = selectedPawnKind;
@@ -55,6 +57,8 @@ namespace ArachnaeSwarm
}
}
private void SpawnPawn(PawnKindDef pawnKind)
{
try
@@ -71,34 +75,38 @@ namespace ArachnaeSwarm
return;
}
Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnKind, parent.Faction));
if (pawn == null)
int count = Props.spawnCount.RandomInRange;
for (int i = 0; i < count; i++)
{
Log.Error($"CompSpawnPawnFromList: Failed to generate pawn of kind {pawnKind.defName} for faction {parent.Faction?.Name ?? "null"}.");
return;
}
if (GenSpawn.Spawn(pawn, parent.Position, parent.Map) == null)
{
Log.Error($"CompSpawnPawnFromList: Failed to spawn pawn {pawn} at {parent.Position}.");
if (!pawn.Destroyed)
Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnKind, parent.Faction));
if (pawn == null)
{
pawn.Destroy();
Log.Error($"CompSpawnPawnFromList: Failed to generate pawn of kind {pawnKind.defName} for faction {parent.Faction?.Name ?? "null"}.");
continue;
}
return;
}
if (Props.lordJob != null)
{
try
if (GenSpawn.Spawn(pawn, parent.Position, parent.Map) == null)
{
LordJob lordJobInstance = (LordJob)System.Activator.CreateInstance(Props.lordJob);
Lord lord = LordMaker.MakeNewLord(parent.Faction, lordJobInstance, parent.Map);
lord.AddPawn(pawn);
Log.Error($"CompSpawnPawnFromList: Failed to spawn pawn {pawn} at {parent.Position}.");
if (!pawn.Destroyed)
{
pawn.Destroy();
}
continue;
}
catch (System.Exception e)
if (Props.lordJob != null)
{
Log.Error($"CompSpawnPawnFromList: Error creating LordJob {Props.lordJob?.Name ?? "null"} or assigning pawn {pawn}. Exception: {e}");
try
{
LordJob lordJobInstance = (LordJob)System.Activator.CreateInstance(Props.lordJob);
Lord lord = LordMaker.MakeNewLord(parent.Faction, lordJobInstance, parent.Map);
lord.AddPawn(pawn);
}
catch (System.Exception e)
{
Log.Error($"CompSpawnPawnFromList: Error creating LordJob {Props.lordJob?.Name ?? "null"} or assigning pawn {pawn}. Exception: {e}");
}
}
}
@@ -114,6 +122,7 @@ namespace ArachnaeSwarm
}
}
public override string CompInspectStringExtra()
{
if (spawnUntilTick > 0)
@@ -136,6 +145,7 @@ namespace ArachnaeSwarm
base.PostExposeData();
Scribe_Values.Look(ref spawnUntilTick, "spawnUntilTick", -1);
Scribe_Defs.Look(ref spawningPawnKind, "spawningPawnKind");
Scribe_Defs.Look(ref selectedPawnKind, "selectedPawnKind");
}
}
}

View File

@@ -0,0 +1,14 @@
using Verse;
namespace ArachnaeSwarm
{
public class HediffCompProperties_HiveMindDrone : HediffCompProperties
{
public int unlinkedDieDelayTicks = 1800; // Default to 30 seconds
public HediffCompProperties_HiveMindDrone()
{
this.compClass = typeof(HediffComp_HiveMindDrone); // Reference the Comp class
}
}
}

View File

@@ -0,0 +1,57 @@
using Verse;
using RimWorld;
namespace ArachnaeSwarm
{
public class HediffComp_HiveMindDrone : HediffComp
{
public HediffCompProperties_HiveMindDrone Props => (HediffCompProperties_HiveMindDrone)this.props;
public int TicksUnlinked => ticksUnlinked; // Expose as public property
private int ticksUnlinked = 0;
public override void CompExposeData()
{
base.CompExposeData();
Scribe_Values.Look(ref ticksUnlinked, "ticksUnlinked", 0);
}
public override void CompPostTick(ref float severityAdjustment)
{
base.CompPostTick(ref severityAdjustment);
// Only check if pawn is spawned and on a map
if (parent.pawn.Spawned && parent.pawn.Map != null)
{
// We use parent.pawn.IsHashIntervalTick(60) for performance
if (!parent.pawn.IsHashIntervalTick(60))
return;
Hediff_HiveMindDrone droneHediff = parent as Hediff_HiveMindDrone;
if (droneHediff == null) return; // Should not happen
Pawn masterPawn = droneHediff.target as Pawn;
if (masterPawn == null || masterPawn.Destroyed || masterPawn.Dead || !masterPawn.health.hediffSet.HasHediff(HediffDef.Named("ARA_HiveMindMaster")))
{
// Master is invalid or unlinked, start/continue unlinked timer
ticksUnlinked += 60; // Increment by 60 because we check every 60 ticks
if (ticksUnlinked >= Props.unlinkedDieDelayTicks)
{
Log.Message($"[ArachnaeSwarm] Drone {parent.pawn.LabelShort} was unlinked from master for too long and will die. Forcing death.");
// Ensure the pawn is killed only once and prevent further ticks
if (!parent.pawn.Dead && !parent.pawn.Destroyed)
{
parent.pawn.Kill(null, parent);
}
}
}
else
{
// Master is valid, reset unlinked timer
ticksUnlinked = 0;
}
}
}
}
}

View File

@@ -0,0 +1,73 @@
using System.Linq;
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class Hediff_HiveMindDrone : HediffWithTarget
{
public override string LabelBase
{
get
{
string baseLabel = base.LabelBase + " (" + (target != null ? target.LabelShortCap : "未连接") + ")";
// Get the HediffComp_HiveMindDrone to access ticksUnlinked
HediffComp_HiveMindDrone comp = this.TryGetComp<HediffComp_HiveMindDrone>();
if (comp != null)
{
// Safely cast target to Pawn for Dead and health checks
Pawn masterPawn = target as Pawn;
if (masterPawn == null || masterPawn.Destroyed || masterPawn.Dead || !masterPawn.health.hediffSet.HasHediff(HediffDef.Named("ARA_HiveMindMaster")))
{
float timeLeftSecs = (comp.Props.unlinkedDieDelayTicks - comp.TicksUnlinked) / 60f;
if (timeLeftSecs > 0)
{
return baseLabel + " (死亡倒计时: " + timeLeftSecs.ToString("F1") + "s)";
}
}
}
return baseLabel;
}
}
public override void PostAdd(DamageInfo? dinfo)
{
base.PostAdd(dinfo);
// No direct linking in PostAdd, master will link manually
}
public override bool ShouldRemove
{
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
}
}
public override void PostRemoved()
{
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)
{
var masterHediff = master.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindMaster")) as Hediff_HiveMindMaster;
masterHediff?.DeregisterDrone(this.pawn);
}
}
// PostTick logic moved to HediffComp_HiveMindDrone
}
}

View File

@@ -0,0 +1,86 @@
using System.Collections.Generic;
using System.Linq;
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class Hediff_HiveMindMaster : Hediff
{
private List<Pawn> drones = new List<Pawn>();
public override string LabelInBrackets => drones.Count.ToString();
public override void ExposeData()
{
base.ExposeData();
Scribe_Collections.Look(ref drones, "drones", LookMode.Reference);
if (drones == null)
{
drones = new List<Pawn>();
}
}
public bool TryBindDrone(Pawn drone)
{
if (drone == null || drone.Dead || !drone.Spawned || drone.Map != this.pawn.Map)
{
Log.Message($"[ArachnaeSwarm] Cannot bind drone {drone?.LabelShort ?? "null"}: Invalid pawn state.");
return false;
}
Hediff_HiveMindDrone droneHediff = drone.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindDrone")) as Hediff_HiveMindDrone;
if (droneHediff == null)
{
Log.Message($"[ArachnaeSwarm] Cannot bind drone {drone.LabelShort}: Does not have ARA_HiveMindDrone hediff.");
return false;
}
if (droneHediff.target != null && droneHediff.target != this.pawn)
{
Log.Message($"[ArachnaeSwarm] Cannot bind drone {drone.LabelShort}: Already bound to another master ({droneHediff.target.LabelShort}).");
return false;
}
if (drones.Contains(drone))
{
Log.Message($"[ArachnaeSwarm] Drone {drone.LabelShort} is already bound to this master.");
return false;
}
droneHediff.target = this.pawn; // Set the drone's target to this master
drones.Add(drone);
UpdateSeverity();
Log.Message($"[ArachnaeSwarm] Master {this.pawn.LabelShort} successfully bound drone {drone.LabelShort}.");
return true;
}
public void DeregisterDrone(Pawn drone)
{
if (drones.Contains(drone))
{
drones.Remove(drone);
UpdateSeverity();
}
}
private void UpdateSeverity()
{
this.Severity = drones.Count;
}
public override void PostRemoved()
{
base.PostRemoved();
// Kill all drones when the master hediff is removed (e.g., master dies)
foreach (var drone in drones.ToList()) // ToList() to avoid collection modification issues
{
if (drone != null && !drone.Dead)
{
Log.Message($"[ArachnaeSwarm] Master {pawn.LabelShort} died, killing drone {drone.LabelShort}.");
drone.Kill(null, this);
}
}
}
}
}

View File

@@ -0,0 +1,147 @@
# 蜂巢意识Hive Mind系统设计文档 - v2
## 1. 需求概述
本设计旨在为 `ArachnaeSwarm` Mod 实现一个“蜂巢意识”系统。该系统包含两种角色:
- **主节点 (Master)**:蜂巢的中心。
- **子节点 (Drone)**:蜂巢的工蜂,可以有多个。
它们之间通过 `Hediff`(健康状态)进行链接,实现以下核心功能:
1. **自动绑定**:子节点在生成时,会自动在地图上寻找携带 `ARA_HiveMindMaster` Hediff 的Pawn作为主节点。如果找到多个则选择第一个进行绑定。如果找不到主节点子节点会立即死亡。
2. **主从死亡联动**:当主节点死亡时,所有与之链接的子节点也会立即死亡。
3. **链接增益**:主节点的力量会随着链接的子节点数量增加而增强。具体表现为主节点的 `Hediff` 严重性Severity会随着子节点数量的增加而提升为后续添加属性加成提供基础。
## 2. 技术方案
为了实现上述功能,我们将创建以下组件:
### 2.1. XML 定义 (使用 ARA_ 前缀)
我们将定义两个新的 `HediffDef`:
- `HediffDef: ARA_HiveMindMaster`
- **hediffClass**: `ArachnaeSwarm.Hediff_HiveMindMaster`
- **描述**: 应用于主节点,用于管理子节点链接并根据数量调整严重性。
- `HediffDef: ARA_HiveMindDrone`
- **hediffClass**: `ArachnaeSwarm.Hediff_HiveMindDrone`
- **描述**: 应用于子节点,继承自 `HediffWithTarget`,其 `target` 字段将指向主节点。
### 2.2. C# 类定义 (命名空间: ArachnaeSwarm)
我们将实现两个新的C#类
- `Hediff_HiveMindMaster`
- 继承自 `Hediff`
- 包含一个 `List<Pawn>` 类型的字段 `drones`,用于存储所有已链接的子节点。
- 提供 `RegisterDrone(Pawn drone)``DeregisterDrone(Pawn drone)` 方法,用于添加和移除子节点。
- 在每次注册/反注册后,更新自身的 `Severity` 属性,其值等于 `drones.Count`
- 重写 `PostRemoved()` 方法在主节点死亡或Hediff被移除时杀死所有已注册的子节点。
- `Hediff_HiveMindDrone`
- 继承自 `HediffWithTarget`
- 重写 `PostAdd(DamageInfo? dinfo)` 方法。在此方法中:
1. 在当前地图上扫描所有Pawn查找携带 `ARA_HiveMindMaster` Hediff 的单位。
2. 如果找到至少一个,则选择第一个作为 `target`,并调用其 `RegisterDrone` 方法将自己注册进去。
3. 如果找不到任何主节点,立即杀死自己 (`pawn.Kill(null, null)`)。
- 重写 `PostRemoved()` 方法,在自身被移除时,如果 `target` 仍然有效,则调用其 `DeregisterDrone` 方法将自己从中移除。
-`PostTick()` 或类似方法中周期性检查 `target`(主节点)是否已死亡或 Hediff 已被移除。如果是,则立即杀死自己。
## 3. 开发步骤 (TODO List)
- [ ] **步骤 1: 创建 XML 定义**
-`ArachnaeSwarm/1.6/Defs/HediffDefs/` 目录下创建 `ARA_Hediffs_HiveMind.xml` 文件。
- [ ] **步骤 2: 实现 C# 类 `Hediff_HiveMindMaster`**
-`ArachnaeSwarm/Source/ArachnaeSwarm/` 目录下创建 `Hediff_HiveMindMaster.cs` 文件并编写代码。
- [ ] **步骤 3: 实现 C# 类 `Hediff_HiveMindDrone`**
-`ArachnaeSwarm/Source/ArachnaeSwarm/` 目录下创建 `Hediff_HiveMindDrone.cs` 文件并编写代码。
- [ ] **步骤 4: 更新项目文件**
- 将新创建的 `.cs` 文件添加到 `ArachnaeSwarm.csproj` 项目文件中。
- [ ] **步骤 5: 编译和测试**
- 运行 `dotnet build` 编译项目,修复所有编译错误。
- 进入游戏进行功能测试。
## 4. 参考代码
### `HediffWithTarget.cs`
```csharp
using Verse;
namespace RimWorld
{
public class HediffWithTarget : HediffWithComps
{
public Thing target;
public override bool ShouldRemove
{
get
{
if (target != null && !(target is Pawn { Dead: not false }))
{
return base.ShouldRemove;
}
return true;
}
}
public override void ExposeData()
{
base.ExposeData();
Scribe_References.Look(ref target, "target");
}
}
}
```
### `Hediff_PsychicBond.cs`
```csharp
using Verse;
namespace RimWorld
{
public class Hediff_PsychicBond : HediffWithTarget
{
private const int HediffCheckInterval = 65;
public override string LabelBase => base.LabelBase + " (" + target?.LabelShortCap + ")";
public override bool ShouldRemove
{
get
{
if (!base.ShouldRemove)
{
return pawn.Dead;
}
return true;
}
}
public override void PostRemoved()
{
base.PostRemoved();
Gene_PsychicBonding gene_PsychicBonding = base.pawn.genes?.GetFirstGeneOfType<Gene_PsychicBonding>();
if (gene_PsychicBonding != null)
{
gene_PsychicBonding.RemoveBond();
}
else if (target != null && target is Pawn pawn)
{
pawn.genes?.GetFirstGeneOfType<Gene_PsychicBonding>()?.RemoveBond();
}
}
public override void PostTickInterval(int delta)
{
base.PostTickInterval(delta);
if (pawn.IsHashIntervalTick(65, delta))
{
Severity = (ThoughtWorker_PsychicBondProximity.NearPsychicBondedPerson(pawn, this) ? 0.5f : 1.5f);
}
}
}
}

View File

@@ -0,0 +1,38 @@
# 项目:可交互的虫卵囊
## 1. 核心目标
创建一个可交互的虫卵囊,它允许一个特定的 Pawn阿拉克涅女皇种通过右键菜单与它交互从一个可配置的列表中选择一个 Pawn并在经过一段可配置的延迟后生成这个 Pawn。
## 2. 已完成的功能
* **创建了新的 VS 项目**: [`ArachnaeSwarm.csproj`](Source/ArachnaeSwarm/ArachnaeSwarm.csproj)
* **实现了核心的生成逻辑**:
* `CompProperties_SpawnPawnFromList.cs`: 定义了 XML 中可配置的属性,包括:
* `pawnKinds`: 可生成的 Pawn 列表。
* `whitelist`: 可以与虫卵囊交互的 Pawn 列表。
* `delay`: 孵化延迟。
* `spawnCount`: 生成数量。
* `destroyOnSpawn`: 生成后是否摧毁自身。
* `lordJob`: 生成的 Pawn 要执行的集体任务。
* `CompSpawnPawnFromList.cs`: 实现了核心的生成逻辑,包括:
* 生成右键菜单。
* 处理孵化倒计时。
* 生成指定数量的 Pawn。
* 在检查面板上显示孵化状态和提示信息。
* **实现了交互的 Job**:
* `ARA_Jobs.xml`: 定义了 `ARA_IncubateJob`
* `JobDriver_Incubate.cs`: 实现了让 Pawn 走到虫卵囊旁边并启动孵化过程的逻辑。
* **实现了动态的图形切换**:
* `Building_Incubator.cs`: 创建了一个新的建筑基类,它会根据虫卵囊是否正在孵化来动态地改变自身的图形。
* **创建了测试用的 Defs**:
* `ARA_InteractiveEggSac.xml`: 定义了一个可交互的虫卵囊,用于在游戏中测试新功能。
* `ArachnaeSwarm_Keys.xml`: 定义了相关的本地化 `key`
## 3. 当前状态
目前,项目已经基本完成了所有的核心功能,并且能够成功编译。但是,在最后一次构建时,我们遇到了一个编译错误,导致我们无法进行最终的测试。
## 4. 下一步计划
解决当前的编译错误,并成功构建项目,以便在游戏中进行最终的测试。