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 @@ +