修复寿命问题,写完虫巢袭击系统,去除菌毯减速和原始恐惧

This commit is contained in:
Tourswen
2025-10-16 23:34:30 +08:00
parent ca1b2744de
commit 0f7b7b3d7c
23 changed files with 698 additions and 247 deletions

Binary file not shown.

View File

@@ -232,7 +232,7 @@
<description>阿拉克涅女皇种向目标地点喷射大量腐蚀性酸液,喷射将持续数秒以完全覆盖一片区域。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_AcidSprayBurst</iconPath>
<cooldownTicksRange>5000</cooldownTicksRange> <!-- 2 hours -->
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<verbProperties>
@@ -308,7 +308,7 @@
<description>阿拉克涅督虫向目标地点喷射大量腐蚀性酸液,虽然不如女皇种所喷射的酸雨那样强劲,但是虫酸的伤害依然是实打实的。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_AcidSprayBurst</iconPath>
<cooldownTicksRange>12000</cooldownTicksRange> <!-- 2 hours -->
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<displayOrder>300</displayOrder>
<warmupStartSound>AcidSpray_Warmup</warmupStartSound>
<verbProperties>
@@ -871,6 +871,7 @@
<cooldownTicksRange>3800</cooldownTicksRange>
<cooldownPerCharge>true</cooldownPerCharge>
<hostile>false</hostile>
<aiCanUse>false</aiCanUse>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<stunTargetWhileCasting>true</stunTargetWhileCasting>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>
@@ -930,7 +931,7 @@
<cooldownTicksRange>7500</cooldownTicksRange> <!-- 3 hours -->
<stunTargetWhileCasting>true</stunTargetWhileCasting>
<targetRequired>false</targetRequired>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_SearchAOEForTargets>true</ai_SearchAOEForTargets>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>
@@ -992,7 +993,7 @@
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_TerrainTempt_Ability</iconPath>
<cooldownTicksRange>13500</cooldownTicksRange> <!-- 3 hours -->
<stunTargetWhileCasting>true</stunTargetWhileCasting>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_SearchAOEForTargets>true</ai_SearchAOEForTargets>
<displayOrder>300</displayOrder>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>

View File

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<IncidentDef>
<defName>ARA_Loop_Raid_Incident</defName>
<label>虫群袭击</label>
<category>Misc</category>
<targetTags>
<li>Map_PlayerHome</li>
</targetTags>
<!-- This uses the vanilla quest giver worker -->
<workerClass>IncidentWorker_GiveQuest</workerClass>
<!-- This points to our custom QuestScriptDef -->
<questScriptDef>ARA_Loop_Raid_Quest</questScriptDef>
<!--
<baseChance>1.0</baseChance>
<earliestDay>0.001</earliestDay>
<minRefireDays>99999</minRefireDays>
-->
</IncidentDef>
<QuestScriptDef>
<defName>ARA_Loop_Raid_Quest</defName>
<label>虫群袭击</label>
<description>虫群袭击description</description>
<root Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_ResolveQuestName">
<rules>
<rulesStrings>
<li>questName->虫群袭击</li>
</rulesStrings>
</rules>
</li>
<li Class="QuestNode_ResolveQuestDescription">
<rules>
<rulesStrings>
<li>questDescription->虫群袭击questDescription</li>
</rulesStrings>
</rules>
</li>
<li Class="ArachnaeSwarm.QuestNode_Root_EventLetter">
<letterLabel>虫群袭击Label</letterLabel>
<letterTitle>虫群袭击Title</letterTitle>
<letterText>虫群袭击Text</letterText>
<options>
<li>
<label>袭击开始</label>
<optionEffects>
<li>
<effects>
<li Class="ArachnaeSwarm.Effect_OpenCustomUI">
<defName>ARA_Loop_Raid_Main_Event_1</defName>
</li>
</effects>
</li>
</optionEffects>
</li>
</options>
</li>
</nodes>
</root>
</QuestScriptDef>
<ArachnaeSwarm.EventDef>
<defName>ARA_Loop_Raid_Main_Event_1</defName>
<characterName>嘻嘻</characterName>
<hiddenWindow>true</hiddenWindow>
<immediateEffects>
<li>
<!-- 系统会从这个列表中根据权重随机选择一个执行 -->
<randomlistEffects>
<li Class="ArachnaeSwarm.Effect_TriggerRaid">
<points>10000</points>
<faction>ARA_Hostile_Hive</faction>
<raidStrategy>ImmediateAttack</raidStrategy>
<raidArrivalMode>EdgeWalkIn</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
<kindDef>Combat</kindDef>
<commonality>100</commonality>
<options>
<ARA_Raid_AcidSwarm>20</ARA_Raid_AcidSwarm>
<ARA_Raid_Acidling>5</ARA_Raid_Acidling>
</options>
</li>
</pawnGroupMakers>
</li>
<li Class="ArachnaeSwarm.Effect_TriggerRaid">
<points>10000</points>
<faction>ARA_Hostile_Hive</faction>
<raidStrategy>ImmediateAttack</raidStrategy>
<raidArrivalMode>EdgeWalkIn</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
<kindDef>Combat</kindDef>
<commonality>100</commonality>
<options>
<ARA_Raid_AcidSwarm>20</ARA_Raid_AcidSwarm>
<ARA_Raid_Heavy>3</ARA_Raid_Heavy>
</options>
</li>
</pawnGroupMakers>
</li>
<li Class="ArachnaeSwarm.Effect_TriggerRaid">
<points>10000</points>
<faction>ARA_Hostile_Hive</faction>
<raidStrategy>ImmediateAttack</raidStrategy>
<raidArrivalMode>EdgeWalkIn</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
<kindDef>Combat</kindDef>
<commonality>100</commonality>
<options>
<ARA_Raid_AcidSwarm>20</ARA_Raid_AcidSwarm>
<ARA_Raid_Shooter>3</ARA_Raid_Shooter>
<ARA_Raid_Assault>7</ARA_Raid_Assault>
</options>
</li>
</pawnGroupMakers>
</li>
</randomlistEffects>
<effects>
</effects>
</li>
</immediateEffects>
</ArachnaeSwarm.EventDef>
</Defs>

