diff --git a/mods/ra/languages/lua/en.ftl b/mods/ra/languages/lua/en.ftl index 3845d57a0d..8ec5652282 100644 --- a/mods/ra/languages/lua/en.ftl +++ b/mods/ra/languages/lua/en.ftl @@ -352,6 +352,12 @@ save-migs = Do not squander any of our new MiG aircraft. ## soviet-11b destroy-allied-naval-base = Destroy Allied naval base. +## soviet-13a, soviet13b +chrono-trap-triggered = We failed to take the trap offline! +destroy-allied-radar-sites = Destroy the Allied radar sites before approaching + the Chronoshpere. +capture-the-chronosphere = Capture the Chronoshpere. + ## soviet-soldier-volkov-n-chitzkoi destroy-control-center = Destroy the Control Center. tank-division-must-not-be-destroyed = Your tank division must not be destroyed before diff --git a/mods/ra/maps/soviet-13a/map.bin b/mods/ra/maps/soviet-13a/map.bin new file mode 100644 index 0000000000..76142e71e2 Binary files /dev/null and b/mods/ra/maps/soviet-13a/map.bin differ diff --git a/mods/ra/maps/soviet-13a/map.png b/mods/ra/maps/soviet-13a/map.png new file mode 100644 index 0000000000..dc774179f2 Binary files /dev/null and b/mods/ra/maps/soviet-13a/map.png differ diff --git a/mods/ra/maps/soviet-13a/map.yaml b/mods/ra/maps/soviet-13a/map.yaml new file mode 100644 index 0000000000..7debbb5f5c --- /dev/null +++ b/mods/ra/maps/soviet-13a/map.yaml @@ -0,0 +1,940 @@ +MapFormat: 12 + +RequiresMod: ra + +Title: 13a: Capture the Chronosphere + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 18,17,96,90 + +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 + Allies: GoodGuy + Enemies: USSR + PlayerReference@GoodGuy: + Name: GoodGuy + Faction: allies + Color: E2E6F6 + Allies: Greece + 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: GoodGuy, Greece + +Actors: + Actor0: cycl + Location: 42,73 + Owner: Greece + Actor1: cycl + Location: 43,73 + Owner: Greece + Actor2: cycl + Location: 44,73 + Owner: Greece + Actor3: cycl + Location: 45,73 + Owner: Greece + Actor4: cycl + Location: 46,73 + Owner: Greece + Actor5: cycl + Location: 50,73 + Owner: Greece + Actor6: cycl + Location: 51,73 + Owner: Greece + Actor7: cycl + Location: 52,73 + Owner: Greece + Actor8: cycl + Location: 53,73 + Owner: Greece + Actor9: cycl + Location: 54,73 + Owner: Greece + Actor10: cycl + Location: 55,73 + Owner: Greece + Actor11: cycl + Location: 26,74 + Owner: Greece + Actor12: cycl + Location: 27,74 + Owner: Greece + Actor13: cycl + Location: 28,74 + Owner: Greece + Actor14: cycl + Location: 29,74 + Owner: Greece + Actor15: cycl + Location: 30,74 + Owner: Greece + Actor16: cycl + Location: 35,74 + Owner: Greece + Actor17: cycl + Location: 36,74 + Owner: Greece + Actor18: cycl + Location: 41,74 + Owner: Greece + Actor19: cycl + Location: 42,74 + Owner: Greece + Actor20: cycl + Location: 55,74 + Owner: Greece + Actor21: cycl + Location: 56,74 + Owner: Greece + Actor22: cycl + Location: 25,75 + Owner: Greece + Actor23: cycl + Location: 26,75 + Owner: Greece + Actor24: cycl + Location: 36,75 + Owner: Greece + Actor25: cycl + Location: 37,75 + Owner: Greece + Actor26: cycl + Location: 38,75 + Owner: Greece + Actor27: cycl + Location: 39,75 + Owner: Greece + Actor28: cycl + Location: 40,75 + Owner: Greece + Actor29: cycl + Location: 41,75 + Owner: Greece + Actor30: cycl + Location: 56,75 + Owner: Greece + Actor31: cycl + Location: 57,75 + Owner: Greece + Actor32: cycl + Location: 58,75 + Owner: Greece + Actor33: cycl + Location: 59,75 + Owner: Greece + Actor34: cycl + Location: 25,76 + Owner: Greece + Actor35: cycl + Location: 59,76 + Owner: Greece + Actor36: cycl + Location: 62,79 + Owner: Greece + Actor37: cycl + Location: 63,79 + Owner: Greece + Actor38: cycl + Location: 64,79 + Owner: Greece + Actor39: cycl + Location: 64,80 + Owner: Greece + Actor40: cycl + Location: 65,80 + Owner: Greece + Actor41: cycl + Location: 66,80 + Owner: Greece + Actor42: cycl + Location: 66,81 + Owner: Greece + Actor43: cycl + Location: 67,81 + Owner: Greece + Actor44: cycl + Location: 68,81 + Owner: Greece + Actor45: cycl + Location: 69,81 + Owner: Greece + Actor46: cycl + Location: 66,88 + Owner: Greece + Actor47: cycl + Location: 67,88 + Owner: Greece + Actor48: cycl + Location: 68,88 + Owner: Greece + Actor49: cycl + Location: 69,88 + Owner: Greece + Actor50: cycl + Location: 70,88 + Owner: Greece + Actor51: cycl + Location: 71,88 + Owner: Greece + Actor52: cycl + Location: 71,89 + Owner: Greece + Actor53: cycl + Location: 71,90 + Owner: Greece + Actor54: cycl + Location: 71,91 + Owner: Greece + Actor55: cycl + Location: 54,95 + Owner: Greece + Actor56: cycl + Location: 55,95 + Owner: Greece + Actor57: cycl + Location: 58,95 + Owner: Greece + Actor58: cycl + Location: 59,95 + Owner: Greece + Actor59: cycl + Location: 54,96 + Owner: Greece + Actor60: cycl + Location: 59,96 + Owner: Greece + Actor61: cycl + Location: 54,97 + Owner: Greece + Actor62: cycl + Location: 55,97 + Owner: Greece + Actor63: cycl + Location: 56,97 + Owner: Greece + Actor64: cycl + Location: 57,97 + Owner: Greece + Actor65: cycl + Location: 58,97 + Owner: Greece + Actor66: cycl + Location: 59,97 + Owner: Greece + Actor67: cycl + Location: 71,97 + Owner: Greece + Actor68: cycl + Location: 71,98 + Owner: Greece + Actor69: brik + Location: 26,100 + Owner: Greece + Actor70: brik + Location: 27,100 + Owner: Greece + Actor71: brik + Location: 28,100 + Owner: Greece + Actor72: brik + Location: 29,100 + Owner: Greece + Actor73: brik + Location: 26,101 + Owner: Greece + Actor74: brik + Location: 29,101 + Owner: Greece + Actor75: brik + Location: 26,102 + Owner: Greece + Actor76: brik + Location: 29,102 + Owner: Greece + Actor77: brik + Location: 26,103 + Owner: Greece + Actor78: brik + Location: 27,103 + Owner: Greece + Actor79: brik + Location: 28,103 + Owner: Greece + Actor80: brik + Location: 29,103 + Owner: Greece + Actor81: tc02 + Location: 46,99 + Owner: Neutral + Actor82: t01 + Location: 92,88 + Owner: Neutral + Actor83: tc04 + Location: 73,89 + Owner: Neutral + Actor84: tc01 + Location: 76,91 + Owner: Neutral + Actor85: tc04 + Location: 60,65 + Owner: Neutral + Actor86: t12 + Location: 64,65 + Owner: Neutral + Actor87: tc02 + Location: 93,17 + Owner: Neutral + Actor88: tc05 + Location: 104,19 + Owner: Neutral + Actor89: tc04 + Location: 111,17 + Owner: Neutral + Actor90: tc01 + Location: 46,56 + Owner: Neutral + Actor91: tc05 + Location: 36,54 + Owner: Neutral + Actor92: tc04 + Location: 39,56 + Owner: Neutral + Actor93: tc03 + Location: 37,67 + Owner: Neutral + Actor94: tc02 + Location: 52,62 + Owner: Neutral + Actor95: tc03 + Location: 70,59 + Owner: Neutral + Actor96: tc02 + Location: 82,62 + Owner: Neutral + Actor97: t16 + Location: 42,48 + Owner: Neutral + Actor98: t15 + Location: 27,68 + Owner: Neutral + Actor99: t14 + Location: 56,68 + Owner: Neutral + Actor100: t13 + Location: 59,50 + Owner: Neutral + Actor101: t12 + Location: 92,54 + Owner: Neutral + Actor102: t11 + Location: 108,26 + Owner: Neutral + Actor103: tc04 + Location: 23,63 + Owner: Neutral + Actor104: tc02 + Location: 18,52 + Owner: Neutral + Actor105: tc01 + Location: 29,53 + Owner: Neutral + Actor106: t15 + Location: 27,59 + Owner: Neutral + Actor107: tc01 + Location: 20,57 + Owner: Neutral + Actor108: t16 + Location: 19,58 + Owner: Neutral + Actor109: t13 + Location: 18,57 + Owner: Neutral + Actor110: mine + Location: 101,27 + Owner: Neutral + Actor111: mine + Location: 84,92 + Owner: Neutral + Actor112: mine + Location: 84,74 + Owner: Neutral + Actor113: tc04 + Location: 58,99 + Owner: Neutral + Actor114: tc02 + Location: 55,100 + Owner: Neutral + Actor115: t17 + Location: 54,99 + Owner: Neutral + Actor116: t16 + Location: 53,100 + Owner: Neutral + Actor117: atek + Location: 27,96 + Owner: Greece + Chronosphere: pdox + Location: 27,101 + Owner: Greece + Actor119: pbox + Location: 48,75 + Owner: Greece + Actor120: pbox + Location: 58,80 + Owner: Greece + Actor121: pbox + Location: 34,74 + Owner: Greece + Actor122: pbox + Location: 31,74 + Owner: Greece + Actor123: hbox + Location: 46,99 + Owner: Greece + Actor124: hbox + Location: 26,83 + Owner: Greece + Actor125: hbox + Location: 27,89 + Owner: Greece + Actor126: hbox + Location: 71,94 + Owner: Greece + Radar4: dome + Location: 44,104 + Owner: Greece + Actor128: gap + Location: 47,105 + Owner: Greece + Actor129: gap + Location: 26,78 + Owner: Greece + Actor130: gun + Location: 58,78 + Owner: Greece + Facing: 223 + Actor131: gun + Location: 60,80 + Owner: Greece + Facing: 223 + Actor132: gun + Location: 50,72 + Owner: Greece + Actor133: gun + Location: 46,72 + Owner: Greece + Actor134: gun + Location: 71,92 + Owner: Greece + Facing: 191 + Actor135: gun + Location: 71,96 + Owner: Greece + Facing: 191 + Actor136: fact + Location: 47,84 + Owner: Greece + Actor137: proc + Location: 54,90 + Owner: Greece + Actor138: proc + Location: 59,90 + Owner: Greece + Actor139: silo + Location: 56,96 + Owner: Greece + Actor140: silo + Location: 58,96 + Owner: Greece + Actor141: silo + Location: 57,96 + Owner: Greece + Actor142: silo + Location: 55,96 + Owner: Greece + HPad1: hpad + Location: 32,73 + Owner: Greece + HPad4: hpad + Location: 49,100 + Owner: Greece + Actor145: apwr + Location: 44,86 + Owner: Greece + Actor146: apwr + Location: 43,99 + Owner: Greece + Actor147: apwr + Location: 60,95 + Owner: Greece + Actor148: apwr + Location: 51,95 + Owner: Greece + Actor150: apwr + Location: 50,86 + Owner: Greece + Actor151: apwr + Location: 31,91 + Owner: Greece + GreeceTent2: tent + Location: 19,98 + Owner: Greece + GreeceTent1: tent + Location: 46,80 + Owner: Greece + Radar2: dome + Location: 29,90 + Owner: Greece + Radar3: dome + Location: 48,88 + Owner: Greece + Radar1: dome + Location: 27,75 + Owner: Greece + HPad2: hpad + Location: 56,76 + Owner: Greece + Actor158: syrd + Location: 73,84 + Owner: Greece + GoodguyShipyard: syrd + Location: 32,43 + Owner: GoodGuy + Actor160: brl3 + Location: 71,87 + Owner: Greece + Actor161: barl + Location: 71,86 + Owner: Greece + Actor162: barl + Location: 70,87 + Owner: Greece + Actor163: barl + Location: 70,89 + Owner: Greece + Actor164: brl3 + Location: 70,90 + Owner: Greece + Actor165: brl3 + Location: 69,89 + Owner: Greece + Actor166: barl + Location: 69,90 + Owner: Greece + Actor167: barl + Location: 70,91 + Owner: Greece + Actor168: v19 + Location: 67,89 + Owner: Greece + Actor169: v19 + Location: 69,91 + Owner: Greece + Actor170: hbox + Location: 27,93 + Owner: Greece + HPad3: hpad + Location: 61,80 + Owner: Greece + Actor172: gap + Location: 24,46 + Owner: GoodGuy + Actor173: gun + Location: 27,42 + Owner: Greece + Facing: 223 + Actor174: gun + Location: 25,41 + Owner: Greece + Facing: 223 + Actor175: agun + Location: 28,45 + Owner: GoodGuy + Actor176: agun + Location: 23,42 + Owner: GoodGuy + Actor177: fact + Location: 20,42 + Owner: GoodGuy + Actor178: weap + Location: 25,50 + Owner: GoodGuy + Actor179: apwr + Location: 25,47 + Owner: GoodGuy + Actor180: apwr + Location: 18,46 + Owner: GoodGuy + Actor181: agun + Location: 24,50 + Owner: GoodGuy + Actor182: apwr + Location: 27,79 + Owner: Greece + GreeceWarFactory: weap + Location: 58,84 + Owner: Greece + Actor184: agun + Location: 47,101 + Owner: Greece + Actor185: v19 + Location: 26,76 + Owner: Greece + Actor186: brl3 + Location: 26,77 + Owner: Greece + Actor187: brl3 + Location: 51,101 + Owner: Greece + Actor188: barl + Location: 51,102 + Owner: Greece + Actor189: v19 + Location: 52,101 + Owner: Greece + Actor190: brl3 + Location: 52,102 + Owner: Greece + Actor191: gap + Location: 67,84 + Owner: Greece + Actor192: gap + Location: 30,88 + Owner: Greece + Actor193: apwr + Location: 36,104 + Owner: Greece + Actor194: agun + Location: 33,89 + Owner: Greece + StartAttack1: 2tnk + Location: 78,59 + Owner: Greece + Facing: 927 + StartAttack2: 2tnk + Location: 79,59 + Owner: Greece + Facing: 904 + StartAttack3: 2tnk + Location: 79,60 + Owner: Greece + Facing: 911 + StartAttack5: arty + Location: 78,61 + Owner: Greece + Facing: 896 + StartAttack4: arty + Location: 77,60 + Owner: Greece + Facing: 911 + V2A: v2rl + Location: 106,40 + Owner: USSR + Facing: 261 + V2B: v2rl + Location: 106,39 + Owner: USSR + Facing: 253 + Actor203: 4tnk + Location: 106,38 + Owner: USSR + Facing: 261 + Actor204: 4tnk + Location: 106,41 + Owner: USSR + Facing: 253 + Actor205: 3tnk + Location: 104,40 + Owner: USSR + Facing: 261 + OreAttack3: 2tnk + Location: 108,98 + Owner: GoodGuy + OreAttack2: 2tnk + Location: 107,98 + Owner: GoodGuy + OreAttack4: 2tnk + Location: 109,98 + Owner: GoodGuy + OreAttack6: 2tnk + Location: 108,99 + Owner: GoodGuy + OreAttack1: 2tnk + Location: 108,97 + Owner: GoodGuy + OreAttack5: arty + Location: 107,99 + Owner: GoodGuy + OreAttack7: arty + Location: 109,99 + Owner: GoodGuy + OreAttack8: arty + Location: 108,100 + Owner: GoodGuy + Actor214: 3tnk + Location: 104,39 + Owner: USSR + Facing: 253 + Actor215: 2tnk + Location: 28,41 + Owner: Greece + Actor216: 2tnk + Location: 30,41 + Owner: Greece + Actor217: 2tnk + Location: 24,40 + Owner: Greece + Facing: 872 + Actor218: 2tnk + Location: 26,40 + Owner: Greece + Facing: 880 + Actor219: arty + Location: 29,42 + Owner: Greece + Actor220: arty + Location: 24,41 + Owner: Greece + Facing: 223 + Actor223: e3 + Location: 43,105 + Owner: Greece + SubCell: 0 + Actor224: e3 + Location: 46,106 + Owner: Greece + SubCell: 0 + Actor225: e3 + Location: 47,88 + Owner: Greece + SubCell: 2 + Actor226: e3 + Location: 46,85 + Owner: Greece + SubCell: 2 + Actor227: e3 + Location: 50,85 + Owner: Greece + SubCell: 3 + Actor228: e3 + Location: 50,89 + Owner: Greece + SubCell: 1 + Actor229: e3 + Location: 29,75 + Owner: Greece + SubCell: 0 + Actor230: e3 + Location: 29,77 + Owner: Greece + SubCell: 1 + Actor231: e3 + Location: 27,78 + Owner: Greece + SubCell: 2 + Actor232: e3 + Location: 58,76 + Owner: Greece + SubCell: 1 + Actor233: e3 + Location: 55,75 + Owner: Greece + SubCell: 4 + Actor234: e3 + Location: 63,80 + Owner: Greece + SubCell: 4 + Actor235: e3 + Location: 63,81 + Owner: Greece + SubCell: 4 + Actor236: e3 + Location: 46,79 + Owner: Greece + SubCell: 4 + Actor237: e3 + Location: 47,79 + Owner: Greece + SubCell: 4 + Actor238: e3 + Location: 31,90 + Owner: Greece + SubCell: 1 + Actor239: e3 + Location: 28,91 + Owner: Greece + SubCell: 3 + Actor240: e3 + Location: 30,93 + Owner: Greece + SubCell: 0 + Actor241: dd + Location: 79,98 + Owner: Greece + Facing: 642 + Actor242: dd + Location: 68,103 + Owner: Greece + Facing: 777 + Actor243: pt + Location: 80,97 + Owner: Greece + Facing: 626 + Actor244: pt + Location: 82,98 + Owner: Greece + Facing: 634 + Actor245: pt + Location: 70,104 + Owner: Greece + Facing: 745 + Actor246: pt + Location: 70,102 + Owner: Greece + Facing: 761 + Actor247: pt + Location: 82,82 + Owner: Greece + Facing: 515 + Actor248: pt + Location: 82,87 + Owner: Greece + Actor249: dd + Location: 80,81 + Owner: Greece + Facing: 515 + Actor250: dd + Location: 80,87 + Owner: Greece + Facing: 1015 + Actor251: dd + Location: 35,41 + Owner: GoodGuy + Actor252: dd + Location: 38,46 + Owner: GoodGuy + Facing: 0 + Actor253: pt + Location: 36,40 + Owner: GoodGuy + Actor254: pt + Location: 39,44 + Owner: GoodGuy + Facing: 0 + Actor255: pt + Location: 35,39 + Owner: GoodGuy + Jeep2: jeep + Owner: Greece + Location: 27,91 + Facing: 396 + Jeep1: jeep + Owner: Greece + Location: 26,91 + Facing: 364 + Actor271: fix + Owner: Greece + Location: 38,79 + Actor149: apwr + Location: 27,83 + Owner: Greece + Actor272: arty + Owner: Greece + Location: 48,102 + Facing: 1023 + Actor273: arty + Owner: Greece + Location: 45,102 + Facing: 1023 + Actor274: arty + Owner: Greece + Location: 32,94 + Facing: 848 + Actor275: arty + Owner: Greece + Location: 31,88 + Facing: 888 + DefaultCameraPosition: waypoint + Location: 108,39 + Owner: Neutral + JeepWaypoint1: waypoint + Location: 23,47 + Owner: Neutral + JeepWaypoint2: waypoint + Location: 26,91 + Owner: Neutral + MCVEntry: waypoint + Location: 113,39 + Owner: Neutral + ChinookLZ: waypoint + Location: 108,20 + Owner: Neutral + ChronoshiftPoint: waypoint + Location: 32,101 + Owner: Neutral + EastWaterEntry: waypoint + Location: 73,106 + Owner: Neutral + EastBeach1: waypoint + Location: 92,104 + Owner: Neutral + EastBeach2: waypoint + Location: 102,83 + Owner: Neutral + EastBeach3: waypoint + Location: 101,53 + Owner: Neutral + WestWaterEntry: waypoint + Location: 18,36 + Owner: Neutral + WestBeach1: waypoint + Location: 60,29 + Owner: Neutral + WestBeach2: waypoint + Location: 93,26 + Owner: Neutral + CruiserStop: waypoint + Location: 88,27 + Owner: Neutral + ChinookEntry: waypoint + Location: 18,19 + Owner: Neutral + WarFactoryRally: waypoint + Location: 56,82 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml + +Translations: ra|languages/lua/en.ftl, ra|languages/difficulties/en.ftl diff --git a/mods/ra/maps/soviet-13a/rules.yaml b/mods/ra/maps/soviet-13a/rules.yaml new file mode 100644 index 0000000000..51bc0bfe8a --- /dev/null +++ b/mods/ra/maps/soviet-13a/rules.yaml @@ -0,0 +1,79 @@ +World: + LuaScript: + Scripts: campaign.lua, soviet13a.lua, soviet13a-AI.lua, utils.lua + MissionData: + BriefingVideo: soviet13.vqa + WinVideo: sovtstar.vqa + LossVideo: allymorf.vqa + StartVideo: mtnkfact.vqa + Briefing: We have another chance to capture the Chronosphere. Take out the Radar Domes to cut the link between them and the Chronosphere. Then capture it! + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: dropdown-difficulty.label + Description: dropdown-difficulty.description + Values: + easy: options-difficulty.easy + normal: options-difficulty.normal + hard: options-difficulty.hard + Default: normal + +Player: + PlayerResources: + DefaultCash: 10000 + +AFLD: + AirstrikePower@parabombs: + Prerequisites: aircraft.soviet + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E2,E2 + +PDOX: + Power: + Amount: 0 + -WithColoredOverlay@IDISABLE: + Buildable: + Prerequisites: ~disabled + +ATEK: + GpsPower: + DisplayTimerRelationships: Ally + +MSLO: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +MECH: + Buildable: + Prerequisites: ~disabled + +IRON: + Buildable: + Prerequisites: ~disabled + +QTNK: + Buildable: + Prerequisites: ~disabled + +E7: + Buildable: + Prerequisites: ~disabled + +E7.noautotarget: + Buildable: + Prerequisites: ~disabled + +E3: + Buildable: + Prerequisites: ~tent + +MSUB: + Buildable: + Prerequisites: ~disabled + +THF: + Buildable: + Prerequisites: ~disabled diff --git a/mods/ra/maps/soviet-13a/soviet13a-AI.lua b/mods/ra/maps/soviet-13a/soviet13a-AI.lua new file mode 100644 index 0000000000..9e2b97e58c --- /dev/null +++ b/mods/ra/maps/soviet-13a/soviet13a-AI.lua @@ -0,0 +1,170 @@ +--[[ + Copyright (c) The OpenRA Developers and Contributors + 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. +]] +WTransWays = +{ + { EastWaterEntry.Location, EastBeach1.Location }, + { EastWaterEntry.Location, EastBeach2.Location }, + { EastWaterEntry.Location, EastBeach3.Location }, + { WestWaterEntry.Location, WestBeach1.Location }, + { WestWaterEntry.Location, WestBeach2.Location } +} + +WTransUnits = +{ + hard = { { "2tnk", "2tnk", "e3", "e3", "e3" }, { "2tnk", "2tnk", "2tnk", "2tnk" } }, + normal = { { "2tnk", "1tnk", "e3", "e3", "jeep" }, { "2tnk", "2tnk", "1tnk", "jeep" } }, + easy = { { "2tnk", "e1", "e1", "e3", "e3" }, { "1tnk", "1tnk", "jeep", "jeep" } } +} + +WTransDelays = +{ + easy = DateTime.Minutes(5), + normal = DateTime.Minutes(4), + hard = DateTime.Minutes(3) +} + +AttackGroup = { } +AttackGroupSize = 8 + +ProductionInterval = +{ + easy = DateTime.Seconds(20), + normal = DateTime.Seconds(14), + hard = DateTime.Seconds(8) +} + +AlliedInfantry = { "e1", "e3" } +AlliedVehiclesUpgradeDelay = DateTime.Minutes(8) +AlliedVehicleType = "Normal" +AlliedVehicles = +{ + Normal = { "1tnk", "2tnk", "2tnk" }, + Upgraded = { "2tnk", "2tnk", "arty" } +} + +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() + IdleHunt(a) + end) + end) + + Trigger.AfterDelay(WTransDelay, WTransWaves) +end + +SendAttackGroup = function() + if #AttackGroup < AttackGroupSize then + return + end + + Utils.Do(AttackGroup, IdleHunt) + + 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[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[Difficulty], ProduceVehicles) + end) +end + +AlliedAircraftType = { "heli" } +Longbows = { } + +AlliedAircraft = function() + if (HPad1.IsDead or HPad1.Owner ~= Greece) and (HPad2.IsDead or HPad2.Owner ~= Greece) and (HPad3.IsDead or HPad3.Owner ~= Greece) and (HPad4.IsDead or HPad4.Owner ~= Greece) then + return + end + + Greece.Build(AlliedAircraftType, function(units) + local longbow = units[1] + Longbows[#Longbows + 1] = longbow + + Trigger.OnKilled(longbow, AlliedAircraft) + + local alive = Utils.Where(Longbows, function(y) return not y.IsDead end) + if #alive < 2 then + Trigger.AfterDelay(DateTime.Seconds(75), AlliedAircraft) + end + + InitializeAttackAircraft(longbow, USSR) + end) +end + +SendCruiser = function() + if GoodguyShipyard.IsDead or GoodguyShipyard.Owner ~= GoodGuy then + return + end + + local boat = Reinforcements.Reinforce(Greece, { "ca" }, { WestWaterEntry.Location }) + Utils.Do(boat, function(ca) + ca.Move(CruiserStop.Location) + Trigger.OnKilled(ca, function() + Trigger.AfterDelay(DateTime.Minutes(6), SendCruiser) + end) + end) +end + +ChinookChalk = { "e1", "e1", "e1", "e3", "e3", "e3", "e3", "e3" } +ChinookPath = { ChinookEntry.Location, ChinookLZ.Location } + +SendChinook = function() + if (HPad1.IsDead or HPad1.Owner ~= Greece) and (HPad2.IsDead or HPad2.Owner ~= Greece) and (HPad3.IsDead or HPad3.Owner ~= Greece) and (HPad4.IsDead or HPad4.Owner ~= Greece) then + return + end + + local chalk = Reinforcements.ReinforceWithTransport(Greece, "tran", ChinookChalk , ChinookPath, { ChinookPath[1] })[2] + Utils.Do(chalk, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + + Trigger.AfterDelay(DateTime.Minutes(5), SendChinook) +end + +ActivateAI = function() + WTransUnits = WTransUnits[Difficulty] + WTransDelay = 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(AlliedVehiclesUpgradeDelay, function() AlliedVehicleType = "Upgraded" end) + ProduceInfantry() + Trigger.AfterDelay(DateTime.Minutes(3), ProduceVehicles) + Trigger.AfterDelay(DateTime.Minutes(5), AlliedAircraft) + Trigger.AfterDelay(DateTime.Minutes(6), WTransWaves) + Trigger.AfterDelay(DateTime.Minutes(10), SendCruiser) +end diff --git a/mods/ra/maps/soviet-13a/soviet13a.lua b/mods/ra/maps/soviet-13a/soviet13a.lua new file mode 100644 index 0000000000..7a643fb13e --- /dev/null +++ b/mods/ra/maps/soviet-13a/soviet13a.lua @@ -0,0 +1,125 @@ +--[[ + Copyright (c) The OpenRA Developers and Contributors + 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. +]] +Jeeps = { Jeep1, Jeep2 } +JeepWaypoints = { JeepWaypoint1.Location, JeepWaypoint2.Location } +OreAttackers = { OreAttack1, OreAttack2, OreAttack3, OreAttack4, OreAttack5, OreAttack6, OreAttack7, OreAttack8 } +RadarSites = { Radar1, Radar2, Radar3, Radar4 } +StartAttack = { StartAttack1, StartAttack2, StartAttack3, StartAttack4, StartAttack5 } +ChronoDemolitionTrigger = { CPos.New(35,96), CPos.New(36,96), CPos.New(37,96), CPos.New(37,97), CPos.New(38,97), CPos.New(39,97) } +OreAttackTrigger = { CPos.New(105,67), CPos.New(106,67), CPos.New(107,67), CPos.New(108,67), CPos.New(109,67), CPos.New(110,67) } + +Start = function() + Reinforcements.Reinforce(USSR, { "mcv" }, { MCVEntry.Location, DefaultCameraPosition.Location }, 5) + + Utils.Do(Jeeps, function(jeep) + jeep.Patrol(JeepWaypoints, true, 125) + end) + + Utils.Do(StartAttack, function(a) + IdleHunt(a) + end) + + ChronoCam = Actor.Create("camera", true, { Owner = USSR, Location = Chronosphere.Location}) +end + +MissionTriggers = function() + Trigger.OnAllKilledOrCaptured(RadarSites, function() + USSR.MarkCompletedObjective(TakeDownRadar) + ChronoshiftAlliedUnits() + end) + + Trigger.OnCapture(Chronosphere, function() + if not USSR.IsObjectiveCompleted(TakeDownRadar) then + Media.DisplayMessage(UserInterface.Translate("chrono-trap-triggered"), UserInterface.Translate("headquarters")) + Chronosphere.Kill() + else + USSR.MarkCompletedObjective(CaptureChronosphere) + end + end) + + Trigger.OnKilled(Chronosphere, function() + USSR.MarkFailedObjective(CaptureChronosphere) + end) + + local chronoTriggered + Trigger.OnEnteredFootprint(ChronoDemolitionTrigger, function(actor, id) + if actor.Owner == USSR and not chronoTriggered and not USSR.IsObjectiveCompleted(TakeDownRadar) then + Trigger.RemoveFootprintTrigger(id) + chronoTriggered = true + Media.DisplayMessage(UserInterface.Translate("chrono-trap-triggered"), UserInterface.Translate("headquarters")) + Chronosphere.Kill() + end + end) + + Trigger.OnEnteredProximityTrigger(ChinookLZ.CenterPosition, WDist.FromCells(5), function(actor, id) + if actor.Owner == USSR and actor.Type == "harv" then + Trigger.RemoveProximityTrigger(id) + SendChinook() + end + end) + + local oreAttackTriggered + Trigger.OnEnteredFootprint(OreAttackTrigger, function(actor, id) + if actor.Owner == USSR and not oreAttackTriggered then + Trigger.RemoveFootprintTrigger(id) + oreAttackTriggered = true + + Utils.Do(OreAttackers, function(a) + if not a.IsDead then + IdleHunt(a) + end + end) + end + end) +end + +ChronoshiftAlliedUnits = function() + if Chronosphere.IsDead then + return + end + + local cells = Utils.ExpandFootprint({ ChronoshiftPoint.Location }, false) + local units = { } + for i = 1, #cells do + local unit = Actor.Create("2tnk", true, { Owner = Greece, Facing = Angle.North }) + units[unit] = cells[i] + IdleHunt(unit) + end + Chronosphere.Chronoshift(units) +end + +Tick = function() + Greece.Cash = 20000 + + if USSR.HasNoRequiredUnits() then + Greece.MarkCompletedObjective(AlliesObjective) + end +end + +WorldLoaded = function() + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + GoodGuy = Player.GetPlayer("GoodGuy") + + InitObjectives(USSR) + + AlliesObjective = AddPrimaryObjective(Greece, "") + TakeDownRadar = AddPrimaryObjective(USSR, "destroy-allied-radar-sites") + CaptureChronosphere = AddPrimaryObjective(USSR, "capture-the-chronosphere") + + Camera.Position = DefaultCameraPosition.CenterPosition + Start() + MissionTriggers() + ActivateAI() + GreeceWarFactory.RallyPoint = WarFactoryRally.Location + if Difficulty == "hard" then + V2A.Destroy() + V2B.Destroy() + end +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index bbb9e96855..b8c2f1401d 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -32,6 +32,7 @@ Soviet Campaign: soviet-10 soviet-11a soviet-11b + soviet-13a Counterstrike Allied Missions: sarin-gas-1-crackdown sarin-gas-2-down-under