diff --git a/mods/ra/maps/soviet-08b/map.bin b/mods/ra/maps/soviet-08b/map.bin new file mode 100644 index 0000000000..438f74e3bf Binary files /dev/null and b/mods/ra/maps/soviet-08b/map.bin differ diff --git a/mods/ra/maps/soviet-08b/map.png b/mods/ra/maps/soviet-08b/map.png new file mode 100644 index 0000000000..dc774179f2 Binary files /dev/null and b/mods/ra/maps/soviet-08b/map.png differ diff --git a/mods/ra/maps/soviet-08b/map.yaml b/mods/ra/maps/soviet-08b/map.yaml new file mode 100644 index 0000000000..520c6815d1 --- /dev/null +++ b/mods/ra/maps/soviet-08b/map.yaml @@ -0,0 +1,892 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 08b: Investigate Elba Island + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 28,27,87,79 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: Germany, Greece + PlayerReference@Germany: + Name: Germany + Bot: campaign + Faction: allies + Color: 505050 + Allies: Greece + Enemies: USSR + PlayerReference@Greece: + Name: Greece + Bot: campaign + Faction: allies + Color: E2E6F6 + Allies: Germany + Enemies: USSR + +Actors: + Actor0: sbag + Location: 61,56 + Owner: Germany + Actor1: sbag + Location: 62,56 + Owner: Germany + Actor2: sbag + Location: 62,57 + Owner: Germany + Actor3: wood + Location: 74,57 + Owner: Neutral + Actor4: wood + Location: 76,57 + Owner: Neutral + Actor5: wood + Location: 77,57 + Owner: Neutral + Actor6: sbag + Location: 62,58 + Owner: Germany + Actor7: wood + Location: 80,59 + Owner: Neutral + Actor8: wood + Location: 82,59 + Owner: Neutral + Actor9: sbag + Location: 53,62 + Owner: Germany + Actor10: sbag + Location: 53,63 + Owner: Germany + Actor11: sbag + Location: 54,63 + Owner: Germany + Actor12: sbag + Location: 55,63 + Owner: Germany + Actor13: sbag + Location: 56,63 + Owner: Germany + Actor14: sbag + Location: 57,63 + Owner: Germany + Actor15: sbag + Location: 58,63 + Owner: Germany + Actor16: wood + Location: 68,65 + Owner: Neutral + Actor17: v13 + Location: 71,65 + Owner: Neutral + Actor18: sbag + Location: 83,66 + Owner: Germany + Actor19: sbag + Location: 84,66 + Owner: Germany + Actor20: sbag + Location: 86,66 + Owner: Germany + Actor21: sbag + Location: 87,66 + Owner: Germany + Actor22: v14 + Location: 68,67 + Owner: Neutral + Actor23: v14 + Location: 69,67 + Owner: Neutral + Actor24: v14 + Location: 70,67 + Owner: Neutral + Actor25: sbag + Location: 84,67 + Owner: Germany + Actor26: sbag + Location: 86,67 + Owner: Germany + Actor27: sbag + Location: 65,68 + Owner: Germany + Actor28: sbag + Location: 65,69 + Owner: Germany + Actor29: sbag + Location: 65,72 + Owner: Germany + Actor30: sbag + Location: 65,73 + Owner: Germany + Actor31: sbag + Location: 47,81 + Owner: Germany + Actor32: sbag + Location: 48,81 + Owner: Germany + Actor33: sbag + Location: 49,81 + Owner: Germany + Actor34: sbag + Location: 47,85 + Owner: Germany + Actor35: sbag + Location: 48,85 + Owner: Germany + Actor36: sbag + Location: 49,85 + Owner: Germany + Actor37: t11 + Location: 54,100 + Owner: Neutral + Actor38: t15 + Location: 56,100 + Owner: Neutral + Actor39: tc05 + Location: 89,64 + Owner: Neutral + Actor40: tc04 + Location: 92,64 + Owner: Neutral + Actor41: tc02 + Location: 92,63 + Owner: Neutral + Actor42: tc01 + Location: 93,60 + Owner: Neutral + Actor43: tc02 + Location: 98,73 + Owner: Neutral + Actor44: tc02 + Location: 46,89 + Owner: Neutral + Actor45: tc05 + Location: 35,87 + Owner: Neutral + Actor46: tc05 + Location: 50,66 + Owner: Neutral + Actor47: t15 + Location: 37,53 + Owner: Neutral + Actor48: t08 + Location: 37,55 + Owner: Neutral + Actor49: tc05 + Location: 74,69 + Owner: Neutral + Actor50: t11 + Location: 78,69 + Owner: Neutral + Actor51: t08 + Location: 70,69 + Owner: Neutral + Actor52: t08 + Location: 90,73 + Owner: Neutral + Actor53: t10 + Location: 85,95 + Owner: Neutral + Actor54: t07 + Location: 83,97 + Owner: Neutral + Actor55: t08 + Location: 85,97 + Owner: Neutral + Actor56: tc04 + Location: 92,91 + Owner: Neutral + Actor57: tc03 + Location: 97,88 + Owner: Neutral + Actor58: tc02 + Location: 68,89 + Owner: Neutral + Actor59: tc04 + Location: 54,54 + Owner: Neutral + Actor60: tc02 + Location: 52,56 + Owner: Neutral + Actor61: tc01 + Location: 57,54 + Owner: Neutral + Actor62: t01 + Location: 68,67 + Owner: Neutral + Actor63: t11 + Location: 66,62 + Owner: Neutral + Actor64: tc03 + Location: 72,57 + Owner: Neutral + Actor65: tc05 + Location: 77,57 + Owner: Neutral + Actor66: tc02 + Location: 78,66 + Owner: Neutral + Actor67: t02 + Location: 81,37 + Owner: Neutral + Actor68: t02 + Location: 78,39 + Owner: Neutral + Actor69: tc03 + Location: 80,40 + Owner: Neutral + Actor70: tc04 + Location: 92,39 + Owner: Neutral + Actor71: tc05 + Location: 89,40 + Owner: Neutral + Actor72: tc02 + Location: 95,36 + Owner: Neutral + Actor73: tc01 + Location: 86,42 + Owner: Neutral + Actor74: tc04 + Location: 77,52 + Owner: Neutral + Actor75: tc02 + Location: 72,49 + Owner: Neutral + Actor76: t15 + Location: 83,35 + Owner: Neutral + Actor77: t14 + Location: 80,36 + Owner: Neutral + Actor78: t14 + Location: 104,44 + Owner: Neutral + Actor79: tc04 + Location: 55,64 + Owner: Neutral + Actor80: tc02 + Location: 63,66 + Owner: Neutral + Actor81: tc01 + Location: 54,70 + Owner: Neutral + Actor82: t17 + Location: 49,71 + Owner: Neutral + Actor83: t16 + Location: 59,75 + Owner: Neutral + Actor84: tc02 + Location: 67,53 + Owner: Neutral + Actor85: tc02 + Location: 75,53 + Owner: Neutral + Actor86: tc05 + Location: 71,46 + Owner: Neutral + Actor87: mine + Location: 89,93 + Owner: Neutral + Actor88: mine + Location: 91,96 + Owner: Neutral + Actor89: mine + Location: 38,87 + Owner: Neutral + Actor90: mine + Location: 46,81 + Owner: Neutral + Actor91: mine + Location: 91,69 + Owner: Neutral + Actor92: mine + Location: 84,55 + Owner: Neutral + Actor93: fact + Location: 79,83 + Owner: USSR + Actor94: powr + Location: 76,85 + Owner: USSR + Actor95: fact + Location: 50,38 + Owner: Greece + Actor96: spen + Location: 77,92 + Owner: USSR + Actor97: tent + Location: 57,59 + Owner: Germany + Actor98: weaf + Location: 58,56 + Owner: Germany + Actor99: facf + Location: 52,58 + Owner: Germany + Actor100: powr + Location: 55,56 + Owner: Germany + Actor101: hbox + Location: 56,62 + Owner: Germany + Actor102: gun + Location: 61,60 + Owner: Germany + Facing: 159 + Church: v01 + Location: 75,57 + Owner: Germany + Civ1: v02 + Location: 80,60 + Owner: Germany + Health: 89 + Civ2: v03 + Location: 76,62 + Owner: Germany + Civ3: v04 + Location: 71,60 + Owner: Germany + Health: 41 + Civ4: v05 + Location: 66,60 + Owner: Germany + Health: 37 + Civ5: v06 + Location: 69,65 + Owner: Germany + Civ6: v07 + Location: 71,66 + Owner: Germany + Health: 31 + Civ7: v09 + Location: 68,62 + Owner: Germany + Civ8: v11 + Location: 69,58 + Owner: Germany + Jeep1: jeep + Location: 79,80 + Owner: Germany + Facing: 159 + Jeep2: jeep + Location: 76,82 + Owner: Germany + Facing: 159 + Actor114: 1tnk + Location: 64,56 + Owner: Germany + Facing: 159 + Actor115: jeep + Location: 85,65 + Owner: Germany + Facing: 127 + Actor116: jeep + Location: 61,70 + Owner: Germany + Facing: 191 + Actor117: 2tnk + Location: 72,51 + Owner: Greece + Facing: 127 + Actor118: 2tnk + Location: 74,51 + Owner: Greece + Facing: 95 + Actor119: 2tnk + Location: 75,53 + Owner: Greece + Facing: 63 + Actor120: 1tnk + Location: 40,84 + Owner: Germany + Facing: 191 + Actor121: 2tnk + Location: 44,52 + Owner: Greece + Facing: 127 + Actor122: 2tnk + Location: 45,53 + Owner: Greece + Facing: 127 + Actor123: 2tnk + Location: 46,52 + Owner: Greece + Facing: 127 + Actor124: arty + Location: 44,51 + Owner: Greece + Facing: 127 + Actor125: arty + Location: 46,51 + Owner: Greece + Facing: 127 + Actor126: 2tnk + Location: 69,42 + Owner: Greece + Facing: 191 + Actor127: 2tnk + Location: 69,44 + Owner: Greece + Facing: 191 + Actor128: 2tnk + Location: 70,33 + Owner: Greece + Facing: 191 + Actor129: 2tnk + Location: 70,35 + Owner: Greece + Facing: 223 + Actor130: jeep + Location: 67,34 + Owner: Greece + Facing: 159 + Actor131: jeep + Location: 63,38 + Owner: Greece + Facing: 63 + Actor132: jeep + Location: 70,43 + Owner: Greece + Facing: 191 + Actor133: arty + Location: 69,34 + Owner: Greece + Facing: 191 + Actor134: arty + Location: 68,43 + Owner: Greece + Facing: 191 + Actor135: 2tnk + Location: 74,52 + Owner: Greece + Facing: 95 + Actor136: e1 + Location: 78,82 + Owner: USSR + SubCell: 4 + Actor137: e1 + Location: 79,82 + Owner: USSR + SubCell: 1 + Actor138: e1 + Location: 79,81 + Owner: USSR + SubCell: 4 + Rifle1: e1 + Location: 76,81 + Owner: Germany + Facing: 159 + SubCell: 4 + Rifle2: e1 + Location: 77,81 + Owner: Germany + Facing: 159 + SubCell: 2 + Rifle3: e1 + Location: 78,80 + Owner: Germany + Facing: 127 + SubCell: 3 + Rifle4: e1 + Location: 80,79 + Owner: Germany + Facing: 159 + SubCell: 3 + Actor143: e1 + Location: 48,82 + Owner: Germany + Facing: 159 + SubCell: 0 + Actor144: e3 + Location: 48,84 + Owner: Germany + Facing: 223 + SubCell: 4 + Actor145: e1 + Location: 64,68 + Owner: Germany + Facing: 159 + SubCell: 4 + Actor146: e1 + Location: 64,72 + Owner: Germany + Facing: 191 + SubCell: 4 + Actor147: e3 + Location: 83,65 + Owner: Germany + Facing: 159 + SubCell: 4 + Actor148: e3 + Location: 87,65 + Owner: Germany + Facing: 95 + SubCell: 4 + Actor149: e3 + Location: 93,74 + Owner: Germany + Facing: 127 + SubCell: 2 + Actor150: e3 + Location: 95,73 + Owner: Germany + Facing: 127 + SubCell: 0 + Actor151: e3 + Location: 97,74 + Owner: Germany + Facing: 127 + SubCell: 3 + Actor152: e1 + Location: 61,57 + Owner: Germany + SubCell: 4 + Actor153: e1 + Location: 63,58 + Owner: Germany + SubCell: 1 + Actor154: e3 + Location: 58,62 + Owner: Germany + Facing: 191 + SubCell: 0 + Actor155: e3 + Location: 73,51 + Owner: Greece + Facing: 127 + SubCell: 2 + Actor156: e3 + Location: 75,52 + Owner: Greece + Facing: 63 + SubCell: 2 + Actor157: e3 + Location: 75,50 + Owner: Greece + Facing: 95 + SubCell: 3 + Actor158: e3 + Location: 41,85 + Owner: Germany + Facing: 223 + SubCell: 0 + Actor159: c8 + Location: 68,64 + Owner: Germany + SubCell: 2 + Actor160: c8 + Location: 67,57 + Owner: Germany + SubCell: 1 + Actor161: c8 + Location: 81,59 + Owner: Germany + SubCell: 0 + Actor162: c6 + Location: 80,62 + Owner: Germany + SubCell: 3 + Actor163: c5 + Location: 78,61 + Owner: Germany + SubCell: 1 + Actor164: c4 + Location: 74,58 + Owner: Germany + SubCell: 2 + Actor165: c4 + Location: 74,60 + Owner: Germany + SubCell: 4 + Actor166: c3 + Location: 70,63 + Owner: Germany + SubCell: 4 + Actor167: c2 + Location: 66,62 + Owner: Germany + SubCell: 1 + Actor168: c2 + Location: 77,60 + Owner: Germany + SubCell: 1 + Actor169: c2 + Location: 74,66 + Owner: Germany + SubCell: 4 + Actor170: c1 + Location: 73,59 + Owner: Germany + SubCell: 2 + Actor171: c1 + Location: 73,65 + Owner: Germany + SubCell: 0 + Actor172: e1 + Location: 76,64 + Owner: Germany + Facing: 191 + SubCell: 1 + Actor173: e1 + Location: 68,59 + Owner: Germany + Facing: 159 + SubCell: 1 + Actor174: ss + Location: 74,92 + Owner: USSR + Facing: 95 + Actor175: ss + Location: 76,96 + Owner: USSR + Facing: 95 + Actor176: ss + Location: 74,94 + Owner: USSR + Facing: 95 + Actor177: ss + Location: 79,96 + Owner: USSR + Facing: 127 + Gunboat1: pt + Location: 112,36 + Owner: Greece + Gunboat2: pt + Location: 29,31 + Owner: Greece + Gunboat3: pt + Location: 30,50 + Owner: Greece + Gunboat4: pt + Location: 41,104 + Owner: Greece + Gunboat5: pt + Location: 112,54 + Owner: Greece + Gunboat6: pt + Location: 88,29 + Owner: Greece + GreeceWarFactory: weap + Owner: Greece + Location: 49,43 + Actor253: agun + Owner: Greece + Location: 51,36 + TurretFacing: 92 + Actor255: hbox + Owner: Greece + Location: 46,36 + TurretFacing: 92 + Actor256: apwr + Owner: Greece + Location: 43,35 + Actor257: apwr + Owner: Greece + Location: 47,33 + Actor258: apwr + Owner: Greece + Location: 44,32 + Actor259: dome + Owner: Greece + Location: 44,38 + Actor260: agun + Owner: Greece + Location: 47,40 + TurretFacing: 92 + GreeceTent1: tent + Owner: Greece + Location: 45,41 + Actor262: hbox + Owner: Greece + Location: 47,44 + TurretFacing: 92 + GreeceNavalYard: syrd + Owner: Greece + Location: 56,30 + Actor264: fix + Owner: Greece + Location: 54,36 + Actor265: agun + Owner: Greece + Location: 55,40 + TurretFacing: 92 + Actor266: hbox + Owner: Greece + Location: 57,40 + TurretFacing: 92 + Actor267: proc + Owner: Greece + Location: 56,41 + Actor268: silo + Owner: Greece + Location: 56,41 + Actor269: silo + Owner: Greece + Location: 58,41 + Actor270: proc + Owner: Greece + Location: 58,36 + Actor271: silo + Owner: Greece + Location: 58,36 + Actor272: silo + Owner: Greece + Location: 60,36 + GreeceTent2: tent + Owner: Greece + Location: 61,40 + Actor274: gun + Owner: Greece + Location: 64,40 + TurretFacing: 92 + Actor275: gun + Owner: Greece + Location: 64,43 + TurretFacing: 92 + Actor276: gun + Owner: Greece + Location: 64,46 + TurretFacing: 92 + Actor277: gun + Owner: Greece + Location: 63,34 + TurretFacing: 92 + Actor278: gun + Owner: Greece + Location: 63,36 + TurretFacing: 92 + Actor279: gun + Owner: Greece + Location: 44,46 + TurretFacing: 92 + Actor280: gun + Owner: Greece + Location: 48,48 + TurretFacing: 92 + Actor242: apwr + Owner: Greece + Location: 47,36 + ScoutRetreat: waypoint + Location: 61,72 + Owner: Neutral + SouthEntry: waypoint + Location: 74,105 + Owner: Neutral + Unload1: waypoint + Location: 72,90 + Owner: Neutral + Unload2: waypoint + Location: 76,90 + Owner: Neutral + ScriptedParadrop: waypoint + Location: 74,76 + Owner: Neutral + ChurchAmbush: waypoint + Location: 75,58 + Owner: Neutral + AmbushMove: waypoint + Location: 75,64 + Owner: Neutral + DDEntry: waypoint + Location: 39,27 + Owner: Neutral + DDEntryStop: waypoint + Location: 39,29 + Owner: Neutral + DDPatrol1Point1: waypoint + Location: 31,43 + Owner: Neutral + DDPatrol1Point2: waypoint + Location: 30,89 + Owner: Neutral + DDPatrol1Point3: waypoint + Location: 41,99 + Owner: Neutral + DDPatrol1Point4: waypoint + Location: 53,88 + Owner: Neutral + DDPatrol2Point1: waypoint + Location: 62,29 + Owner: Neutral + DDPatrol2Point2: waypoint + Location: 111,29 + Owner: Neutral + DDPatrol2Point3: waypoint + Location: 109,71 + Owner: Neutral + DDPatrol2Point4: waypoint + Location: 99,82 + Owner: Neutral + WaterUnloadEntry1: waypoint + Location: 28,32 + Owner: Neutral + WaterUnload1: waypoint + Location: 37,48 + Owner: Neutral + WaterUnloadEntry2: waypoint + Location: 28,50 + Owner: Neutral + WaterUnload2: waypoint + Location: 41,63 + Owner: Neutral + WaterUnloadEntry3: waypoint + Location: 28,72 + Owner: Neutral + WaterUnload3: waypoint + Location: 36,80 + Owner: Neutral + WaterUnloadEntry4: waypoint + Location: 39,105 + Owner: Neutral + WaterUnload4: waypoint + Location: 41,92 + Owner: Neutral + WaterUnloadEntry5: waypoint + Location: 114,42 + Owner: Neutral + WaterUnload5: waypoint + Location: 99,58 + Owner: Neutral + WaterUnloadEntry6: waypoint + Location: 114,37 + Owner: Neutral + WaterUnload6: waypoint + Location: 102,38 + Owner: Neutral + SovietBase: waypoint + Location: 77,82 + Owner: Neutral + BoatRally: waypoint + Location: 78,91 + 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-08b/rules.yaml b/mods/ra/maps/soviet-08b/rules.yaml new file mode 100644 index 0000000000..299dba5246 --- /dev/null +++ b/mods/ra/maps/soviet-08b/rules.yaml @@ -0,0 +1,139 @@ +World: + LuaScript: + Scripts: soviet08b.lua, soviet08b-AI.lua + MissionData: + Briefing: We have detected Allied activity on Elba island. The Allies plan to use this island to stage an attack on the Soviet Empire.\n\nYou must ensure that the island ceases to be under Allied control. Destroy all Allied units on and around the island.\n\nThe local population has been aiding the Allies as well. There is only one punishment for helping the enemy - Death. + BriefingVideo: soviet8.vqa + StartVideo: slntsrvc.vqa + WinVideo: bombrun.vqa + LossVideo: allymorf.vqa + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +Player: + PlayerResources: + DefaultCash: 5000 + +CAMERA: + RevealsShroud: + Range: 6c0 + +LST.Reinforcement: + Inherits: LST + RejectsOrders: + -Buildable: + -Selectable: + RenderSprites: + Image: lst + Interactable: + +V01: + -SpawnActorOnDeath@1: + -SpawnActorOnDeath@2: + -SpawnActorOnDeath@3: + +SCRIPTEDDROP: + ParatroopersPower: + DisplayBeacon: False + DropItems: E1,E1,E4,E4,E4 + AlwaysVisible: + +AFLD: + AirstrikePower@parabombs: + Prerequisites: aircraft.soviet + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E2,E2 + +MONEYCRATE: + GiveCashCrateAction: + Amount: 2000 + +STEK: + Buildable: + Prerequisites: ~disabled + +ATEK: + Buildable: + Prerequisites: ~disabled + +HPAD: + Buildable: + Prerequisites: ~disabled + +SAM: + Buildable: + Prerequisites: ~disabled + +IRON: + Buildable: + Prerequisites: ~disabled + +MSLO: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +FTRK: + Buildable: + Prerequisites: ~disabled + +4TNK: + Buildable: + Prerequisites: ~disabled + +QTNK: + Buildable: + Prerequisites: ~disabled + +MRJ: + Buildable: + Prerequisites: ~disabled + +MIG: + Buildable: + Prerequisites: ~disabled + +HELI: + Buildable: + Prerequisites: ~disabled + +MSUB: + Buildable: + Prerequisites: ~disabled + +CA: + Buildable: + Prerequisites: ~disabled + +THF: + Buildable: + Prerequisites: ~disabled + +GAP: + Buildable: + Prerequisites: ~disabled + +PDOX: + Buildable: + Prerequisites: ~disabled + +E7: + Buildable: + Prerequisites: ~disabled + +MECH: + Buildable: + Prerequisites: ~disabled + +E3: + Buildable: + Prerequisites: ~tent diff --git a/mods/ra/maps/soviet-08b/soviet08b-AI.lua b/mods/ra/maps/soviet-08b/soviet08b-AI.lua new file mode 100644 index 0000000000..3a0a29b053 --- /dev/null +++ b/mods/ra/maps/soviet-08b/soviet08b-AI.lua @@ -0,0 +1,156 @@ +--[[ + Copyright 2007-2020 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. +]] +IdlingUnits = { } + +DDPatrol = { "dd", "dd" } +DDPatrol1Path = { DDPatrol1Point1.Location, DDPatrol1Point2.Location, DDPatrol1Point3.Location, DDPatrol1Point4.Location } +DDPatrol2Path = { DDPatrol2Point1.Location, DDPatrol2Point2.Location, DDPatrol2Point3.Location, DDPatrol2Point4.Location } +ShipArrivePath = { DDEntry.Location, DDEntryStop.Location } + +WTransWays = +{ + { WaterUnloadEntry1.Location, WaterUnload1.Location }, + { WaterUnloadEntry2.Location, WaterUnload2.Location }, + { WaterUnloadEntry3.Location, WaterUnload3.Location }, + { WaterUnloadEntry4.Location, WaterUnload4.Location }, + { WaterUnloadEntry5.Location, WaterUnload5.Location }, + { WaterUnloadEntry6.Location, WaterUnload6.Location } +} + +WTransUnits = +{ + hard = { { "2tnk", "1tnk", "e1", "e3", "e3" }, { "2tnk", "2tnk", "2tnk" } }, + normal = { { "1tnk", "1tnk", "e3", "e3", "jeep" }, { "2tnk", "e3", "e3", "jeep" } }, + easy = { { "1tnk", "e1", "e1", "e3", "e3" }, { "e3", "e3", "jeep", "jeep" } } +} + +WTransDelays = +{ + easy = DateTime.Minutes(4), + normal = DateTime.Minutes(2), + hard = DateTime.Minutes(1) +} + +AttackGroup = { } +AttackGroupSize = 10 + +ProductionInterval = +{ + easy = DateTime.Seconds(30), + normal = DateTime.Seconds(20), + hard = DateTime.Seconds(10) +} + +AlliedInfantry = { "e1", "e3" } +AlliedVehiclesUpgradeDelay = DateTime.Minutes(15) +AlliedVehicleType = "Normal" +AlliedVehicles = +{ + Normal = { "jeep", "1tnk", "1tnk" }, + Upgraded = { "2tnk", "arty" } +} + +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +WTransWaves = function() + local way = Utils.Random(WTransWays) + local units = Utils.Random(WTransUnits) + local attackUnits = Reinforcements.ReinforceWithTransport(Greece, "lst", units , way, { way[2], way[1] })[2] + Utils.Do(attackUnits, function(a) + Trigger.OnAddedToWorld(a, function() + a.AttackMove(SovietBase.Location) + IdleHunt(a) + end) + end) + + Trigger.AfterDelay(WTransDelays, WTransWaves) +end + +SendAttackGroup = function() + if #AttackGroup < AttackGroupSize then + return + end + + Utils.Do(AttackGroup, function(unit) + if not unit.IsDead then + Trigger.OnIdle(unit, unit.Hunt) + end + end) + + AttackGroup = { } +end + +ProduceInfantry = function() + if (GreeceTent1.IsDead or GreeceTent1.Owner ~= Greece) and (GreeceTent2.IsDead or GreeceTent2.Owner ~= Greece) then + return + end + + Greece.Build({ Utils.Random(AlliedInfantry) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceInfantry) + end) +end + +ProduceVehicles = function() + if GreeceWarFactory.IsDead or GreeceWarFactory.Owner ~= Greece then + return + end + + Greece.Build({ Utils.Random(AlliedVehicles[AlliedVehicleType]) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceVehicles) + end) +end + +BringDDPatrol = function(patrolPath) + local units = Reinforcements.Reinforce(Greece, DDPatrol, ShipArrivePath) + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(patrols) + patrols.Patrol(patrolPath, true, 200) + end) + end) + + Trigger.OnAllKilled(units, function() + if GreeceNavalYard.IsDead then + return + else + if Map.LobbyOption("difficulty") == "easy" then + Trigger.AfterDelay(DateTime.Minutes(7), function() BringDDPatrol(patrolPath) end) + else + Trigger.AfterDelay(DateTime.Minutes(4), function() BringDDPatrol(patrolPath) end) + end + end + end) +end + +ActivateAI = function() + local difficulty = Map.LobbyOption("difficulty") + WTransUnits = WTransUnits[difficulty] + WTransDelays = WTransDelays[difficulty] + + 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) + + Trigger.AfterDelay(DateTime.Minutes(3), WTransWaves) + + Trigger.AfterDelay(AlliedVehiclesUpgradeDelay, function() AlliedVehicleType = "Upgraded" end) + + ProduceInfantry() + ProduceVehicles() + BringDDPatrol(DDPatrol1Path) + Trigger.AfterDelay(DateTime.Minutes(1), function() BringDDPatrol(DDPatrol2Path) end) +end diff --git a/mods/ra/maps/soviet-08b/soviet08b.lua b/mods/ra/maps/soviet-08b/soviet08b.lua new file mode 100644 index 0000000000..be3e6b9480 --- /dev/null +++ b/mods/ra/maps/soviet-08b/soviet08b.lua @@ -0,0 +1,174 @@ +--[[ + Copyright 2007-2020 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. +]] +AlliedScouts = { Jeep1, Jeep2, Rifle1, Rifle2, Rifle3, Rifle4 } + +SovReinforcements = +{ + one = + { + actors = { "e1", "e1", "e1", "e1", "e1" }, + entryPath = { SouthEntry.Location, Unload1.Location + CVec.New(1, 0) }, + exitPath = { SouthEntry.Location }, + }, + two = + { + actors = { "e4", "e4", "e1", "e1", "e1" }, + entryPath = { SouthEntry.Location, Unload2.Location + CVec.New(0, 1) }, + exitPath = { SouthEntry.Location } + }, + mammoth = + { + actors = { "4tnk" }, + entryPath = { SouthEntry.Location, Unload1.Location + CVec.New(0, 1) }, + exitPath = { SouthEntry.Location } + } +} + +Village = { Church, Civ1, Civ2, Civ3, Civ4, Civ5, Civ6, Civ7, Civ8 } + +ActivateAIDelay = DateTime.Seconds(45) + +FirstReinforcementTrigger = function() + Trigger.AfterDelay(DateTime.Seconds(30), function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + local reinforcement = SovReinforcements.one + Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", reinforcement.actors, reinforcement.entryPath, reinforcement.exitPath) + end) +end + +SecondReinforcementTrigger = function() + Trigger.AfterDelay(DateTime.Seconds(60), function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + local reinforcement = SovReinforcements.two + Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", reinforcement.actors, reinforcement.entryPath, reinforcement.exitPath) + end) +end + +AddParadropReinforcementTrigger = function() + Trigger.AfterDelay(DateTime.Seconds(90), function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + ScriptedDrop.TargetParatroopers(ScriptedParadrop.CenterPosition, Angle.New(0)) + end) +end + +ChurchAmbushTrigger = function() + if not AmbushSwitch then + local hiding = Reinforcements.Reinforce(Germany, { 'e1', 'e1', 'e1', 'e1', 'e1', 'e1', 'e1', 'e3', 'e3', 'e3' }, { ChurchAmbush.Location, AmbushMove.Location }, 0) + Utils.Do(hiding, IdleHunt) + end + AmbushSwitch = true +end + +Trigger.OnKilled(Church, function() + Actor.Create("moneycrate", true, { Owner = USSR, Location = ChurchAmbush.Location }) +end) + +DestroyVillage = function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + USSR.MarkCompletedObjective(DestroyVillageObjective) + local reinforcement = SovReinforcements.mammoth + Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", reinforcement.actors, reinforcement.entryPath, reinforcement.exitPath) +end + +AddRetreatTrigger = function() + Trigger.OnEnteredProximityTrigger(Jeep2.CenterPosition, WDist.FromCells(12), function(actor, id) + if actor.Owner == USSR and actor.Type == "barr" then + AlliedScouts = Utils.Where(AlliedScouts, function(scout) return not scout.IsDead end) + local removed + Utils.Do(AlliedScouts, function(scout) + if scout.Type == "e1" and not removed then + removed = true + else + scout.Stop() + scout.Move(ScoutRetreat.Location, 1) + end + end) + Trigger.RemoveProximityTrigger(id) + end + end) +end + +BoatAttack = function(boat) + if boat.IsDead then + return + else + boat.AttackMove(BoatRally.Location) + end +end + +Tick = function() + Greece.Cash = 1000 + + if Greece.HasNoRequiredUnits() and Germany.HasNoRequiredUnits() then + USSR.MarkCompletedObjective(KillAll) + end + + if USSR.HasNoRequiredUnits() then + Greece.MarkCompletedObjective(BeatUSSR) + end +end + +WorldLoaded = function() + USSR = Player.GetPlayer("USSR") + Germany = Player.GetPlayer("Germany") + Greece = Player.GetPlayer("Greece") + + Trigger.OnObjectiveAdded(USSR, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + KillAll = USSR.AddObjective("Destroy all Allied units and structures.") + DestroyVillageObjective = USSR.AddObjective("Destroy the village of Allied sympathizers.", "Secondary", false) + BeatUSSR = Greece.AddObjective("Defeat the Soviet forces.") + + 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) + + FirstReinforcementTrigger() + SecondReinforcementTrigger() + AddParadropReinforcementTrigger() + AddRetreatTrigger() + + ScriptedDrop = Actor.Create("scripteddrop", false, { Owner = USSR }) + + OnAnyDamaged(Village, ChurchAmbushTrigger) + + Trigger.OnAllRemovedFromWorld(Village, DestroyVillage) + + Camera.Position = SovietBase.CenterPosition + + Trigger.AfterDelay(ActivateAIDelay, ActivateAI) + Trigger.AfterDelay(DateTime.Minutes(2), function() BoatAttack(Gunboat1) end) + Trigger.AfterDelay(DateTime.Minutes(5), function() BoatAttack(Gunboat2) end) + Trigger.AfterDelay(DateTime.Minutes(7), function() BoatAttack(Gunboat3) end) + Trigger.AfterDelay(DateTime.Minutes(10), function() BoatAttack(Gunboat4) end) + Trigger.AfterDelay(DateTime.Minutes(12), function() BoatAttack(Gunboat5) end) + Trigger.AfterDelay(DateTime.Minutes(14), function() BoatAttack(Gunboat6) end) +end + +OnAnyDamaged = function(actors, func) + Utils.Do(actors, function(actor) + Trigger.OnDamaged(actor, func) + end) +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index bfac7ece0b..4273251e2f 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -22,6 +22,7 @@ Soviet Campaign: soviet-06b soviet-07 soviet-08a + soviet-08b Counterstrike: sarin-gas-1-crackdown sarin-gas-2-down-under