View File

@@ -45,7 +45,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -109,7 +109,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -196,7 +196,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -271,7 +271,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -422,7 +422,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -538,7 +538,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -690,7 +690,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -868,7 +868,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>
@@ -984,7 +984,7 @@
<groupAbility>true</groupAbility>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<aiCanUse>true</aiCanUse>
<aiCanUse>false</aiCanUse>
<ai_IsOffensive>true</ai_IsOffensive>
<targetRequired>false</targetRequired>
<jobDef>CastAbilityOnThing</jobDef>

View File

@@ -6,40 +6,101 @@
<description>向闪耀世界方向侵略的阿拉克涅虫巢舰队被闪耀世界联军击败后,残留于星域中的虫群子个体。这些虫群子个体由于无法和蜂巢网络建立联系,其自行组织的反常网络只有低度的智能,只能让其成员如野兽般行动——然而她们依然是一群危险的敌人,于无数敌手交战留下的基因性反射使得她们的锋芒不减当年。\n\n她们不会对任何人展现仁慈即使她们的对手是自己的同族。</description>
<pawnSingular>虫群</pawnSingular>
<pawnsPlural>虫群</pawnsPlural>
<basicMemberKind>RealWula_PawnKind</basicMemberKind>
<categoryTag>ARA_Hostile_Hive</categoryTag>
<requiredCountAtGameStart>1</requiredCountAtGameStart>
<fixedName>阿拉克涅断须</fixedName>
<factionIconPath>World/WorldObjects/Expanding/Insects</factionIconPath>
<factionNameMaker>ARA_New_Hive_NamerFaction</factionNameMaker>
<factionIconPath>Wula/World/WorldObjects/Expanding/Wula_FE_Faction</factionIconPath>
<displayInFactionSelection>false</displayInFactionSelection>
<!-- <settlementGenerationWeight>1</settlementGenerationWeight> -->
<canSiege>false</canSiege>
<canStageAttacks>false</canStageAttacks>
<backstoryFilters>
<li>
<categories>
<li>Offworld</li>
</categories>
</li>
</backstoryFilters>
<techLevel>Animal</techLevel>
<arrivalLayerWhitelist>
<li>Surface</li>
<!-- <li MayRequire="Ludeon.RimWorld.Odyssey">Orbit</li> -->
</arrivalLayerWhitelist>
<colorSpectrum>
<li>(0.44, 0.41, 0.32)</li>
<li>(0.61, 0.58, 0.49)</li>
<li>(0.60, 0.49, 0.36)</li>
<li>(0.6, 0.5, 0.9)</li>
</colorSpectrum>
<!-- <arrivalModeWhitelist>
<li>EdgeDrop</li>
<li>EdgeDropGroups</li>
<li>CenterDrop</li>
<li>RandomDrop</li>
</arrivalModeWhitelist> -->
<raidCommonalityFromPointsCurve>
<points>
<li>(0, 0)</li>
<li>(300, 0)</li>
<li>(700, 0)</li>
<li>(1400, 0)</li>
<li>(2800, 0)</li>
<li>(4000, 0)</li>
</points>
</raidCommonalityFromPointsCurve>
<pawnGroupMakers>
<li>
<!-- Normal fights, standard mix -->
<kindDef>Combat</kindDef>
<options>
<ARA_Raid_Shooter>7</ARA_Raid_Shooter>
<ARA_Raid_Assault>3</ARA_Raid_Assault>
</options>
</li>
<li>
<kindDef>Settlement</kindDef>
<options>
<TradersGuild_Citizen>10</TradersGuild_Citizen>
<TradersGuild_Slasher>7</TradersGuild_Slasher>
<TradersGuild_Gunner>10</TradersGuild_Gunner>
<TradersGuild_Elite>10</TradersGuild_Elite>
</options>
</li>
</pawnGroupMakers>
<!-- <raidLootMaker>MechanoidRaidLootMaker</raidLootMaker> -->
<raidLootValueFromPointsCurve>
<points>
<li>(35, 8)</li>
<li>(100, 60)</li>
<li>(1000, 250)</li>
<li>(2000, 400)</li>
<li>(4000, 500)</li>
</points>
</raidLootValueFromPointsCurve>
<humanlikeFaction>true</humanlikeFaction>
<hidden>true</hidden>
<!-- <autoFlee>false</autoFlee> -->
<canUseAvoidGrid>false</canUseAvoidGrid>
<apparelStuffFilter>
<thingDefs>
<li>Cloth</li>
</thingDefs>
</apparelStuffFilter>
<earliestRaidDays>0</earliestRaidDays>
<permanentEnemy>true</permanentEnemy>
<hostileToFactionlessHumanlikes>true</hostileToFactionlessHumanlikes>
<maxPawnCostPerTotalPointsCurve>
<points>
<li>(100,100)</li>
<li>(10000,10000)</li>
<li>(400,200)</li>
<li>(900,300)</li>
<li>(100000,10000)</li>
</points>
</maxPawnCostPerTotalPointsCurve>
<pawnGroupMakers>
<!-- 虫巢不发起任何常规袭击,而是使用自定义袭击 -->
</pawnGroupMakers>
<humanlikeFaction>false</humanlikeFaction>
<hidden>true</hidden>
<autoFlee>false</autoFlee>
<canUseAvoidGrid>false</canUseAvoidGrid>
<techLevel>Animal</techLevel>
<animalsFleeDanger>false</animalsFleeDanger>
<permanentEnemyToEveryoneExcept>
<li MayRequire="Ludeon.RimWorld.Anomaly">Entities</li>
</permanentEnemyToEveryoneExcept>
<settlementTexturePath>World/WorldObjects/DefaultSettlement</settlementTexturePath>
<allowedArrivalTemperatureRange>-2000~2000</allowedArrivalTemperatureRange>
<maxConfigurableAtWorldCreation>1</maxConfigurableAtWorldCreation>
<configurationListOrderPriority>1000</configurationListOrderPriority>
<configurationListOrderPriority>900</configurationListOrderPriority>
<dropPodActive>ActiveDropPodMechanoid</dropPodActive>
<dropPodIncoming>DropPodIncomingMechanoidRapid</dropPodIncoming>
<disallowedRaidAgeRestrictions>
<li MayRequire="Ludeon.RimWorld.Biotech">Children</li>
</disallowedRaidAgeRestrictions>
</FactionDef>
</Defs>

