diff --git a/OpenRA.Mods.RA/Missions/Allies01Script.cs b/OpenRA.Mods.RA/Missions/Allies01Script.cs index e8957314e2..ed8a5db7f8 100644 --- a/OpenRA.Mods.RA/Missions/Allies01Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies01Script.cs @@ -14,6 +14,8 @@ using System.Drawing; using System.Linq; using OpenRA.FileFormats; using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Air; +using OpenRA.Mods.RA.Move; using OpenRA.Network; using OpenRA.Scripting; using OpenRA.Traits; @@ -134,15 +136,19 @@ namespace OpenRA.Mods.RA.Missions } if (objectives[ExtractEinsteinID].Status == ObjectiveStatus.InProgress) { + if (world.FrameNumber % 25 == 0) + { + SendAttackWave(); + } if (world.FrameNumber >= currentAttackWaveFrameNumber + 600) { Sound.Play("enmyapp1.aud"); - SendAttackWave(AttackWave); + SpawnAttackWave(AttackWave); currentAttackWave++; currentAttackWaveFrameNumber = world.FrameNumber; if (currentAttackWave >= EinsteinChinookAttackWave) { - SendAttackWave(LastAttackWaveAddition); + SpawnAttackWave(LastAttackWaveAddition); } if (currentAttackWave == EinsteinChinookAttackWave) { @@ -188,22 +194,47 @@ namespace OpenRA.Mods.RA.Missions world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies), new LocationInit(extractionLZ.Location) }); } - void SendAttackWave(IEnumerable wave) + void SpawnAttackWave(IEnumerable wave) { foreach (var unit in wave) { var spawnActor = world.SharedRandom.Next(2) == 0 ? attackEntryPoint1 : attackEntryPoint2; var actor = world.CreateActor(unit, new TypeDictionary { new OwnerInit(soviets), new LocationInit(spawnActor.Location) }); + } + } + + void SendAttackWave() + { + foreach (var unit in world.Actors.Where( + a => a != world.WorldActor + && a.IsInWorld + && a.Owner == soviets + && !a.IsDead() + && a.IsIdle + && a.HasTrait() + && a.HasTrait())) + { Activity innerActivity; - if (einstein != null && einstein.IsInWorld) + if (einstein != null) { - innerActivity = new Attack(Target.FromActor(einstein), 3); + if (einstein.IsInWorld) + { + innerActivity = new Attack(Target.FromActor(einstein), 3); + } + else + { + var container = world.UnitContaining(einstein); + if (container != null && !container.HasTrait() && container.HasTrait()) + { + innerActivity = new Attack(Target.FromActor(container), 3); + } + else + { + innerActivity = new Move.Move(extractionLZ.Location, 3); + } + } + unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, innerActivity)); } - else - { - innerActivity = new Move.Move(extractionLZ.Location, 3); - } - actor.QueueActivity(new AttackMove.AttackMoveActivity(actor, innerActivity)); } } diff --git a/OpenRA.Mods.RA/Missions/MissionUtils.cs b/OpenRA.Mods.RA/Missions/MissionUtils.cs index 5d694d8905..bc905cf79b 100644 --- a/OpenRA.Mods.RA/Missions/MissionUtils.cs +++ b/OpenRA.Mods.RA/Missions/MissionUtils.cs @@ -24,13 +24,13 @@ namespace OpenRA.Mods.RA.Missions public static IEnumerable FindAliveCombatantActorsInCircle(this World world, PPos location, int range) { return world.FindUnitsInCircle(location, Game.CellSize * range) - .Where(a => a.IsInWorld && a != world.WorldActor && !a.Destroyed && !a.Owner.NonCombatant); + .Where(a => a.IsInWorld && a != world.WorldActor && !a.IsDead() && !a.Owner.NonCombatant); } public static IEnumerable FindAliveNonCombatantActorsInCircle(this World world, PPos location, int range) { return world.FindUnitsInCircle(location, Game.CellSize * range) - .Where(a => a.IsInWorld && a != world.WorldActor && !a.Destroyed && a.Owner.NonCombatant); + .Where(a => a.IsInWorld && a != world.WorldActor && !a.IsDead() && a.Owner.NonCombatant); } public static Actor ExtractUnitWithChinook(World world, Player owner, Actor unit, CPos entry, CPos lz, CPos exit) @@ -90,5 +90,10 @@ namespace OpenRA.Mods.RA.Missions .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category) .Select(a => a.Trait); } + + public static Actor UnitContaining(this World world, Actor actor) + { + return world.Actors.FirstOrDefault(a => a.HasTrait() && a.Trait().Passengers.Contains(actor)); + } } }