This commit is contained in:
Tourswen
2025-12-19 03:08:16 +08:00
parent ad42832aa7
commit 6d7ac8f054
45 changed files with 2187 additions and 1403 deletions

Binary file not shown.

View File

@@ -633,9 +633,10 @@
<verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
<label>追踪冲撞</label>
<requireLineOfSight>false</requireLineOfSight>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
<canTargetBuildings>true</canTargetBuildings>
<canTargetAnimals>true</canTargetAnimals>
<canTargetMechs>true</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
@@ -672,7 +673,7 @@
<defName>ARA_Flyer_TrackingCharge</defName>
<thingClass>ArachnaeSwarm.PawnFlyer_TrackingCharge</thingClass>
<pawnFlyer>
<flightSpeed>0.5</flightSpeed>
<flightSpeed>1.5</flightSpeed>
<heightFactor>0</heightFactor>
</pawnFlyer>
</ThingDef>

View File

@@ -4197,4 +4197,559 @@
</parts>
</corePart>
</BodyDef>
<BodyDef>
<defName>ArachnaeSlayer_Body</defName>
<label>阿拉克涅暴屠种</label>
<corePart>
<def>Torso</def>
<height>Middle</height>
<depth>Outside</depth>
<groups>
<li>Torso</li>
</groups>
<parts>
<!-- 背部组织,仅包含骨骼和甲片 -->
<li>
<def>ARA_Dorsum</def>
<coverage>0.14</coverage>
<groups>
<li>Torso</li>
</groups>
<parts>
<!-- 甲片,防御作用 -->
<li>
<def>ARA_Chitin_Shell</def>
<coverage>0.02</coverage>
<depth>Outside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<!-- 背部外骨骼,承担托举四肢和代替脊椎 -->
<li>
<def>ARA_Exoskeleton_Dorsum</def>
<coverage>0.016</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
</parts>
</li>
<!-- 胸部组织,包含骨骼和各类重点维生器官 -->
<li>
<def>ARA_Sternum</def>
<coverage>0.15</coverage>
<groups>
<li>Torso</li>
</groups>
<parts>
<!-- 胸部外骨骼,代替肋骨,因为没有甲片所以是外露的 -->
<li>
<def>ARA_Exoskeleton_Sternum</def>
<coverage>0.015</coverage>
<depth>Outside</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>Stomach</def>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<!-- 肺,4个 -->
<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>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>
<!-- 肾脏,2个 -->
<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>
<!-- 肝脏,2个 -->
<li>
<def>Liver</def>
<coverage>0.025</coverage>
<customLabel>肝脏(其一)</customLabel>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
<li>
<def>Liver</def>
<customLabel>肝脏(其二)</customLabel>
<coverage>0.025</coverage>
<depth>Inside</depth>
<groups>
<li>Torso</li>
</groups>
</li>
</parts>
</li>
<!-- 尾部组织群 -->
<li>
<def>ARA_Tail</def>
<height>Bottom</height>
<depth>Inside</depth>
<coverage>0.15</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>
</parts>
</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>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>
<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>left ear</customLabel>
<coverage>0.07</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>UpperHead</li>
<li>FullHead</li>
</groups>
</li>
<li>
<def>Ear</def>
<customLabel>right ear</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>
<flipGraphic>true</flipGraphic>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Clavicle</def>
<customLabel>左副肢外骨骼</customLabel>
<coverage>0.09</coverage>
<height>Top</height>
<depth>Outside</depth>
<flipGraphic>true</flipGraphic>
<groups>
<li>Shoulders</li>
</groups>
</li>
<li>
<def>Arm</def>
<customLabel>左副肢</customLabel>
<coverage>0.77</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Hand</def>
<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>右鳌钳口</customLabel>
<coverage>0.14</coverage>
<groups>
<li>Hands</li>
<li>LeftHand</li>
</groups>
</li>
</parts>
</li>
</parts>
</li>
</parts>
</li>
<li>
<def>Shoulder</def>
<customLabel>右副肢关节</customLabel>
<coverage>0.12</coverage>
<woundAnchorTag>LeftShoulder</woundAnchorTag>
<flipGraphic>true</flipGraphic>
<groups>
<li>Shoulders</li>
</groups>
<parts>
<li>
<def>Clavicle</def>
<customLabel>右副肢外骨骼</customLabel>
<coverage>0.09</coverage>
<height>Top</height>
<depth>Outside</depth>
<flipGraphic>true</flipGraphic>
<groups>
<li>Shoulders</li>
</groups>
</li>
<li>
<def>Arm</def>
<customLabel>右副肢</customLabel>
<coverage>0.77</coverage>
<flipGraphic>true</flipGraphic>
<groups>
<li>Arms</li>
</groups>
<parts>
<li>
<def>Hand</def>
<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>右鳌钳口</customLabel>
<coverage>0.14</coverage>
<groups>
<li>Hands</li>
<li>RightHand</li>
</groups>
</li>
</parts>
</li>
</parts>
</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>左前腿</customLabel>
<coverage>0.06</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<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>左前腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Leg</def>
<customLabel>右前腿</customLabel>
<coverage>0.06</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<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>右前腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Leg</def>
<customLabel>左后腿</customLabel>
<coverage>0.06</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<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>左后腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
</parts>
</li>
<li>
<def>Leg</def>
<customLabel>右后腿</customLabel>
<coverage>0.06</coverage>
<height>Bottom</height>
<groups>
<li>Legs</li>
</groups>
<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>右后腿外骨骼</customLabel>
<coverage>0.1</coverage>
<depth>Inside</depth>
<groups>
<li>Legs</li>
</groups>
</li>
</parts>
</li>
</parts>
</corePart>
</BodyDef>
</Defs>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<FleckDef ParentName="FleckBase">
<FleckDef ParentName="FleckBase">
<defName>ARA_Arc_Beam_Fleck</defName>
<altitudeLayer>MoteOverhead</altitudeLayer>
<fadeInTime>0.025</fadeInTime>
@@ -190,7 +190,7 @@
<positionRadius>0.1</positionRadius>
</EffecterDef>
<EffecterDef>
<defName>ARA_Double_Melee_Attack_Hit</defName>
<defName>ARA_Melee_Attack_Pluse_Hit</defName>
<children>
<li>
<subEffecterClass>SubEffecter_Random</subEffecterClass>
@@ -229,7 +229,7 @@
<color>(170,74,68)</color>
<scale>6.5~7.5</scale>
<speed>0.5</speed>
<angle>180~196</angle>
<angle>-25~45</angle>
<spawnLocType>OnSource</spawnLocType>
<fleckUsesAngleForVelocity>true</fleckUsesAngleForVelocity>
</li>
@@ -240,7 +240,7 @@
<color>(147,50,28)</color>
<scale>6.5~7.5</scale>
<speed>0.5</speed>
<angle>195~215</angle>
<angle>-35~35</angle>
<spawnLocType>OnSource</spawnLocType>
<fleckUsesAngleForVelocity>true</fleckUsesAngleForVelocity>
</li>
@@ -252,24 +252,20 @@
<EffecterDef>
<defName>ARA_Area_Crush</defName>
<children>
<li>
<subEffecterClass>SubEffecter_SoundTriggered</subEffecterClass>
<soundDef>ARA_Area_Crush_Sound</soundDef>
<spawnLocType>OnTarget</spawnLocType>
</li>
<li>
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
<fleckDef>Fleck_BlastMechBandShockwave</fleckDef>
<burstCount>1</burstCount>
<spawnLocType>OnSource</spawnLocType>
<absoluteAngle>true</absoluteAngle>
<scale>0.25~0.35</scale>
<rotation>0~0</rotation>
</li>
<li>
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
<moteDef>Mote_GiantExplosion</moteDef>
<scale>1~1</scale>
</li>
<li>
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
<moteDef>Mote_GiantExplosionInner</moteDef>
<scale>5~5</scale>
</li>
</children>
</EffecterDef>

View File

@@ -1519,4 +1519,31 @@
</li>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_Slayer_Base</defName>
<label>暴虐之兽</label>
<description>阿拉克涅暴屠种是一种特殊的兽虫,比起它的兄弟姐妹,它的智力等级要低很多,但是它也获得了其他虫族无法比拟的优势——巨大的体型和厚重的甲壳,这使得它可以抵御一切的攻击,并作为重锤击碎敌人的防御阵地。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<stages>
<li>
<minSeverity>0</minSeverity>
<statFactors>
<StaggerDurationFactor>0</StaggerDurationFactor>
<Flammability>0</Flammability>
<MeleeHitChance>5</MeleeHitChance>
<IncomingDamageFactor>0.25</IncomingDamageFactor>
</statFactors>
<statOffsets>
<ArmorRating_Blunt>3</ArmorRating_Blunt>
<ArmorRating_Sharp>3</ArmorRating_Sharp>
<ArmorRating_Heat>1.5</ArmorRating_Heat>
</statOffsets>
</li>
</stages>
</HediffDef>
</Defs>

View File

@@ -132,7 +132,47 @@
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_HiveMindBeast</defName>
<label>阿拉克涅兽虫</label>
<description>阿拉克涅兽虫是对比其他阿拉克涅虫族来说要更加原始的生命体,头脑简单四肢发达,但是不怎么遵循蜂巢的金字塔思维,巢穴内的任何督虫和女皇均可指挥它们。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<stages>
<li>
<minSeverity>0</minSeverity>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_HiveStrength_Pluse</defName>
<label>虫群异血</label>
<description>这只阿拉克涅虫族的修复细胞已经难以用常理形容,无论是多严重的伤势几乎都无法将其击杀。此外,这种强大的细胞也能给予其抵御酸蚀和阿拉克涅虫酸的伤害。</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<stages>
<li>
<minSeverity>0</minSeverity>
<regeneration>500</regeneration>
<damageFactors>
<ARA_AcidBurn>0.1</ARA_AcidBurn>
<AcidBurn>0.1</AcidBurn>
</damageFactors>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_Cycle_Suppression_Hediff</li>
</hediffs>
</li>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_HiveStrength</defName>
<label>虫群活力</label>

View File

@@ -593,7 +593,7 @@
<li>
<bodyGraphicData>
<texPath>ArachnaeSwarm/Things/ARA_Slayer/Bodies/Naked_Thin</texPath>
<drawSize>4.5</drawSize>
<drawSize>6.5</drawSize>
<shadowData>
<volume>(0.4, 0.5, 0.37)</volume>
<offset>(0,0,-0.15)</offset>

View File

