更新更新
This commit is contained in:
@@ -15,6 +15,17 @@ namespace ArachnaeSwarm
|
||||
|
||||
if (masterPawn != null && dronePawn != null)
|
||||
{
|
||||
// 检查目标是否有 ARA_NonPlayer_HiveMindDroneHediff
|
||||
Hediff nonPlayerDroneHediff = dronePawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_NonPlayer_HiveMindDroneHediff"));
|
||||
|
||||
if (nonPlayerDroneHediff != null)
|
||||
{
|
||||
// 处理非玩家派系的无人机
|
||||
HandleNonPlayerDroneConversion(dronePawn, masterPawn);
|
||||
return;
|
||||
}
|
||||
|
||||
// 原有的玩家派系无人机绑定逻辑
|
||||
Hediff_HiveMindMaster masterHediff = masterPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindMaster")) as Hediff_HiveMindMaster;
|
||||
if (masterHediff != null)
|
||||
{
|
||||
@@ -34,6 +45,56 @@ namespace ArachnaeSwarm
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理非玩家派系无人机的转换
|
||||
/// </summary>
|
||||
private void HandleNonPlayerDroneConversion(Pawn dronePawn, Pawn masterPawn)
|
||||
{
|
||||
// 1. 改变阵营
|
||||
if (dronePawn.Faction != masterPawn.Faction)
|
||||
{
|
||||
dronePawn.SetFaction(masterPawn.Faction, masterPawn);
|
||||
Log.Message($"Converted {dronePawn.LabelShort} from {dronePawn.Faction?.Name ?? "null"} to {masterPawn.Faction?.Name}");
|
||||
}
|
||||
|
||||
// 2. 移除 ARA_NonPlayer_HiveMindDroneHediff
|
||||
Hediff nonPlayerHediff = dronePawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_NonPlayer_HiveMindDroneHediff"));
|
||||
if (nonPlayerHediff != null)
|
||||
{
|
||||
dronePawn.health.RemoveHediff(nonPlayerHediff);
|
||||
Log.Message($"Removed ARA_NonPlayer_HiveMindDroneHediff from {dronePawn.LabelShort}");
|
||||
}
|
||||
|
||||
// 3. 添加 ARA_HiveMindDrone
|
||||
HediffDef hiveMindDroneDef = HediffDef.Named("ARA_HiveMindDrone");
|
||||
if (hiveMindDroneDef != null && !dronePawn.health.hediffSet.HasHediff(hiveMindDroneDef))
|
||||
{
|
||||
dronePawn.health.AddHediff(hiveMindDroneDef);
|
||||
Log.Message($"Added ARA_HiveMindDrone to {dronePawn.LabelShort}");
|
||||
}
|
||||
|
||||
// 4. 尝试绑定到主节点
|
||||
Hediff_HiveMindMaster masterHediff = masterPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindMaster")) as Hediff_HiveMindMaster;
|
||||
if (masterHediff != null)
|
||||
{
|
||||
if (masterHediff.TryBindDrone(dronePawn))
|
||||
{
|
||||
Messages.Message("ARA_BindDrone_ConversionSuccess".Translate(dronePawn.LabelShort, masterPawn.LabelShort), MessageTypeDefOf.PositiveEvent, historical: false);
|
||||
Log.Message($"Successfully bound converted drone {dronePawn.LabelShort} to master {masterPawn.LabelShort}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Messages.Message("ARA_BindDrone_ConversionFailure".Translate(dronePawn.LabelShort, masterPawn.LabelShort), MessageTypeDefOf.NegativeEvent, historical: false);
|
||||
Log.Warning($"Failed to bind converted drone {dronePawn.LabelShort} to master {masterPawn.LabelShort}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Messages.Message("ARA_BindDrone_NoMasterForConversion".Translate(masterPawn.LabelShort), MessageTypeDefOf.NegativeEvent, historical: false);
|
||||
Log.Error($"[ArachnaeSwarm] Master {masterPawn.LabelShort} tried to convert a non-player drone but does not have Hediff_HiveMindMaster.");
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Valid(LocalTargetInfo target, bool throwMessages = false)
|
||||
{
|
||||
if (!base.Valid(target, throwMessages))
|
||||
@@ -64,7 +125,16 @@ namespace ArachnaeSwarm
|
||||
return false;
|
||||
}
|
||||
|
||||
// Target must have ARA_HiveMindDrone hediff
|
||||
// 检查目标是否有 ARA_NonPlayer_HiveMindDroneHediff(新增条件)
|
||||
Hediff nonPlayerDroneHediff = dronePawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_NonPlayer_HiveMindDroneHediff"));
|
||||
if (nonPlayerDroneHediff != null)
|
||||
{
|
||||
// 对于非玩家派系无人机,只需要基本检查,不需要绑定状态检查
|
||||
// 所有检查通过
|
||||
return true;
|
||||
}
|
||||
|
||||
// 原有的玩家派系无人机检查逻辑
|
||||
Hediff_HiveMindDrone droneHediff = dronePawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("ARA_HiveMindDrone")) as Hediff_HiveMindDrone;
|
||||
if (droneHediff == null)
|
||||
{
|
||||
@@ -105,4 +175,4 @@ namespace ArachnaeSwarm
|
||||
return Valid(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +74,9 @@ namespace ArachnaeSwarm
|
||||
return false;
|
||||
}
|
||||
|
||||
// 新增:强制赋予主节点的文化给无人机
|
||||
ForceMasterCultureToDrone(drone);
|
||||
|
||||
droneHediff.target = this.pawn; // Set the drone's target to this master
|
||||
drones.Add(drone);
|
||||
UpdateSeverity();
|
||||
@@ -81,6 +84,84 @@ namespace ArachnaeSwarm
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 强制将主节点的文化赋予无人机
|
||||
/// </summary>
|
||||
private void ForceMasterCultureToDrone(Pawn drone)
|
||||
{
|
||||
// 检查是否有意识形态系统(Ideology DLC)
|
||||
if (ModsConfig.IdeologyActive)
|
||||
{
|
||||
// 获取主节点的意识形态
|
||||
Ideo masterIdeo = this.pawn.Ideo;
|
||||
|
||||
if (masterIdeo != null)
|
||||
{
|
||||
// 设置无人机的意识形态为主节点的意识形态
|
||||
if (drone.Ideo != masterIdeo)
|
||||
{
|
||||
drone.ideo.SetIdeo(masterIdeo);
|
||||
Log.Message($"[ArachnaeSwarm] Set drone {drone.LabelShort} ideology to master's ideology: {masterIdeo.name}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning($"[ArachnaeSwarm] Master {this.pawn.LabelShort} has no ideology to assign to drone {drone.LabelShort}");
|
||||
}
|
||||
|
||||
// 强制同步文化相关记忆和状态
|
||||
SyncCulturalMemories(drone);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Message($"[ArachnaeSwarm] Ideology DLC not active, skipping cultural assignment for drone {drone.LabelShort}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步文化相关记忆和状态
|
||||
/// </summary>
|
||||
private void SyncCulturalMemories(Pawn drone)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 清除可能存在的文化冲突记忆
|
||||
if (drone.needs?.mood != null)
|
||||
{
|
||||
// 移除与文化转换相关的负面想法
|
||||
var thoughtsToRemove = drone.needs.mood.thoughts.memories.Memories
|
||||
.Where(thought => thought.def.defName.Contains("Cultural") ||
|
||||
thought.def.defName.Contains("Ideo") ||
|
||||
thought.def.defName.Contains("Convert"))
|
||||
.ToList();
|
||||
|
||||
foreach (var thought in thoughtsToRemove)
|
||||
{
|
||||
drone.needs.mood.thoughts.memories.RemoveMemory(thought);
|
||||
}
|
||||
|
||||
if (thoughtsToRemove.Count > 0)
|
||||
{
|
||||
Log.Message($"[ArachnaeSwarm] Removed {thoughtsToRemove.Count} cultural conflict thoughts from drone {drone.LabelShort}");
|
||||
}
|
||||
|
||||
// 添加蜂群文化适应的正面想法
|
||||
ThoughtDef culturalHarmonyThought = DefDatabase<ThoughtDef>.GetNamedSilentFail("ARA_CulturalHarmony");
|
||||
if (culturalHarmonyThought != null)
|
||||
{
|
||||
drone.needs.mood.thoughts.memories.TryGainMemory(culturalHarmonyThought);
|
||||
}
|
||||
}
|
||||
|
||||
// 同步服装和文化偏好
|
||||
Log.Message($"[ArachnaeSwarm] Successfully synchronized cultural memories for drone {drone.LabelShort}");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Log.Error($"[ArachnaeSwarm] Error synchronizing cultural memories for drone {drone.LabelShort}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public void TryBindAllAvailableDrones()
|
||||
{
|
||||
if (this.pawn?.Map == null) return;
|
||||
@@ -102,6 +183,9 @@ namespace ArachnaeSwarm
|
||||
// Check if the drone is unlinked (target is null) and not already in our list
|
||||
if (droneHediff != null && droneHediff.target == null && !drones.Contains(drone))
|
||||
{
|
||||
// 新增:在自动绑定时也强制赋予文化
|
||||
ForceMasterCultureToDrone(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}.");
|
||||
@@ -144,4 +228,4 @@ namespace ArachnaeSwarm
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user