diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 794c7c9..c65fc0c 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml index 50c6bb8..1652ecb 100644 --- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml +++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml @@ -188,7 +188,23 @@ - + + + + ARA_LifespanHediff + Hediff_High + (0.6, 0.8, 0.9) + 0.01 + 0 + + 阿拉克涅虫族记录寿命的hediff,正常情况下你不应该看见这个。 + +
  • + 0 + false +
  • +
    +
    ARA_TemperatureRegulation diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml index bf7f4da..4e4dd10 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml @@ -504,8 +504,8 @@ 2 50 - 150 - 100 + 60 + 30 0.85 1.5 @@ -759,8 +759,6 @@ 1 100 - 70 - 10 0.5 @@ -809,6 +807,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 120 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -916,8 +915,6 @@ 1 100 - 50 - 80 0.75 @@ -970,6 +967,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 60 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -1039,8 +1037,6 @@ 3 100 - 40 - 10 0.75 @@ -1092,6 +1088,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 60 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -1166,8 +1163,6 @@ 2 100 - 60 - 30 1.25 1.25 @@ -1207,6 +1202,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 60 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -1313,8 +1309,6 @@ 5 5 100 - 20 - 5 1.5 2.5 @@ -1379,8 +1373,6 @@ 100 - 150 - 150 0.5 @@ -1431,6 +1423,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 120 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -1512,8 +1505,6 @@ 100 - 160 - 30 1.5 @@ -1560,6 +1551,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 60 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -1719,8 +1711,6 @@ 100 - 160 - 30 0.75 @@ -1913,8 +1903,6 @@ 2 100 - 80 - 40 1.5 1.5 @@ -1940,6 +1928,7 @@
  • ARA_Cycle_Suppression_Hediff + ARA_LifespanHediff 180 寿命 阿拉克涅的督虫们生命如精密的发条般运转着。 @@ -2028,8 +2017,6 @@ 3 100 - 40 - 10 0.75 diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo index 0556729..8139c83 100644 Binary files a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo and b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo differ diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json index 7514925..a9a7db9 100644 --- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json +++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json @@ -7,11 +7,11 @@ "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thing_comps\\ara_compextraincubationinfo\\compextraincubationinfo.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\\thing_comps\\ara_compextraincubationinfo\\compproperties_extraincubationinfo.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\\thing_comps\\ara_compextraincubationinfo\\compproperties_extraincubationinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thing_comps\\ara_compextraincubationinfo\\compproperties_extraincubationinfo.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\\building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" } ], @@ -38,8 +38,7 @@ "RelativeToolTip": "Thing_Comps\\ARA_CompExtraIncubationInfo\\CompProperties_ExtraIncubationInfo.cs", "ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAAAAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-13T03:27:00.382Z", - "EditorCaption": "" + "WhenOpened": "2025-10-13T03:27:00.382Z" }, { "$type": "Document", @@ -64,8 +63,7 @@ "RelativeToolTip": "Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs", "ViewState": "AgIAAA4AAAAAAAAAAAAAwD0AAAAhAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-10-12T15:30:31.391Z", - "EditorCaption": "" + "WhenOpened": "2025-10-12T15:30:31.391Z" } ] } diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs index 4436cf0..541cdc5 100644 --- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs @@ -7,6 +7,8 @@ namespace ArachnaeSwarm { public class CompHediffGiver : ThingComp { + private bool hediffsApplied = false; // 新增:标记是否已经应用过hediff + public CompProperties_HediffGiver Props => (CompProperties_HediffGiver)this.props; public override void PostSpawnSetup(bool respawningAfterLoad) @@ -16,7 +18,12 @@ namespace ArachnaeSwarm // 只有当thing是pawn时才添加hediff if (this.parent is Pawn pawn) { - AddHediffsToPawn(pawn); + // 新增:检查是否已经应用过hediff,或者是否是读档 + if (!hediffsApplied && !respawningAfterLoad) + { + AddHediffsToPawn(pawn); + hediffsApplied = true; // 标记为已应用 + } } } @@ -41,5 +48,23 @@ namespace ArachnaeSwarm pawn.health.AddHediff(hediffDef); } } + + // 新增:序列化hediffsApplied标记 + public override void PostExposeData() + { + base.PostExposeData(); + Scribe_Values.Look(ref hediffsApplied, "hediffsApplied", false); + } + + // 新增:调试方法,用于手动触发hediff添加(仅开发模式) + public void DebugApplyHediffs() + { + if (this.parent is Pawn pawn && !hediffsApplied) + { + AddHediffsToPawn(pawn); + hediffsApplied = true; + Log.Message($"Debug: Applied hediffs to {pawn.Label}"); + } + } } -} \ No newline at end of file +} diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs index 470c230..3cee652 100644 --- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs @@ -20,4 +20,4 @@ namespace ArachnaeSwarm this.compClass = typeof(CompHediffGiver); } } -} \ No newline at end of file +} diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs index d777355..0e75510 100644 --- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs @@ -1,5 +1,3 @@ -// Assembly-CSharp, Version=1.6.9371.18214, Culture=neutral, PublicKeyToken=null -// RimWorld.CompNodeSwarmLifetime using RimWorld; using System.Collections.Generic; using UnityEngine; @@ -10,14 +8,17 @@ namespace ArachnaeSwarm public class CompNodeSwarmLifetime : ThingComp { private int powerTicksLeft; - public bool depleted; - private NodeSwarmLifetimeGizmo gizmo; // 添加:检查是否有特定 Hediff 的缓存字段 private bool? hasShutdownHediffCached; private int lastHediffCheckTick; + + // 新增:寿命Hediff相关字段 + private Hediff lifespanHediff; + private int lastHediffSyncTick; + private const int HEDIFF_SYNC_INTERVAL = 250; // 每250ticks同步一次 public CompProperties_NodeSwarmLifetime Props => (CompProperties_NodeSwarmLifetime)props; @@ -59,6 +60,91 @@ namespace ArachnaeSwarm return pawn.health.hediffSet.HasHediff(Props.immuteHediff); } + // 新增:获取或创建寿命Hediff + private Hediff GetOrCreateLifespanHediff() + { + Pawn pawn = parent as Pawn; + if (pawn == null) return null; + + // 首先尝试查找现有的寿命Hediff + if (lifespanHediff == null || lifespanHediff.pawn != pawn) + { + lifespanHediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.lifespanHediff); + } + + // 如果不存在,创建新的寿命Hediff + if (lifespanHediff == null) + { + lifespanHediff = pawn.health.AddHediff(Props.lifespanHediff); + if (lifespanHediff != null) + { + // 初始化Hediff的严重程度为当前剩余寿命比例 + lifespanHediff.Severity = PercentFull; + Log.Message($"Created lifespan hediff for {pawn.Label} with severity {lifespanHediff.Severity:P2}"); + } + } + + return lifespanHediff; + } + + // 新增:同步组件和Hediff的寿命数据 + private void SyncLifespanWithHediff() + { + 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; + } + + // 获取Hediff中的寿命数据 + float hediffSeverity = hediff.Severity; + int hediffTicksLeft = (int)(hediffSeverity * Props.lifetimeDays * 60000); + + // 比较组件和Hediff的数据 + if (hediffTicksLeft != powerTicksLeft) + { + // 以Hediff的数据为准 + if (Mathf.Abs(hediffTicksLeft - powerTicksLeft) > 1000) // 只在校正值较大时记录 + { + Log.Message($"Lifespan sync: Component had {powerTicksLeft}, Hediff had {hediffTicksLeft}. Using Hediff value."); + } + powerTicksLeft = hediffTicksLeft; + } + + // 更新Hediff的严重程度(确保是最新的) + if (Mathf.Abs(hediff.Severity - PercentFull) > 0.001f) + { + hediff.Severity = PercentFull; + } + } + + // 新增:定期校验Hediff状态 + private void ValidateHediffState() + { + Pawn pawn = parent as Pawn; + if (pawn == null) return; + + // 检查寿命Hediff是否存在 + var currentHediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.lifespanHediff); + + if (currentHediff == null) + { + // Hediff消失了,重新创建 + Log.Message($"Lifespan hediff was missing for {pawn.Label}, recreating with component data"); + lifespanHediff = null; // 重置缓存 + GetOrCreateLifespanHediff(); + } + else if (currentHediff != lifespanHediff) + { + // Hediff引用发生变化,更新缓存 + lifespanHediff = currentHediff; + } + } + public override void PostSpawnSetup(bool respawningAfterLoad) { if (!ModLister.CheckBiotechOrAnomalyOrOdyssey("Node swarm lifetime")) @@ -67,6 +153,7 @@ namespace ArachnaeSwarm return; } base.PostSpawnSetup(respawningAfterLoad); + if (!respawningAfterLoad && !parent.BeingTransportedOnGravship) { // 修改:使用天数转换为 ticks @@ -76,6 +163,13 @@ namespace ArachnaeSwarm // 初始化 Hediff 检查缓存 hasShutdownHediffCached = null; lastHediffCheckTick = Find.TickManager.TicksGame; + lastHediffSyncTick = Find.TickManager.TicksGame; + + // 确保寿命Hediff存在 + GetOrCreateLifespanHediff(); + + // 初始同步 + SyncLifespanWithHediff(); } public override IEnumerable CompGetGizmosExtra() @@ -109,6 +203,7 @@ namespace ArachnaeSwarm action = delegate { powerTicksLeft = 0; + SyncLifespanWithHediff(); // 同步到Hediff } }; yield return new Command_Action @@ -117,6 +212,25 @@ namespace ArachnaeSwarm action = delegate { powerTicksLeft = (int)(Props.lifetimeDays * 60000); + SyncLifespanWithHediff(); // 同步到Hediff + } + }; + + // 新增:调试命令显示Hediff状态 + yield return new Command_Action + { + defaultLabel = "DEV: Show Hediff Info", + action = delegate + { + var hediff = GetOrCreateLifespanHediff(); + if (hediff != null) + { + Messages.Message($"Lifespan Hediff: Severity={hediff.Severity:P2}, TicksLeft={powerTicksLeft}", MessageTypeDefOf.SilentInput); + } + else + { + Messages.Message("No lifespan hediff found", MessageTypeDefOf.SilentInput); + } } }; } @@ -136,7 +250,24 @@ namespace ArachnaeSwarm { return; } + + // 定期同步Hediff状态 + if (Find.TickManager.TicksGame > lastHediffSyncTick + HEDIFF_SYNC_INTERVAL) + { + SyncLifespanWithHediff(); + ValidateHediffState(); + lastHediffSyncTick = Find.TickManager.TicksGame; + } + powerTicksLeft--; + + // 更新Hediff严重程度 + var hediff = GetOrCreateLifespanHediff(); + if (hediff != null) + { + hediff.Severity = PercentFull; + } + if (powerTicksLeft <= 0) { if (Props.killWhenDepleted) @@ -165,6 +296,13 @@ namespace ArachnaeSwarm { pawn.Kill(null, null); } + + // 移除寿命Hediff + if (lifespanHediff != null) + { + pawn.health.RemoveHediff(lifespanHediff); + lifespanHediff = null; + } } public override void PostExposeData() @@ -172,12 +310,14 @@ namespace ArachnaeSwarm base.PostExposeData(); Scribe_Values.Look(ref powerTicksLeft, "powerTicksLeft", 0); Scribe_Values.Look(ref depleted, "depleted", defaultValue: false); + Scribe_Values.Look(ref lastHediffSyncTick, "lastHediffSyncTick", 0); // 添加:保存时重置缓存 if (Scribe.mode == LoadSaveMode.PostLoadInit) { hasShutdownHediffCached = null; lastHediffCheckTick = Find.TickManager.TicksGame; + lifespanHediff = null; // 重置Hediff缓存,下次需要时重新获取 // 添加:额外的安全检查 // 如果读档后 powerTicksLeft 异常,重置为满值 @@ -185,6 +325,10 @@ namespace ArachnaeSwarm { powerTicksLeft = (int)(Props.lifetimeDays * 60000); } + + // 确保寿命Hediff存在并同步 + GetOrCreateLifespanHediff(); + SyncLifespanWithHediff(); } } } diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs index 9660ae9..a5c0a0e 100644 --- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs +++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs @@ -1,6 +1,3 @@ -// Assembly-CSharp, Version=1.6.9371.18214, Culture=neutral, PublicKeyToken=null -// RimWorld.CompProperties_NodeSwarmLifetime -using ArachnaeSwarm; using RimWorld; using Verse; @@ -8,16 +5,19 @@ namespace ArachnaeSwarm { public class CompProperties_NodeSwarmLifetime : CompProperties { - // ޸ģʹ ticks + // 修改:使用天数而不是 ticks public float lifetimeDays = 10f; - //ʱɱ + //结束计时后杀死 public bool killWhenDepleted = true; - //رϵͳhediff + //关闭系统的hediff public HediffDef immuteHediff; - //ǷڷҿƵpawnʾؿؼ + //是否在非玩家控制的pawn身上显示相关控件 public bool showGizmoOnNonPlayerControlled; + // 新增:用于记录寿命的隐藏Hediff + public HediffDef lifespanHediff; + [MustTranslate] public string labelOverride; @@ -29,4 +29,4 @@ namespace ArachnaeSwarm compClass = typeof(CompNodeSwarmLifetime); } } -} \ No newline at end of file +}