diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 75455d8a..e204c939 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.pdb b/1.6/1.6/Assemblies/WulaFallenEmpire.pdb
index 57582f75..206026ca 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.pdb and b/1.6/1.6/Assemblies/WulaFallenEmpire.pdb differ
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Keyed.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Keyed.xml
index 521d8cb6..155b58c7 100644
--- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Keyed.xml
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Keyed.xml
@@ -174,8 +174,8 @@
- P.I.A 轨道监视已启动
- P.I.A 已经接管了轨道防御系统,正在持续扫描敌对目标。\n\n如果有敌人出现且无误伤风险,AI 将自动进行打击。\n\n剩余时间:{0} 秒
+ P.I.A 正在接管轨道防御!
+ P.I.A 已经接管了轨道防御系统,正在持续扫描敌对目标。\n\n如果有敌人出现且无误伤风险,轨道舰队将自动进行打击。\n\n剩余时间:{0} 秒
P.I.A 轨道监视协议已处于激活状态(剩余 {0} 秒)。请求被忽略。
P.I.A 轨道监视协议:已启动,持续 {0} 秒。
P.I.A 轨道监视协议:已解除。
diff --git a/Source/WulaFallenEmpire/EventSystem/AI/MapComponent_AIOverwatch.cs b/Source/WulaFallenEmpire/EventSystem/AI/MapComponent_AIOverwatch.cs
index ed9a77f6..349377e9 100644
--- a/Source/WulaFallenEmpire/EventSystem/AI/MapComponent_AIOverwatch.cs
+++ b/Source/WulaFallenEmpire/EventSystem/AI/MapComponent_AIOverwatch.cs
@@ -63,29 +63,31 @@ namespace WulaFallenEmpire.EventSystem.AI
{
try
{
- // Find the FlyOver spawner component and trigger it
var flyOverDef = DefDatabase.GetNamedSilentFail("WULA_AircraftCarrier");
- if (flyOverDef != null)
- {
- // Use the FlyOver spawning system
- var flyOver = ThingMaker.MakeThing(flyOverDef) as FlyOver;
- if (flyOver != null)
- {
- // Configure the flyover
- flyOver.flightSpeed = 0.03f;
- flyOver.altitude = 20;
-
- // Spawn at map edge
- IntVec3 spawnPos = CellFinder.RandomEdgeCell(map);
- GenSpawn.Spawn(flyOver, spawnPos, map);
-
- Messages.Message("WULA_AIOverwatch_FleetCalled".Translate(), MessageTypeDefOf.PositiveEvent);
- WulaLog.Debug("[AI Overwatch] Called fleet: WULA_AircraftCarrier spawned.");
- }
- }
- else
+ if (flyOverDef == null)
{
WulaLog.Debug("[AI Overwatch] Could not find WULA_AircraftCarrier ThingDef.");
+ return;
+ }
+
+ // Calculate proper start and end positions (edge to opposite edge)
+ IntVec3 startPos = GetRandomMapEdgePosition(map);
+ IntVec3 endPos = GetOppositeMapEdgePosition(map, startPos);
+
+ // Use the proper FlyOver.MakeFlyOver static method
+ FlyOver flyOver = FlyOver.MakeFlyOver(
+ flyOverDef,
+ startPos,
+ endPos,
+ map,
+ speed: 0.03f,
+ height: 20f
+ );
+
+ if (flyOver != null)
+ {
+ Messages.Message("WULA_AIOverwatch_FleetCalled".Translate(), MessageTypeDefOf.PositiveEvent);
+ WulaLog.Debug($"[AI Overwatch] Called fleet: WULA_AircraftCarrier spawned from {startPos} to {endPos}.");
}
}
catch (Exception ex)
@@ -94,27 +96,74 @@ namespace WulaFallenEmpire.EventSystem.AI
}
}
+ private IntVec3 GetRandomMapEdgePosition(Map map)
+ {
+ int edge = Rand.Range(0, 4);
+ int x, z;
+
+ switch (edge)
+ {
+ case 0: // Bottom
+ x = Rand.Range(5, map.Size.x - 5);
+ z = 0;
+ break;
+ case 1: // Right
+ x = map.Size.x - 1;
+ z = Rand.Range(5, map.Size.z - 5);
+ break;
+ case 2: // Top
+ x = Rand.Range(5, map.Size.x - 5);
+ z = map.Size.z - 1;
+ break;
+ case 3: // Left
+ default:
+ x = 0;
+ z = Rand.Range(5, map.Size.z - 5);
+ break;
+ }
+
+ return new IntVec3(x, 0, z);
+ }
+
+ private IntVec3 GetOppositeMapEdgePosition(Map map, IntVec3 startPos)
+ {
+ // Calculate direction from start to center, then extend to opposite edge
+ IntVec3 center = map.Center;
+ Vector3 toCenter = (center.ToVector3() - startPos.ToVector3()).normalized;
+
+ // Extend to the opposite edge
+ float maxDistance = Mathf.Max(map.Size.x, map.Size.z) * 1.5f;
+ Vector3 endVec = startPos.ToVector3() + toCenter * maxDistance;
+
+ // Clamp to map bounds
+ int endX = Mathf.Clamp((int)endVec.x, 0, map.Size.x - 1);
+ int endZ = Mathf.Clamp((int)endVec.z, 0, map.Size.z - 1);
+
+ return new IntVec3(endX, 0, endZ);
+ }
+
private void TryClearFlightPath()
{
try
{
- // Find all FlyOver entities on the map and destroy them
+ // Find all FlyOver entities on the map and use EmergencyDestroy for smooth exit
var flyOvers = map.listerThings.AllThings
- .Where(t => t is FlyOver || t.def.defName.Contains("FlyOver") || t.def.defName.Contains("AircraftCarrier"))
+ .Where(t => t is FlyOver)
+ .Cast()
.ToList();
foreach (var flyOver in flyOvers)
{
if (!flyOver.Destroyed)
{
- flyOver.Destroy(DestroyMode.Vanish);
+ flyOver.EmergencyDestroy(); // Use smooth accelerated exit instead of instant destroy
}
}
if (flyOvers.Count > 0)
{
Messages.Message("WULA_AIOverwatch_FleetCleared".Translate(), MessageTypeDefOf.NeutralEvent);
- WulaLog.Debug($"[AI Overwatch] Cleared flight path: Destroyed {flyOvers.Count} entities.");
+ WulaLog.Debug($"[AI Overwatch] Cleared flight path: {flyOvers.Count} entities set to emergency exit.");
}
}
catch (Exception ex)