@@ -3,6 +3,7 @@
<ResearchProjectDef Abstract="True" Name="ARA_techBase">
<techLevel>Medieval</techLevel>
<tab>ARA_ResearchTab</tab>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<heldByFactionCategoryTags Inherit="False" />
</ResearchProjectDef>
<ResearchProjectDef Abstract="True" Name="ARA_techBase_Needtechprint" ParentName="ARA_techBase">
@@ -11,6 +12,7 @@
<techprintCount>1</techprintCount>
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>2500</techprintMarketValue>
<requiredResearchBuilding>ARA_InteractiveEggSac_Techprint</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -23,7 +25,7 @@
<ResearchProjectDef ParentName="ARA_techBase">
<defName>ARA_Base_Technology</defName>
<label>基础基因序列获取</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n解锁虫群的基础科技允许孵化基本的辅虫和武装器官。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n解锁虫群的基础科技允许孵化基本的辅虫和武装器官。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>100</baseCost>
<researchViewX>0.00</researchViewX>
<researchViewY>3.20</researchViewY>
@@ -31,11 +33,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_1WMT</defName>
<label>节点WMT-1"突破"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种和工艺种进化到下一个阶段。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种和工艺种进化到下一个阶段。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>3000</baseCost>
<researchViewX>4.50</researchViewX>
<researchViewY>3.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<techprintCount>1</techprintCount>
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>1</techprintMarketValue>
@@ -49,11 +50,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_2WMT</defName>
<label>节点WMT-2"突破2"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种和工艺种进化到下一个阶段。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种和工艺种进化到下一个阶段。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>7000</baseCost>
<researchViewX>9.00</researchViewX>
<researchViewY>3.20</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>3.20</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_6KYC</li>
<li>ARA_Technology_1BAC</li>
@@ -67,7 +67,6 @@
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -79,7 +78,6 @@
<baseCost>300</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -94,7 +92,6 @@
<baseCost>1250</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_7VXI</li>
</hiddenPrerequisites>
@@ -108,8 +105,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许工艺种孵化新的武器。</description>
<baseCost>2000</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>1.50</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_8VXI</li>
</hiddenPrerequisites>
@@ -123,8 +119,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许工艺种孵化新的武器。</description>
<baseCost>3000</baseCost>
<researchViewX>11.00</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>1.50</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_9VXI</li>
</prerequisites>
@@ -135,8 +130,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许建造天灾酸烧炮组织一种强大的防御设施不仅能解决成片的来犯之敌也可以跨越地图发起打击。</description>
<baseCost>3000</baseCost>
<researchViewX>12.00</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.90</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_10VXI</li>
<li>ARA_Technology_1NPT</li>
@@ -150,7 +144,6 @@
<baseCost>2500</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_6KYC</li>
</prerequisites>
@@ -163,7 +156,6 @@
<baseCost>150</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_5ESS</li>
</prerequisites>
@@ -171,11 +163,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_1KYC</defName>
<label>节点KYC-1"战士虫"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——战士种。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——战士种。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>150</baseCost>
<researchViewX>3.00</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2HAG</li>
</prerequisites>
@@ -183,11 +174,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_4KYC</defName>
<label>节点KYC-4"原虫"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——原虫种一种可以寄生在别的种族身上以控制它们的特殊督虫。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——原虫种一种可以寄生在别的种族身上以控制它们的特殊督虫。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>200</baseCost>
<researchViewX>3.00</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2HAG</li>
</prerequisites>
@@ -195,11 +185,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_2KYC</defName>
<label>节点KYC-2"飞行翼膜"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——空天种敏捷而致命的精锐虫族拥有以飞行姿态穿梭于战场的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——空天种敏捷而致命的精锐虫族拥有以飞行姿态穿梭于战场的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1600</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -210,11 +199,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_5KYC</defName>
<label>节点KYC-5"巨甲"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——迷雾种一种拥有厚重甲壳的大型督虫可以释放烟雾、阻燃剂和召唤虫族增援的信息素以协助虫群进行集群冲击。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——迷雾种一种拥有厚重甲壳的大型督虫可以释放烟雾、阻燃剂和召唤虫族增援的信息素以协助虫群进行集群冲击。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>800</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -225,11 +213,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_6KYC</defName>
<label>节点KYC-6"灵脑"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——织域种一种寿命长且拥有强大灵能的特殊虫族不仅能协助虫群的科研工作也是一个强大的施法者。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——织域种一种寿命长且拥有强大灵能的特殊虫族不仅能协助虫群的科研工作也是一个强大的施法者。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>800</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -240,11 +227,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_7KYC</defName>
<label>节点KYC-7"亲卫"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——禁卫种一种寿命较其他虫族更长的精锐虫族拥有优秀的远程作战能力和社交能力同时也可以作为指挥官指挥虫群。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——禁卫种一种寿命较其他虫族更长的精锐虫族拥有优秀的远程作战能力和社交能力同时也可以作为指挥官指挥虫群。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>2800</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -255,11 +241,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_6MEN</defName>
<label>节点MEN-6"拟线"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——拟线体一种出生时躯体便已经被阿拉克涅拟线种寄生的虫族便宜廉价并且可以快速得到的炮灰倒是没什么纪律性就是了。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的虫族——拟线体一种出生时躯体便已经被阿拉克涅拟线种寄生的虫族便宜廉价并且可以快速得到的炮灰倒是没什么纪律性就是了。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1800</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -275,7 +260,6 @@
<baseCost>250</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -290,7 +274,6 @@
<baseCost>600</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
@@ -302,7 +285,6 @@
<baseCost>1200</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2WMT</li>
</prerequisites>
@@ -315,7 +297,6 @@
<baseCost>200</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
@@ -330,7 +311,6 @@
<baseCost>1000</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5PAV</li>
</hiddenPrerequisites>
@@ -344,8 +324,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许工艺种孵化新的武器。</description>
<baseCost>1800</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_6PAV</li>
</hiddenPrerequisites>
@@ -359,8 +338,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许工艺种孵化新的武器。</description>
<baseCost>2000</baseCost>
<researchViewX>11.00</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_7PAV</li>
</prerequisites>
@@ -371,8 +349,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造一种强大的防御设施具有强大的穿甲能力和较高的射速专擅于对抗重甲目标。</description>
<baseCost>2500</baseCost>
<researchViewX>12.00</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_1NPT</li>
<li>ARA_Technology_7XPAV</li>
@@ -386,7 +363,6 @@
<baseCost>600</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
@@ -397,8 +373,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许工艺种孵化新的武器。</description>
<baseCost>1200</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.90</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_2MEL</li>
</hiddenPrerequisites>
@@ -414,7 +389,6 @@
<baseCost>150</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -425,8 +399,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造一种特殊的辅虫可以将物品和虫族以空投的方式送到大地图上的其他地方不需要燃料。</description>
<baseCost>200</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>3.80</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -437,8 +410,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造一个中央营养供给设施它可以自动为链接到的、需要营养的建筑自动补充营养。</description>
<baseCost>1800</baseCost>
<researchViewX>11.00</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.90</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_2WMT</li>
</prerequisites>
@@ -450,7 +422,6 @@
<baseCost>250</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -462,7 +433,6 @@
<baseCost>500</baseCost>
<researchViewX>1.00</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -473,8 +443,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造一种可以通过挖掘地道连接两地的特殊固定辅虫以在两地间快速传输人员和物资。</description>
<baseCost>2500</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>2.10</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_6SPV</li>
</hiddenPrerequisites>
@@ -488,8 +457,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫利用活体钜菌的催化能力使虫群可以建造一系列产出建筑。</description>
<baseCost>1000</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>0.90</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -503,8 +471,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造用于存放多余虫族的茧在里面的虫族将沉眠直到虫巢意志再次呼唤。</description>
<baseCost>2000</baseCost>
<researchViewX>13.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>2.10</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_1NPT</li>
</prerequisites>
@@ -515,8 +482,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造生产阿拉克涅蜜晶糕的巢穴通过分解虫蜜来生产可食用的蜜晶糕。这种在巢穴内加工过的食物可以帮助虫群抵御冷血动物的影响并且软糯的口感让非虫族殖民者也能乐在其中。</description>
<baseCost>2000</baseCost>
<researchViewX>14.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>2.10</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_2NPT</li>
</prerequisites>
@@ -527,8 +493,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造孵化池。一种专用于批量生产虫族的孵化场地。孵化池的孵化效率比孵化茧更高。</description>
<baseCost>1800</baseCost>
<researchViewX>12.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>2.10</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_1NPT</li>
</prerequisites>
@@ -541,7 +506,6 @@
<baseCost>2500</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_2WMT</li>
</prerequisites>
@@ -553,7 +517,6 @@
<baseCost>600</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>0.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_6PAV</li>
</prerequisites>
@@ -566,7 +529,6 @@
<baseCost>800</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
@@ -577,8 +539,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许虫族建造一种强大的防御设施能够向进犯的敌军投射以自杀式袭击为核心的爆裂种辅虫。</description>
<baseCost>2500</baseCost>
<researchViewX>12.00</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>1.50</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_6SPV</li>
</hiddenPrerequisites>
@@ -595,7 +556,6 @@
<baseCost>1600</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1MED</li>
<li>ARA_Technology_6SPV</li>
@@ -605,11 +565,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_5STL</defName>
<label>节点STL-5"基因窃取"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许战士种进行定向进化抛弃其战斗技能以换取其从殖民者、囚犯和奴隶身上抽取和注入基因的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许战士种进行定向进化抛弃其战斗技能以换取其从殖民者、囚犯和奴隶身上抽取和注入基因的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>500</baseCost>
<researchViewX>4.00</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1KYC</li>
</prerequisites>
@@ -617,11 +576,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_1VTE</defName>
<label>节点VTE-1"护卫者"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许盾头种进行定向进化抛弃其产出甲壳素和建造建筑的能力以换取战斗能力、移动能力和冲撞攻击的技能。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许盾头种进行定向进化抛弃其产出甲壳素和建造建筑的能力以换取战斗能力、移动能力和冲撞攻击的技能。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1200</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_1KYC</li>
</hiddenPrerequisites>
@@ -632,11 +590,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_1MED</defName>
<label>节点MED-1"疗愈种"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许蜜罐种进行定向进化抛弃生产虫蜜的能力以强化其自身的医疗能力并解锁孵化医药茧的技能。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许蜜罐种进行定向进化抛弃生产虫蜜的能力以强化其自身的医疗能力并解锁孵化医药茧的技能。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1200</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
</prerequisites>
@@ -644,11 +601,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_4CLO</defName>
<label>节点CLO-4"追猎种"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许战士种进行定向进化牺牲其使用远程武器的能力以换取强大的近战和永久隐身的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许战士种进行定向进化牺牲其使用远程武器的能力以换取强大的近战和永久隐身的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1800</baseCost>
<researchViewX>5.50</researchViewX>
<researchViewY>5.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_1KYC</li>
</hiddenPrerequisites>
@@ -659,11 +615,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_1BAC</defName>
<label>节点BAC-1"育菌种"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许迷雾种进行定向进化牺牲其护甲和喷射信息素的能力以换成生产虫群所需高级资源"活化钜菌"的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许迷雾种进行定向进化牺牲其护甲和喷射信息素的能力以换成生产虫群所需高级资源"活化钜菌"的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1000</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_1WMT</li>
<li>ARA_Technology_5KYC</li>
@@ -672,11 +627,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_9WID</defName>
<label>节点WID-9"磁暴"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许空天种进行定向进化以牺牲高速和高空机动的能力换取向敌人投射大量磁暴种的能力这种虫群可以以自杀性攻击的方式释放EMP以对抗机械族。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许空天种进行定向进化以牺牲高速和高空机动的能力换取向敌人投射大量磁暴种的能力这种虫群可以以自杀性攻击的方式释放EMP以对抗机械族。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1500</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>1.50</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_2KYC</li>
</hiddenPrerequisites>
@@ -687,11 +641,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_6LOD</defName>
<label>节点LOD-6"巢之主"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许空天种进行定向进化以牺牲高速和高空机动的能力换取向敌人投射大量天巢种的能力这种飞行辅虫速度很快并且在近战中很难缠。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许空天种进行定向进化以牺牲高速和高空机动的能力换取向敌人投射大量天巢种的能力这种飞行辅虫速度很快并且在近战中很难缠。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>3500</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>5.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>5.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_2KYC</li>
</hiddenPrerequisites>
@@ -702,11 +655,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_3CON</defName>
<label>节点CON-3"建造者"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许盾头种进行定向进化抛弃其防御能力以换取更强大的甲壳素产出能力和建造建筑的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许盾头种进行定向进化抛弃其防御能力以换取更强大的甲壳素产出能力和建造建筑的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>300</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>2.70</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -714,11 +666,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_8FEL</defName>
<label>节点FEL-8"爆燃腔"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许蜜罐种进行定向进化抛弃生产虫蜜的能力以获得防御力增强、生产化合燃料和喷射火焰的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许蜜罐种进行定向进化抛弃生产虫蜜的能力以获得防御力增强、生产化合燃料和喷射火焰的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>300</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Base_Technology</li>
</prerequisites>
@@ -726,11 +677,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_3CRP</defName>
<label>节点CRP-3"菌毯铺设"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许迷雾种进行定向进化抛弃喷射信息素的能力以获得防御力、移动速度的增强和大规模铺设菌毯的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许迷雾种进行定向进化抛弃喷射信息素的能力以获得防御力、移动速度的增强和大规模铺设菌毯的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>1300</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>0.90</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5KYC</li>
</hiddenPrerequisites>
@@ -741,11 +691,10 @@
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_9NAV</defName>
<label>节点NAV-9"领航使者"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许禁卫种进行定向进化抛弃直接战斗能力和指挥地面虫群部队的能力换取指挥空中兽虫群的能力。\n\n阿拉克涅虫群所有需要蓝图的科技蓝图只能通过女皇种的基因试验卵获取</description>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许禁卫种进行定向进化抛弃直接战斗能力和指挥地面虫群部队的能力换取指挥空中兽虫群的能力。\n\n阿拉克涅虫群所有需要蓝图的科技研究只能通过基因试验卵进行</description>
<baseCost>3500</baseCost>
<researchViewX>11.00</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_7KYC</li>
</prerequisites>
@@ -758,7 +707,6 @@
<baseCost>250</baseCost>
<researchViewX>2.00</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<prerequisites>
<li>ARA_Technology_5ESS</li>
</prerequisites>
@@ -770,7 +718,6 @@
<baseCost>1000</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -785,7 +732,6 @@
<baseCost>1200</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>1.50</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -800,7 +746,6 @@
<baseCost>1500</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -815,7 +760,6 @@
<baseCost>1500</baseCost>
<researchViewX>6.50</researchViewX>
<researchViewY>5.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -830,7 +774,6 @@
<baseCost>1500</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>4.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding>
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -844,8 +787,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许实行新的阿拉克涅进化手术允许阿拉克涅虫族在甲壳植入玻璃钢以获得强大防御力。</description>
<baseCost>2500</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>4.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -862,8 +804,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许实行新的阿拉克涅进化手术允许阿拉克涅虫族以丧失自愈能力为代价摆脱寿命的限制。</description>
<baseCost>4000</baseCost>
<researchViewX>11.00</researchViewX>
<researchViewY>2.10</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>2.10</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -877,8 +818,7 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许实行新的阿拉克涅进化手术使得阿拉克涅虫族获得更强大的肺部。</description>
<baseCost>1000</baseCost>
<researchViewX>7.50</researchViewX>
<researchViewY>5.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>5.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<hiddenPrerequisites>
<li>ARA_Technology_5ESS</li>
</hiddenPrerequisites>
@@ -893,21 +833,33 @@
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许阿拉克涅虫族建造特殊的活体建筑——阿拉克涅共生肌群一种可以和督虫融合的无意识组织体能为督虫提供强大的战斗力。\n\n霜结体共生肌群可以支持与其融合的阿拉克涅督虫使用多种急冻类武装可以在控制大范围人群和快速点杀高价值目标间切换。</description>
<baseCost>4000</baseCost>
<researchViewX>11.00</researchViewX>
<researchViewY>4.30</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>4.30</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_8EVO</li>
</prerequisites>
</ResearchProjectDef>
<!-- 兽虫发展 -->
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_8SLA</defName>
<label>节点SLA-8"暴戮之兽"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许女皇种孵化新的兽虫——暴屠种。\n\n阿拉克涅虫群所有需要蓝图的科技其研究只能通过基因试验卵进行。</description>
<baseCost>3000</baseCost>
<researchViewX>10.00</researchViewX>
<researchViewY>5.80</researchViewY>
<hiddenPrerequisites>
<li>ARA_Technology_2HAG</li>
</hiddenPrerequisites>
<prerequisites>
<li>ARA_Technology_2WMT</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="ARA_techBase_Needtechprint">
<defName>ARA_Technology_4COV</defName>
<label>节点COV-4"天巫兽群"</label>
<description>&lt;color=#887E78>&lt;i>阿拉克涅虫群-主巢触须\n主巢触须的进化路径是包含于每一支虫群中的通用进化路径它们奠定了虫群在生物学上的优越性。&lt;/i>&lt;/color>\n\n允许阿拉克涅虫族建造特殊的活体建筑——天巫种兽虫一种由引航种指挥的半自主个体能依据指令灵活地从天上袭击敌军以降下死亡之雨。</description>
<baseCost>3000</baseCost>
<researchViewX>12.00</researchViewX>
<researchViewY>3.80</researchViewY>
<requiredResearchBuilding>ARA_ResearchBench</requiredResearchBuilding> <!-- ARA_MorphableResearchBench-->
<researchViewY>3.80</researchViewY> <!-- ARA_MorphableResearchBench-->
<prerequisites>
<li>ARA_Technology_9NAV</li>
</prerequisites>

