diff --git a/mods/ra/maps/soviet-11b/map.bin b/mods/ra/maps/soviet-11b/map.bin new file mode 100644 index 0000000000..8161e83150 Binary files /dev/null and b/mods/ra/maps/soviet-11b/map.bin differ diff --git a/mods/ra/maps/soviet-11b/map.png b/mods/ra/maps/soviet-11b/map.png new file mode 100644 index 0000000000..dc774179f2 Binary files /dev/null and b/mods/ra/maps/soviet-11b/map.png differ diff --git a/mods/ra/maps/soviet-11b/map.yaml b/mods/ra/maps/soviet-11b/map.yaml new file mode 100644 index 0000000000..8874ebd820 --- /dev/null +++ b/mods/ra/maps/soviet-11b/map.yaml @@ -0,0 +1,840 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 11b: Sunk Costs + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 21,20,90,85 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: E2E6F6 + Enemies: USSR + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Greece + +Actors: + Actor0: cycl + Location: 29,90 + Owner: Greece + Actor1: cycl + Location: 30,90 + Owner: Greece + Actor2: cycl + Location: 31,90 + Owner: Greece + Actor3: cycl + Location: 32,90 + Owner: Greece + Actor4: cycl + Location: 39,91 + Owner: Greece + Actor5: cycl + Location: 40,91 + Owner: Greece + Actor6: cycl + Location: 41,91 + Owner: Greece + Actor7: cycl + Location: 42,91 + Owner: Greece + Actor8: cycl + Location: 38,97 + Owner: Greece + Actor9: cycl + Location: 39,97 + Owner: Greece + Actor10: cycl + Location: 40,97 + Owner: Greece + Actor11: cycl + Location: 41,97 + Owner: Greece + Actor12: tc04 + Location: 23,78 + Owner: Neutral + Actor13: tc05 + Location: 33,76 + Owner: Neutral + Actor14: tc05 + Location: 35,63 + Owner: Neutral + Actor15: tc05 + Location: 42,58 + Owner: Neutral + Actor16: tc05 + Location: 41,43 + Owner: Neutral + Actor17: tc04 + Location: 44,43 + Owner: Neutral + Actor18: t16 + Location: 43,52 + Owner: Neutral + Actor19: tc03 + Location: 27,84 + Owner: Neutral + Actor20: tc02 + Location: 40,83 + Owner: Neutral + Actor21: tc01 + Location: 58,93 + Owner: Neutral + Actor22: t16 + Location: 60,85 + Owner: Neutral + Actor23: t12 + Location: 24,63 + Owner: Neutral + Actor24: t11 + Location: 31,54 + Owner: Neutral + Actor25: t10 + Location: 40,55 + Owner: Neutral + Actor26: t08 + Location: 37,41 + Owner: Neutral + Actor27: tc03 + Location: 49,40 + Owner: Neutral + Actor28: tc01 + Location: 44,76 + Owner: Neutral + Actor29: tc02 + Location: 46,78 + Owner: Neutral + Actor30: tc05 + Location: 94,48 + Owner: Neutral + Actor31: tc04 + Location: 85,46 + Owner: Neutral + Actor32: tc02 + Location: 89,48 + Owner: Neutral + Actor33: tc01 + Location: 87,52 + Owner: Neutral + Actor34: t17 + Location: 93,52 + Owner: Neutral + Actor35: tc03 + Location: 80,45 + Owner: Neutral + Actor36: t08 + Location: 79,46 + Owner: Neutral + Actor37: t06 + Location: 102,41 + Owner: Neutral + Actor38: t05 + Location: 95,42 + Owner: Neutral + Actor39: t01 + Location: 52,89 + Owner: Neutral + Actor40: t06 + Location: 56,87 + Owner: Neutral + Actor41: t07 + Location: 56,89 + Owner: Neutral + Actor42: mine + Location: 88,48 + Owner: Neutral + Actor43: mine + Location: 95,54 + Owner: Neutral + Actor44: mine + Location: 87,94 + Owner: Neutral + Actor45: mine + Location: 83,56 + Owner: Neutral + Actor46: weap + Location: 35,80 + Owner: Greece + Actor47: pbox + Location: 30,87 + Owner: Greece + Actor48: hbox + Location: 42,43 + Owner: Greece + Actor49: hbox + Location: 43,52 + Owner: Greece + Actor50: hbox + Location: 43,58 + Owner: Greece + Actor51: hbox + Location: 45,43 + Owner: Greece + Actor52: gap + Location: 36,90 + Owner: Greece + Actor53: gun + Location: 33,58 + Owner: Greece + Actor54: gun + Location: 38,58 + Owner: Greece + Actor55: gun + Location: 31,72 + Owner: Greece + Actor56: gun + Location: 27,72 + Owner: Greece + Actor57: gun + Location: 51,66 + Owner: Greece + Facing: 127 + TurretFacing: 192 + Actor58: gun + Location: 48,70 + Owner: Greece + Facing: 191 + Actor59: gun + Location: 51,74 + Owner: Greece + Actor60: gun + Location: 33,85 + Owner: Greece + Actor61: agun + Location: 30,89 + Owner: Greece + Actor62: agun + Location: 39,96 + Owner: Greece + Facing: 191 + Actor63: agun + Location: 30,93 + Owner: Greece + Facing: 95 + Actor64: agun + Location: 40,90 + Owner: Greece + Actor65: fact + Location: 31,86 + Owner: Greece + Helipad3: hpad + Location: 31,78 + Owner: Greece + Helipad4: hpad + Location: 24,83 + Owner: Greece + Helipad2: hpad + Location: 26,78 + Owner: Greece + Helipad1: hpad + Location: 24,72 + Owner: Greece + Actor69: apwr + Location: 53,89 + Owner: Greece + Actor70: apwr + Location: 57,90 + Owner: Greece + Actor71: apwr + Location: 49,88 + Owner: Greece + Actor72: apwr + Location: 53,86 + Owner: Greece + Actor73: apwr + Location: 57,87 + Owner: Greece + Actor74: tent + Location: 44,78 + Owner: Greece + NavalYard1: syrd + Location: 44,93 + Owner: Greece + NavalYard2: syrd + Location: 32,96 + Owner: Greece + Actor77: barl + Location: 39,94 + Owner: Greece + Actor78: brl3 + Location: 40,94 + Owner: Greece + Actor79: brl3 + Location: 40,92 + Owner: Greece + Actor80: brl3 + Location: 31,93 + Owner: Greece + Actor81: brl3 + Location: 30,91 + Owner: Greece + Actor82: brl3 + Location: 29,93 + Owner: Greece + Actor83: barl + Location: 32,93 + Owner: Greece + Actor84: barl + Location: 38,94 + Owner: Greece + Actor85: brl3 + Location: 39,92 + Owner: Greece + Actor86: brl3 + Location: 39,93 + Owner: Greece + Actor87: v19 + Location: 31,92 + Owner: Greece + Actor88: v19 + Location: 29,91 + Owner: Greece + Actor89: v19 + Location: 29,92 + Owner: Greece + Actor90: v19 + Location: 31,91 + Owner: Greece + Actor91: v19 + Location: 38,93 + Owner: Greece + Actor92: v19 + Location: 40,93 + Owner: Greece + Actor93: v19 + Location: 38,95 + Owner: Greece + Actor94: v19 + Location: 40,95 + Owner: Greece + Actor95: minv + Location: 64,73 + Owner: Greece + Actor96: minv + Location: 63,74 + Owner: Greece + Actor97: minv + Location: 62,71 + Owner: Greece + Actor98: minv + Location: 61,72 + Owner: Greece + Actor99: minv + Location: 62,73 + Owner: Greece + Actor100: minv + Location: 61,74 + Owner: Greece + Actor101: minv + Location: 60,73 + Owner: Greece + Actor102: minv + Location: 59,74 + Owner: Greece + Actor103: minv + Location: 58,73 + Owner: Greece + Actor104: minv + Location: 57,72 + Owner: Greece + Actor105: minv + Location: 55,72 + Owner: Greece + Actor106: minv + Location: 56,71 + Owner: Greece + Actor107: minv + Location: 58,71 + Owner: Greece + Actor108: minv + Location: 60,71 + Owner: Greece + Actor109: minv + Location: 59,72 + Owner: Greece + Actor110: minv + Location: 57,70 + Owner: Greece + Actor111: minv + Location: 55,70 + Owner: Greece + Actor112: minv + Location: 59,70 + Owner: Greece + Actor113: minv + Location: 54,71 + Owner: Greece + Actor115: pbox + Location: 34,87 + Owner: Greece + Actor116: minv + Location: 46,50 + Owner: Greece + Actor117: minv + Location: 47,51 + Owner: Greece + Actor118: minv + Location: 48,50 + Owner: Greece + Actor119: minv + Location: 49,51 + Owner: Greece + Actor120: minv + Location: 50,50 + Owner: Greece + Actor121: minv + Location: 50,52 + Owner: Greece + Actor122: minv + Location: 48,52 + Owner: Greece + Actor123: minv + Location: 46,52 + Owner: Greece + Actor124: minv + Location: 47,53 + Owner: Greece + Actor125: minv + Location: 49,53 + Owner: Greece + Actor126: minv + Location: 46,54 + Owner: Greece + Actor127: minv + Location: 47,55 + Owner: Greece + Actor128: minv + Location: 48,54 + Owner: Greece + Actor129: minv + Location: 50,54 + Owner: Greece + Actor130: minv + Location: 49,55 + Owner: Greece + Actor131: minv + Location: 46,56 + Owner: Greece + Actor132: minv + Location: 48,56 + Owner: Greece + Actor133: minv + Location: 50,56 + Owner: Greece + Actor134: minv + Location: 45,57 + Owner: Greece + Actor135: minv + Location: 47,57 + Owner: Greece + Actor136: minv + Location: 49,57 + Owner: Greece + Actor137: minv + Location: 51,57 + Owner: Greece + Actor138: hbox + Location: 52,89 + Owner: Greece + Actor139: hbox + Location: 56,89 + Owner: Greece + Actor140: barl + Location: 38,75 + Owner: Greece + Actor141: brl3 + Location: 38,76 + Owner: Greece + BridgeBarrel: brl3 + Location: 42,76 + Owner: Greece + Actor143: barl + Location: 43,76 + Owner: Greece + Actor144: barl + Location: 41,76 + Owner: Greece + Actor145: barl + Location: 39,75 + Owner: Greece + Actor146: 2tnk + Location: 56,69 + Owner: Greece + Facing: 689 + Actor147: 2tnk + Location: 53,69 + Owner: Greece + Facing: 713 + Actor148: 2tnk + Location: 53,71 + Owner: Greece + Facing: 697 + Actor149: 2tnk + Location: 47,47 + Owner: Greece + Facing: 523 + Actor150: 2tnk + Location: 50,47 + Owner: Greece + Facing: 523 + Actor151: arty + Location: 47,45 + Owner: Greece + Facing: 491 + Actor152: arty + Location: 50,45 + Owner: Greece + Facing: 531 + Actor153: arty + Location: 32,59 + Owner: Greece + Actor154: arty + Location: 38,59 + Owner: Greece + Actor155: 2tnk + Location: 36,57 + Owner: Greece + Actor156: 2tnk + Location: 35,57 + Owner: Greece + Actor157: 2tnk + Location: 34,57 + Owner: Greece + Actor158: 2tnk + Location: 25,82 + Owner: Greece + Actor159: 2tnk + Location: 26,76 + Owner: Greece + BridgeTank: 2tnk + Location: 42,78 + Owner: Greece + Actor161: 1tnk + Location: 48,45 + Owner: Greece + TurretFacing: 0 + Facing: 523 + Actor162: 1tnk + Location: 49,45 + Owner: Greece + Facing: 507 + Actor163: 1tnk + Location: 32,92 + Owner: Greece + Actor164: 1tnk + Location: 37,94 + Owner: Greece + Actor165: 1tnk + Location: 51,86 + Owner: Greece + Actor166: 1tnk + Location: 48,90 + Owner: Greece + Actor167: arty + Location: 63,68 + Owner: Greece + Facing: 674 + Actor168: arty + Location: 59,67 + Owner: Greece + Facing: 689 + Actor169: arty + Location: 55,66 + Owner: Greece + Facing: 682 + Actor170: 2tnk + Location: 93,30 + Owner: Greece + Facing: 507 + Actor171: 1tnk + Location: 92,29 + Owner: Greece + Facing: 523 + Actor172: 1tnk + Location: 92,31 + Owner: Greece + Facing: 531 + Rocket5: e3 + Location: 56,86 + Owner: Greece + SubCell: 2 + Rocket6: e3 + Location: 57,86 + Owner: Greece + SubCell: 2 + Actor175: e3 + Location: 59,93 + Owner: Greece + SubCell: 0 + Actor176: e3 + Location: 58,93 + Owner: Greece + SubCell: 0 + Rocket3: e3 + Location: 50,86 + Owner: Greece + SubCell: 1 + Rocket4: e3 + Location: 50,87 + Owner: Greece + SubCell: 1 + Rocket1: e3 + Location: 31,85 + Owner: Greece + SubCell: 2 + Rocket2: e3 + Location: 32,85 + Owner: Greece + SubCell: 2 + Actor181: e3 + Location: 48,44 + Owner: Greece + SubCell: 4 + Facing: 547 + Actor182: e3 + Location: 49,44 + Owner: Greece + SubCell: 0 + Facing: 475 + Actor183: e3 + Location: 35,58 + Owner: Greece + SubCell: 1 + Actor184: e3 + Location: 35,58 + Owner: Greece + SubCell: 2 + Actor185: ss + Location: 105,94 + Owner: USSR + Facing: 31 + Actor186: ss + Location: 101,94 + Owner: USSR + Facing: 31 + Actor187: ss + Location: 101,97 + Owner: USSR + Facing: 31 + Actor188: dd + Location: 98,92 + Owner: Greece + Health: 6 + Facing: 364 + StartGunboat: pt + Location: 97,96 + Owner: Greece + Facing: 428 + Actor190: ca + Location: 83,24 + Owner: Greece + Facing: 539 + TurretFacing@PRIMARY: 0 + TurretFacing@SECONDARY: 0 + Actor192: ca + Location: 50,95 + Owner: Greece + Facing: 658 + Actor193: dd + Location: 48,93 + Owner: Greece + Facing: 618 + Actor194: dd + Location: 53,94 + Owner: Greece + Facing: 610 + Actor195: dd + Location: 48,97 + Owner: Greece + Facing: 642 + Actor196: dd + Location: 53,97 + Owner: Greece + Facing: 610 + Gunboat1: pt + Location: 77,39 + Owner: Greece + Facing: 388 + Gunboat2: pt + Location: 79,40 + Owner: Greece + Facing: 396 + Actor199: pt + Location: 51,101 + Owner: Greece + Facing: 610 + Actor200: pt + Location: 54,100 + Owner: Greece + Facing: 666 + Actor201: pt + Location: 57,99 + Owner: Greece + TurretFacing: 0 + Facing: 634 + Cruiser1: ca + Location: 80,38 + Owner: Greece + Facing: 380 + Actor203: dd + Location: 58,55 + Owner: Greece + Facing: 666 + Actor204: dd + Location: 55,55 + Owner: Greece + Facing: 642 + Actor205: pt + Location: 61,56 + Owner: Greece + Facing: 666 + Actor206: pt + Location: 59,59 + Owner: Greece + Facing: 650 + Actor207: dd + Location: 58,52 + Owner: Greece + Facing: 618 + Actor208: pt + Location: 61,58 + Owner: Greece + Facing: 618 + Actor249: dome + Owner: Greece + Location: 45,82 + Actor250: camera + Owner: Greece + Location: 92,79 + NavalYard3: syrd + Owner: Greece + Location: 54,51 + Rocket7: e3 + Owner: Greece + SubCell: 3 + Location: 51,64 + Facing: 384 + Rocket8: e3 + Owner: Greece + Location: 51,64 + SubCell: 1 + Facing: 384 + DefaultCameraPosition: waypoint + Location: 99,94 + Owner: Neutral + TransportEntry: waypoint + Location: 110,102 + Owner: Neutral + TransportStop: waypoint + Location: 104,96 + Owner: Neutral + ShipWaypoint1: waypoint + Location: 69,59 + Owner: Neutral + ShipWaypoint2: waypoint + Location: 73,72 + Owner: Neutral + ShipWaypoint3: waypoint + Location: 69,92 + Owner: Neutral + ShipWaypoint4: waypoint + Location: 87,102 + Owner: Neutral + ShipWaypoint5: waypoint + Location: 101,94 + Owner: Neutral + PlayerBase: waypoint + Location: 92,78 + Owner: Neutral + RocketPath1: waypoint + Location: 29,71 + Owner: Neutral + RocketPath2: waypoint + Location: 31,84 + Owner: Neutral + RocketPath3: waypoint + Location: 39,77 + Owner: Neutral + RocketPath4: waypoint + Location: 34,93 + Owner: Neutral + RocketPath5: waypoint + Location: 54,74 + Owner: Neutral + RocketPath6: waypoint + Location: 57,85 + Owner: Neutral + RocketPath7: waypoint + Location: 52,65 + Owner: Neutral + RocketPath8: waypoint + Location: 62,67 + Owner: Neutral + CruiserEntry: waypoint + Location: 110,40 + Owner: Neutral + SurpriseTransportEntry: waypoint + Location: 24,20 + Owner: Neutral + SurpriseTransportDrop: waypoint + Location: 38,24 + Owner: Neutral + AmbushTrigger: waypoint + Location: 92,30 + Owner: Neutral + AlliedTransportEntry1: waypoint + Location: 61,104 + Owner: Neutral + AlliedTransportEntry2: waypoint + Location: 71,104 + Owner: Neutral + AlliedTransportEntry3: waypoint + Location: 110,63 + Owner: Neutral + AlliedTransportDrop1: waypoint + Location: 80,52 + Owner: Neutral + AlliedTransportDrop2: waypoint + Location: 83,97 + Owner: Neutral + AlliedTransportDrop3: waypoint + Location: 102,49 + Owner: Neutral + ShipEntry: waypoint + Location: 57,53 + Owner: Neutral + BaseBridge: waypoint + Location: 43,73 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/ra/maps/soviet-11b/rules.yaml b/mods/ra/maps/soviet-11b/rules.yaml new file mode 100644 index 0000000000..fbf062e808 --- /dev/null +++ b/mods/ra/maps/soviet-11b/rules.yaml @@ -0,0 +1,91 @@ +World: + LuaScript: + Scripts: campaign-global.lua, soviet11b.lua, soviet11b-AI.lua + MissionData: + BriefingVideo: soviet11.vqa + WinVideo: sitduck.vqa + LossVideo: dpthchrg.vqa + StartVideo: periscop.vqa + Briefing: Intelligence indicates that a large portion of the Allied Naval Fleet will stop for refueling at a base in this area. Destroy the fleet and the base. Beware the long range of their cruisers. + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: normal + +Player: + PlayerResources: + DefaultCash: 10000 + +AFLD: + AirstrikePower@parabombs: + Prerequisites: aircraft.soviet + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E2,E2 + +ATEK: + Buildable: + Prerequisites: ~disabled + +IRON: + Buildable: + Prerequisites: ~disabled + +MSLO: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +FTRK: + Buildable: + Prerequisites: ~disabled + +QTNK: + Buildable: + Prerequisites: ~disabled + +MSUB: + Buildable: + Prerequisites: ~disabled + +THF: + Buildable: + Prerequisites: ~disabled + +PDOX: + Buildable: + Prerequisites: ~disabled + +E7: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +MECH: + Buildable: + Prerequisites: ~disabled + +MH60: + Buildable: + Prerequisites: ~disabled + +E3: + Buildable: + Prerequisites: ~tent + +CA: + Buildable: + Prerequisites: ~syrd, dome + +HELI: + Buildable: + Prerequisites: ~hpad diff --git a/mods/ra/maps/soviet-11b/soviet11b-AI.lua b/mods/ra/maps/soviet-11b/soviet11b-AI.lua new file mode 100644 index 0000000000..a557ac2d0b --- /dev/null +++ b/mods/ra/maps/soviet-11b/soviet11b-AI.lua @@ -0,0 +1,248 @@ +--[[ + Copyright 2007-2021 The OpenRA Developers (see AUTHORS) + This file is part of OpenRA, which is free software. It is made + available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] +FirstPatrolActors = { Cruiser1, Gunboat1, Gunboat2 } +PatrolA = { Rocket1, Rocket2 } +PatrolB = { Rocket3, Rocket4 } +PatrolC = { Rocket5, Rocket6 } +PatrolD = { Rocket7, Rocket8 } +PatrolPathA = { RocketPath1.Location, RocketPath2.Location } +PatrolPathB = { RocketPath3.Location, RocketPath4.Location } +PatrolPathC = { RocketPath5.Location, RocketPath6.Location } +PatrolPathD = { RocketPath7.Location, RocketPath8.Location } + +Helipads = { Helipad1, Helipad2, Helipad3, Helipad4 } +HeliType = { "heli" } + +DestroyerSquad = { "dd", "dd" } + +DestroyerDelays = +{ + easy = 4, + normal = 3, + hard = 2 +} + +TransportDelays = +{ + easy = 6, + normal = 5, + hard = 4 +} + +AlliedShips = +{ + easy = { "pt", "pt", "dd" }, + normal = { "pt", "dd", "dd" }, + hard = { "dd", "dd" , "dd" } +} + +Helis = { } + +PatrolWay = { ShipWaypoint1.Location, ShipWaypoint2.Location, ShipWaypoint3.Location, ShipWaypoint4.Location, ShipWaypoint5.Location } + +TransportWays = +{ + { AlliedTransportEntry1.Location, AlliedTransportDrop1.Location }, + { AlliedTransportEntry2.Location, AlliedTransportDrop2.Location }, + { AlliedTransportEntry3.Location, AlliedTransportDrop3.Location } +} + +TransportUnits = +{ + easy = { { "1tnk", "1tnk", "2tnk" }, { "arty", "jeep", "1tnk" } }, + normal = { { "1tnk", "2tnk", "2tnk" }, { "arty", "arty", "1tnk" } }, + hard = { { "2tnk", "2tnk", "2tnk" }, { "arty", "arty", "2tnk" } } +} + +SurpriseTransportWay = { SurpriseTransportEntry.Location, SurpriseTransportDrop.Location } + +SurpriseTransportUnits = +{ + easy = { "jeep", "jeep", "1tnk" }, + normal = { "jeep", "jeep", "1tnk" }, + hard = { "jeep", "1tnk", "2tnk" } +} + +ProductionDelays = +{ + easy = 3, + normal = 2, + hard = 1 +} + +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +SendCruiser = function() + if NavalYard2.IsDead or NavalYard2.Owner ~= Greece then + return + end + + local boat = Reinforcements.Reinforce(Greece, { "ca" }, { CruiserEntry.Location }) + Utils.Do(boat, function(ca) + ca.Move(DefaultCameraPosition.Location) + Trigger.OnKilled(ca, function() + Trigger.AfterDelay(DateTime.Minutes(3), SendCruiser) + end) + end) +end + +DestroyerAttacks = function() + if NavalYard3.IsDead or NavalYard3.Owner ~= Greece then + return + end + + local boats = Reinforcements.Reinforce(Greece, DestroyerSquad, { ShipEntry.Location }) + Utils.Do(boats, function(dd) + dd.Patrol(PatrolWay, false, 1) + IdleHunt(dd) + end) + Trigger.OnAllKilled(boats, function() + Trigger.AfterDelay(DateTime.Minutes(DestroyerDelays), DestroyerAttacks) + end) +end + +AlliedTransportReinforcements = function() + local way = Utils.Random(TransportWays) + local group = Utils.Random(TransportUnits) + local units = Reinforcements.ReinforceWithTransport(Greece, "lst", group, way, { way[2], way[1] } )[2] + Utils.Do(units, function(a) + Trigger.OnAddedToWorld(a, function() + a.AttackMove(PlayerBase.Location) + IdleHunt(a) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(TransportDelays), AlliedTransportReinforcements) +end + +BuildingsHealing = function() + local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == Greece and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(actor) + Trigger.OnDamaged(actor, function(building) + if building.Owner == Greece and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + end) +end + +StartPatrols = function() + Utils.Do(FirstPatrolActors, function(a) + if not a.IsDead then + a.Patrol(PatrolWay, false, 1) + IdleHunt(a) + end + end) + + Utils.Do(PatrolA, function(a) + a.Patrol(PatrolPathA, true, 20) + end) + Utils.Do(PatrolB, function(b) + b.Patrol(PatrolPathB, true, 20) + end) + Utils.Do(PatrolC, function(c) + c.Patrol(PatrolPathC, true, 20) + end) + Utils.Do(PatrolD, function(d) + d.Patrol(PatrolPathD, true, 20) + end) +end + +ProduceShips = function() + if NavalYard1.IsDead or NavalYard1.Owner ~= Greece then + return + end + + Greece.Build(AlliedShips, function(ships) + Utils.Do(ships, function(a) + a.AttackMove(ShipWaypoint5.Location) + IdleHunt(a) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(ProductionDelays), ProduceShips) +end + +ProduceHelicopters = function() + if Utils.All(Helipads, function(a) return a.IsDead or a.Owner ~= Greece end) then + return + end + + Greece.Build(HeliType, function(helis) + local heli = helis[1] + Helis[#Helis+1] = heli + + Trigger.OnKilled(heli, ProduceHelicopters) + + local alive = Utils.Where(Helis, function(y) return not y.IsDead end) + if #alive < 2 then + Trigger.AfterDelay(DateTime.Minutes(ProductionDelays), ProduceHelicopters) + end + + InitializeAttackAircraft(heli, USSR) + end) +end + +AlliedTransportAmbush = function() + Trigger.OnEnteredProximityTrigger(AmbushTrigger.CenterPosition, WDist.FromCells(7), function(actor, id) + if actor.Owner == USSR and actor.Type ~= "badr" and actor.Type ~= "u2" and actor.Type ~= "camera.spyplane" then + Trigger.RemoveProximityTrigger(id) + local way = SurpriseTransportWay + local group = SurpriseTransportUnits + local units = Reinforcements.ReinforceWithTransport(Greece, "lst", group, way, { way[2], way[1] } )[2] + Utils.Do(units, function(a) + Trigger.OnAddedToWorld(a, function() + a.AttackMove(PlayerBase.Location) + IdleHunt(a) + end) + end) + end + end) +end + +BridgeTrigger = function() + TheBridge = Utils.Where(Map.ActorsInWorld, function(actor) return actor.Type == "bridge1" end)[1] + Trigger.OnKilled(BridgeBarrel, function() + if not TheBridge.IsDead then + TheBridge.Kill() + end + end) + + Trigger.OnEnteredProximityTrigger(BaseBridge.CenterPosition, WDist.FromCells(3), function(actor, id) + if actor.Owner == USSR and actor.Type ~= "badr" and actor.Type ~= "u2" and actor.Type ~= "camera.spyplane" then + Trigger.RemoveProximityTrigger(id) + + if not BridgeTank.IsDead and not BridgeBarrel.IsDead and not TheBridge.IsDead then + BridgeTank.Attack(BridgeBarrel, true, true) + end + end + end) +end + +ActivateAI = function() + local difficulty = Map.LobbyOption("difficulty") + TransportDelays = TransportDelays[difficulty] + DestroyerDelays = DestroyerDelays[difficulty] + TransportUnits = TransportUnits[difficulty] + ProductionDelays = ProductionDelays[difficulty] + AlliedShips = AlliedShips[difficulty] + SurpriseTransportUnits = SurpriseTransportUnits[difficulty] + + BuildingsHealing() + AlliedTransportAmbush() + BridgeTrigger() + NavalYard1.IsPrimaryBuilding = true + + Trigger.AfterDelay(DateTime.Minutes(1), StartPatrols) + Trigger.AfterDelay(DateTime.Minutes(3), AlliedTransportReinforcements) + Trigger.AfterDelay(DateTime.Minutes(4), DestroyerAttacks) + Trigger.AfterDelay(DateTime.Minutes(5), ProduceShips) + Trigger.AfterDelay(DateTime.Minutes(6), ProduceHelicopters) + Trigger.AfterDelay(DateTime.Minutes(7), SendCruiser) +end diff --git a/mods/ra/maps/soviet-11b/soviet11b.lua b/mods/ra/maps/soviet-11b/soviet11b.lua new file mode 100644 index 0000000000..e41dcd2a1d --- /dev/null +++ b/mods/ra/maps/soviet-11b/soviet11b.lua @@ -0,0 +1,63 @@ +--[[ + Copyright 2007-2021 The OpenRA Developers (see AUTHORS) + This file is part of OpenRA, which is free software. It is made + available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] +StartingUnits = { "mcv", "e4", "e4", "e2", "e2" } +SovietTransportWay = { TransportEntry.Location, TransportStop.Location } + +InitialSovietReinforcements = function() + Trigger.AfterDelay(DateTime.Seconds(2), function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + Reinforcements.ReinforceWithTransport(USSR, "lst", StartingUnits, SovietTransportWay) + end) +end + +Tick = function() + Greece.Cash = 10000 + + if Greece.HasNoRequiredUnits() then + USSR.MarkCompletedObjective(DestroyNavalBase) + end + + if USSR.HasNoRequiredUnits() and DateTime.GameTime > DateTime.Seconds(5) then + Greece.MarkCompletedObjective(BeatSoviets) + end +end + +WorldLoaded = function() + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + + Trigger.OnObjectiveAdded(USSR, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + DestroyNavalBase = USSR.AddPrimaryObjective("Destroy Allied naval base") + BeatSoviets = Greece.AddPrimaryObjective("Destroy all Soviet troops.") + + Trigger.OnObjectiveCompleted(USSR, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(USSR, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerLost(USSR, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(USSR, "MissionFailed") + end) + end) + Trigger.OnPlayerWon(USSR, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(USSR, "MissionAccomplished") + end) + end) + + Camera.Position = DefaultCameraPosition.CenterPosition + InitialSovietReinforcements() + Trigger.AfterDelay(DateTime.Seconds(5), ActivateAI) +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index e42533fc5c..67c5011543 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -28,6 +28,7 @@ Soviet Campaign: soviet-08b soviet-09 soviet-11a + soviet-11b Counterstrike: sarin-gas-1-crackdown sarin-gas-2-down-under