diff --git a/mods/ra/maps/soviet-11a/map.bin b/mods/ra/maps/soviet-11a/map.bin new file mode 100644 index 0000000000..8dab240da6 Binary files /dev/null and b/mods/ra/maps/soviet-11a/map.bin differ diff --git a/mods/ra/maps/soviet-11a/map.png b/mods/ra/maps/soviet-11a/map.png new file mode 100644 index 0000000000..dc774179f2 Binary files /dev/null and b/mods/ra/maps/soviet-11a/map.png differ diff --git a/mods/ra/maps/soviet-11a/map.yaml b/mods/ra/maps/soviet-11a/map.yaml new file mode 100644 index 0000000000..b2a698d3ac --- /dev/null +++ b/mods/ra/maps/soviet-11a/map.yaml @@ -0,0 +1,912 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 11a: Sunk Costs + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 16,28,94,80 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Greece: + Name: Greece + 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: 78,41 + Owner: Greece + Actor1: cycl + Location: 79,41 + Owner: Greece + Actor2: cycl + Location: 80,41 + Owner: Greece + Actor3: cycl + Location: 81,41 + Owner: Greece + Actor4: cycl + Location: 82,41 + Owner: Greece + Actor5: cycl + Location: 83,41 + Owner: Greece + Actor6: cycl + Location: 84,41 + Owner: Greece + Actor7: cycl + Location: 78,42 + Owner: Greece + Actor8: cycl + Location: 84,42 + Owner: Greece + Actor9: cycl + Location: 78,43 + Owner: Greece + Actor10: cycl + Location: 78,44 + Owner: Greece + Actor11: cycl + Location: 78,49 + Owner: Greece + Actor12: cycl + Location: 78,50 + Owner: Greece + Actor13: cycl + Location: 78,51 + Owner: Greece + Actor14: cycl + Location: 84,51 + Owner: Greece + Actor15: cycl + Location: 78,52 + Owner: Greece + Actor16: cycl + Location: 79,52 + Owner: Greece + Actor17: cycl + Location: 80,52 + Owner: Greece + Actor18: cycl + Location: 81,52 + Owner: Greece + Actor19: cycl + Location: 82,52 + Owner: Greece + Actor20: cycl + Location: 83,52 + Owner: Greece + Actor21: cycl + Location: 84,52 + Owner: Greece + Actor22: tc05 + Location: 47,45 + Owner: Neutral + Actor23: tc03 + Location: 32,43 + Owner: Neutral + Actor24: tc02 + Location: 51,64 + Owner: Neutral + Actor25: tc01 + Location: 53,54 + Owner: Neutral + Actor26: t15 + Location: 51,61 + Owner: Neutral + Actor27: t12 + Location: 74,50 + Owner: Neutral + Actor28: tc04 + Location: 40,74 + Owner: Neutral + Actor29: tc03 + Location: 27,74 + Owner: Neutral + Actor30: tc02 + Location: 28,80 + Owner: Neutral + Actor31: t01 + Location: 33,75 + Owner: Neutral + Actor32: t02 + Location: 33,70 + Owner: Neutral + Actor33: t05 + Location: 32,81 + Owner: Neutral + Actor34: tc04 + Location: 70,84 + Owner: Neutral + Actor35: t17 + Location: 73,87 + Owner: Neutral + Actor36: t01 + Location: 40,95 + Owner: Neutral + Actor37: t02 + Location: 38,96 + Owner: Neutral + Actor38: t05 + Location: 48,99 + Owner: Neutral + Actor39: t07 + Location: 41,99 + Owner: Neutral + Actor40: t11 + Location: 29,71 + Owner: Neutral + Actor41: t12 + Location: 74,72 + Owner: Neutral + Actor42: t14 + Location: 80,67 + Owner: Neutral + Actor43: tc01 + Location: 84,66 + Owner: Neutral + Actor44: tc04 + Location: 86,66 + Owner: Neutral + Actor45: tc05 + Location: 97,68 + Owner: Neutral + Actor46: tc05 + Location: 104,84 + Owner: Neutral + Actor47: tc04 + Location: 36,51 + Owner: Neutral + Actor48: t12 + Location: 31,44 + Owner: Neutral + Actor49: tc04 + Location: 25,35 + Owner: Neutral + Actor50: tc01 + Location: 27,40 + Owner: Neutral + Actor51: tc02 + Location: 29,34 + Owner: Neutral + Actor52: t01 + Location: 43,37 + Owner: Neutral + Actor53: t06 + Location: 43,42 + Owner: Neutral + Actor54: t01 + Location: 98,56 + Owner: Neutral + Actor55: t03 + Location: 96,59 + Owner: Neutral + Actor56: t11 + Location: 93,65 + Owner: Neutral + Actor57: t10 + Location: 97,86 + Owner: Neutral + Actor58: t08 + Location: 96,86 + Owner: Neutral + Actor59: t01 + Location: 86,100 + Owner: Neutral + Actor60: tc02 + Location: 89,100 + Owner: Neutral + Actor61: tc05 + Location: 95,96 + Owner: Neutral + Actor62: ice05 + Location: 92,92 + Owner: Neutral + Actor63: ice03 + Location: 91,93 + Owner: Neutral + Actor64: ice02 + Location: 99,92 + Owner: Neutral + Actor65: ice04 + Location: 98,93 + Owner: Neutral + Actor66: ice05 + Location: 100,91 + Owner: Neutral + Actor67: ice01 + Location: 93,90 + Owner: Neutral + Actor68: ice04 + Location: 95,90 + Owner: Neutral + Actor69: ice04 + Location: 93,92 + Owner: Neutral + Actor70: ice04 + Location: 100,92 + Owner: Neutral + Actor71: ice03 + Location: 99,94 + Owner: Neutral + Actor72: ice03 + Location: 82,86 + Owner: Neutral + Actor73: ice04 + Location: 82,87 + Owner: Neutral + Actor74: ice02 + Location: 81,85 + Owner: Neutral + Actor75: ice01 + Location: 82,84 + Owner: Neutral + Actor76: ice04 + Location: 84,85 + Owner: Neutral + Actor77: ice04 + Location: 83,83 + Owner: Neutral + Actor78: ice04 + Location: 75,85 + Owner: Neutral + Actor79: ice05 + Location: 83,77 + Owner: Neutral + Actor80: ice03 + Location: 88,78 + Owner: Neutral + Actor81: ice04 + Location: 89,77 + Owner: Neutral + Actor82: ice04 + Location: 87,79 + Owner: Neutral + Actor83: ice04 + Location: 82,78 + Owner: Neutral + Actor84: ice01 + Location: 74,83 + Owner: Neutral + Actor85: mine + Location: 43,98 + Owner: Neutral + Actor86: mine + Location: 81,91 + Owner: Neutral + Actor87: mine + Location: 93,100 + Owner: Neutral + Actor88: mine + Location: 100,84 + Owner: Neutral + Actor89: mine + Location: 83,71 + Owner: Neutral + Actor90: mine + Location: 32,76 + Owner: Neutral + NavalYard2: syrd + Location: 83,46 + Owner: Greece + NavalYard3: syrd + Owner: Greece + Location: 45,32 + Actor92: v19 + Location: 82,44 + Owner: Greece + Actor93: v19 + Location: 80,44 + Owner: Greece + Actor94: v19 + Location: 83,43 + Owner: Greece + Actor95: v19 + Location: 79,43 + Owner: Greece + Actor96: barl + Location: 81,43 + Owner: Greece + Actor97: brl3 + Location: 80,42 + Owner: Greece + Actor98: barl + Location: 79,42 + Owner: Greece + Actor99: barl + Location: 81,42 + Owner: Greece + Actor100: brl3 + Location: 82,43 + Owner: Greece + Actor101: brl3 + Location: 82,42 + Owner: Greece + Actor102: brl3 + Location: 83,42 + Owner: Greece + Actor103: v19 + Location: 79,49 + Owner: Greece + Actor104: v19 + Location: 83,51 + Owner: Greece + Actor105: brl3 + Location: 80,51 + Owner: Greece + Actor106: barl + Location: 81,51 + Owner: Greece + Actor107: barl + Location: 79,50 + Owner: Greece + Actor108: minv + Location: 62,56 + Owner: Greece + Actor109: minv + Location: 59,57 + Owner: Greece + Actor110: minv + Location: 62,58 + Owner: Greece + Actor111: minv + Location: 60,58 + Owner: Greece + Actor112: minv + Location: 61,57 + Owner: Greece + Actor113: minv + Location: 61,59 + Owner: Greece + Actor114: minv + Location: 60,60 + Owner: Greece + Actor115: minv + Location: 61,61 + Owner: Greece + Actor116: minv + Location: 62,60 + Owner: Greece + Actor117: minv + Location: 59,59 + Owner: Greece + Actor118: gun + Location: 75,44 + Owner: Greece + Facing: 63 + Actor119: agun + Location: 77,50 + Owner: Greece + Facing: 31 + Actor120: weap + Location: 51,36 + Owner: Greece + Actor121: dome + Location: 62,38 + Owner: Greece + Actor122: gun + Location: 65,54 + Owner: Greece + Facing: 95 + Actor123: gun + Location: 75,49 + Owner: Greece + Facing: 63 + Actor124: gun + Location: 47,43 + Owner: Greece + Facing: 95 + Actor125: gun + Location: 61,51 + Owner: Greece + Facing: 127 + Actor126: gun + Location: 57,53 + Owner: Greece + Facing: 127 + Actor127: gun + Location: 64,44 + Owner: Greece + Facing: 31 + Actor128: fact + Location: 69,41 + Owner: Greece + Helipad4: hpad + Location: 61,42 + Owner: Greece + Helipad3: hpad + Location: 57,42 + Owner: Greece + Actor131: apwr + Location: 55,31 + Owner: Greece + Actor132: apwr + Location: 52,32 + Owner: Greece + Actor133: apwr + Location: 58,31 + Owner: Greece + Actor134: tent + Location: 59,36 + Owner: Greece + Actor135: hbox + Location: 31,44 + Owner: Greece + Actor136: hbox + Location: 48,45 + Owner: Greece + Actor137: hbox + Location: 53,54 + Owner: Greece + Actor138: hbox + Location: 36,51 + Owner: Greece + Actor139: hbox + Location: 43,42 + Owner: Greece + Actor140: hbox + Location: 74,50 + Owner: Greece + Actor141: agun + Location: 82,53 + Owner: Greece + Facing: 127 + Actor142: agun + Location: 85,42 + Owner: Greece + Helipad1: hpad + Location: 43,39 + Owner: Greece + Actor144: brl3 + Location: 55,46 + Owner: Greece + BridgeBarrel: brl3 + Location: 57,46 + Owner: Greece + Actor146: barl + Location: 56,46 + Owner: Greece + Actor147: barl + Location: 61,47 + Owner: Greece + Actor148: brl3 + Location: 62,47 + Owner: Greece + Actor149: barl + Location: 62,48 + Owner: Greece + Helipad2: hpad + Location: 48,40 + Owner: Greece + Actor151: minv + Location: 47,51 + Owner: Greece + Actor152: minv + Location: 44,52 + Owner: Greece + Actor153: minv + Location: 43,51 + Owner: Greece + Actor154: minv + Location: 42,52 + Owner: Greece + Actor155: minv + Location: 41,53 + Owner: Greece + Actor156: minv + Location: 41,51 + Owner: Greece + Actor157: minv + Location: 40,52 + Owner: Greece + Actor158: minv + Location: 46,52 + Owner: Greece + Actor159: minv + Location: 49,51 + Owner: Greece + Actor160: minv + Location: 48,52 + Owner: Greece + Actor161: minv + Location: 45,51 + Owner: Greece + Actor162: minv + Location: 45,53 + Owner: Greece + Actor163: minv + Location: 43,53 + Owner: Greece + Actor164: minv + Location: 50,52 + Owner: Greece + Actor165: minv + Location: 60,56 + Owner: Greece + Actor166: minv + Location: 59,61 + Owner: Greece + Actor167: hbox + Location: 76,48 + Owner: Greece + Actor168: hbox + Location: 76,45 + Owner: Greece + Actor169: hbox + Location: 68,41 + Owner: Greece + Actor170: hbox + Location: 72,43 + Owner: Greece + Actor171: agun + Location: 67,41 + Owner: Greece + Actor172: agun + Location: 73,41 + Owner: Greece + Actor173: agun + Location: 67,43 + Owner: Greece + Actor174: agun + Location: 73,43 + Owner: Greece + Actor175: agun + Location: 44,38 + Owner: Greece + Actor176: agun + Location: 51,41 + Owner: Greece + Actor177: apwr + Location: 55,34 + Owner: Greece + Actor178: gap + Location: 77,44 + Owner: Greece + NavalYard1: syrd + Location: 89,53 + Owner: Greece + Actor180: brl3 + Location: 82,51 + Owner: Greece + Actor181: apwr + Location: 74,41 + Owner: Greece + Actor182: 2tnk + Location: 40,45 + Owner: Greece + Facing: 261 + Actor183: 2tnk + Location: 61,56 + Owner: Greece + Facing: 507 + Actor184: 2tnk + Location: 61,55 + Owner: Greece + Facing: 499 + Actor185: 2tnk + Location: 40,47 + Owner: Greece + Facing: 253 + Actor186: 2tnk + Location: 60,55 + Owner: Greece + Facing: 531 + Actor187: 2tnk + Location: 62,55 + Owner: Greece + Facing: 491 + Actor188: 2tnk + Location: 49,44 + Owner: Greece + Facing: 325 + Actor189: 2tnk + Location: 61,35 + Owner: Greece + Facing: 380 + BridgeTank: 2tnk + Location: 56,44 + Owner: Greece + Facing: 127 + Actor191: 2tnk + Location: 49,36 + Owner: Greece + Facing: 396 + Actor192: arty + Location: 42,45 + Owner: Greece + Facing: 253 + Actor193: arty + Location: 64,61 + Owner: Greece + Facing: 293 + Actor194: arty + Location: 65,55 + Owner: Greece + Facing: 245 + Actor195: arty + Location: 42,47 + Owner: Greece + Facing: 261 + Actor196: arty + Location: 65,58 + Owner: Greece + Facing: 261 + Actor197: 1tnk + Location: 79,45 + Owner: Greece + Facing: 245 + Actor198: 1tnk + Location: 79,47 + Owner: Greece + Facing: 253 + Actor199: 1tnk + Location: 79,46 + Owner: Greece + Facing: 261 + Actor200: 1tnk + Location: 79,48 + Owner: Greece + Facing: 253 + Actor201: e3 + Location: 51,33 + Owner: Greece + SubCell: 0 + Actor202: e3 + Location: 51,34 + Owner: Greece + SubCell: 0 + Rocket1: e3 + Location: 58,34 + Owner: Greece + SubCell: 2 + Rocket2: e3 + Location: 59,34 + Owner: Greece + SubCell: 1 + Rocket3: e3 + Location: 61,34 + Owner: Greece + SubCell: 0 + Rocket4: e3 + Location: 62,34 + Owner: Greece + SubCell: 0 + Actor207: e3 + Location: 41,46 + Owner: Greece + SubCell: 2 + Actor208: e3 + Location: 41,46 + Owner: Greece + SubCell: 4 + Actor209: e3 + Location: 65,60 + Owner: Greece + SubCell: 4 + Rocket6: e3 + Location: 66,60 + Owner: Greece + SubCell: 1 + Rocket5: e3 + Location: 66,60 + Owner: Greece + SubCell: 4 + Actor212: ss + Location: 62,102 + Owner: USSR + Actor213: ss + Location: 67,101 + Owner: USSR + Actor214: ss + Location: 72,102 + Owner: USSR + Actor215: dd + Location: 67,97 + Owner: Greece + Facing: 277 + Health: 26 + Actor216: ca + Location: 35,39 + Owner: Greece + Facing: 159 + Actor217: dd + Location: 34,37 + Owner: Greece + Facing: 191 + Actor218: dd + Location: 78,59 + Owner: Greece + Facing: 380 + Actor219: dd + Location: 39,40 + Owner: Greece + Facing: 127 + Actor220: dd + Location: 38,37 + Owner: Greece + Facing: 159 + Actor221: dd + Location: 31,39 + Owner: Greece + Facing: 127 + Cruiser1: ca + Location: 19,31 + Owner: Greece + Facing: 515 + Gunboat1: pt + Location: 17,29 + Owner: Greece + Facing: 531 + Gunboat2: pt + Location: 21,29 + Owner: Greece + Facing: 507 + Actor225: pt + Location: 32,28 + Owner: Greece + Facing: 285 + Actor226: pt + Location: 32,29 + Owner: Greece + Facing: 237 + Actor227: pt + Location: 32,30 + Owner: Greece + Facing: 261 + Actor228: pt + Location: 61,98 + Owner: Greece + Facing: 364 + Actor229: ca + Location: 81,60 + Owner: Greece + Facing: 364 + Actor230: dd + Location: 84,58 + Owner: Greece + Facing: 412 + Actor231: dd + Location: 78,62 + Owner: Greece + Facing: 404 + Actor232: dd + Location: 83,62 + Owner: Greece + Facing: 388 + Actor233: pt + Location: 71,64 + Owner: Greece + Facing: 396 + Actor234: pt + Location: 75,66 + Owner: Greece + Facing: 364 + Actor237: ca + Location: 101,79 + Owner: Greece + Facing: 285 + AlliedCamera: camera + Location: 56,88 + Owner: Greece + Actor283: apwr + Location: 55,37 + Owner: Greece + Actor284: powr + Location: 47,37 + Owner: Greece + DefaultCameraPosition: waypoint + Location: 67,101 + Owner: Neutral + TransportEntry: waypoint + Owner: Neutral + Location: 67,107 + TransportStop: waypoint + Location: 67,103 + Owner: Neutral + AmbushTrigger: waypoint + Location: 94,70 + Owner: Neutral + SurpriseTransportEntry: waypoint + Location: 109,40 + Owner: Neutral + SurpriseTransportDrop: waypoint + Location: 101,62 + Owner: Neutral + ShipEntry: waypoint + Location: 19,28 + Owner: Neutral + ShipWaypoint1: waypoint + Location: 19,38 + Owner: Neutral + ShipWaypoint2: waypoint + Location: 21,65 + Owner: Neutral + ShipWaypoint3: waypoint + Location: 25,102 + Owner: Neutral + ShipWaypoint4: waypoint + Location: 42,105 + Owner: Neutral + ShipWaypoint5: waypoint + Owner: Neutral + Location: 64,101 + ShipWaypoint6: waypoint + Location: 57,73 + Owner: Neutral + AlliedTransportDrop1: waypoint + Location: 97,100 + Owner: Neutral + AlliedTransportDrop2: waypoint + Location: 36,98 + Owner: Neutral + AlliedTransportDrop3: waypoint + Location: 38,69 + Owner: Neutral + AlliedTransportEntry1: waypoint + Location: 109,99 + Owner: Neutral + AlliedTransportEntry2: waypoint + Location: 25,107 + Owner: Neutral + AlliedTransportEntry3: waypoint + Owner: Neutral + Location: 16,62 + PlayerBase: waypoint + Owner: Neutral + Location: 57,88 + CruiserEntry: waypoint + Location: 109,106 + Owner: Neutral + RocketPath1: waypoint + Location: 60,46 + Owner: Neutral + RocketPath2: waypoint + Location: 74,46 + Owner: Neutral + RocketPath3: waypoint + Location: 46,39 + Owner: Neutral + RocketPath4: waypoint + Location: 60,39 + Owner: Neutral + RocketPath5: waypoint + Location: 66,62 + Owner: Neutral + RocketPath6: waypoint + Location: 67,55 + Owner: Neutral + BaseBridge: waypoint + Location: 57,48 + 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-11a/rules.yaml b/mods/ra/maps/soviet-11a/rules.yaml new file mode 100644 index 0000000000..a9cac14ccc --- /dev/null +++ b/mods/ra/maps/soviet-11a/rules.yaml @@ -0,0 +1,91 @@ +World: + LuaScript: + Scripts: campaign-global.lua, soviet11a.lua, soviet11a-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-11a/soviet11a-AI.lua b/mods/ra/maps/soviet-11a/soviet11a-AI.lua new file mode 100644 index 0000000000..aa483856c3 --- /dev/null +++ b/mods/ra/maps/soviet-11a/soviet11a-AI.lua @@ -0,0 +1,242 @@ +--[[ + 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 } +PatrolPathA = { RocketPath1.Location, RocketPath2.Location } +PatrolPathB = { RocketPath3.Location, RocketPath4.Location } +PatrolPathC = { RocketPath5.Location, RocketPath6.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 } +} + +SurpriseTransportWay = { SurpriseTransportEntry.Location, SurpriseTransportDrop.Location } + +TransportUnits = +{ + easy = { { "1tnk", "1tnk", "2tnk" }, { "arty", "jeep", "1tnk" } }, + normal = { { "1tnk", "2tnk", "2tnk" }, { "arty", "arty", "1tnk" } }, + hard = { { "2tnk", "2tnk", "2tnk" }, { "arty", "arty", "2tnk" } } +} + +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 + +WesternBoatAttacks = 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), WesternBoatAttacks) + 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) +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.New(1024 * 7), function(a, id) + if a.Owner == USSR 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), WesternBoatAttacks) + 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-11a/soviet11a.lua b/mods/ra/maps/soviet-11a/soviet11a.lua new file mode 100644 index 0000000000..3afd9160f7 --- /dev/null +++ b/mods/ra/maps/soviet-11a/soviet11a.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 all Allied units and structures.") + 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 74803335d2..e42533fc5c 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -27,6 +27,7 @@ Soviet Campaign: soviet-08a soviet-08b soviet-09 + soviet-11a Counterstrike: sarin-gas-1-crackdown sarin-gas-2-down-under