View File

@@ -15,6 +15,38 @@
</li>
</subSounds>
</SoundDef>
<SoundDef>
<defName>ARA_Area_Crush_Sound</defName>
<context>MapOnly</context>
<maxSimultaneous>2</maxSimultaneous>
<subSounds>
<li>
<grains>
<li Class="AudioGrain_Clip">
<clipPath>ArachnaeSwarm/ARA_Area_Crush_Sound</clipPath>
</li>
</grains>
<volumeRange>65</volumeRange>
<pitchRange>0.9~1.1</pitchRange>
</li>
</subSounds>
</SoundDef>
<SoundDef>
<defName>ArachnaeBeast_Race_Slayer_Cleave_Hit</defName>
<context>MapOnly</context>
<maxSimultaneous>2</maxSimultaneous>
<subSounds>
<li>
<grains>
<li Class="AudioGrain_Clip">
<clipPath>ArachnaeSwarm/ArachnaeBeast_Race_Slayer_Cleave_Hit</clipPath>
</li>
</grains>
<volumeRange>75</volumeRange>
<pitchRange>0.9~1.1</pitchRange>
</li>
</subSounds>
</SoundDef>
<SoundDef>
<defName>ARA_RW_Lighting_Cannon_Shootingsound</defName>
<sustain>true</sustain>

View File

@@ -15,6 +15,24 @@
</statBases>
<uiIconScale>1.1</uiIconScale>
<recipes Inherit="False">
<li>ARA_CureBloodRot</li>
<li>ARA_CureAcid</li>
<li>RemovePorcupineQuill</li>
<li>SurgicalInspection</li>
<li>ARA_Surgery_Install_Plasteel</li>
<li>ARA_Surgery_Install_Carapace_Shell</li>
<li>ARA_Surgery_Install_Huge_Stomach</li>
<li>ARA_Surgery_Install_Cycle_Suppression</li>
<li>ARA_Surgery_Install_Shell_Thorn</li>
<li>ARA_Surgery_Install_Reactive_Shell</li>
<li>ARA_Surgery_Install_Strengthening_Tendon</li>
<li>ARA_Surgery_Install_Slide_Patagium</li>
<li>ARA_Surgery_Install_Acidling_Pouch</li>
<li>ARA_Surgery_Install_Tumor_Pouch</li>
<li>ARA_Surgery_Install_Internal_Circulation_Lung</li>
</recipes>
<tools>
<li>
<label>head</label>
@@ -61,11 +79,6 @@
<li>(0.0, 0, -0.12)</li>
<li>(-0.07, 0, 0.08)</li>
</headPosPerRotation>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<comps>
<!-- <li Class="CompProperties_MechPowerCell">
@@ -77,7 +90,6 @@
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_TemperatureRegulation</li>
<li>ARA_HiveMindWorker</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
@@ -90,7 +102,21 @@
<description>阿拉克涅辅虫之一,是虫族的根基。</description>
<race>
<thinkTreeMain>ARA_Larva_Thinktree</thinkTreeMain>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<comps>
<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_Scavenger</defName>
@@ -103,6 +129,11 @@
<li>Dig</li>
<li>ARA_Cleaning</li>
</specialTrainables>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AdvancedTraining">
@@ -155,6 +186,13 @@
</trainables>
<disableAllSkillDecay>true</disableAllSkillDecay> <!-- 阻止这个动物的所有技能衰减 -->
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindWorker</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -3,13 +3,24 @@
<ThingDef ParentName="ArachnaeBase_Race">
<defName>ArachnaeBeast_Race_Slayer</defName>
<label>阿拉克涅暴屠种</label>
<description>阿拉克涅兽虫之一。</description>
<description>阿拉克涅兽虫之一,身形高大,浑身披挂厚重甲壳,硕大的足部无差别地践踏着周围的敌人,并且有一对粗壮的镰爪可以劈倒一群敌人,其存在的意义就是抗下并吸收攻击,粉碎敌人进攻虫群后排的矛头</description>
<thingClass>ArachnaeSwarm.BeastUnit</thingClass>
<statBases>
<MoveSpeed>5</MoveSpeed>
</statBases>
<race>
<body>ArachnaeSlayer_Body</body>
<thinkTreeMain>ARA_Insect_Beast</thinkTreeMain>
<thinkTreeConstant>ARA_Insect_Beast_Constant</thinkTreeConstant>
<!-- 身形大小 -->
<baseBodySize>10</baseBodySize>
<!-- 基础血量,很高 -->
<baseHealthScale>50</baseHealthScale>
<specialTrainables>
<li MayRequire="Ludeon.RimWorld.Odyssey">AttackTarget</li>
<li MayRequire="Ludeon.RimWorld.Odyssey">ARA_Slayer_Ability1_Train</li>
</specialTrainables>
<!-- <deathAction Inherit="False" IsNull="True"/> -->
</race>
<tools Inherit="False">
<li>
@@ -20,17 +31,28 @@
<power>65</power>
<armorPenetration>2</armorPenetration>
<cooldownTime>2</cooldownTime>
<soundMeleeHit>ArachnaeBeast_Race_Slayer_Cleave_Hit</soundMeleeHit>
<soundMeleeMiss>ArachnaeBeast_Race_Slayer_Cleave_Hit</soundMeleeMiss>
</li>
</tools>
<comps>
<li Class="ArachnaeSwarm.CompProperties_DraftableAnimals"/>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>180</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>即使是四肢发达头脑简单的阿拉克涅兽虫,也最终难逃刻在基因中的命定之死。</tooltipOverride>
<showGizmoOnNonPlayerControlled>true</showGizmoOnNonPlayerControlled>
</li>
<li Class="ArachnaeSwarm.CompProperties_PawnBodyWeapon">
<cleaveAngle>60</cleaveAngle>
<cleaveRange>6</cleaveRange>
<cleaveAngle>120</cleaveAngle>
<cleaveRange>3</cleaveRange>
<cleaveDamageFactor>1</cleaveDamageFactor>
<damageDowned>false</damageDowned>
<cleaveDamageDef>Cut</cleaveDamageDef>
<attackEffecter>ARA_Double_Melee_Attack_Hit</attackEffecter>
<cleaveEffecter>ARA_Double_Melee_Attack_Hit</cleaveEffecter>
<attackEffecter>ARA_Melee_Attack_Pluse_Hit</attackEffecter>
<cleaveEffecter>ARA_Melee_Attack_Pluse_Hit</cleaveEffecter>
<requiresMeleeSkill>true</requiresMeleeSkill>
<onlyWhenDrafted>false</onlyWhenDrafted>
</li>
@@ -70,12 +92,24 @@
<disableAllSkillDecay>true</disableAllSkillDecay> <!-- 阻止这个动物的所有技能衰减 -->
</li>
<li Class="ArachnaeSwarm.CompProperties_AreaDamage">
<radius>4</radius>
<damageIntervalTicks>120</damageIntervalTicks>
<radius>3</radius>
<damageIntervalTicks>180</damageIntervalTicks>
<damageDef>Crush</damageDef>
<damageAmount>60</damageAmount>
<damageAmount>80</damageAmount>
<scaleWithPsychicSensitivity>false</scaleWithPsychicSensitivity>
<areaEffecterDef>ARA_Area_Crush</areaEffecterDef>
<toggleLabel>践踏</toggleLabel>
<toggleDescription>这只阿拉克涅虫族的身躯是如此巨大,以至于靠近它的敌人会被直接一脚踩死</toggleDescription>
<toggleIconPath>ArachnaeSwarm/UI/Abilities/ARA_Area_Crush</toggleIconPath>
</li>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>
<li>ARA_HiveMindBeast</li>
<li>ARA_HiveStrength_Pluse</li>
<li>ARA_Slayer_Base</li>
</hediffs>
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
</comps>
</ThingDef>

View File

@@ -44,6 +44,11 @@
<soundAngry>Pawn_Spelopede_Angry</soundAngry>
</li>
</lifeStageAges>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_Slime</filth>
<filthCountRange>1~3</filthCountRange>
</deathAction>
</race>
<tools Inherit="False">
<li>

View File

@@ -625,24 +625,6 @@
</li>
</tools>
<recipes Inherit="False">
<li>ARA_CureBloodRot</li>
<li>ARA_CureAcid</li>
<li>RemovePorcupineQuill</li>
<li>SurgicalInspection</li>
<li>ARA_Surgery_Install_Plasteel</li>
<li>ARA_Surgery_Install_Carapace_Shell</li>
<li>ARA_Surgery_Install_Huge_Stomach</li>
<li>ARA_Surgery_Install_Cycle_Suppression</li>
<li>ARA_Surgery_Install_Shell_Thorn</li>
<li>ARA_Surgery_Install_Reactive_Shell</li>
<li>ARA_Surgery_Install_Strengthening_Tendon</li>
<li>ARA_Surgery_Install_Slide_Patagium</li>
<li>ARA_Surgery_Install_Acidling_Pouch</li>
<li>ARA_Surgery_Install_Tumor_Pouch</li>
<li>ARA_Surgery_Install_Internal_Circulation_Lung</li>
</recipes>
<comps>
<li Class="ArachnaeSwarm.CompProperties_HediffGiver">
<hediffs>

View File

@@ -8,8 +8,25 @@
<ComfyTemperatureMax>3000</ComfyTemperatureMax>
<RoyalFavorValue>3</RoyalFavorValue>
</statBases>
<tools>
</tools>
<recipes Inherit="False">
<li>ARA_CureBloodRot</li>
<li>ARA_CureAcid</li>
<li>RemovePorcupineQuill</li>
<li>SurgicalInspection</li>
<li>ARA_Surgery_Install_Plasteel</li>
<li>ARA_Surgery_Install_Carapace_Shell</li>
<li>ARA_Surgery_Install_Huge_Stomach</li>
<li>ARA_Surgery_Install_Cycle_Suppression</li>
<li>ARA_Surgery_Install_Shell_Thorn</li>
<li>ARA_Surgery_Install_Reactive_Shell</li>
<li>ARA_Surgery_Install_Strengthening_Tendon</li>
<li>ARA_Surgery_Install_Slide_Patagium</li>
<li>ARA_Surgery_Install_Acidling_Pouch</li>
<li>ARA_Surgery_Install_Tumor_Pouch</li>
<li>ARA_Surgery_Install_Internal_Circulation_Lung</li>
</recipes>
<race>
<!-- <nameGenerator>ARA_NamerHivePawnGeneric</nameGenerator> -->
@@ -718,12 +735,6 @@
</li>
</tools>
<recipes Inherit="False">
<li>RemovePorcupineQuill</li>
<li>ARA_CureBloodRot</li>
<li>ARA_CureAcid</li>
</recipes>
<comps>
<li Class="ArachnaeSwarm.CompProperties_UniquePawn">
<globalVariable>Unique_Arachnae_Queen</globalVariable>

View File