View File

@@ -30,20 +30,6 @@
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindMaster">
<scanIntervalTicks>3200</scanIntervalTicks>
</li>
<li Class="HediffCompProperties_GiveHediffsInRange">
<range>6</range>
<hediff>ARA_CreepyCrawly_Hediff</hediff>
<mote IsNull="True"/>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
<targetingParameters>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>false</canTargetAnimals>
<canTargetMechs>false</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
<onlyTargetColonists>true</onlyTargetColonists>
</targetingParameters>
<onlyPawnsInSameFaction>false</onlyPawnsInSameFaction>
</li>
</comps>
</HediffDef>
<HediffDef>
@@ -71,20 +57,6 @@
</li>
</stages>
<comps>
<li Class="HediffCompProperties_GiveHediffsInRange">
<range>6</range>
<hediff>ARA_CreepyCrawly_Hediff</hediff>
<mote IsNull="True"/>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
<targetingParameters>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>false</canTargetAnimals>
<canTargetMechs>false</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
<onlyTargetColonists>true</onlyTargetColonists>
</targetingParameters>
<onlyPawnsInSameFaction>false</onlyPawnsInSameFaction>
</li>
<li Class="ArachnaeSwarm.HediffCompProperties_HiveMindDrone">
<unlinkedDieDelayTicks>6400</unlinkedDieDelayTicks> <!-- Default to 30 seconds -->
</li>
@@ -94,8 +66,47 @@
<letterText>一只新的阿拉克涅督虫 {0_labelShort} 已经破茧而出!她正在四处徘徊,等待女皇种的指示——使用阿拉克涅女皇种的信息素标记技能完成链接,或者等待其自行建立链接。</letterText>
<letterType>HumanPregnancy</letterType>
</li>
<li Class="HediffCompProperties_RemoveIfOtherHediff">
<hediffs>
<li>ARA_NonPlayer_HiveMindDroneHediff</li>
</hediffs>
</li>
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_NonPlayer_HiveMindDroneHediff</defName>
<label>野性虫群</label>
<description>与阿拉克涅虫群蜂巢意志断开链接的督虫只会如野兽般行动——女皇种可以重新接管它们。</description>
<!-- <hediffClass>ArachnaeSwarm.Hediff_HiveMindDrone</hediffClass> -->
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<stages>
<li>
<minSeverity>0</minSeverity>
<foodPoisoningChanceFactor>0</foodPoisoningChanceFactor>
<disablesNeeds>
<li>Mood</li>
<li>Joy</li>
<li>Beauty</li>
<li>Comfort</li>
<li>Outdoors</li>
<li>Indoors</li>
<li>DrugDesire</li>
<li>RoomSize</li>
</disablesNeeds>
</li>
</stages>
</HediffDef>
<HediffGiverSetDef>
<defName>ARA_NonPlayerHediffSet</defName>
<hediffGivers>
<li Class="ArachnaeSwarm.HediffGiver_NonPlayerFaction">
<hediff>ARA_NonPlayer_HiveMindDroneHediff</hediff>
<mtbDays>0.1</mtbDays> <!-- 很短的检查间隔 -->
</li>
</hediffGivers>
</HediffGiverSetDef>
<HediffDef>
<defName>ARA_HiveMindWorker</defName>
<label>阿拉克涅辅虫</label>
@@ -104,22 +115,6 @@
<defaultLabelColor>(0.6, 0.4, 0.8)</defaultLabelColor>
<isBad>false</isBad>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
<li Class="HediffCompProperties_GiveHediffsInRange">
<range>6</range>
<hediff>ARA_CreepyCrawly_Hediff</hediff>
<mote IsNull="True"/>
<hideMoteWhenNotDrafted>true</hideMoteWhenNotDrafted>
<targetingParameters>
<canTargetBuildings>false</canTargetBuildings>
<canTargetAnimals>false</canTargetAnimals>
<canTargetMechs>false</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
<onlyTargetColonists>true</onlyTargetColonists>
</targetingParameters>
<onlyPawnsInSameFaction>false</onlyPawnsInSameFaction>
</li>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
@@ -192,9 +187,9 @@
<!-- 勿删——用于记录寿命的hediff没有会导致寿命组件的工作出现异常 -->
<HediffDef Name="ARA_LifespanHediff" >
<defName>ARA_LifespanHediff</defName>
<hediffClass>Hediff_High</hediffClass>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.6, 0.8, 0.9)</defaultLabelColor>
<minSeverity>0.01</minSeverity>
<!-- <minSeverity>0.01</minSeverity> -->
<initialSeverity>0.01</initialSeverity>
<label>寿命记录</label>
<description>阿拉克涅虫族记录寿命的hediff正常情况下你不应该看见这个。</description>
@@ -204,6 +199,9 @@
<becomeVisible>false</becomeVisible>
</li>
</stages>
<comps>
<li Class="ArachnaeSwarm.HediffCompProperties_LifespanDisplay" />
</comps>
</HediffDef>
<HediffDef>
<defName>ARA_TemperatureRegulation</defName>
@@ -249,52 +247,6 @@
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_CreepyCrawly_Hediff</defName>
<label>原始恐惧</label>
<description>快把这些虫子从我身边支开!</description>
<defaultLabelColor>(0.52, 1, 0.95)</defaultLabelColor>
<hediffClass>HediffWithComps</hediffClass>
<isBad>false</isBad>
<debugLabelExtra>other</debugLabelExtra>
<initialSeverity>1</initialSeverity> <!-- 初始层数设置为10 -->
<maxSeverity>1</maxSeverity> <!-- 最大层数,可以根据需要调整 -->
<stages>
<li>
<minSeverity>0</minSeverity>
<becomeVisible>false</becomeVisible>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_Disappears">
<showRemainingTime>false</showRemainingTime>
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
<li Class="HediffCompProperties_Link">
<requireLinkOnOtherPawn>false</requireLinkOnOtherPawn>
<maxDistance>0</maxDistance>
<customMote>Mote_ARA_CreepyCrawly_HediffLinkLine</customMote>
</li>
</comps>
</HediffDef>
<ThingDef ParentName="MoteBase">
<defName>Mote_ARA_CreepyCrawly_HediffLinkLine</defName>
<thingClass>MoteDualAttached</thingClass>
<altitudeLayer>MoteLow</altitudeLayer>
<mote>
<fadeInTime>0.1</fadeInTime>
<fadeOutTime>0.1</fadeOutTime>
<solidTime>999999</solidTime>
<needsMaintenance>True</needsMaintenance>
<rotateTowardsTarget>True</rotateTowardsTarget>
<scaleToConnectTargets>True</scaleToConnectTargets>
</mote>
<graphicData>
<shaderType>MoteGlow</shaderType>
<texPath>Things/Mote/WorkCommandLinkLine</texPath>
<color>(0,0,0,0)</color>
</graphicData>
</ThingDef>
<HediffDef>
<defName>ARA_RaceBaseSwarmProduceSwitchHediff</defName>

