diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
index d1be993..9473f9b 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 f6af277..7fde87d 100644
--- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
+++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
@@ -9,6 +9,11 @@
false
false
100
+
+
+ 3200
+
+
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml
index 443c05a..c1cb40f 100644
--- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml
@@ -10,5 +10,16 @@
目标 {0} 没有“ARA_HiveMindDrone”的 hediff。
目标 {0} 已绑定到 {1}。
施法者 {0} 没有“ARA_HiveMindMaster”的 hediff。
+
+
+ 目标必须是类人生物。
+ {0} 已被寄生。
+ 无法寄生 {0} 种族。
+
+
+ 链接至: {0}
+ 未链接至任何女皇种。
+ 控制的虫族:
+ 尚未绑定任何虫族。
\ No newline at end of file
diff --git a/Languages/ChineseSimplified/Keyed/ArachnaeSwarm_Keys.xml b/Languages/ChineseSimplified/Keyed/ArachnaeSwarm_Keys.xml
deleted file mode 100644
index 9a71c32..0000000
--- a/Languages/ChineseSimplified/Keyed/ArachnaeSwarm_Keys.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- 目标必须是类人生物。
- {0} 已被夺舍。
- 无法夺舍 {0} 种族。
-
-
\ No newline at end of file
diff --git a/Source/ArachnaeSwarm/ARA_HiveMind/HediffComp_HiveMindMaster.cs b/Source/ArachnaeSwarm/ARA_HiveMind/HediffComp_HiveMindMaster.cs
new file mode 100644
index 0000000..15b900e
--- /dev/null
+++ b/Source/ArachnaeSwarm/ARA_HiveMind/HediffComp_HiveMindMaster.cs
@@ -0,0 +1,44 @@
+using Verse;
+
+namespace ArachnaeSwarm
+{
+ public class HediffCompProperties_HiveMindMaster : HediffCompProperties
+ {
+ public int scanIntervalTicks = 60; // Default to 1 second
+
+ public HediffCompProperties_HiveMindMaster()
+ {
+ this.compClass = typeof(HediffComp_HiveMindMaster);
+ }
+ }
+
+ public class HediffComp_HiveMindMaster : HediffComp
+ {
+ private Hediff_HiveMindMaster parentHediff;
+
+ private HediffCompProperties_HiveMindMaster Props => (HediffCompProperties_HiveMindMaster)this.props;
+
+ public override void CompPostMake()
+ {
+ base.CompPostMake();
+ parentHediff = (Hediff_HiveMindMaster)this.parent;
+ // Immediately try to bind drones when the hediff is first applied.
+ parentHediff.TryBindAllAvailableDrones();
+ }
+
+ public override void CompPostTick(ref float severityAdjustment)
+ {
+ base.CompPostTick(ref severityAdjustment);
+
+ // Periodically check for new unbound drones based on XML value.
+ if (Find.TickManager.TicksGame % Props.scanIntervalTicks == 0)
+ {
+ if (parentHediff == null)
+ {
+ parentHediff = (Hediff_HiveMindMaster)this.parent;
+ }
+ parentHediff.TryBindAllAvailableDrones();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindDrone.cs b/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindDrone.cs
index 6a141f8..e1ad738 100644
--- a/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindDrone.cs
+++ b/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindDrone.cs
@@ -56,6 +56,17 @@ namespace ArachnaeSwarm
masterHediff?.DeregisterDrone(this.pawn);
}
}
+ public override string TipStringExtra
+ {
+ get
+ {
+ if (this.target is Pawn master && master != null)
+ {
+ return "ARA_TipString_LinkedTo".Translate(master.LabelShortCap);
+ }
+ return "ARA_TipString_NotLinked".Translate();
+ }
+ }
// PostTick logic moved to HediffComp_HiveMindDrone
}
}
\ No newline at end of file
diff --git a/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindMaster.cs b/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindMaster.cs
index 50f49f2..bced785 100644
--- a/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindMaster.cs
+++ b/Source/ArachnaeSwarm/ARA_HiveMind/Hediff_HiveMindMaster.cs
@@ -5,7 +5,7 @@ using Verse;
namespace ArachnaeSwarm
{
- public class Hediff_HiveMindMaster : Hediff
+ public class Hediff_HiveMindMaster : HediffWithComps
{
private List drones = new List();
@@ -13,6 +13,30 @@ namespace ArachnaeSwarm
public override bool ShouldRemove => false;
+ public override string TipStringExtra
+ {
+ get
+ {
+ if (drones.NullOrEmpty())
+ {
+ return "\n" + "ARA_TipString_NoDronesBound".Translate().Colorize(ColoredText.SubtleGrayColor);
+ }
+
+ System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
+ stringBuilder.AppendLine("\n" + "ARA_TipString_ControlledDrones".Translate().Colorize(ColoredText.TipSectionTitleColor));
+ foreach (var drone in drones)
+ {
+ string backstoryInfo = "";
+ if (drone.story?.TitleShort is string adulthoodTitle && !adulthoodTitle.NullOrEmpty())
+ {
+ backstoryInfo = $" ({adulthoodTitle.Colorize(ColoredText.SubtleGrayColor)})";
+ }
+ stringBuilder.AppendLine($" - {drone.LabelShortCap}{backstoryInfo}");
+ }
+ return stringBuilder.ToString();
+ }
+ }
+
public override void ExposeData()
{
base.ExposeData();
@@ -57,6 +81,41 @@ namespace ArachnaeSwarm
return true;
}
+ public void TryBindAllAvailableDrones()
+ {
+ if (this.pawn?.Map == null) return;
+
+ // First, clean up any dead, despawned, or destroyed drones from the list.
+ int removedCount = drones.RemoveAll(drone => drone == null || drone.Dead || drone.Destroyed);
+
+ // Find all pawns on the map that could be potential drones
+ List potentialDrones = this.pawn.Map.mapPawns.AllPawnsSpawned
+ .Where(p => p.health.hediffSet.HasHediff(HediffDef.Named("ARA_HiveMindDrone")))
+ .ToList();
+
+ int boundCount = 0;
+
+ foreach (var drone in potentialDrones)
+ {
+ Hediff_HiveMindDrone droneHediff = drone.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindDrone")) as Hediff_HiveMindDrone;
+
+ // Check if the drone is unlinked (target is null) and not already in our list
+ if (droneHediff != null && droneHediff.target == null && !drones.Contains(drone))
+ {
+ droneHediff.target = this.pawn; // Set the drone's target to this master
+ drones.Add(drone);
+ Log.Message($"[ArachnaeSwarm] Master {this.pawn.LabelShort} automatically bound drone {drone.LabelShort}.");
+ boundCount++;
+ }
+ }
+
+ // Update severity if anything changed (drones were added or removed)
+ if (boundCount > 0 || removedCount > 0)
+ {
+ UpdateSeverity();
+ }
+ }
+
public void DeregisterDrone(Pawn drone)
{
if (drones.Contains(drone))
diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj
index 8b68949..2929c0b 100644
--- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj
+++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj
@@ -80,6 +80,7 @@
+