@@ -626,7 +626,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -692,7 +692,7 @@
<comps Inherit="False">
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -764,7 +764,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -831,7 +831,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -902,7 +902,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -979,7 +979,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -1141,7 +1141,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -1193,7 +1193,7 @@
<comps Inherit="False">
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -48,7 +48,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -38,7 +38,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -338,7 +338,7 @@
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -540,7 +540,7 @@
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -65,7 +65,7 @@
<ThingDef ParentName="BuildingNaturalBase">
<defName>ARA_Pawn_Ootheca</defName>
<label>阿拉克涅虫卵囊</label>
<description>一个脆弱、易燃、黏滑的囊状物,内含哺育一只新督虫所需的营养和遗传物质,一个宽敞、铺满阿拉克涅营养液的孵化间将是它最佳的放置场所。它需要由阿拉克涅幼虫种进入以启动孵化进程。</description>
<description>一个脆弱、易燃、黏滑的囊状物,内含哺育一只新督虫或兽虫所需的营养和遗传物质,一个宽敞、铺满阿拉克涅营养液的孵化间将是它最佳的放置场所。它需要由阿拉克涅幼虫种进入以启动孵化进程。</description>
<statBases>
<MarketValue>1000</MarketValue>
</statBases>
@@ -160,7 +160,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -369,6 +369,21 @@
<li>ARA_Incubator_8_Reward_Hediffs</li>
</extraHediffs>
</li>
<li>
<pawnKind>ArachnaeBeast_Race_Slayer</pawnKind>
<daysRequired>16</daysRequired>
<requiredResearch>ARA_Technology_8SLA</requiredResearch>
<extraHediffs>
<li>ARA_Incubator_1_Reward_Hediffs</li>
<li>ARA_Incubator_2_Reward_Hediffs</li>
<li>ARA_Incubator_3_Reward_Hediffs</li>
<li>ARA_Incubator_4_Reward_Hediffs</li>
<li>ARA_Incubator_5_Reward_Hediffs</li>
<li>ARA_Incubator_6_Reward_Hediffs</li>
<li>ARA_Incubator_7_Reward_Hediffs</li>
<li>ARA_Incubator_8_Reward_Hediffs</li>
</extraHediffs>
</li>
</incubationConfigs>
</li>
<li Class="CompProperties_SpawnEffecterOnDestroy">
@@ -473,7 +488,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -556,7 +571,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -290,7 +290,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -435,7 +435,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -603,7 +603,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -62,7 +62,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>
@@ -145,7 +145,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -41,7 +41,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_SwarmMaintenance">
<maxMaintenance>100</maxMaintenance>
<maintenanceDecayPerDay>30</maintenanceDecayPerDay>
<maintenanceDecayPerDay>10</maintenanceDecayPerDay>
<damagePerSecondWhenEmpty>2</damagePerSecondWhenEmpty>
<warningThreshold>0.2</warningThreshold>
<maintenanceThresholdForJob>0.5</maintenanceThresholdForJob>

View File

@@ -158,9 +158,9 @@
<li Class="ThinkNode_Subtree">
<treeDef>Downed</treeDef>
</li>
<li Class="ThinkNode_Subtree">
<!-- <li Class="ThinkNode_Subtree">
<treeDef>BurningResponse</treeDef>
</li>
</li> -->
<li Class="ThinkNode_Subtree">
<treeDef>MentalStateCritical</treeDef>
</li>
@@ -170,6 +170,19 @@
<!-- Do a queued job -->
<li Class="ThinkNode_QueuedJob"/>
<!-- Wait if drafted -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>DraftedOrder</tagToGive>
<subNodes>
<li Class="JobGiver_MoveToStandable" />
<li Class="JobGiver_Orders" />
</subNodes>
</li>
</subNodes>
</li>
<!-- Mental state non critical -->
<li Class="ThinkNode_Subtree">
@@ -479,6 +492,38 @@
</subNodes>
</thinkRoot>
</ThinkTreeDef>
<ThinkTreeDef>
<defName>ARA_Insect_Beast_Constant</defName>
<thinkRoot Class="ThinkNode_Priority">
<subNodes>
<!-- Despawned -->
<li Class="ThinkNode_Subtree">
<treeDef>Despawned</treeDef>
</li>
<li Class="ThinkNode_ConditionalCanDoConstantThinkTreeJobNow">
<subNodes>
<!-- Join auto joinable caravan -->
<li Class="ThinkNode_Subtree">
<treeDef>JoinAutoJoinableCaravan</treeDef>
</li>
</subNodes>
</li>
<!-- Board/leave gravship -->
<li Class="JobGiver_BoardOrLeaveGravship" />
<li Class="ThinkNode_ConditionalCanDoLordJobNow">
<subNodes>
<!-- Lord directives -->
<li Class="ThinkNode_Subtree">
<treeDef>LordDutyConstant</treeDef>
</li>
</subNodes>
</li>
</subNodes>
</thinkRoot>
</ThinkTreeDef>
<ThinkTreeDef>
<defName>ARA_Insect_WithPlanting</defName>

View File

@@ -1,22 +0,0 @@
<?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

@@ -1,6 +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>
<TrainableDef>
<defName>ARA_Sowing</defName>
<label>种植</label>
@@ -35,11 +51,13 @@
<label>暴屠冲撞</label>
<description>以庞大的身躯冲撞目标,对路径上的一切造成伤害。在冲击中途经的距离越远,伤害越高。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_TrackingCharge</iconPath> <!-- Placeholder Icon -->
<cooldownTicksRange>6000</cooldownTicksRange>
<cooldownTicksRange>600</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
<label>追踪冲撞</label>
<requireLineOfSight>false</requireLineOfSight>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>true</canTargetBuildings>
@@ -57,12 +75,12 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_TrackingCharge">
<homingSpeed>1.5</homingSpeed>
<initialDamage>50</initialDamage>
<initialDamage>100</initialDamage>
<damagePerTile>3</damagePerTile>
<inertiaDistance>6</inertiaDistance>
<inertiaDistance>25</inertiaDistance>
<collisionDamageDef>Blunt</collisionDamageDef>
<flyerDef>ARA_Flyer_TrackingCharge</flyerDef>
<collisionRadius>2.5</collisionRadius> <!-- Larger collision radius -->
<collisionRadius>3.5</collisionRadius> <!-- Larger collision radius -->
<impactSound>Pawn_Melee_BigBash_HitPawn</impactSound>
<damageHostileOnly>true</damageHostileOnly> <!-- Set to false to damage everyone in the path -->
</li>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -132,9 +132,15 @@
<Compile Include="Buildings\Building_ResearchBlueprintReader\ResearchBlueprintReaderManager.cs" />
<Compile Include="HarmonyPatches\DestroyRemovesResearch\CompDestroyRemovesResearch.cs" />
<Compile Include="HarmonyPatches\DestroyRemovesResearch\CompProperties_DestroyRemovesResearch.cs" />
<Compile Include="HarmonyPatches\Patch_DraftableAnimals.cs" />
<Compile Include="HarmonyPatches\Patch_ResearchManager_AddRemoveMethod.cs" />
<Compile Include="Pawn_Comps\ARA_DratfableAnimals\CompDratfableAnimals.cs" />
<Compile Include="Pawn_Comps\ARA_DratfableAnimals\CompProperties_DratfableAnimals.cs" />
<Compile Include="Pawn_Comps\ARA_PreventPartLoss\CompProperties_PreventPartLoss.cs" />
<Compile Include="Pawn_Comps\ARA_PreventPartLoss\PreventPartLossPatches.cs" />
<Compile Include="Pawn_Comps\ARA_SwarmMaintainer\CompProperties_SwarmMaintainer.cs" />
<Compile Include="Pawn_Comps\ARA_SwarmMaintainer\Comp_SwarmMaintainer.cs" />
<Compile Include="Pawn_Comps\ARA_DratfableAnimals\BeastUnit.cs" />
<Compile Include="RoomRole\RoomRoleWorker_JellyVat.cs" />
<Compile Include="RoomRole\RoomRoleWorker_Incubator.cs" />
<Compile Include="Buildings\Building_TurretGunHasSpeed.cs" />

View File