View File

@@ -7,7 +7,7 @@
<pointWavePools>
<li>
<minPoints>0</minPoints>
<maxPoints>800</maxPoints> <!-- 第一阶段点数上限,点数为人数*100 -->
<maxPoints>800</maxPoints>
<wavePool>ARA_WavePool_Stage1</wavePool>
</li>
</pointWavePools>

View File

@@ -3,7 +3,7 @@
<MemeDef>
<defName>ARA_Hive_Worship</defName>
<label>视虫为神</label>
<description>这些美丽的节肢类动物便是无上意志派来拯救我们的使者。</description>
<description>这些美丽的节肢类动物便是无上意志派来拯救我们的使者。(虫群恐惧已经删除,该文化即将废弃,如果你是开新档请勿选择)</description>
<iconPath>ArachnaeSwarm/UI/Memes/ARA_Hive_Worship</iconPath>
<groupDef>Misc</groupDef>
<impact>2</impact>
@@ -125,10 +125,6 @@
<displayOrderInIssue>20</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<comps>
<li Class="PreceptComp_SituationalThought">
<thought>ARA_CreepyCrawly</thought>
<description>对虫群的恐惧</description>
</li>
</comps>
</PreceptDef>
</Defs>

View File

@@ -23,7 +23,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>3.0</value>
<value>1.5</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>
@@ -43,7 +43,7 @@
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>200</apparelMoney>
<weaponMoney>200</weaponMoney>
<weaponMoney>50000</weaponMoney>
<abilities>
<li>ARA_BaseRace_Acid_Launcher</li>
</abilities>
@@ -62,10 +62,10 @@
<li>ARA_Inner</li>
</apparelTags>
<apparelMoney>150</apparelMoney>
<weaponMoney>400</weaponMoney>
<techHediffsMoney>100</techHediffsMoney>
<weaponMoney>50000</weaponMoney>
<techHediffsMoney>0</techHediffsMoney>
<abilities>
<li>ARA_Hibernate_Ability</li>
<li>ARA_BaseRace_Acid_Launcher</li>
</abilities>
</PawnKindDef>
<!-- 辅虫群单位 -->
@@ -112,7 +112,7 @@
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>400</apparelMoney>
<weaponMoney>600</weaponMoney>
<weaponMoney>1200</weaponMoney>
<techHediffsMoney>0</techHediffsMoney>
</PawnKindDef>
<!-- 自杀辅虫群单位 -->

View File

@@ -38,7 +38,7 @@
<moveSpeedFactorByTerrainTag>
<li>
<key>ARA_Creep</key>
<value>3.0</value>
<value>1.5</value>
</li>
</moveSpeedFactorByTerrainTag>
</PawnKindDef>

View File

@@ -120,6 +120,7 @@
<hediffGiverSets>
<li>OrganicStandard</li>
<li>Human</li>
<li>ARA_NonPlayerHediffSet</li>
</hediffGiverSets>
</race>
<recipes>
@@ -462,7 +463,6 @@
<li>ColonistLost</li>
<li>KnowColonistDied</li>
<li>PsychicDrone</li>
<li>ARA_CreepyCrawly</li>
<li>Naked</li>
<li>AnyBodyPartButGroinCovered_Disapproved_Female</li>
<li>AnyBodyPartButGroinCovered_Disapproved_Male</li>

View File

