更新更新

This commit is contained in:
Tourswen
2025-10-21 01:33:29 +08:00
parent a49b9cb554
commit 2314b7bca7
37 changed files with 990 additions and 439 deletions

View File

@@ -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);
}
}
}
}

View File

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