@@ -1,4 +1,3 @@
// File: Buildings/Building_EquipmentOotheca.cs
using RimWorld;
using System.Collections.Generic;
using System.Text;
@@ -34,23 +33,9 @@ namespace ArachnaeSwarm
private float qualityProgress = 0f;
private float qualityTotal = 0f;
// === 修复后的营养液消耗相关字段 ===
private int totalNutrientCost = 0; // 总共需要的营养液地块数量
private int consumedNutrientCount = 0; // 已消耗的营养液地块数量
private int lastConsumeCheckTick = -1; // 上次检查消耗的时间
private const int ConsumeCheckInterval = 250; // 检查间隔tick
private List<IntVec3> consumedCells = new List<IntVec3>(); // 已消耗的单元格记录
private bool isConsuming = false; // 是否正在消耗营养液
private int consecutiveFailedConsumptions = 0; // 连续失败的消耗次数
private const int MaxConsecutiveFailures = 10; // 最大连续失败次数,超过则暂停检查
private bool nutrientDeficiencyPause = false; // 是否因营养液不足而暂停
// === 新增属性 ===
public int TotalNutrientCost => totalNutrientCost;
public int ConsumedNutrientCount => consumedNutrientCount;
public float NutrientProgress => totalNutrientCost > 0 ? (float)consumedNutrientCount / totalNutrientCost : 0f;
public bool HasEnoughNutrients => consumedNutrientCount >= totalNutrientCost;
public bool IsConsuming => isConsuming;
// === 简化后的营养液系统:只用于速度加成,不消耗 ===
private int totalNutrientCost = 0; // 总共需要的营养液地块数量(仅用于信息显示)
private int currentNutrientCount = 0; // 当前周围存在的营养液数量
// 缓存的ModExtension
private OothecaIncubatorExtension cachedExtension;
@@ -86,6 +71,10 @@ namespace ArachnaeSwarm
public float QualityProgress => qualityProgress;
public float QualityPercent => qualityTotal > 0 ? qualityProgress / qualityTotal : 0f;
// 营养液加成属性
public int CurrentNutrientCount => currentNutrientCount;
public float NutrientSpeedBonus => currentNutrientCount * Ext.nutrientSolutionBonusPerTile;
// 进度百分比
public float AdjustedProgressPercent
{
@@ -96,288 +85,30 @@ namespace ArachnaeSwarm
}
}
// === 修复后的初始化营养液消耗方法 ===
private void InitializeNutrientConsumption()
// === 简化的初始化营养液方法 ===
private void InitializeNutrientInfo()
{
if (incubatingThingDef == null)
return;
// 获取孵化成本统计值
// 获取孵化成本统计值(仅用于信息显示)
var costStat = DefDatabase<StatDef>.GetNamedSilentFail("ARA_IncubationCost");
if (costStat != null)
{
totalNutrientCost = Mathf.RoundToInt(incubatingThingDef.GetStatValueAbstract(costStat, null));
Log.Message($"[ARA] 初始化营养液消耗: {incubatingThingDef.defName} 需要 {totalNutrientCost} 个营养液地块");
Log.Message($"[ARA] 孵化 {incubatingThingDef.defName} 建议有 {totalNutrientCost} 个营养液地块以获得最佳速度");
}
else
{
totalNutrientCost = 0;
Log.Message($"[ARA] 孵化 {incubatingThingDef.defName} 不需要营养液");
Log.Message($"[ARA] 孵化 {incubatingThingDef.defName} 不需要营养液加成");
}
consumedNutrientCount = 0;
consumedCells.Clear();
isConsuming = true; // 立即开始消耗
consecutiveFailedConsumptions = 0;
nutrientDeficiencyPause = false;
// 立即检查一次营养液
lastConsumeCheckTick = Find.TickManager.TicksGame - ConsumeCheckInterval; // 强制立即检查
// 立即更新一次营养液计数
UpdateNutrientCount();
}
// === 修复后的检查并消耗营养液方法 ===
private void CheckAndConsumeNutrients()
{
if (!isIncubating || incubatingThingDef == null)
return;
// 如果已经满足需求,停止消耗
if (HasEnoughNutrients)
{
if (isConsuming)
{
Log.Message($"[ARA] 营养液需求已满足: {consumedNutrientCount}/{totalNutrientCost}");
isConsuming = false;
nutrientDeficiencyPause = false; // 重置暂停标志
}
return;
}
// 计算需要消耗的数量(基于当前进度)
float targetProgress = AdjustedProgressPercent;
int targetConsumed = Mathf.RoundToInt(targetProgress * totalNutrientCost);
int toConsume = Mathf.Max(1, targetConsumed - consumedNutrientCount);
if (toConsume <= 0)
return;
// 查找可消耗的营养液单元格
List<IntVec3> availableCells = FindNutrientCells();
if (availableCells.Count == 0)
{
consecutiveFailedConsumptions++;
nutrientDeficiencyPause = true; // 设置为暂停
// 如果没有找到营养液,检查是否应该应用伤害
if (Ext.nutrientDeficiencyDamageEnabled && toConsume > 0)
{
ApplyNutrientDeficiencyDamage();
// 显示消息(频率控制)
if (Find.TickManager.TicksGame % 2000 == 0 && Rand.Chance(0.3f))
{
Messages.Message("ARA_EquipmentIncubator.NoNutrientsFound".Translate(),
this, MessageTypeDefOf.NegativeEvent);
}
Log.Warning($"[ARA] 未找到营养液,连续失败次数: {consecutiveFailedConsumptions}");
}
return;
}
// 重置失败计数和暂停标志
consecutiveFailedConsumptions = 0;
nutrientDeficiencyPause = false; // 有营养液可用,取消暂停
// 开始消耗
int consumedThisTick = 0;
for (int i = 0; i < Mathf.Min(toConsume, availableCells.Count); i++)
{
if (ConsumeNutrientCell(availableCells[i]))
{
consumedThisTick++;
consumedNutrientCount++;
consumedCells.Add(availableCells[i]);
if (HasEnoughNutrients)
break;
}
}
if (consumedThisTick > 0)
{
Log.Message($"[ARA] 消耗了 {consumedThisTick} 个营养液,总计: {consumedNutrientCount}/{totalNutrientCost}");
// 显示消息
if (consumedThisTick > 0 && Find.TickManager.TicksGame % 1000 == 0)
{
Messages.Message($"ARA_EquipmentIncubator.NutrientConsumed".Translate(consumedThisTick, consumedNutrientCount, totalNutrientCost),
this, MessageTypeDefOf.SilentInput);
}
// 如果达到需求,显示完成消息
if (HasEnoughNutrients)
{
Messages.Message("ARA_EquipmentIncubator.NutrientRequirementsMet".Translate(),
this, MessageTypeDefOf.PositiveEvent);
}
}
}
// === 修复后的应用营养液不足伤害方法 ===
private void ApplyNutrientDeficiencyDamage()
{
if (Ext.nutrientDeficiencyDamageAmount <= 0f || Ext.nutrientDamageType == null)
return;
try
{
// 计算实际伤害量
float damageAmount = Ext.nutrientDeficiencyDamageAmount;
// 如果建筑血量已经很低,减少伤害以避免立即摧毁
float healthPercent = (float)HitPoints / MaxHitPoints;
if (healthPercent < 0.3f)
{
damageAmount *= 0.5f; // 血量低于30%时,伤害减半
}
if (healthPercent < 0.1f)
{
damageAmount *= 0.2f; // 血量低于10%时伤害减为20%
}
// 应用伤害
DamageInfo damageInfo = new DamageInfo(
Ext.nutrientDamageType,
damageAmount,
armorPenetration: 0,
angle: -1f,
instigator: null,
hitPart: null,
weapon: null,
category: DamageInfo.SourceCategory.ThingOrUnknown,
intendedTarget: this
);
TakeDamage(damageInfo);
// 显示伤害消息(几率性)
if (Ext.showDamageMessages && Rand.Chance(Ext.damageMessageChance))
{
Messages.Message("ARA_EquipmentIncubator.NutrientDeficiencyDamage".Translate(damageAmount.ToString("F1")),
this, MessageTypeDefOf.NegativeEvent);
}
// 更新质量乘数(因为血量变化会影响质量)
UpdateQualityMultiplier();
}
catch (Exception ex)
{
Log.Error($"Failed to apply nutrient deficiency damage: {ex.Message}");
}
}
// === 修复后的查找营养液单元格方法 ===
public List<IntVec3> FindNutrientCells()
{
List<IntVec3> availableCells = new List<IntVec3>();
var map = Map;
if (map == null)
return availableCells;
// 使用ModExtension中定义的营养液检测半径
int searchRadius = Ext.NutrientSolutionRadiusInt;
TerrainDef nutrientDef = DefDatabase<TerrainDef>.GetNamedSilentFail("ARA_Incubator_Nutrient_Solution");
if (nutrientDef == null)
{
Log.Error("[ARA] 未找到营养液地形定义: ARA_Incubator_Nutrient_Solution");
return availableCells;
}
// 优化搜索:先从内圈开始,逐步扩大
int minRadius = 1; // 最小搜索半径
int currentRadius = Mathf.Min(searchRadius, Mathf.Max(minRadius, consecutiveFailedConsumptions + 1));
for (int x = -currentRadius; x <= currentRadius; x++)
{
for (int z = -currentRadius; z <= currentRadius; z++)
{
IntVec3 cell = Position + new IntVec3(x, 0, z);
// 排除自己的位置和已消耗的单元格
if (cell == Position || consumedCells.Contains(cell))
continue;
// 检查是否在边界内
if (cell.InBounds(map))
{
TerrainDef terrain = map.terrainGrid.TerrainAt(cell);
if (terrain == nutrientDef)
{
availableCells.Add(cell);
}
}
}
}
// 随机排序,避免总是从固定位置开始消耗
if (availableCells.Count > 1)
{
availableCells.Shuffle();
}
return availableCells;
}
// === 修复后的消耗单个营养液单元格方法 ===
private bool ConsumeNutrientCell(IntVec3 cell)
{
var map = Map;
if (map == null)
return false;
// 获取目标地貌定义
TerrainDef insectCreepDef = DefDatabase<TerrainDef>.GetNamedSilentFail("ARA_InsectCreep");
TerrainDef nutrientDef = DefDatabase<TerrainDef>.GetNamedSilentFail("ARA_Incubator_Nutrient_Solution");
if (insectCreepDef == null || nutrientDef == null)
return false;
// 记录原来的地貌
TerrainDef originalTerrain = map.terrainGrid.TerrainAt(cell);
// 转换为昆虫爬行地貌
map.terrainGrid.SetTerrain(cell, insectCreepDef);
// 创建营养液蓝图
try
{
// 使用PlaceBlueprintForBuild方法创建蓝图
Blueprint_Build blueprint = GenConstruct.PlaceBlueprintForBuild(
nutrientDef,
cell,
map,
Rot4.North,
Faction.OfPlayer,
null
);
if (blueprint != null)
{
// 显示转换效果
if (Find.TickManager.TicksGame % 10 == 0)
{
MoteMaker.ThrowText(cell.ToVector3Shifted(), map,
"ARA_Consumed".Translate(), Color.yellow);
}
return true;
}
}
catch (Exception ex)
{
Log.Error($"Failed to place nutrient solution blueprint at {cell}: {ex.Message}");
// 如果蓝图放置失败,恢复原貌
map.terrainGrid.SetTerrain(cell, originalTerrain);
return false;
}
return false;
}
// === 修复后的Tick方法 ===
// === 简化的Tick方法 ===
protected override void Tick()
{
base.Tick();
@@ -396,39 +127,11 @@ namespace ArachnaeSwarm
UpdateQualityMultiplier();
}
// 检查营养液消耗
if (lastConsumeCheckTick < 0 || Find.TickManager.TicksGame - lastConsumeCheckTick >= ConsumeCheckInterval)
{
lastConsumeCheckTick = Find.TickManager.TicksGame;
CheckAndConsumeNutrients();
}
float currentSpeed = SpeedMultiplier;
// 决定是否应该增加进度
bool shouldProgress = true;
// 检查是否因营养液不足而暂停
if (Ext.stopIncubationWhenNutrientDeficient &&
totalNutrientCost > 0 &&
!HasEnoughNutrients &&
nutrientDeficiencyPause)
{
shouldProgress = false;
// 显示暂停消息(频率控制)
if (Find.TickManager.TicksGame % 2000 == 0 && Rand.Chance(0.2f))
{
Messages.Message("ARA_EquipmentIncubator.IncubationPausedNoNutrients".Translate(incubatingThingDef?.LabelCap ?? "Unknown"),
this, MessageTypeDefOf.NeutralEvent);
}
}
if (shouldProgress)
{
incubationProgress += currentSpeed;
qualityProgress += currentSpeed * QualityMultiplier;
}
// 始终增加进度(不再有营养液不足的暂停)
incubationProgress += currentSpeed;
qualityProgress += currentSpeed * QualityMultiplier;
if (incubationProgress >= incubationDuration)
{
@@ -458,7 +161,7 @@ namespace ArachnaeSwarm
int nutrientSolutionCount = CountNearbyNutrientSolutions();
if (nutrientSolutionCount > 0)
{
builder.AppendLine("ARA_EquipmentIncubator.NutrientSolutions".Translate(
builder.AppendLine("ARA_EquipmentIncubator.NutrientSolutionsBonus".Translate(
nutrientSolutionCount,
nutrientSolutionCount * Ext.nutrientSolutionBonusPerTile * 100));
}
@@ -522,39 +225,34 @@ namespace ArachnaeSwarm
return builder.ToString().TrimEndNewlines();
}
// === 获取营养液消耗描述 ===
public string GetNutrientConsumptionDescription()
// === 获取营养液信息描述 ===
public string GetNutrientInfoDescription()
{
var builder = new StringBuilder();
builder.AppendLine("ARA_EquipmentIncubator.NutrientConsumption".Translate());
builder.AppendLine("ARA_EquipmentIncubator.NutrientInfo".Translate());
builder.AppendLine();
if (totalNutrientCost == 0)
{
builder.AppendLine("ARA_EquipmentIncubator.NoNutrientCost".Translate());
return builder.ToString().TrimEndNewlines();
}
// 显示当前营养液数量和加成
builder.AppendLine("ARA_EquipmentIncubator.CurrentNutrientCount".Translate(currentNutrientCount));
builder.AppendLine("ARA_EquipmentIncubator.NutrientSpeedBonus".Translate(NutrientSpeedBonus.ToStringPercent()));
builder.AppendLine("ARA_EquipmentIncubator.NutrientRequirement".Translate(totalNutrientCost));
builder.AppendLine("ARA_EquipmentIncubator.NutrientConsumed".Translate(consumedNutrientCount));
builder.AppendLine("ARA_EquipmentIncubator.NutrientProgress".Translate(NutrientProgress.ToStringPercent()));
if (HasEnoughNutrients)
// 显示建议的营养液数量
if (totalNutrientCost > 0 && incubatingThingDef != null)
{
builder.AppendLine();
builder.AppendLine("ARA_EquipmentIncubator.NutrientRequirementsMet".Translate());
}
else if (isConsuming)
{
builder.AppendLine();
builder.AppendLine("ARA_EquipmentIncubator.ConsumingNutrients".Translate());
}
if (nutrientDeficiencyPause)
{
builder.AppendLine();
builder.AppendLine("ARA_EquipmentIncubator.NutrientDeficiencyPaused".Translate());
builder.AppendLine("ARA_EquipmentIncubator.RecommendedNutrients".Translate(incubatingThingDef.LabelCap, totalNutrientCost));
// 显示加成效果
if (currentNutrientCount >= totalNutrientCost)
{
builder.AppendLine("ARA_EquipmentIncubator.MaximumBonusActive".Translate());
}
else
{
int needed = totalNutrientCost - currentNutrientCount;
builder.AppendLine("ARA_EquipmentIncubator.AddMoreNutrients".Translate(needed));
}
}
return builder.ToString().TrimEndNewlines();
@@ -684,8 +382,8 @@ namespace ArachnaeSwarm
UpdateQualityMultiplier();
UpdateSpeedMultiplier();
// 初始化营养液消耗
InitializeNutrientConsumption();
// 初始化营养液信息(仅用于显示和建议)
InitializeNutrientInfo();
assignedLarva = null;
larvaOperateTicksRemaining = 0;
@@ -709,8 +407,9 @@ namespace ArachnaeSwarm
qualityProgress = 0f;
qualityTotal = 0f;
// 重置营养液消耗状态
ResetNutrientConsumptionState();
// 重置营养液信息
totalNutrientCost = 0;
currentNutrientCount = 0;
Messages.Message("ARA_EquipmentIncubator.IncubationCancelled".Translate() + " " + "ARA_EquipmentIncubator.ContentsLost".Translate(),
MessageTypeDefOf.NeutralEvent);
@@ -725,16 +424,6 @@ namespace ArachnaeSwarm
float finalQualityPercent = QualityPercent;
// 检查营养液是否满足要求
if (totalNutrientCost > 0 && consumedNutrientCount < totalNutrientCost)
{
Messages.Message("ARA_EquipmentIncubator.IncubationCompleteNutrientDeficient".Translate(incubatingThingDef.LabelCap),
this, MessageTypeDefOf.NegativeEvent);
// 生成物品但应用质量惩罚
finalQualityPercent *= Mathf.Lerp(0.3f, 1.0f, NutrientProgress);
}
// 生成物品
Thing thing = ThingMaker.MakeThing(incubatingThingDef);
ApplyQualityEffects(thing, finalQualityPercent);
@@ -785,18 +474,6 @@ namespace ArachnaeSwarm
}
}
// === 重置营养液消耗状态 ===
private void ResetNutrientConsumptionState()
{
totalNutrientCost = 0;
consumedNutrientCount = 0;
isConsuming = false;
consumedCells.Clear();
consecutiveFailedConsumptions = 0;
nutrientDeficiencyPause = false;
lastConsumeCheckTick = -1;
}
// === 重置孵化状态 ===
private void ResetIncubationState()
{
@@ -806,9 +483,8 @@ namespace ArachnaeSwarm
incubatingThingDef = null;
qualityProgress = 0f;
qualityTotal = 0f;
// 重置营养液消耗状态
ResetNutrientConsumptionState();
totalNutrientCost = 0;
currentNutrientCount = 0;
}
// === 获取剩余时间 ===
@@ -865,34 +541,14 @@ namespace ArachnaeSwarm
}
builder.Append(timeText);
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.Speed".Translate() + ": " + SpeedMultiplier.ToStringPercent() + ", " +
"ARA_EquipmentIncubator.Quality".Translate() + ": " + QualityMultiplier.ToStringPercent());
// 显示营养液消耗信息
if (totalNutrientCost > 0)
builder.Append("ARA_EquipmentIncubator.Speed".Translate() + ": " + SpeedMultiplier.ToStringPercent());
// 显示营养液加成信息
if (currentNutrientCount > 0)
{
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.NutrientConsumption".Translate() + ": " +
consumedNutrientCount + " / " + totalNutrientCost +
" (" + NutrientProgress.ToStringPercent() + ")");
if (!HasEnoughNutrients)
{
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.NutrientDeficient".Translate());
if (nutrientDeficiencyPause)
{
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.NutrientDeficiencyPaused".Translate());
}
if (consecutiveFailedConsumptions > 0)
{
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.ConsecutiveFailures".Translate(consecutiveFailedConsumptions));
}
}
builder.Append("ARA_EquipmentIncubator.NutrientBonusActive".Translate() + ": " +
currentNutrientCount + " tiles (" + NutrientSpeedBonus.ToStringPercent() + ")");
}
}
else if (assignedLarva != null)
@@ -916,19 +572,15 @@ namespace ArachnaeSwarm
if (builder.Length > 0) builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.Target".Translate() + ": " + config.thingDef.LabelCap);
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.SpeedMultiplier".Translate() + ": " + SpeedMultiplier.ToStringPercent() + ", " +
"ARA_EquipmentIncubator.QualityMultiplier".Translate() + ": " + QualityMultiplier.ToStringPercent());
// 显示预计的营养液需求
var costStat = DefDatabase<StatDef>.GetNamedSilentFail("ARA_IncubationCost");
if (costStat != null)
builder.Append("ARA_EquipmentIncubator.SpeedMultiplier".Translate() + ": " + SpeedMultiplier.ToStringPercent());
// 显示当前营养液加成
UpdateNutrientCount();
if (currentNutrientCount > 0)
{
int estimatedCost = Mathf.RoundToInt(config.thingDef.GetStatValueAbstract(costStat, null));
if (estimatedCost > 0)
{
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.EstimatedNutrientCost".Translate() + ": " + estimatedCost);
}
builder.AppendLine();
builder.Append("ARA_EquipmentIncubator.CurrentNutrientBonus".Translate() + ": " +
currentNutrientCount + " tiles (" + NutrientSpeedBonus.ToStringPercent() + ")");
}
}
}
@@ -1041,6 +693,18 @@ namespace ArachnaeSwarm
{
builder.AppendLine("ARA_EquipmentIncubator.NoResearchRequired".Translate());
}
// 显示营养液建议
var costStat = DefDatabase<StatDef>.GetNamedSilentFail("ARA_IncubationCost");
if (costStat != null)
{
int recommendedCost = Mathf.RoundToInt(config.thingDef.GetStatValueAbstract(costStat, null));
if (recommendedCost > 0)
{
builder.AppendLine();
builder.AppendLine("ARA_EquipmentIncubator.RecommendedNutrientsForSpeed".Translate(recommendedCost));
}
}
}
builder.AppendLine();
@@ -1220,6 +884,12 @@ namespace ArachnaeSwarm
return count;
}
// === 更新营养液计数 ===
private void UpdateNutrientCount()
{
currentNutrientCount = CountNearbyNutrientSolutions();
}
// === 计算房间质量因子 ===
private float GetRoomQualityFactor()
{
@@ -1293,9 +963,11 @@ namespace ArachnaeSwarm
multiplier *= Ext.speedPenaltyOutsideIncubator;
}
int nutrientSolutionCount = CountNearbyNutrientSolutions();
float nutrientBonus = 1.0f + (nutrientSolutionCount * Ext.nutrientSolutionBonusPerTile);
// 更新营养液计数
UpdateNutrientCount();
// 应用营养液加成
float nutrientBonus = 1.0f + (currentNutrientCount * Ext.nutrientSolutionBonusPerTile);
multiplier *= nutrientBonus;
speedMultiplier = multiplier;
@@ -1342,28 +1014,8 @@ namespace ArachnaeSwarm
Scribe_Values.Look(ref qualityMultiplier, "qualityMultiplier", 1.0f);
Scribe_Values.Look(ref qualityProgress, "qualityProgress", 0f);
Scribe_Values.Look(ref qualityTotal, "qualityTotal", 0f);
// 保存营养液消耗状态
Scribe_Values.Look(ref totalNutrientCost, "totalNutrientCost", 0);
Scribe_Values.Look(ref consumedNutrientCount, "consumedNutrientCount", 0);
Scribe_Values.Look(ref lastConsumeCheckTick, "lastConsumeCheckTick", -1);
Scribe_Values.Look(ref isConsuming, "isConsuming", false);
Scribe_Values.Look(ref consecutiveFailedConsumptions, "consecutiveFailedConsumptions", 0);
Scribe_Values.Look(ref nutrientDeficiencyPause, "nutrientDeficiencyPause", false);
Scribe_Collections.Look(ref consumedCells, "consumedCells", LookMode.Value);
if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
// 确保列表不为null
if (consumedCells == null)
consumedCells = new List<IntVec3>();
// 确保状态一致性
if (isIncubating && totalNutrientCost > 0 && !isConsuming)
{
isConsuming = true; // 加载后恢复消耗状态
}
}
Scribe_Values.Look(ref currentNutrientCount, "currentNutrientCount", 0);
}
}
}

