diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
index 7844968..e45e816 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 21a4b40..ee9fb69 100644
--- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
+++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
@@ -83,9 +83,33 @@
ARA_ChitinArmor
+
+
+
+
+ Consciousness
+ 0.5
+
+
+ 0.99
+ 0
+
+ Mood
+ Joy
+ Beauty
+ Comfort
+ Outdoors
+ Indoors
+ DrugDesire
+ RoomSize
+
+
+ ARA_ChitinArmor
+
+
- 1
+ 1.25
0
Mood
@@ -256,7 +280,70 @@
false
+
+
+
+ Consciousness
+ 0.2
+
+
0
+ 0
+
+ Mood
+ Joy
+ Beauty
+ Comfort
+ Outdoors
+ Indoors
+ DrugDesire
+ RoomSize
+
+
+ ARA_ChitinArmor
+
+
+
+
+
+
+ Consciousness
+ 0.5
+
+
+ 0.99
+ 0
+
+ Mood
+ Joy
+ Beauty
+ Comfort
+ Outdoors
+ Indoors
+ DrugDesire
+ RoomSize
+
+
+ ARA_ChitinArmor
+
+
+
+
+ 1.25
+ 0
+
+ Mood
+ Joy
+ Beauty
+ Comfort
+ Outdoors
+ Indoors
+ DrugDesire
+ RoomSize
+
+
+ ARA_ChitinArmor
+
diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo
index d278891..f760c80 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 9d10a24..85b51d3 100644
--- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
+++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
@@ -92,7 +92,7 @@
"RelativeDocumentMoniker": "Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs",
"RelativeToolTip": "Hediffs\\ARA_GestaltNode\\HediffComp_GestaltNode.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAAFAAAAAAAAAA==",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAnAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-02-14T02:36:39.249Z",
"EditorCaption": ""
diff --git a/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs b/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs
index 5e9e979..6b91cb1 100644
--- a/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs
+++ b/Source/ArachnaeSwarm/Hediffs/ARA_GestaltNode/HediffComp_GestaltNode.cs
@@ -34,6 +34,26 @@ namespace ArachnaeSwarm
///
private const int DELAY_TICKS = 60;
+ ///
+ /// 过渡开始时间(ticks)
+ ///
+ private int transitionStartTick = -1;
+
+ ///
+ /// 过渡期持续时间(ticks),5秒
+ ///
+ private const int TRANSITION_DURATION = 300; // 5秒
+
+ ///
+ /// 过渡后的目标严重性
+ ///
+ private float targetSeverityAfterTransition = 1.0f;
+
+ ///
+ /// 是否正在过渡中
+ ///
+ private bool isTransitioning = false;
+
// === 属性 ===
///
@@ -76,6 +96,35 @@ namespace ArachnaeSwarm
}
}
+ ///
+ /// 是否在过渡期中
+ ///
+ public bool IsInTransition
+ {
+ get
+ {
+ if (transitionStartTick < 0)
+ return false;
+
+ return Find.TickManager.TicksGame - transitionStartTick < TRANSITION_DURATION;
+ }
+ }
+
+ ///
+ /// 获取当前过渡进度(0-1)
+ ///
+ public float TransitionProgress
+ {
+ get
+ {
+ if (!IsInTransition || transitionStartTick < 0)
+ return 1.0f;
+
+ int elapsed = Find.TickManager.TicksGame - transitionStartTick;
+ return Mathf.Clamp01((float)elapsed / TRANSITION_DURATION);
+ }
+ }
+
///
/// 获取 GestaltTracker
///
@@ -151,11 +200,14 @@ namespace ArachnaeSwarm
InitializeAfterDelay();
}
+ // 检查过渡状态
+ UpdateTransitionState();
+
// 正常的Tick逻辑
if (NodeType == GestaltNodeType.HiveNode)
{
- // 定期更新严重性
- if (Find.TickManager.TicksGame % 60 == 0) // 每60tick检查一次
+ // 定期更新严重性(如果不在过渡中)
+ if (!IsInTransition && Find.TickManager.TicksGame % 60 == 0) // 每60tick检查一次
{
UpdateSeverityBasedOnConnection();
}
@@ -199,6 +251,74 @@ namespace ArachnaeSwarm
}
}
+ ///
+ /// 更新过渡状态
+ ///
+ private void UpdateTransitionState()
+ {
+ if (!isTransitioning || transitionStartTick < 0)
+ return;
+
+ // 检查是否过渡完成
+ if (!IsInTransition)
+ {
+ // 过渡完成,设置目标严重性
+ if (parent != null && Mathf.Abs(parent.Severity - targetSeverityAfterTransition) > 0.01f)
+ {
+ parent.Severity = targetSeverityAfterTransition;
+
+ // 通知Pawn状态改变
+ var pawn = Pawn;
+ if (pawn?.health != null)
+ {
+ pawn.health.Notify_HediffChanged(parent);
+ }
+
+ Log.Message($"[GestaltNode] {Pawn?.LabelShort} 过渡完成,严重性: {targetSeverityAfterTransition}");
+ }
+
+ // 重置过渡状态
+ transitionStartTick = -1;
+ isTransitioning = false;
+ }
+ else
+ {
+ // 在过渡中,保持中间态严重性1
+ if (parent != null && Mathf.Abs(parent.Severity - 1.0f) > 0.01f)
+ {
+ parent.Severity = 1.0f;
+ }
+ }
+ }
+
+ ///
+ /// 开始过渡
+ ///
+ private void StartTransition(bool isConnecting)
+ {
+ // 设置目标严重性
+ targetSeverityAfterTransition = isConnecting ? 1.5f : 0.5f;
+
+ // 记录过渡开始时间
+ transitionStartTick = Find.TickManager.TicksGame;
+ isTransitioning = true;
+
+ // 立即设置到中间态(严重性1)
+ if (parent != null)
+ {
+ parent.Severity = 1.0f;
+
+ // 通知Pawn状态改变
+ var pawn = Pawn;
+ if (pawn?.health != null)
+ {
+ pawn.health.Notify_HediffChanged(parent);
+ }
+ }
+
+ Log.Message($"[GestaltNode] {Pawn?.LabelShort} 开始过渡,目标: {(isConnecting ? "连接" : "断开")} ({targetSeverityAfterTransition})");
+ }
+
///
/// 根据连接状态更新 Hediff 严重性
///
@@ -215,21 +335,30 @@ namespace ArachnaeSwarm
bool isConnected = IsConnectedToOverlord();
- // 只有连接状态改变时才更新,避免每帧都设置
+ // 检查连接状态是否改变
if (isConnected != wasConnected)
{
- float targetSeverity = isConnected ? 1.5f : 0.5f;
-
- // 平滑过渡到目标严重性
- if (Mathf.Abs(parent.Severity - targetSeverity) > 0.01f)
- {
- parent.Severity = targetSeverity;
- }
+ // 连接状态改变,开始过渡
+ StartTransition(isConnected);
wasConnected = isConnected;
-
- // 如果严重性改变,需要重新计算Pawn的能力
- pawn.health.Notify_HediffChanged(parent);
+ }
+ else
+ {
+ // 连接状态没有改变,但可能不在过渡中,需要确保严重性正确
+ // 如果不在过渡中,直接设置到目标严重性
+ if (!IsInTransition)
+ {
+ float currentTargetSeverity = isConnected ? 1.5f : 0.5f;
+
+ if (Mathf.Abs(parent.Severity - currentTargetSeverity) > 0.01f)
+ {
+ parent.Severity = currentTargetSeverity;
+
+ // 如果严重性改变,需要重新计算Pawn的能力
+ pawn.health.Notify_HediffChanged(parent);
+ }
+ }
}
}
@@ -363,6 +492,9 @@ namespace ArachnaeSwarm
Scribe_Values.Look(ref wasConnected, "wasConnected", false);
Scribe_Values.Look(ref spawnTimestamp, "spawnTimestamp", -1);
Scribe_Values.Look(ref isInitialized, "isInitialized", false);
+ Scribe_Values.Look(ref transitionStartTick, "transitionStartTick", -1);
+ Scribe_Values.Look(ref targetSeverityAfterTransition, "targetSeverityAfterTransition", 1.0f);
+ Scribe_Values.Look(ref isTransitioning, "isTransitioning", false);
// 加载后,如果已经过了延迟期,标记为已初始化
if (Scribe.mode == LoadSaveMode.PostLoadInit && spawnTimestamp >= 0)
@@ -372,6 +504,22 @@ namespace ArachnaeSwarm
{
isInitialized = true;
}
+
+ // 如果正在过渡中,恢复过渡状态
+ if (transitionStartTick >= 0 && isTransitioning)
+ {
+ // 检查过渡是否已经完成
+ if (!IsInTransition)
+ {
+ // 过渡已完成,设置最终严重性
+ if (parent != null)
+ {
+ parent.Severity = targetSeverityAfterTransition;
+ }
+ transitionStartTick = -1;
+ isTransitioning = false;
+ }
+ }
}
}
@@ -384,12 +532,23 @@ namespace ArachnaeSwarm
if (pawn == null)
return "Pawn is null";
+ string transitionInfo = "无";
+ if (IsInTransition)
+ {
+ transitionInfo = $"过渡中,进度: {TransitionProgress:P0},目标: {targetSeverityAfterTransition}";
+ }
+ else if (isTransitioning)
+ {
+ transitionInfo = $"过渡完成,目标: {targetSeverityAfterTransition}";
+ }
+
return $"NodeType: {NodeType}\n" +
$"SpawnTimestamp: {spawnTimestamp}\n" +
$"IsPastSpawnDelay: {IsPastSpawnDelay}\n" +
$"IsInitialized: {isInitialized}\n" +
$"WasConnected: {wasConnected}\n" +
$"IsConnected: {IsConnectedToOverlord()}\n" +
+ $"Transition: {transitionInfo}\n" +
$"CurrentSeverity: {parent?.Severity ?? 0f}";
}
}