自动绑定

This commit is contained in:
2025-09-06 13:52:16 +08:00
parent 3983c53e72
commit aabe7e9541
8 changed files with 132 additions and 10 deletions

View File

@@ -5,7 +5,7 @@ using Verse;
namespace ArachnaeSwarm
{
public class Hediff_HiveMindMaster : Hediff
public class Hediff_HiveMindMaster : HediffWithComps
{
private List<Pawn> drones = new List<Pawn>();
@@ -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<Pawn> 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))