View File

@@ -1,4 +1,3 @@
// File: ITabs/ITab_EquipmentOotheca_Incubation.cs
using UnityEngine;
using Verse;
using System.Collections.Generic;
@@ -15,10 +14,10 @@ namespace ArachnaeSwarm
private const float SmallLabelHeight = 20f;
private const float ButtonHeight = 25f;
private const float TabWidth = 320f;
private const float TabHeight = 450f; // 增加高度以容纳更多信息
private const float TabHeight = 450f;
private Vector2 scrollPosition = Vector2.zero;
private const float ViewHeight = 480f; // 增加视图高度
private const float ViewHeight = 480f;
public override bool IsVisible
{
@@ -115,6 +114,7 @@ namespace ArachnaeSwarm
Widgets.Label(targetRect, "ARA_EquipmentIncubator.Target".Translate() + ": " + ootheca.incubatingThingDef.LabelCap);
curY += SmallLabelHeight + 20f;
// 孵化进度条
Rect progressBarRect = new Rect(0f, curY, viewRect.width, BarHeight);
Rect progressLabelRect = new Rect(progressBarRect.x, progressBarRect.y - 20, progressBarRect.width, 18);
Text.Anchor = TextAnchor.MiddleCenter;
@@ -133,6 +133,7 @@ namespace ArachnaeSwarm
curY += BarHeight + 30f;
// 质量进度条
Rect qualityBarRect = new Rect(0f, curY, viewRect.width, BarHeight);
Rect qualityLabelRect = new Rect(qualityBarRect.x, qualityBarRect.y - 20, qualityBarRect.width, 18);
Text.Anchor = TextAnchor.MiddleCenter;
@@ -141,98 +142,8 @@ namespace ArachnaeSwarm
Text.Anchor = TextAnchor.UpperLeft;
GUI.color = Color.white;
Widgets.FillableBar(qualityBarRect, qualityPercent, SolidColorMaterials.NewSolidColorTexture(new Color(0.1f, 0.4f, 0.8f, 0.5f))); curY += BarHeight + 25f;
// === 新增:营养液消耗显示 ===
if (ootheca.TotalNutrientCost > 0)
{
// 标题
Rect nutrientTitleRect = new Rect(0f, curY, viewRect.width, SmallLabelHeight);
Widgets.Label(nutrientTitleRect, "ARA_EquipmentIncubator.NutrientConsumption".Translate());
curY += SmallLabelHeight + 5f;
// 进度条
Rect nutrientBarRect = new Rect(0f, curY, viewRect.width, BarHeight);
float nutrientProgress = ootheca.NutrientProgress;
Widgets.FillableBar(nutrientBarRect, nutrientProgress,
SolidColorMaterials.NewSolidColorTexture(new Color(0.8f, 0.6f, 0.1f, 0.5f)));
// 进度文本
string nutrientText = $"{ootheca.ConsumedNutrientCount} / {ootheca.TotalNutrientCost} ({nutrientProgress:P0})";
Text.Anchor = TextAnchor.MiddleCenter;
Widgets.Label(nutrientBarRect, nutrientText);
Text.Anchor = TextAnchor.UpperLeft;
curY += BarHeight + 10f;
// 状态描述
Rect nutrientStatusRect = new Rect(0f, curY, viewRect.width, SmallLabelHeight);
string statusText;
if (ootheca.HasEnoughNutrients)
{
statusText = "ARA_EquipmentIncubator.NutrientRequirementsMet".Translate();
GUI.color = Color.green;
}
else if (ootheca.IsConsuming)
{
statusText = "ARA_EquipmentIncubator.ConsumingNutrients".Translate();
GUI.color = Color.yellow;
}
else
{
statusText = "ARA_EquipmentIncubator.WaitingForNutrients".Translate();
GUI.color = Color.gray;
}
Widgets.Label(nutrientStatusRect, statusText);
GUI.color = Color.white;
curY += SmallLabelHeight + 15f;
}
// === 新增:营养液不足状态显示 ===
if (ootheca.TotalNutrientCost > 0 && ootheca.IsConsuming)
{
curY += BarHeight + 15f;
// 检查是否有营养液不足的警告
var availableCells = ootheca.FindNutrientCells();
if (availableCells.Count == 0 && !ootheca.HasEnoughNutrients)
{
Rect warningRect = new Rect(0f, curY, viewRect.width, SmallLabelHeight * 2);
if (ootheca.Ext.stopIncubationWhenNutrientDeficient)
{
Widgets.Label(warningRect, "ARA_EquipmentIncubator.IncubationPausedWarning".Translate());
GUI.color = Color.yellow;
}
else
{
Widgets.Label(warningRect, "ARA_EquipmentIncubator.NutrientDeficiencyWarning".Translate());
GUI.color = Color.red;
}
// 绘制警告背景
Widgets.DrawHighlight(warningRect);
GUI.color = Color.white;
curY += SmallLabelHeight * 2 + 10f;
// 显示血量警告
float healthPercent = (float)ootheca.HitPoints / ootheca.MaxHitPoints;
if (healthPercent < 0.5f)
{
Rect healthWarningRect = new Rect(0f, curY, viewRect.width, SmallLabelHeight);
Widgets.Label(healthWarningRect, "ARA_EquipmentIncubator.LowHealthWarning".Translate(healthPercent.ToStringPercent()));
GUI.color = new Color(1f, 0.5f, 0.5f);
Widgets.DrawHighlight(healthWarningRect);
GUI.color = Color.white;
curY += SmallLabelHeight + 5f;
}
}
}
Widgets.FillableBar(qualityBarRect, qualityPercent, SolidColorMaterials.NewSolidColorTexture(new Color(0.1f, 0.4f, 0.8f, 0.5f)));
string qualityProgressText = $"{qualityPercent:P0}";
Text.Anchor = TextAnchor.MiddleCenter;
Widgets.Label(qualityBarRect, qualityProgressText);
@@ -247,6 +158,7 @@ namespace ArachnaeSwarm
curY += BarHeight + 25f;
// 剩余时间
Rect timeRect = new Rect(0f, curY, viewRect.width, SmallLabelHeight);
string timeText = "ARA_EquipmentIncubator.TimeRemaining".Translate() + ": " + daysRemaining.ToString("F1") + " " + "ARA_EquipmentIncubator.Days".Translate();
if (hoursRemaining > 0.1f && daysRemaining < 1f)

View File

@@ -6,34 +6,47 @@ using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
namespace ArachnaeSwarm
{
public class Building_ResearchBlueprintReader : Building
{
// 储存的科技
private ResearchProjectDef storedResearch;
// 当前研究进度
private float progress;
// 管理器引用
private ResearchBlueprintReaderManager manager;
// 是否正在研究
private bool isResearching = false;
// 电力组件
private CompPowerTrader powerComp;
// 锁定信息
private int researchStartTime;
// === 新增唯一ID防止重复注册 ===
private string uniqueId = null;
public string UniqueId
{
get
{
if (uniqueId == null)
{
uniqueId = $"ResearchBlueprintReader_{Guid.NewGuid():N}";
}
return uniqueId;
}
}
public ResearchProjectDef StoredResearch => storedResearch;
public float Progress => progress;
public bool IsLocked => storedResearch != null;
public bool IsResearching => isResearching && storedResearch != null && !storedResearch.IsFinished;
// 获取研究速度
private float ResearchSpeed
{
@@ -43,44 +56,54 @@ namespace ArachnaeSwarm
return ext?.researchSpeed ?? 10f;
}
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Defs.Look(ref storedResearch, "storedResearch");
Scribe_Values.Look(ref progress, "progress", 0f);
Scribe_Values.Look(ref isResearching, "isResearching", false);
Scribe_Values.Look(ref researchStartTime, "researchStartTime", 0);
Scribe_Values.Look(ref uniqueId, "uniqueId");
if (Scribe.mode == LoadSaveMode.LoadingVars)
{
// 重建管理器连接
manager = ResearchBlueprintReaderManager.Instance;
}
}
public override void SpawnSetup(Map map, bool respawningAfterLoad)
{
base.SpawnSetup(map, respawningAfterLoad);
// 获取管理器
manager = ResearchBlueprintReaderManager.Instance;
if (manager != null)
try
{
manager.RegisterReader(this);
base.SpawnSetup(map, respawningAfterLoad);
// 获取管理器
manager = ResearchBlueprintReaderManager.Instance;
if (manager != null)
{
manager.RegisterReader(this);
}
// 获取电力组件
powerComp = GetComp<CompPowerTrader>();
// 如果加载时有储存的科技,确保注册到管理器
if (storedResearch != null && manager != null)
{
manager.RegisterResearch(this, storedResearch);
}
Log.Message($"[ResearchBlueprintReader] Building spawned with ID: {ThingID}, UniqueId: {UniqueId}");
}
// 获取电力组件
powerComp = GetComp<CompPowerTrader>();
// 如果加载时有储存的科技,确保注册到管理器
if (storedResearch != null && manager != null)
catch (Exception ex)
{
manager.RegisterResearch(this, storedResearch);
Log.Error($"[ResearchBlueprintReader] Error in SpawnSetup: {ex}");
}
}
public override void Destroy(DestroyMode mode = DestroyMode.Vanish)
{
// 通知管理器建筑被摧毁
@@ -88,10 +111,10 @@ namespace ArachnaeSwarm
{
manager.OnBuildingDestroyed(this, storedResearch);
}
base.Destroy(mode);
}
protected override void Tick()
{
base.Tick();
@@ -207,38 +230,6 @@ namespace ArachnaeSwarm
MessageTypeDefOf.NeutralEvent);
}
/// <summary>
/// 解锁建筑(释放储存的科技)
/// </summary>
public void UnlockBuilding()
{
if (storedResearch != null && manager != null)
{
var project = storedResearch;
// 如果科技未完成,需要移除进度
if (!project.IsFinished)
{
// 计算当前建筑的贡献
float contributedProgress = progress;
float globalProgress = Find.ResearchManager.GetProgress(project);
// 移除这个建筑的贡献(简化处理:减去当前建筑的进度)
// 注意:这里可能有多个建筑同时研究,所以不能简单减去
// 我们让管理器来处理复杂的逻辑
manager.OnBuildingUnlocked(this, project);
}
storedResearch = null;
progress = 0f;
isResearching = false;
researchStartTime = 0;
Messages.Message("ResearchBlueprintReader_BuildingUnlocked".Translate(project.LabelCap),
MessageTypeDefOf.NeutralEvent);
}
}
/// <summary>
/// 强制完成研究(用于调试)
/// </summary>
@@ -258,22 +249,6 @@ namespace ArachnaeSwarm
yield return gizmo;
}
// 如果已锁定,显示解锁按钮
if (IsLocked)
{
var unlockCmd = new Command_Action();
unlockCmd.defaultLabel = "ResearchBlueprintReader_UnlockBuilding".Translate();
unlockCmd.defaultDesc = "ResearchBlueprintReader_UnlockBuildingDesc".Translate();
unlockCmd.icon = ContentFinder<Texture2D>.Get("ArachnaeSwarm/UI/Abilities/ARA_Ability_Morph", false);
unlockCmd.action = delegate
{
UnlockBuilding();
};
yield return unlockCmd;
yield break; // 锁定状态下不显示其他按钮
}
// 选择研究按钮
var selectCmd = new Command_Action();
selectCmd.defaultLabel = "ResearchBlueprintReader_SelectProject".Translate();

View File

@@ -23,6 +23,10 @@ namespace ArachnaeSwarm
private int cleanupTimer;
private const int CleanupInterval = 2500;
// === 新增:用于序列化的临时字段 ===
private List<ResearchProjectDef> serializedProjects;
private List<List<Building_ResearchBlueprintReader>> serializedBuildings;
public ResearchBlueprintReaderManager(Game game) : base()
{
instance = this;
@@ -36,34 +40,79 @@ namespace ArachnaeSwarm
{
base.ExposeData();
Scribe_Collections.Look(ref allReaders, "allReaders", LookMode.Reference);
// 序列化研究建筑映射
// 修复字典序列化问题
if (Scribe.mode == LoadSaveMode.Saving)
{
List<ResearchProjectDef> keys = researchBuildings.Keys.ToList();
List<List<Building_ResearchBlueprintReader>> values = researchBuildings.Values.ToList();
Scribe_Collections.Look(ref keys, "researchKeys", LookMode.Def);
Scribe_Collections.Look(ref values, "researchValues", LookMode.Deep);
// 保存时:将字典转换为两个列表
serializedProjects = new List<ResearchProjectDef>();
serializedBuildings = new List<List<Building_ResearchBlueprintReader>>();
foreach (var kvp in researchBuildings)
{
// 只保存有效的项目和有建筑的项目
if (kvp.Key != null && kvp.Value != null && kvp.Value.Count > 0)
{
// 过滤掉已被摧毁的建筑
var validBuildings = kvp.Value.Where(b => b != null && !b.Destroyed).ToList();
if (validBuildings.Count > 0)
{
serializedProjects.Add(kvp.Key);
serializedBuildings.Add(validBuildings);
}
}
}
Scribe_Collections.Look(ref serializedProjects, "serializedProjects", LookMode.Def);
Scribe_Collections.Look(ref serializedBuildings, "serializedBuildings", LookMode.Reference);
}
else if (Scribe.mode == LoadSaveMode.LoadingVars)
{
allReaders = allReaders ?? new List<Building_ResearchBlueprintReader>();
List<ResearchProjectDef> keys = null;
List<List<Building_ResearchBlueprintReader>> values = null;
Scribe_Collections.Look(ref keys, "researchKeys", LookMode.Def);
Scribe_Collections.Look(ref values, "researchValues", LookMode.Deep);
// 加载时:清空现有数据
allReaders = new List<Building_ResearchBlueprintReader>();
researchBuildings = new Dictionary<ResearchProjectDef, List<Building_ResearchBlueprintReader>>();
if (keys != null && values != null && keys.Count == values.Count)
serializedProjects = null;
serializedBuildings = null;
Scribe_Collections.Look(ref serializedProjects, "serializedProjects", LookMode.Def);
Scribe_Collections.Look(ref serializedBuildings, "serializedBuildings", LookMode.Reference);
if (serializedProjects != null && serializedBuildings != null &&
serializedProjects.Count == serializedBuildings.Count)
{
for (int i = 0; i < keys.Count; i++)
for (int i = 0; i < serializedProjects.Count; i++)
{
if (keys[i] != null)
researchBuildings[keys[i]] = values[i] ?? new List<Building_ResearchBlueprintReader>();
var project = serializedProjects[i];
var buildings = serializedBuildings[i];
if (project != null && buildings != null)
{
// 清理空引用
buildings.RemoveAll(b => b == null);
if (buildings.Count > 0)
{
researchBuildings[project] = buildings;
// 添加到所有建筑列表
foreach (var building in buildings)
{
if (!allReaders.Contains(building))
{
allReaders.Add(building);
}
}
}
}
}
}
Log.Message($"[ResearchManager] Loaded {allReaders.Count} buildings, {researchBuildings.Count} research projects");
}
else if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
// 后加载初始化:清理所有无效数据
CleanupInvalidData();
}
}
@@ -74,21 +123,86 @@ namespace ArachnaeSwarm
cleanupTimer++;
if (cleanupTimer >= CleanupInterval)
{
CleanupDestroyedBuildings();
CleanupInvalidData();
cleanupTimer = 0;
}
}
/// <summary>
/// 清理无效数据
/// </summary>
private void CleanupInvalidData()
{
int removedCount = 0;
// 清理所有建筑列表
if (allReaders != null)
{
removedCount += allReaders.RemoveAll(b =>
b == null || b.Destroyed || !b.Spawned || b.Map == null);
Log.Message($"[ResearchManager] Cleaned up {removedCount} invalid buildings from allReaders");
}
else
{
allReaders = new List<Building_ResearchBlueprintReader>();
}
// 清理研究建筑映射
if (researchBuildings != null)
{
var projectsToRemove = new List<ResearchProjectDef>();
foreach (var kvp in researchBuildings)
{
if (kvp.Key == null)
{
projectsToRemove.Add(kvp.Key);
continue;
}
// 清理无效建筑
kvp.Value.RemoveAll(b =>
b == null || b.Destroyed || !b.Spawned || b.Map == null);
if (kvp.Value.Count == 0)
{
projectsToRemove.Add(kvp.Key);
}
}
// 移除空项目
foreach (var project in projectsToRemove)
{
researchBuildings.Remove(project);
}
Log.Message($"[ResearchManager] Cleaned up {projectsToRemove.Count} empty research projects");
}
else
{
researchBuildings = new Dictionary<ResearchProjectDef, List<Building_ResearchBlueprintReader>>();
}
}
/// <summary>
/// 注册建筑
/// </summary>
public void RegisterReader(Building_ResearchBlueprintReader reader)
{
if (reader == null || reader.Destroyed) return;
if (reader == null || reader.Destroyed || !reader.Spawned)
return;
// 防止重复注册
if (allReaders == null)
{
allReaders = new List<Building_ResearchBlueprintReader>();
}
if (!allReaders.Contains(reader))
{
allReaders.Add(reader);
Log.Message($"[ResearchManager] Registered reader: {reader.ThingID} at position {reader.Position}");
}
}
@@ -97,15 +211,22 @@ namespace ArachnaeSwarm
/// </summary>
public void RegisterResearch(Building_ResearchBlueprintReader reader, ResearchProjectDef project)
{
if (reader == null || project == null) return;
if (reader == null || project == null)
return;
if (researchBuildings == null)
{
researchBuildings = new Dictionary<ResearchProjectDef, List<Building_ResearchBlueprintReader>>();
}
if (!researchBuildings.ContainsKey(project))
researchBuildings[project] = new List<Building_ResearchBlueprintReader>();
if (!researchBuildings[project].Contains(reader))
{
researchBuildings[project].Add(reader);
Log.Message($"[ResearchManager] Registered research: {project.defName} at building {reader.Position}");
Log.Message($"[ResearchManager] Registered research: {project.defName} at building {reader.Position}");
}
}
/// <summary>
@@ -122,159 +243,27 @@ namespace ArachnaeSwarm
Log.Message($"[ResearchManager] Processing building destruction for project: {project.defName}");
// 从列表中移除
if (researchBuildings.ContainsKey(project))
if (researchBuildings != null && researchBuildings.ContainsKey(project))
{
researchBuildings[project].Remove(building);
Log.Message($"[ResearchManager] Removed building from project list. Remaining buildings: {researchBuildings[project].Count}");
// 检查是否还有建筑
CheckResearchStatus(project);
}
// 从所有建筑列表中移除
allReaders.Remove(building);
}
/// <summary>
/// 检查科技状态
/// </summary>
private void CheckResearchStatus(ResearchProjectDef project)
{
if (project == null) return;
// 检查是否还有建筑研究这个科技
bool hasBuildings = false;
if (researchBuildings.ContainsKey(project))
{
// 清理列表中的空引用
researchBuildings[project].RemoveAll(b => b == null || b.Destroyed);
hasBuildings = researchBuildings[project].Count > 0;
if (!hasBuildings)
if (researchBuildings[project].Count == 0)
{
researchBuildings.Remove(project);
Log.Message($"[ResearchManager] No buildings left for project: {project.defName}");
}
}
// 如果没有建筑了,移除科技
if (!hasBuildings)
// 从所有建筑列表中移除
if (allReaders != null)
{
RemoveResearchProject(project);
allReaders.Remove(building);
}
}
/// <summary>
/// 移除科技
/// </summary>
private void RemoveResearchProject(ResearchProjectDef project)
{
if (project == null) return;
Log.Message($"[ResearchManager] Removing research project: {project.defName}");
try
{
// 移除科技完成状态
Utilities.ResearchRemover.RemoveResearchProject(project, false);
// 发送消息
Messages.Message("ResearchManager_ResearchLost".Translate(project.LabelCap),
MessageTypeDefOf.NegativeEvent);
Log.Message($"[ResearchManager] Successfully removed research project: {project.defName}");
}
catch (Exception ex)
{
Log.Error($"[ResearchManager] Error removing research project {project.defName}: {ex}");
}
}
/// <summary>
/// 建筑解锁时的处理
/// </summary>
public void OnBuildingUnlocked(Building_ResearchBlueprintReader building, ResearchProjectDef project)
{
if (project == null) return;
Log.Message($"[ResearchManager] Processing building unlock for project: {project.defName}");
// 从研究中移除
if (researchBuildings.ContainsKey(project))
{
researchBuildings[project].Remove(building);
Log.Message($"[ResearchManager] Removed building from project list due to unlock. Remaining buildings: {researchBuildings[project].Count}");
// 检查是否还有建筑
CheckResearchStatus(project);
}
}
/// <summary>
/// 检查科技是否还有建筑研究
/// </summary>
public bool HasResearchBuildings(ResearchProjectDef project)
{
if (project == null) return false;
if (researchBuildings.ContainsKey(project))
{
researchBuildings[project].RemoveAll(b => b == null || b.Destroyed);
return researchBuildings[project].Count > 0;
}
return false;
}
/// <summary>
/// 获取研究某个科技的建筑数量
/// </summary>
public int GetResearchBuildingCount(ResearchProjectDef project)
{
if (researchBuildings.ContainsKey(project))
{
researchBuildings[project].RemoveAll(b => b == null || b.Destroyed);
return researchBuildings[project].Count;
}
return 0;
}
/// <summary>
/// 清理被摧毁的建筑
/// </summary>
private void CleanupDestroyedBuildings()
{
int removedCount = 0;
// 清理所有建筑列表
allReaders.RemoveAll(b => b == null || b.Destroyed);
// 清理研究建筑映射,并检查科技状态
List<ResearchProjectDef> projectsToCheck = new List<ResearchProjectDef>();
foreach (var kvp in researchBuildings.ToList())
{
kvp.Value.RemoveAll(b => b == null || b.Destroyed);
removedCount += kvp.Value.Count(b => b == null || b.Destroyed);
if (kvp.Value.Count == 0)
{
projectsToCheck.Add(kvp.Key);
}
}
// 检查需要处理的科技
foreach (var project in projectsToCheck)
{
CheckResearchStatus(project);
}
if (removedCount > 0)
{
Log.Message($"[ResearchManager] Cleanup: removed {removedCount} destroyed buildings");
}
}
// ... 其余方法保持不变 ...
/// <summary>
/// 调试命令
@@ -287,28 +276,19 @@ namespace ArachnaeSwarm
return;
}
Log.Message("ResearchManager_StatusTitle".Translate());
Log.Message("ResearchManager_TotalBuildings".Translate(Instance.allReaders.Count));
Log.Message("ResearchManager_ActiveResearch".Translate(Instance.researchBuildings.Count));
Log.Message("=== Research Manager Status ===");
Log.Message($"Total buildings: {Instance.allReaders?.Count ?? 0}");
Log.Message($"Active research projects: {Instance.researchBuildings?.Count ?? 0}");
foreach (var kvp in Instance.researchBuildings)
if (Instance.researchBuildings != null)
{
int activeBuildings = kvp.Value.Count(b => b != null && !b.Destroyed);
Log.Message("ResearchManager_ProjectStatus".Translate(
kvp.Key.defName, activeBuildings, kvp.Value.Count));
}
}
/// <summary>
/// 强制检查所有科技状态(调试用)
/// </summary>
public static void ForceCheckAllResearch()
{
if (Instance == null) return;
foreach (var project in Instance.researchBuildings.Keys.ToList())
{
Instance.CheckResearchStatus(project);
foreach (var kvp in Instance.researchBuildings)
{
if (kvp.Key == null) continue;
int activeBuildings = kvp.Value?.Count(b => b != null && !b.Destroyed && b.Spawned) ?? 0;
Log.Message($" - {kvp.Key.defName}: {activeBuildings} active buildings");
}
}
}
}