@@ -20,7 +20,7 @@
<shaderType>CutoutComplex</shaderType>
<drawSize>1</drawSize>
</graphicData>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<uiIconScale>1</uiIconScale>
@@ -138,7 +138,7 @@
<researchPrerequisite>ARA_Technology_2MEL</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -218,7 +218,7 @@
<researchPrerequisite>ARA_Technology_3MEL</researchPrerequisite>
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -311,12 +311,9 @@
<ARA_Carapace>25</ARA_Carapace>
</costList>
<weaponTags Inherit="False">
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<tools Inherit="False">
@@ -412,7 +409,7 @@
<hasStandardCommand>true</hasStandardCommand>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<warmupTime>0.8</warmupTime>
<defaultProjectile>Bullet_ARA_RW_Basic_Fist_Needle_Gun</defaultProjectile>
<defaultProjectile>Bullet_ARA_RW_Toxic_Needle_MG</defaultProjectile>
<range>25.9</range>
<burstShotCount>48</burstShotCount>
<ticksBetweenBurstShots>1</ticksBetweenBurstShots>
@@ -431,7 +428,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -529,7 +526,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -643,7 +640,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Needle</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -759,7 +756,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -862,7 +859,7 @@
<li>ARA_Armed_Organ_T1</li>
<li>ARA_Armed_Organ_Small_Ranged_Acid</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -978,7 +975,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Acid</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1128,7 +1125,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Acid</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1247,7 +1244,7 @@
<li>ARA_Armed_Organ_T3</li>
<li>ARA_Armed_Organ_Small_Ranged_Acid</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1382,7 +1379,7 @@
<li>ARA_Armed_Organ_T3</li>
<li>ARA_Armed_Organ_Huge_Ranged_Acid</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1519,7 +1516,7 @@
<li>ARA_Armed_Organ_T1</li>
<li>ARA_Armed_Organ_Small_Ranged_SP</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1672,7 +1669,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Energy</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1779,7 +1776,7 @@
<li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Energy</li>
</weaponTags>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
<comps>
@@ -1835,9 +1832,9 @@
<label>武装器官"拟线种毒针"</label>
<description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。这根毒针中藏有休眠中的阿拉克涅拟线种虫卵,攻击将感染受害者使其最终成为被拟线虫操控的寄生体。</description>
<weaponTags Inherit="False">
<li>ARA_Armed_Organ</li>
<!-- <li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T1</li>
<li>ARA_Armed_Organ_T1</li> -->
</weaponTags>
<graphicData>
<texPath>ArachnaeSwarm/Weapon/ARA_MW_Bone_Sword</texPath>
@@ -1889,7 +1886,7 @@
<researchPrerequisite Inherit="False" />
<unfinishedThingDef>UnfinishedWeapon</unfinishedThingDef>
</recipeMaker>
<generateCommonality>0</generateCommonality>
<generateCommonality>0.01</generateCommonality>
<tradeability>None</tradeability>
<thingSetMakerTags Inherit="False"/>
</ThingDef>

View File

@@ -19,7 +19,7 @@
<plant>
<fertilityMin>0.05</fertilityMin>
<fertilitySensitivity>0.05</fertilitySensitivity>
<growDays>6</growDays>
<growDays>3</growDays>
<harvestYield>10</harvestYield>
<harvestedThingDef>ARA_CreepFungus</harvestedThingDef>
<sowTags>

View File

@@ -14,7 +14,7 @@
<edgeType>FadeRough</edgeType>
<resourcesFractionWhenDeconstructed>0</resourcesFractionWhenDeconstructed>
<renderPrecedence>330</renderPrecedence>
<pathCost>10</pathCost>
<pathCost>0</pathCost>
<generatedFilth>Filth_Slime</generatedFilth>
<researchPrerequisites>
<li>ARA_Base_Technology</li>

View File

@@ -526,7 +526,7 @@
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>500</fuelCapacity>
<fuelCapacity>100</fuelCapacity>
<fuelLabel>精华素</fuelLabel>
<fuelFilter>
<thingDefs>
@@ -534,10 +534,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.02</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>999</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>0</initialConfigurableTargetFuelLevel>
</li>
<!-- 研究生产组件 -->
<li Class="ArachnaeSwarm.CompProperties_ResearchProducer">
@@ -691,10 +691,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>20</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>0</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -712,10 +712,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>20</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>0</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -801,10 +801,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>20</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>0</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -822,10 +822,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>20</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>0</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -919,10 +919,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>60</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>30</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -940,10 +940,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>60</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>30</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -1032,10 +1032,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>60</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>30</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -1053,10 +1053,10 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>60</initialConfigurableTargetFuelLevel>
<initialConfigurableTargetFuelLevel>30</initialConfigurableTargetFuelLevel>
</li>
</comps>
</ThingDef>
@@ -1142,7 +1142,7 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>110</initialConfigurableTargetFuelLevel>
@@ -1163,7 +1163,7 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>110</initialConfigurableTargetFuelLevel>
@@ -1276,7 +1276,7 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>110</initialConfigurableTargetFuelLevel>
@@ -1297,7 +1297,7 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>110</initialConfigurableTargetFuelLevel>
@@ -1405,7 +1405,7 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>0.2</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>999</initialConfigurableTargetFuelLevel>
@@ -1426,7 +1426,7 @@
</thingDefs>
</fuelFilter>
<fuelConsumptionRate>0</fuelConsumptionRate> <!-- IMPORTANT: Disable base class consumption -->
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<showAllowAutoRefuelToggle>false</showAllowAutoRefuelToggle>
<initialFuelPercent>1</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<initialConfigurableTargetFuelLevel>999</initialConfigurableTargetFuelLevel>

View File

@@ -94,7 +94,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_RefuelingVat">
<fuelProductionPerDay>5</fuelProductionPerDay> <!-- 每天生产20单位燃料 -->
<fuelProductionPerDay>8</fuelProductionPerDay> <!-- 每天生产8单位燃料 -->
<fuelProductionEfficiency>1</fuelProductionEfficiency> <!-- 150%效率 -->
</li>

View File

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

View File

