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)