View File

@@ -0,0 +1,194 @@
using HarmonyLib;
using RimWorld;
using System;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
[HarmonyPatch(typeof(Pawn), "get_CanTakeOrder")]
public class Patch_CanTakeOrder
{
[HarmonyPostfix]
public static void postfix(ref bool __result, Pawn __instance)
{
if (__instance.HasComp<CompDraftableAnimals>() && __instance.Drafted)
{
__result = true;
}
}
}
[HarmonyPatch(typeof(PawnComponentsUtility), "AddAndRemoveDynamicComponents")]
public class Patch_PawnTracer
{
[HarmonyPostfix]
public static void postfix(Pawn pawn)
{
CompDraftableAnimals comp = pawn.TryGetComp<CompDraftableAnimals>();
if (comp != null && comp.Props.draftable)
{
pawn.drafter = new Pawn_DraftController(pawn);
}
}
}
[HarmonyPatch(typeof(FloatMenuOptionProvider), "SelectedPawnValid")]
public class Patch_GetSingleOption
{
[HarmonyPostfix]
public static void postfix(ref bool __result, Pawn pawn)
{
if (pawn.HasComp<CompDraftableAnimals>() && pawn.Drafted)
{
__result = true;
}
}
}
[HarmonyPatch(typeof(FloatMenuUtility), "UseRangedAttack")]
public static class Patch_FloatMenuUtility_UseRangedAttack
{
[HarmonyPrefix]
public static bool Prefix(Pawn pawn, ref bool __result)
{
if (pawn.equipment == null)
{
__result = false;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(FloatMenuUtility), nameof(FloatMenuUtility.GetMeleeAttackAction))]
public static class Patch_FloatMenuUtility_GetMeleeAttackAction_Simple
{
[HarmonyPrefix]
public static bool Prefix(Pawn pawn, LocalTargetInfo target, out string failStr, ref Action __result, bool ignoreControlled = false)
{
failStr = "";
// 检查是否有 CompDraftableAnimals
var comp = pawn?.GetComp<CompDraftableAnimals>();
if (comp != null)
{
// 直接返回 true 跳过控制检查
ignoreControlled = true;
// 这里我们直接调用修改后的方法
__result = ModifiedGetMeleeAttackAction(pawn, target, out failStr, ignoreControlled);
return false; // 跳过原始方法
}
return true; // 没有组件,继续执行原始方法
}
private static Action ModifiedGetMeleeAttackAction(Pawn pawn, LocalTargetInfo target, out string failStr, bool ignoreControlled = false)
{
failStr = "";
try
{
// 直接使用原始代码,但跳过控制检查
if (!pawn.Drafted && !ignoreControlled)
{
failStr = "IsNotDraftedLower".Translate(pawn.LabelShort, pawn);
}
else if (target.IsValid && !pawn.CanReach(target, PathEndMode.Touch, Danger.Deadly))
{
failStr = "NoPath".Translate();
}
else if (pawn.WorkTagIsDisabled(WorkTags.Violent))
{
failStr = "IsIncapableOfViolenceLower".Translate(pawn.LabelShort, pawn);
}
else if (pawn.meleeVerbs?.TryGetMeleeVerb(target.Thing) == null)
{
failStr = "Incapable".Translate();
}
else if (pawn == target.Thing)
{
failStr = "CannotAttackSelf".Translate();
}
else if (target.Thing is Pawn targetPawn && (pawn.InSameExtraFaction(targetPawn, ExtraFactionType.HomeFaction) || pawn.InSameExtraFaction(targetPawn, ExtraFactionType.MiniFaction)))
{
failStr = "CannotAttackSameFactionMember".Translate();
}
else
{
if (!(target.Thing is Pawn pawn2) || !pawn2.RaceProps.Animal || !HistoryEventUtility.IsKillingInnocentAnimal(pawn, pawn2) || new HistoryEvent(HistoryEventDefOf.KilledInnocentAnimal, pawn.Named(HistoryEventArgsNames.Doer)).DoerWillingToDo())
{
return delegate
{
Job job = JobMaker.MakeJob(JobDefOf.AttackMelee, target);
if (target.Thing is Pawn pawn3)
{
job.killIncappedTarget = pawn3.Downed;
}
pawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
};
}
failStr = "IdeoligionForbids".Translate();
}
failStr = failStr.CapitalizeFirst();
return null;
}
catch (Exception ex)
{
Log.Error($"[ARA] Error in ModifiedGetMeleeAttackAction: {ex}");
failStr = "Cannot attack";
return null;
}
}
}
// 阻止有 ARA_HiveMindBeast 的动物判断应该逃跑
[HarmonyPatch(typeof(FleeUtility), "ShouldAnimalFleeDanger")]
public static class Patch_FleeUtility_ShouldAnimalFleeDanger
{
[HarmonyPostfix]
public static void Postfix(Pawn pawn, ref bool __result)
{
try
{
if (pawn != null && pawn.health?.hediffSet != null && __result)
{
var hiveMindBeastDef = HediffDef.Named("ARA_HiveMindBeast");
if (hiveMindBeastDef != null && pawn.health.hediffSet.HasHediff(hiveMindBeastDef))
{
// 如果有这个 hediff动物不应该逃跑
__result = false;
}
}
}
catch (Exception ex)
{
Log.Error($"[ARA] Error in ShouldAnimalFleeDanger postfix: {ex}");
}
}
}
// 阻止有 ARA_HiveMindBeast 的动物判断应该从特定事物逃跑
[HarmonyPatch(typeof(FleeUtility), "ShouldFleeFrom")]
public static class Patch_FleeUtility_ShouldFleeFrom
{
[HarmonyPostfix]
public static void Postfix(Thing t, Pawn pawn, ref bool __result)
{
try
{
if (pawn != null && pawn.health?.hediffSet != null && __result)
{
var hiveMindBeastDef = HediffDef.Named("ARA_HiveMindBeast");
if (hiveMindBeastDef != null && pawn.health.hediffSet.HasHediff(hiveMindBeastDef))
{
// 如果有这个 hediff动物不应该逃跑
__result = false;
}
}
}
catch (Exception ex)
{
Log.Error($"[ARA] Error in ShouldFleeFrom postfix: {ex}");
}
}
}
}

View File

@@ -0,0 +1,70 @@
using System.Collections.Generic;
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class BeastUnit : Pawn
{
public override void DrawExtraSelectionOverlays()
{
base.DrawExtraSelectionOverlays();
pather.curPath?.DrawPath(this);
jobs.DrawLinesBetweenTargets();
}
public override IEnumerable<Gizmo> GetGizmos()
{
foreach (Gizmo gizmo in base.GetGizmos())
{
yield return gizmo;
}
if (drafter == null)
{
yield break;
}
foreach (Gizmo draftGizmo in GetDraftGizmos())
{
yield return draftGizmo;
}
}
public IEnumerable<Gizmo> GetDraftGizmos()
{
if (!drafter.ShowDraftGizmo)
{
yield break;
}
Command_Toggle command_Toggle = new Command_Toggle
{
hotKey = KeyBindingDefOf.Command_ColonistDraft,
isActive = () => base.Drafted,
toggleAction = delegate
{
drafter.Drafted = !drafter.Drafted;
PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.Drafting, KnowledgeAmount.SpecificInteraction);
if (base.Drafted)
{
LessonAutoActivator.TeachOpportunity(ConceptDefOf.QueueOrders, OpportunityType.GoodToKnow);
}
},
defaultDesc = "CommandToggleDraftDesc".Translate(),
icon = TexCommand.Draft,
turnOnSound = SoundDefOf.DraftOn,
turnOffSound = SoundDefOf.DraftOff,
groupKeyIgnoreContent = 81729172,
defaultLabel = (base.Drafted ? "CommandUndraftLabel" : "CommandDraftLabel").Translate()
};
if (base.Downed)
{
command_Toggle.Disable("IsIncapped".Translate(LabelShort, this));
}
if (base.Deathresting)
{
command_Toggle.Disable("IsDeathresting".Translate(this.Named("PAWN")));
}
command_Toggle.tutorTag = ((!base.Drafted) ? "Draft" : "Undraft");
yield return command_Toggle;
}
}
}

View File

@@ -0,0 +1,14 @@
using RimWorld;
using UnityEngine;
using Verse;
using Verse.AI.Group;
using Verse.Sound;
using static HarmonyLib.Code;
namespace ArachnaeSwarm
{
public class CompDraftableAnimals : ThingComp
{
public CompProperties_DraftableAnimals Props => (CompProperties_DraftableAnimals)props;
}
}

View File

@@ -0,0 +1,17 @@
using RimWorld;
using System.Collections.Generic;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_DraftableAnimals : CompProperties
{
public bool draftable = true;
public CompProperties_DraftableAnimals()
{
compClass = typeof(CompDraftableAnimals);
}
}
}

View File

@@ -75,7 +75,7 @@ namespace ArachnaeSwarm
}
// 智能溅射:次要目标的敌对状态必须与主目标一致
if (secondaryTargetPawn.HostileTo(casterPawn) != mainTargetIsHostile)
if (secondaryTargetPawn.HostileTo(casterPawn))
{
continue;
}

View File

@@ -83,7 +83,7 @@ namespace ArachnaeSwarm
}
// 智能溅射:次要目标的敌对状态必须与主目标一致
if (secondaryTargetPawn.HostileTo(casterPawn) != mainTargetIsHostile)
if (secondaryTargetPawn.Faction == casterPawn.Faction)
{
continue;
}

View File

@@ -130,7 +130,7 @@ namespace ArachnaeSwarm
// 检查是否有食物需求
private bool HasFoodNeed(Pawn pawn)
{
return pawn.needs?.TryGetNeed<Need_Food>() != null;
return pawn.needs?.TryGetNeed<Need_Food>() != null && pawn.needs?.TryGetNeed<Need_Food>().CurLevelPercentage <= 0.25f;
}
// 检查是否是虫族成员