From 9238de6a47a9d5e434d41ddabc4d7f89e6e5eebb Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Sat, 3 Nov 2012 21:41:46 +1300 Subject: [PATCH] Add airbase and airbase secondary objective. Improve Soviet attacks. Enable players to capture sam sites as well as destroy them to complete the objective in Allies 02 --- OpenRA.Mods.RA/Missions/Allies02Script.cs | 5 +- OpenRA.Mods.RA/Missions/Allies03Script.cs | 114 +++++-- mods/ra/maps/allies-03/map.bin | Bin 92165 -> 92165 bytes mods/ra/maps/allies-03/map.yaml | 397 ++++++++++++++++++++-- 4 files changed, 454 insertions(+), 62 deletions(-) diff --git a/OpenRA.Mods.RA/Missions/Allies02Script.cs b/OpenRA.Mods.RA/Missions/Allies02Script.cs index 840173b3c8..260abf5f00 100644 --- a/OpenRA.Mods.RA/Missions/Allies02Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies02Script.cs @@ -236,7 +236,10 @@ namespace OpenRA.Mods.RA.Missions } if (objectives[DestroySamSitesID].Status == ObjectiveStatus.InProgress) { - if (sam1.Destroyed && sam2.Destroyed && sam3.Destroyed && sam4.Destroyed) + if ((sam1.Destroyed || sam1.Owner != soviets) && + (sam2.Destroyed || sam2.Owner != soviets) && + (sam3.Destroyed || sam3.Owner != soviets) && + (sam4.Destroyed || sam4.Owner != soviets)) { objectives[DestroySamSitesID].Status = ObjectiveStatus.Completed; objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress; diff --git a/OpenRA.Mods.RA/Missions/Allies03Script.cs b/OpenRA.Mods.RA/Missions/Allies03Script.cs index d7775ef312..8a665a83d8 100644 --- a/OpenRA.Mods.RA/Missions/Allies03Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies03Script.cs @@ -34,9 +34,12 @@ namespace OpenRA.Mods.RA.Missions Dictionary objectives = new Dictionary { { EvacuateID, new Objective(ObjectiveType.Primary, "Following the rescue of Einstein, the Allies are now being flanked from both sides. Evacuate {0} units before the remaining Allied forces in the area are wiped out.".F(UnitsEvacuatedThreshold), ObjectiveStatus.InProgress) }, + { AirbaseID, new Objective(ObjectiveType.Secondary, "Destroy the nearby Soviet airbase.", ObjectiveStatus.InProgress) } }; const int EvacuateID = 0; + const int AirbaseID = 1; + const int UnitsEvacuatedThreshold = 50; int unitsEvacuated; InfoWidget evacuateWidget; @@ -69,13 +72,17 @@ namespace OpenRA.Mods.RA.Missions Actor sovietRallyPoint5; CPos[] sovietRallyPoints; - static readonly string[] SovietVehicles = { "3tnk", "3tnk", "3tnk", "3tnk", "v2rl", "v2rl", "ftrk", "apc" }; - static readonly string[] SovietInfantry = { "e1", "e1", "e1", "e2", "e2", "e3", "e4" }; + Actor sovietAirfield1; + Actor sovietAirfield2; + Actor sovietAirfield3; + Actor sovietAirfield4; + static readonly string[] SovietVehicles = { "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "v2rl", "v2rl", "ftrk", "ftrk", "apc", "apc", "apc" }; + const int SovietAttackGroupSize = 5; const int YakTicks = 2000; - int attackAtFrame = 300; - int attackAtFrameIncrement = 300; + int attackAtFrame; + int attackAtFrameIncrement; Actor allies1EntryPoint; Actor allies1MovePoint; @@ -131,33 +138,48 @@ namespace OpenRA.Mods.RA.Missions attackAtFrame += attackAtFrameIncrement; attackAtFrameIncrement = Math.Max(attackAtFrameIncrement - 5, 100); } - if (world.FrameNumber % YakTicks == 1) + if (world.FrameNumber % YakTicks == 1 && objectives[AirbaseID].Status != ObjectiveStatus.Completed) { AirStrafe(YakName); - if (world.SharedRandom.Next(3) == 2) - { - AirStrafe(YakName); - } } ManageSovietUnits(); + ManageSovietOre(); EvacuateAlliedUnits(exit1TopLeft.CenterLocation, exit1BottomRight.CenterLocation, exit1ExitPoint.Location); EvacuateAlliedUnits(exit2TopLeft.CenterLocation, exit2BottomRight.CenterLocation, exit2ExitPoint.Location); + CheckSovietAirbase(); if (!world.Actors.Any(a => (a.Owner == allies1 || a.Owner == allies2) && a.IsInWorld && !a.IsDead() && ((a.HasTrait() && !a.HasTrait()) || a.HasTrait()))) { MissionFailed("The remaining Allied forces in the area have been wiped out."); } } + void ManageSovietOre() + { + var res = soviets.PlayerActor.Trait(); + res.TakeOre(res.Ore); + res.TakeCash(res.Cash); + } + 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); + var aircraft = world.Actors.Where( + a => a.HasTrait() && a.Trait().FullAmmo() && a.Trait().Altitude == 0 + && a.Owner == soviets && a.IsIdle && a.IsInWorld); + if (aircraft.Count() < 4) + { + var a = world.CreateActor(actor, new TypeDictionary + { + new LocationInit(spawnPoint), + new OwnerInit(soviets), + new AltitudeInit(Rules.Info[actor].Traits.Get().CruiseAltitude) + }); + aircraft = aircraft.Concat(new[] { a }); + } + foreach (var a in aircraft) + { + AirStrafe(a); + } } void AirStrafe(Actor aircraft) @@ -176,25 +198,47 @@ namespace OpenRA.Mods.RA.Missions } } + void CheckSovietAirbase() + { + if (objectives[AirbaseID].Status != ObjectiveStatus.Completed && + (sovietAirfield1.Destroyed || sovietAirfield1.Owner != soviets) && + (sovietAirfield2.Destroyed || sovietAirfield2.Owner != soviets) && + (sovietAirfield3.Destroyed || sovietAirfield3.Owner != soviets) && + (sovietAirfield4.Destroyed || sovietAirfield4.Owner != soviets)) + { + objectives[AirbaseID].Status = ObjectiveStatus.Completed; + OnObjectivesUpdated(true); + } + } + void SpawnSovietUnits() { var route = world.SharedRandom.Next(sovietEntryPoints.Length); var spawnPoint = sovietEntryPoints[route]; var rallyPoint = sovietRallyPoints[route]; - var unit = world.CreateActor(SovietVehicles.Concat(SovietInfantry).Random(world.SharedRandom), new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); - unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(rallyPoint, 5))); + var unit = world.CreateActor(SovietVehicles.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); + unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(rallyPoint, 3))); } void ManageSovietUnits() { - var units = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.IsIdle && u.HasTrait() && u.Owner == soviets); - foreach (var unit in units) + foreach (var rallyPoint in sovietRallyPoints) { - 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) + var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rallyPoint), 10) + .Where(u => u.IsIdle && u.HasTrait() && u.Owner == soviets); + if (units.Count() >= SovietAttackGroupSize) { - unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Attack(Target.FromActor(targetEnemy), 3))); + foreach (var unit in units) + { + 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 Attack(Target.FromActor(targetEnemy), 3))); + } + } } } } @@ -240,7 +284,16 @@ namespace OpenRA.Mods.RA.Missions unit.CancelActivity(); unit.ChangeOwner(allies); unit.QueueActivity(new Move.Move(exit)); - unit.QueueActivity(new CallFunc(() => { unitsEvacuated++; UpdateUnitsEvacuated(); })); + unit.QueueActivity(new CallFunc(() => + { + unitsEvacuated++; + var cargo = unit.TraitOrDefault(); + if (cargo != null) + { + unitsEvacuated += cargo.Passengers.Count(); + } + UpdateUnitsEvacuated(); + })); unit.QueueActivity(new RemoveSelf()); } } @@ -250,7 +303,12 @@ namespace OpenRA.Mods.RA.Missions world = w; allies1 = w.Players.Single(p => p.InternalName == "Allies1"); allies2 = w.Players.SingleOrDefault(p => p.InternalName == "Allies2"); - if (allies2 == null) + if (allies2 != null) + { + attackAtFrame = 400; + attackAtFrameIncrement = 400; + } + else { allies2 = allies1; attackAtFrame = 500; @@ -281,6 +339,10 @@ namespace OpenRA.Mods.RA.Missions sovietRallyPoint4 = actors["SovietRallyPoint4"]; sovietRallyPoint5 = actors["SovietRallyPoint5"]; sovietRallyPoints = new[] { sovietRallyPoint1, sovietRallyPoint2, sovietRallyPoint3, sovietRallyPoint4, sovietRallyPoint5 }.Select(p => p.Location).ToArray(); + sovietAirfield1 = actors["SovietAirfield1"]; + sovietAirfield2 = actors["SovietAirfield2"]; + sovietAirfield3 = actors["SovietAirfield3"]; + sovietAirfield4 = actors["SovietAirfield4"]; if (w.LocalPlayer == null || w.LocalPlayer == allies1) { Game.MoveViewport(allies1EntryPoint.Location.ToFloat2()); diff --git a/mods/ra/maps/allies-03/map.bin b/mods/ra/maps/allies-03/map.bin index bc7bbd80292889aa166f9065b312e980d8080054..577ad8f61d766169044005b787849d3c12854bc0 100644 GIT binary patch delta 651 zcmZp@z}k9&b;Imr&i@Py5VUzovN$6ToC{=ZKAytGIN5x%+~)VGJd6_sMJDs7|C}7| zEUL|nqzuUB-^IYZi-8Tu_|E|1f=Q^clRYvXb3xfaU6V~S^;tmN$r+hiLx1rmFCxBv8F zyum*Gw-;m9bn9Topvek1xTdSCGbT;{3E{EuF)}kUfB++qVq~8FQH62Cbly-#uIVlT zjOzvA5+Fs442(?E4|+3h0vf|2z{mvTg8)qH!wANW(-+7yvP=&OXWYrez%ZRRf^i>^ L-hMWM(SjcU);7s3 delta 1048 zcmY*XOG{Nz7+v2v_x(8crJ0l@QG*82q(%+OSzwY6EU`hLmG3Cau%|Szn{?p{M>#|U z8X*cH=2kRIBO+>+(Zop)k_HX>12s6UeNI}Pd(OV!Uf=rG_t<-IH8{8$oVni`%>#KD zF4F2zYndeSkUUHm5f>r#=5$Q9)5>wPO(mS8UZb@>FQCqHT*Xy0F|@$oz5@m@J4EKNQkNau9)O#F^pYNlq=t~J=(pC z<+0A3{i6GOAgdJ~_v|G`Gon8C#HG{)NLkcr2~vffMU{IlF56hkJTMOyrSo`2v1$^s zYWMja5@sqolB)VbPLkHf$Vsu`?>D?p{nwGE@KxFbY~UsU|Ox6)r#uIzL;r z)Z4y{B>o}A)wjzf65Zfrl+j-%(IH?+Pcx%-Udc&}9p#1~Lon5$t30|%U=qd{Fa~1+ znBb9~y5`|B33CiG26I9msig+4TT<#@fg(`Ub@-!*tA{t@vemx@MMx2W|L(}^o0g=C zFp3Cn-Vyb6;8V!#MOeMMT_My7s`dO#xqk==b#MG>IYCj4&pdBf^*#5Dh#FmvwFE@O zbn2RAF)9WirWoSXHp@bqrrv-*!y~<{mg%%d(wIicurq73mQU~jUu`bI5bzUf8qTd_ zGMgY>V;Y51RV%Z0s8y|g($8>BAlshNazySgNuX4;82N+P6V u*~0j7Q8BMluQxrBCl=Xy9{S