@@ -1,13 +1,33 @@
{
"Version": 1,
"WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"WorkspaceRootPath": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\storyteller\\incidentworker_customraid.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\pawn_comps\\ara_nodeswarmlifetime\\compnodeswarmlifetime.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:pawn_comps\\ara_nodeswarmlifetime\\compnodeswarmlifetime.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\hediffcomp_lifespandisplay.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\hediffcomp_lifespandisplay.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\hediffcomp_temperature.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\hediffcomp_temperature.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffs\\hediffcomp_spawnpawnonremoved.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\hediffcomp_spawnpawnonremoved.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|e:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\hediffgiver\\hediffgiver_nonplayerfaction.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffgiver\\hediffgiver_nonplayerfaction.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\storyteller\\incidentworker_customraid.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:storyteller\\incidentworker_customraid.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\storyteller\\raidwavedef.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\storyteller\\raidwavedef.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:storyteller\\raidwavedef.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
@@ -18,7 +38,7 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 2,
"SelectedChildIndex": 1,
"Children": [
{
"$type": "Bookmark",
@@ -26,29 +46,91 @@
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "RaidWaveDef.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\RaidWaveDef.cs",
"RelativeDocumentMoniker": "Storyteller\\RaidWaveDef.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\RaidWaveDef.cs*",
"RelativeToolTip": "Storyteller\\RaidWaveDef.cs*",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAA9AAAAAAAAAA==",
"DocumentIndex": 0,
"Title": "CompNodeSwarmLifetime.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs",
"RelativeDocumentMoniker": "Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs",
"RelativeToolTip": "Pawn_Comps\\ARA_NodeSwarmLifetime\\CompNodeSwarmLifetime.cs",
"ViewState": "AgIAAPwAAAAAAAAAAAAYwBYBAABIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T09:14:26.956Z",
"WhenOpened": "2025-10-16T15:17:15.994Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "IncidentWorker_CustomRaid.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\IncidentWorker_CustomRaid.cs",
"RelativeDocumentMoniker": "Storyteller\\IncidentWorker_CustomRaid.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\IncidentWorker_CustomRaid.cs*",
"RelativeToolTip": "Storyteller\\IncidentWorker_CustomRaid.cs*",
"ViewState": "AgIAAHgBAAAAAAAAAAA1wJIBAAAfAAAAAAAAAA==",
"DocumentIndex": 2,
"Title": "HediffComp_Temperature.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_Temperature.cs",
"RelativeDocumentMoniker": "Hediffs\\HediffComp_Temperature.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_Temperature.cs",
"RelativeToolTip": "Hediffs\\HediffComp_Temperature.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAYAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T07:14:58.682Z",
"WhenOpened": "2025-10-16T15:13:58.773Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "HediffComp_SpawnPawnOnRemoved.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_SpawnPawnOnRemoved.cs",
"RelativeDocumentMoniker": "Hediffs\\HediffComp_SpawnPawnOnRemoved.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_SpawnPawnOnRemoved.cs",
"RelativeToolTip": "Hediffs\\HediffComp_SpawnPawnOnRemoved.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T15:13:49.858Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "HediffComp_LifespanDisplay.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_LifespanDisplay.cs",
"RelativeDocumentMoniker": "Hediffs\\HediffComp_LifespanDisplay.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_LifespanDisplay.cs",
"RelativeToolTip": "Hediffs\\HediffComp_LifespanDisplay.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAANAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T15:13:38.519Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "HediffGiver_NonPlayerFaction.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\HediffGiver\\HediffGiver_NonPlayerFaction.cs",
"RelativeDocumentMoniker": "HediffGiver\\HediffGiver_NonPlayerFaction.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\HediffGiver\\HediffGiver_NonPlayerFaction.cs",
"RelativeToolTip": "HediffGiver\\HediffGiver_NonPlayerFaction.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAACoAAAAFAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T12:07:58.018Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "RaidWaveDef.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\RaidWaveDef.cs",
"RelativeDocumentMoniker": "Storyteller\\RaidWaveDef.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\RaidWaveDef.cs*",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAA9AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T09:14:26.956Z"
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "IncidentWorker_CustomRaid.cs",
"DocumentMoniker": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\IncidentWorker_CustomRaid.cs",
"RelativeDocumentMoniker": "Storyteller\\IncidentWorker_CustomRaid.cs",
"ToolTip": "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Storyteller\\IncidentWorker_CustomRaid.cs",
"RelativeToolTip": "Storyteller\\IncidentWorker_CustomRaid.cs",
"ViewState": "AgIAAHkBAAAAAAAAAAAUwJIBAAAfAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-16T07:14:58.682Z"
}
]
}

View File

@@ -119,6 +119,8 @@
<Compile Include="EventSystem\EventVariableManager.cs" />
<Compile Include="EventSystem\Letter_EventChoice.cs" />
<Compile Include="EventSystem\QuestNode_Root_EventLetter.cs" />
<Compile Include="HediffGiver\HediffGiver_NonPlayerFaction.cs" />
<Compile Include="Hediffs\HediffComp_LifespanDisplay.cs" />
<Compile Include="Jobs\JobDriver_CarryPrisonerToRefuelingVat.cs" />
<Compile Include="Storyteller\CustomRaidDef.cs" />
<Compile Include="Storyteller\CustomRaidTracker.cs" />

View File

@@ -0,0 +1,44 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class HediffGiver_NonPlayerFaction : HediffGiver
{
// 显式重新定义这些字段,确保 XML 解析器能找到它们
public float mtbDays;
public new HediffDef hediff;
public override void OnIntervalPassed(Pawn pawn, Hediff cause)
{
// 检查派系条件
if (ShouldHaveHediff(pawn))
{
// 给予 hediff
HealthUtility.AdjustSeverity(pawn, this.hediff, 1.0f);
}
else
{
// 移除 hediff
RemoveHediffIfExists(pawn);
}
}
private bool ShouldHaveHediff(Pawn pawn)
{
// 非玩家派系且不是殖民地囚犯
return pawn.Faction != null &&
pawn.Faction != Faction.OfPlayer &&
!pawn.IsPrisonerOfColony;
}
private void RemoveHediffIfExists(Pawn pawn)
{
Hediff existing = pawn.health?.hediffSet?.GetFirstHediffOfDef(this.hediff);
if (existing != null)
{
pawn.health.RemoveHediff(existing);
}
}
}
}

View File

@@ -0,0 +1,44 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
// 新的 HediffComp用于显示寿命信息
public class HediffComp_LifespanDisplay : HediffComp
{
public CompNodeSwarmLifetime LifespanComp => parent.pawn.GetComp<CompNodeSwarmLifetime>();
public override string CompTipStringExtra
{
get
{
if (LifespanComp != null && !LifespanComp.HasShutdownHediff)
{
return $"剩余寿命: {LifespanComp.DaysLeft:F1} 天";
}
return null;
}
}
public override string CompLabelInBracketsExtra
{
get
{
if (LifespanComp != null && !LifespanComp.HasShutdownHediff)
{
return $"{LifespanComp.DaysLeft:F1}d";
}
return null;
}
}
}
// HediffComp 属性类
public class HediffCompProperties_LifespanDisplay : HediffCompProperties
{
public HediffCompProperties_LifespanDisplay()
{
compClass = typeof(HediffComp_LifespanDisplay);
}
}
}

View File

@@ -20,6 +20,10 @@ namespace ArachnaeSwarm
private int lastHediffSyncTick;
private const int HEDIFF_SYNC_INTERVAL = 250; // 每250ticks同步一次
// 新增hediff消失检查相关
private int lastHediffMissingCheckTick = -1;
private const int HEDIFF_MISSING_CHECK_INTERVAL = 60; // 每60ticks检查一次hediff是否存在
public CompProperties_NodeSwarmLifetime Props => (CompProperties_NodeSwarmLifetime)props;
// 修改:将 ticks 转换为天数计算
@@ -60,6 +64,41 @@ namespace ArachnaeSwarm
return pawn.health.hediffSet.HasHediff(Props.immuteHediff);
}
// 新增检查寿命Hediff是否存在
private bool CheckLifespanHediffExists()
{
Pawn pawn = parent as Pawn;
if (pawn == null) return false;
// 直接检查hediff是否存在不使用缓存
return pawn.health.hediffSet.GetFirstHediffOfDef(Props.lifespanHediff) != null;
}
// 新增当hediff消失时执行的处理
private void HandleMissingHediff()
{
Pawn pawn = parent as Pawn;
if (pawn == null) return;
Log.Warning($"Lifespan hediff missing for {pawn.Label}. This should not happen. Forcing death.");
// 立即处死pawn
if (!pawn.Dead)
{
// 可以选择不同的处死方式
if (Props.killWhenDepleted)
{
// 使用原有的处死逻辑
KillPowerProcessor();
}
else
{
// 直接杀死
pawn.Kill(null, null);
}
}
}
// 新增获取或创建寿命Hediff
private Hediff GetOrCreateLifespanHediff()
{
@@ -122,6 +161,24 @@ namespace ArachnaeSwarm
}
}
// 新增将Comp的数据写入Hediff用于调试命令
private void WriteCompDataToHediff()
{
Pawn pawn = parent as Pawn;
if (pawn == null) return;
var hediff = GetOrCreateLifespanHediff();
if (hediff == null)
{
Log.Warning($"Failed to get or create lifespan hediff for {pawn.Label}");
return;
}
// 直接将Comp的数据写入Hediff
hediff.Severity = PercentFull;
Log.Message($"Debug: Wrote comp data to hediff - Severity: {hediff.Severity:P4}, TicksLeft: {powerTicksLeft}");
}
// 新增定期校验Hediff状态
private void ValidateHediffState()
{
@@ -133,10 +190,9 @@ namespace ArachnaeSwarm
if (currentHediff == null)
{
// Hediff消失了重新创建
Log.Message($"Lifespan hediff was missing for {pawn.Label}, recreating with component data");
lifespanHediff = null; // 重置缓存
GetOrCreateLifespanHediff();
// Hediff消失了触发处理逻辑
HandleMissingHediff();
return;
}
else if (currentHediff != lifespanHediff)
{
@@ -164,6 +220,7 @@ namespace ArachnaeSwarm
hasShutdownHediffCached = null;
lastHediffCheckTick = Find.TickManager.TicksGame;
lastHediffSyncTick = Find.TickManager.TicksGame;
lastHediffMissingCheckTick = Find.TickManager.TicksGame;
// 确保寿命Hediff存在
GetOrCreateLifespanHediff();
@@ -197,39 +254,123 @@ namespace ArachnaeSwarm
}
if (DebugSettings.ShowDevGizmos)
{
// 新增:补满寿命调试命令
yield return new Command_Action
{
defaultLabel = "DEV: Power left 0%",
action = delegate
{
powerTicksLeft = 0;
SyncLifespanWithHediff(); // 同步到Hediff
}
};
yield return new Command_Action
{
defaultLabel = "DEV: Power left 100%",
defaultLabel = "DEV: 补满寿命",
action = delegate
{
powerTicksLeft = (int)(Props.lifetimeDays * 60000);
SyncLifespanWithHediff(); // 同步到Hediff
WriteCompDataToHediff(); // 使用新的写入方法
Log.Message($"已补满寿命: {parent.Label} 剩余 {DaysLeft:F1} 天");
Messages.Message($"已补满寿命: {Props.lifetimeDays} 天", MessageTypeDefOf.SilentInput);
}
};
// 新增剩余0.01%寿命调试命令
yield return new Command_Action
{
defaultLabel = "DEV: 剩余0.01%寿命",
action = delegate
{
int totalTicks = (int)(Props.lifetimeDays * 60000);
powerTicksLeft = (int)(totalTicks * 0.0001f); // 0.01%
WriteCompDataToHediff(); // 使用新的写入方法
float daysLeft = (float)powerTicksLeft / 60000f;
Log.Message($"已设置剩余0.01%寿命: {parent.Label} 剩余 {daysLeft:F4} 天 ({PercentFull:P2})");
Messages.Message($"设置剩余寿命为0.01%: {daysLeft:F4} 天", MessageTypeDefOf.SilentInput);
}
};
// 新增:归零寿命调试命令
yield return new Command_Action
{
defaultLabel = "DEV: 归零寿命",
action = delegate
{
powerTicksLeft = 0;
WriteCompDataToHediff(); // 使用新的写入方法
Log.Message($"已归零寿命: {parent.Label} 将立即死亡");
Messages.Message("寿命已归零,即将死亡", MessageTypeDefOf.SilentInput);
// 立即触发死亡逻辑
if (Props.killWhenDepleted)
{
KillPowerProcessor();
}
else
{
depleted = true;
}
}
};
// 新增调试命令显示Hediff状态
yield return new Command_Action
{
defaultLabel = "DEV: Show Hediff Info",
defaultLabel = "DEV: 显示Hediff信息",
action = delegate
{
var hediff = GetOrCreateLifespanHediff();
if (hediff != null)
{
Messages.Message($"Lifespan Hediff: Severity={hediff.Severity:P2}, TicksLeft={powerTicksLeft}", MessageTypeDefOf.SilentInput);
string message = $"寿命Hediff信息:\n" +
$"严重程度: {hediff.Severity:P4}\n" +
$"剩余ticks: {powerTicksLeft}\n" +
$"剩余天数: {DaysLeft:F4}\n" +
$"总天数: {TotalDays:F1}\n" +
$"百分比: {PercentFull:P4}\n" +
$"已耗尽: {depleted}";
Messages.Message(message, MessageTypeDefOf.SilentInput);
Log.Message(message);
}
else
{
Messages.Message("No lifespan hediff found", MessageTypeDefOf.SilentInput);
Messages.Message("未找到寿命hediff", MessageTypeDefOf.SilentInput);
}
}
};
// 新增调试命令手动移除hediff测试hediff消失逻辑
yield return new Command_Action
{
defaultLabel = "DEV: 移除寿命Hediff",
action = delegate
{
Pawn pawn = parent as Pawn;
if (pawn != null)
{
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.lifespanHediff);
if (hediff != null)
{
pawn.health.RemoveHediff(hediff);
lifespanHediff = null;
Log.Message($"已手动移除 {pawn.Label} 的寿命Hediff");
Messages.Message("已手动移除寿命hediffpawn将立即死亡", MessageTypeDefOf.SilentInput);
}
else
{
Messages.Message("没有找到寿命hediff", MessageTypeDefOf.SilentInput);
}
}
}
};
// 新增:强制同步命令(用于测试同步逻辑)
yield return new Command_Action
{
defaultLabel = "DEV: 强制同步",
action = delegate
{
SyncLifespanWithHediff();
var hediff = GetOrCreateLifespanHediff();
if (hediff != null)
{
string message = $"强制同步后:\n" +
$"Comp剩余ticks: {powerTicksLeft}\n" +
$"Hediff严重程度: {hediff.Severity:P4}\n" +
$"剩余天数: {DaysLeft:F4}";
Messages.Message(message, MessageTypeDefOf.SilentInput);
}
}
};
@@ -251,11 +392,17 @@ namespace ArachnaeSwarm
return;
}
// 定期检查hediff是否存在比同步更频繁
if (Find.TickManager.TicksGame > lastHediffMissingCheckTick + HEDIFF_MISSING_CHECK_INTERVAL)
{
ValidateHediffState();
lastHediffMissingCheckTick = Find.TickManager.TicksGame;
}
// 定期同步Hediff状态
if (Find.TickManager.TicksGame > lastHediffSyncTick + HEDIFF_SYNC_INTERVAL)
{
SyncLifespanWithHediff();
ValidateHediffState();
lastHediffSyncTick = Find.TickManager.TicksGame;
}
@@ -283,6 +430,11 @@ namespace ArachnaeSwarm
private void KillPowerProcessor()
{
Pawn pawn = (Pawn)parent;
// 记录日志
Log.Message($"Killing pawn {pawn.Label} due to lifespan depletion");
// 原有的处死逻辑
List<BodyPartRecord> allParts = pawn.def.race.body.AllParts;
for (int i = 0; i < allParts.Count; i++)
{
@@ -311,6 +463,7 @@ namespace ArachnaeSwarm
Scribe_Values.Look(ref powerTicksLeft, "powerTicksLeft", 0);
Scribe_Values.Look(ref depleted, "depleted", defaultValue: false);
Scribe_Values.Look(ref lastHediffSyncTick, "lastHediffSyncTick", 0);
Scribe_Values.Look(ref lastHediffMissingCheckTick, "lastHediffMissingCheckTick", 0);
// 添加:保存时重置缓存
if (Scribe.mode == LoadSaveMode.PostLoadInit)
@@ -326,6 +479,9 @@ namespace ArachnaeSwarm
powerTicksLeft = (int)(Props.lifetimeDays * 60000);
}
// 立即检查hediff是否存在
ValidateHediffState();
// 确保寿命Hediff存在并同步
GetOrCreateLifespanHediff();
SyncLifespanWithHediff();
@@ -333,6 +489,7 @@ namespace ArachnaeSwarm
}
}
// Gizmo 类保持不变
[StaticConstructorOnStartup]
public class NodeSwarmLifetimeGizmo : Gizmo
{