From 03121ed8261483c2945a4dc329ea53de92d5b278 Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Fri, 2 Nov 2012 23:49:37 +1300 Subject: [PATCH] Add yak strafing, support for SP as well as MP, additional Soviet spawn point --- OpenRA.Mods.RA/Missions/Allies02Script.cs | 2 +- OpenRA.Mods.RA/Missions/Allies03Script.cs | 91 +++++++++++++++++------ mods/ra/maps/allies-03/map.yaml | 25 ++----- 3 files changed, 76 insertions(+), 42 deletions(-) diff --git a/OpenRA.Mods.RA/Missions/Allies02Script.cs b/OpenRA.Mods.RA/Missions/Allies02Script.cs index 0f46b7eafb..7d7a056b96 100644 --- a/OpenRA.Mods.RA/Missions/Allies02Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies02Script.cs @@ -320,7 +320,7 @@ namespace OpenRA.Mods.RA.Missions new LocationInit(yakEntryPoint.Location), new OwnerInit(soviets), new FacingInit(Util.GetFacing(yakAttackPoint.Location - yakEntryPoint.Location, 0)), - new AltitudeInit(Rules.Info[YakName].Traits.Get().CruiseAltitude), + new AltitudeInit(Rules.Info[YakName].Traits.Get().CruiseAltitude) }); } if (yak.Trait().HasAmmo()) diff --git a/OpenRA.Mods.RA/Missions/Allies03Script.cs b/OpenRA.Mods.RA/Missions/Allies03Script.cs index 577156c317..95612cfd09 100644 --- a/OpenRA.Mods.RA/Missions/Allies03Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies03Script.cs @@ -64,18 +64,22 @@ namespace OpenRA.Mods.RA.Missions Actor sovietEntryPoint2; Actor sovietEntryPoint3; Actor sovietEntryPoint4; + Actor sovietEntryPoint5; CPos[] sovietEntryPoints; Actor sovietRallyPoint1; Actor sovietRallyPoint2; Actor sovietRallyPoint3; Actor sovietRallyPoint4; + Actor sovietRallyPoint5; CPos[] sovietRallyPoints; - static readonly string[] SovietVehicles = { "3tnk", "3tnk", "3tnk", "v2rl", "ftrk", "apc" }; - static readonly string[] SovietInfantry = { "e1", "e1", "e1", "e1", "e2", "e2", "e3", "e3", "e4", "e4" }; + static readonly string[] SovietVehicles = { "3tnk", "3tnk", "3tnk", "3tnk", "v2rl", "v2rl", "ftrk", "apc" }; + static readonly string[] SovietInfantry = { "e1", "e1", "e1", "e2", "e2", "e3", "e4" }; - int attackAtFrame = 250; - int attackAtFrameIncrement = 250; + const int YakTicks = 1750; + + int attackAtFrame = 300; + int attackAtFrameIncrement = 300; Actor allies1EntryPoint; Actor allies1MovePoint; @@ -84,6 +88,7 @@ namespace OpenRA.Mods.RA.Missions Actor allies2MovePoint; const string McvName = "mcv"; + const string YakName = "yak"; void MissionFailed(string text) { @@ -129,8 +134,14 @@ namespace OpenRA.Mods.RA.Missions SpawnSovietUnits(); attackAtFrame += attackAtFrameIncrement; attackAtFrameIncrement = Math.Max(attackAtFrameIncrement - 5, 100); - Game.Debug(attackAtFrame.ToString()); - Game.Debug(attackAtFrameIncrement.ToString()); + } + if (world.FrameNumber % YakTicks == 1) + { + AirStrafe(YakName); + if (world.SharedRandom.Next(3) == 2) + { + AirStrafe(YakName); + } } ManageSovietUnits(); EvacuateAlliedUnits(exit1TopLeft.CenterLocation, exit1BottomRight.CenterLocation, exit1ExitPoint.Location); @@ -141,6 +152,34 @@ namespace OpenRA.Mods.RA.Missions } } + void AirStrafe(string actor) + { + var spawnPoint = world.ChooseRandomEdgeCell(); + var aircraft = world.CreateActor(actor, new TypeDictionary + { + new LocationInit(spawnPoint), + new OwnerInit(soviets), + new AltitudeInit(Rules.Info[actor].Traits.Get().CruiseAltitude) + }); + AirStrafe(aircraft); + } + + void AirStrafe(Actor aircraft) + { + var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == allies1 || u.Owner == allies2) && ((u.HasTrait() && !u.HasTrait()) || u.HasTrait())); + var targetEnemy = enemies.OrderBy(u => (aircraft.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault(); + if (targetEnemy != null && aircraft.Trait().HasAmmo()) + { + aircraft.QueueActivity(new FlyAttack(Target.FromActor(targetEnemy))); + aircraft.QueueActivity(new CallFunc(() => AirStrafe(aircraft))); + } + else + { + aircraft.QueueActivity(new FlyOffMap()); + aircraft.QueueActivity(new RemoveSelf()); + } + } + void SpawnSovietUnits() { var route = world.SharedRandom.Next(sovietEntryPoints.Length); @@ -155,12 +194,11 @@ namespace OpenRA.Mods.RA.Missions var units = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.IsIdle && u.HasTrait() && u.Owner == soviets); foreach (var unit in units) { - var enemyUnits = world.FindAliveCombatantActorsInCircle(unit.CenterLocation, 100) - .Where(u => (u.Owner == allies1 || u.Owner == allies2) && ((u.HasTrait() && !u.HasTrait()) || u.HasTrait())); - var targetEnemyUnit = enemyUnits.OrderBy(u => (unit.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault(); - if (targetEnemyUnit != null) + var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == allies1 || u.Owner == allies2) && ((u.HasTrait() && !u.HasTrait()) || u.HasTrait())); + var targetEnemy = enemies.OrderBy(u => (unit.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault(); + if (targetEnemy != null) { - unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(targetEnemyUnit.Location, 5))); + unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Attack(Target.FromActor(targetEnemy), 3))); } } } @@ -174,13 +212,16 @@ namespace OpenRA.Mods.RA.Missions new FacingInit(Util.GetFacing(allies1MovePoint.Location - allies1EntryPoint.Location, 0)) }); unit.QueueActivity(new Move.Move(allies1MovePoint.Location)); - unit = world.CreateActor(McvName, new TypeDictionary - { - new LocationInit(allies2EntryPoint.Location), - new OwnerInit(allies2), - new FacingInit(Util.GetFacing(allies2MovePoint.Location - allies2EntryPoint.Location, 0)) - }); - unit.QueueActivity(new Move.Move(allies2MovePoint.Location)); + if (allies2 != allies1) + { + unit = world.CreateActor(McvName, new TypeDictionary + { + new LocationInit(allies2EntryPoint.Location), + new OwnerInit(allies2), + new FacingInit(Util.GetFacing(allies2MovePoint.Location - allies2EntryPoint.Location, 0)) + }); + unit.QueueActivity(new Move.Move(allies2MovePoint.Location)); + } } void UpdateUnitsEvacuated() @@ -212,7 +253,13 @@ namespace OpenRA.Mods.RA.Missions { world = w; allies1 = w.Players.Single(p => p.InternalName == "Allies1"); - allies2 = w.Players.Single(p => p.InternalName == "Allies2"); + allies2 = w.Players.SingleOrDefault(p => p.InternalName == "Allies2"); + if (allies2 == null) + { + allies2 = allies1; + attackAtFrame = 500; + attackAtFrameIncrement = 500; + } evacuees = w.Players.Single(p => p.InternalName == "Evacuees"); soviets = w.Players.Single(p => p.InternalName == "Soviets"); var actors = w.WorldActor.Trait().Actors; @@ -234,12 +281,14 @@ namespace OpenRA.Mods.RA.Missions sovietEntryPoint2 = actors["SovietEntryPoint2"]; sovietEntryPoint3 = actors["SovietEntryPoint3"]; sovietEntryPoint4 = actors["SovietEntryPoint4"]; - sovietEntryPoints = new[] { sovietEntryPoint1, sovietEntryPoint2, sovietEntryPoint3, sovietEntryPoint4 }.Select(p => p.Location).ToArray(); + sovietEntryPoint5 = actors["SovietEntryPoint5"]; + sovietEntryPoints = new[] { sovietEntryPoint1, sovietEntryPoint2, sovietEntryPoint3, sovietEntryPoint4, sovietEntryPoint5 }.Select(p => p.Location).ToArray(); sovietRallyPoint1 = actors["SovietRallyPoint1"]; sovietRallyPoint2 = actors["SovietRallyPoint2"]; sovietRallyPoint3 = actors["SovietRallyPoint3"]; sovietRallyPoint4 = actors["SovietRallyPoint4"]; - sovietRallyPoints = new[] { sovietRallyPoint1, sovietRallyPoint2, sovietRallyPoint3, sovietRallyPoint4 }.Select(p => p.Location).ToArray(); + sovietRallyPoint5 = actors["SovietRallyPoint5"]; + sovietRallyPoints = new[] { sovietRallyPoint1, sovietRallyPoint2, sovietRallyPoint3, sovietRallyPoint4, sovietRallyPoint5 }.Select(p => p.Location).ToArray(); if (w.LocalPlayer == null || w.LocalPlayer == allies1) { Game.MoveViewport(allies1EntryPoint.Location.ToFloat2()); diff --git a/mods/ra/maps/allies-03/map.yaml b/mods/ra/maps/allies-03/map.yaml index e26c87b0b5..c85c7e0f11 100644 --- a/mods/ra/maps/allies-03/map.yaml +++ b/mods/ra/maps/allies-03/map.yaml @@ -802,8 +802,8 @@ Actors: Exit1TopRight: waypoint Location: 25,44 Owner: Neutral - Actor801: tc04 - Location: 129,74 + SovietEntryPoint5: waypoint + Location: 130,79 Owner: Neutral Actor17: mine Location: 99,46 @@ -994,24 +994,6 @@ Actors: Allies2EntryPoint: waypoint Location: 175,38 Owner: Neutral - Actor19: e1 - Location: 147,27 - Owner: Soviets - Actor22: e1 - Location: 150,28 - Owner: Soviets - Actor138: e1 - Location: 163,36 - Owner: Soviets - Actor144: e1 - Location: 164,39 - Owner: Soviets - Actor151: e2 - Location: 148,27 - Owner: Soviets - Actor152: e2 - Location: 164,38 - Owner: Soviets Exit2TopRight: waypoint Location: 35,16 Owner: Neutral @@ -1069,6 +1051,9 @@ Actors: SovietRallyPoint4: waypoint Location: 113,35 Owner: Neutral + SovietRallyPoint5: waypoint + Location: 131,63 + Owner: Neutral Smudges: