diff --git a/mods/ra/maps/shock-therapy/map.bin b/mods/ra/maps/shock-therapy/map.bin new file mode 100644 index 0000000000..7ecbfd77d0 Binary files /dev/null and b/mods/ra/maps/shock-therapy/map.bin differ diff --git a/mods/ra/maps/shock-therapy/map.png b/mods/ra/maps/shock-therapy/map.png new file mode 100644 index 0000000000..dc774179f2 Binary files /dev/null and b/mods/ra/maps/shock-therapy/map.png differ diff --git a/mods/ra/maps/shock-therapy/map.yaml b/mods/ra/maps/shock-therapy/map.yaml new file mode 100644 index 0000000000..f2c611b772 --- /dev/null +++ b/mods/ra/maps/shock-therapy/map.yaml @@ -0,0 +1,998 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: Shock Therapy + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 26,32,73,67 + +Visibility: MissionSelector + +Categories: Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Spain: + Name: Spain + Faction: allies + Color: F6D679 + Allies: Greece, GoodGuy + Enemies: USSR + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: E2E6F6 + Allies: Spain, GoodGuy + Enemies: USSR + PlayerReference@GoodGuy: + Name: GoodGuy + Faction: allies + Color: E2E6F6 + Allies: Spain, 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: Greece, GoodGuy, Spain + +Actors: + Actor0: sbag + Location: 26,39 + Owner: Greece + Actor1: sbag + Location: 27,39 + Owner: Greece + Actor2: sbag + Location: 28,39 + Owner: Greece + Actor3: sbag + Location: 29,39 + Owner: Greece + Actor4: sbag + Location: 30,39 + Owner: Greece + Actor5: sbag + Location: 26,40 + Owner: Greece + Actor6: sbag + Location: 30,40 + Owner: Greece + Actor7: sbag + Location: 31,40 + Owner: Greece + Actor8: sbag + Location: 26,41 + Owner: Greece + Actor9: sbag + Location: 31,41 + Owner: Greece + Actor10: sbag + Location: 32,41 + Owner: Greece + Actor11: sbag + Location: 26,42 + Owner: Greece + Actor12: sbag + Location: 32,42 + Owner: Greece + Actor13: sbag + Location: 33,42 + Owner: Greece + Actor14: sbag + Location: 34,42 + Owner: Greece + Actor15: sbag + Location: 35,42 + Owner: Greece + Actor16: sbag + Location: 26,43 + Owner: Greece + Actor17: sbag + Location: 35,43 + Owner: Greece + Actor18: sbag + Location: 36,43 + Owner: Greece + Actor19: sbag + Location: 37,43 + Owner: Greece + Actor20: sbag + Location: 26,44 + Owner: Greece + Actor21: sbag + Location: 36,44 + Owner: Greece + Actor22: sbag + Location: 37,44 + Owner: Greece + Actor23: sbag + Location: 26,45 + Owner: Greece + Actor24: sbag + Location: 36,45 + Owner: Greece + Actor25: sbag + Location: 37,45 + Owner: Greece + Actor26: sbag + Location: 26,46 + Owner: Greece + Actor27: sbag + Location: 26,47 + Owner: Greece + Actor28: sbag + Location: 26,48 + Owner: Greece + Actor29: sbag + Location: 26,49 + Owner: Greece + Actor30: sbag + Location: 36,49 + Owner: Greece + Actor31: sbag + Location: 37,49 + Owner: Greece + Actor32: sbag + Location: 26,50 + Owner: Greece + Actor33: sbag + Location: 36,50 + Owner: Greece + Actor34: sbag + Location: 37,50 + Owner: Greece + Actor35: sbag + Location: 26,51 + Owner: Greece + Actor36: sbag + Location: 36,51 + Owner: Greece + Actor37: sbag + Location: 37,51 + Owner: Greece + Actor38: sbag + Location: 26,52 + Owner: Greece + Actor39: sbag + Location: 37,52 + Owner: Greece + Actor40: sbag + Location: 26,53 + Owner: Greece + Actor41: sbag + Location: 36,53 + Owner: Greece + Actor42: sbag + Location: 37,53 + Owner: Greece + Actor43: sbag + Location: 26,54 + Owner: Greece + Actor44: sbag + Location: 36,54 + Owner: Greece + Actor45: sbag + Location: 26,55 + Owner: Greece + Actor46: sbag + Location: 36,55 + Owner: Greece + Actor47: sbag + Location: 26,56 + Owner: Greece + Actor48: sbag + Location: 36,56 + Owner: Greece + Actor49: sbag + Location: 26,57 + Owner: Greece + Actor50: sbag + Location: 27,57 + Owner: Greece + Actor51: sbag + Location: 28,57 + Owner: Greece + Actor52: sbag + Location: 29,57 + Owner: Greece + Actor53: sbag + Location: 30,57 + Owner: Greece + Actor54: sbag + Location: 31,57 + Owner: Greece + Actor55: sbag + Location: 32,57 + Owner: Greece + Actor56: sbag + Location: 33,57 + Owner: Greece + Health: 100 + Actor57: sbag + Location: 34,57 + Owner: Greece + Actor58: sbag + Location: 35,57 + Owner: Greece + Actor59: sbag + Location: 36,57 + Owner: Greece + Actor60: healcrate + Location: 70,61 + Owner: Greece + Actor61: sbag + Location: 72,85 + Owner: Greece + Actor62: sbag + Location: 73,85 + Owner: Greece + Actor63: sbag + Location: 74,85 + Owner: Greece + Actor64: sbag + Location: 75,85 + Owner: Greece + Actor65: sbag + Location: 76,85 + Owner: Greece + Actor66: sbag + Location: 77,85 + Owner: Greece + Actor67: sbag + Location: 78,85 + Owner: Greece + Actor68: sbag + Location: 79,85 + Owner: Greece + Actor69: sbag + Location: 80,85 + Owner: Greece + Actor70: sbag + Location: 81,85 + Owner: Greece + Actor71: sbag + Location: 87,85 + Owner: Greece + Actor72: sbag + Location: 88,85 + Owner: Greece + Actor73: sbag + Location: 89,85 + Owner: Greece + Actor74: sbag + Location: 71,86 + Owner: Greece + Actor75: sbag + Location: 72,86 + Owner: Greece + Actor76: sbag + Location: 79,86 + Owner: Greece + Actor77: sbag + Location: 80,86 + Owner: Greece + Actor78: sbag + Location: 81,86 + Owner: Greece + Actor79: sbag + Location: 87,86 + Owner: Greece + Actor80: sbag + Location: 88,86 + Owner: Greece + Actor81: sbag + Location: 89,86 + Owner: Greece + Actor82: sbag + Location: 71,87 + Owner: Greece + Actor83: sbag + Location: 89,87 + Owner: Greece + Actor84: sbag + Location: 71,88 + Owner: Greece + Actor85: sbag + Location: 89,88 + Owner: Greece + Actor86: sbag + Location: 71,89 + Owner: Greece + Actor87: sbag + Location: 72,89 + Owner: Greece + Actor88: sbag + Location: 89,89 + Owner: Greece + Actor89: sbag + Location: 71,90 + Owner: Greece + Actor90: sbag + Location: 72,90 + Owner: Greece + Actor91: sbag + Location: 89,90 + Owner: Greece + Actor92: healcrate + Location: 57,91 + Owner: Greece + Actor93: sbag + Location: 71,91 + Owner: Greece + Actor94: sbag + Location: 72,91 + Owner: Greece + Actor95: sbag + Location: 89,91 + Owner: Greece + Actor96: sbag + Location: 89,92 + Owner: Greece + Actor97: sbag + Location: 89,93 + Owner: Greece + Actor98: sbag + Location: 71,94 + Owner: Greece + Actor99: sbag + Location: 72,94 + Owner: Greece + Actor100: sbag + Location: 89,94 + Owner: Greece + Actor101: sbag + Location: 71,95 + Owner: Greece + Actor102: sbag + Location: 72,95 + Owner: Greece + Actor103: sbag + Location: 89,95 + Owner: Greece + Actor104: sbag + Location: 71,96 + Owner: Greece + Actor105: sbag + Location: 72,96 + Owner: Greece + Actor106: sbag + Location: 89,96 + Owner: Greece + Actor107: sbag + Location: 71,97 + Owner: Greece + Actor108: sbag + Location: 89,97 + Owner: Greece + Actor109: sbag + Location: 71,98 + Owner: Greece + Actor110: sbag + Location: 72,98 + Owner: Greece + Actor111: sbag + Location: 73,98 + Owner: Greece + Actor112: sbag + Location: 74,98 + Owner: Greece + Actor113: sbag + Location: 75,98 + Owner: Greece + Actor114: sbag + Location: 76,98 + Owner: Greece + Actor115: sbag + Location: 77,98 + Owner: Greece + Actor116: sbag + Location: 78,98 + Owner: Greece + Actor117: sbag + Location: 79,98 + Owner: Greece + Actor118: sbag + Location: 80,98 + Owner: Greece + Actor119: sbag + Location: 81,98 + Owner: Greece + Actor120: sbag + Location: 82,98 + Owner: Greece + Actor121: sbag + Location: 83,98 + Owner: Greece + Actor122: sbag + Location: 84,98 + Owner: Greece + Actor123: sbag + Location: 85,98 + Owner: Greece + Actor124: sbag + Location: 86,98 + Owner: Greece + Actor125: sbag + Location: 87,98 + Owner: Greece + Actor126: sbag + Location: 88,98 + Owner: Greece + Actor127: sbag + Location: 89,98 + Owner: Greece + Actor128: t03 + Location: 57,79 + Owner: Neutral + Actor129: t05 + Location: 55,92 + Owner: Neutral + Actor130: t02 + Location: 83,58 + Owner: Neutral + Actor131: t10 + Location: 60,47 + Owner: Neutral + Actor132: t16 + Location: 63,75 + Owner: Neutral + Actor133: tc04 + Location: 58,97 + Owner: Neutral + Actor134: tc05 + Location: 48,44 + Owner: Neutral + Actor135: tc05 + Location: 30,75 + Owner: Neutral + Actor136: tc04 + Location: 65,36 + Owner: Neutral + Actor137: tc04 + Location: 46,73 + Owner: Neutral + Actor138: tc03 + Location: 37,71 + Owner: Neutral + Actor139: tc03 + Location: 76,74 + Owner: Neutral + Actor140: tc03 + Location: 51,43 + Owner: Neutral + Actor141: tc02 + Location: 78,74 + Owner: Neutral + Actor142: tc02 + Location: 83,57 + Owner: Neutral + Actor143: tc01 + Location: 56,97 + Owner: Neutral + Actor144: tc01 + Location: 38,79 + Owner: Neutral + Actor145: tc01 + Location: 45,53 + Owner: Neutral + Actor146: t17 + Location: 45,90 + Owner: Neutral + Actor147: t17 + Location: 65,49 + Owner: Neutral + Actor148: t16 + Location: 56,91 + Owner: Neutral + Actor149: t16 + Location: 69,85 + Owner: Neutral + Actor150: t15 + Location: 51,47 + Owner: Neutral + Actor151: t15 + Location: 53,77 + Owner: Neutral + Actor152: t14 + Location: 85,76 + Owner: Neutral + Actor153: t14 + Location: 50,85 + Owner: Neutral + Actor154: t14 + Location: 59,76 + Owner: Neutral + Actor155: t13 + Location: 78,80 + Owner: Neutral + Actor156: t12 + Location: 30,76 + Owner: Neutral + Actor157: t11 + Location: 28,37 + Owner: Neutral + Actor158: t10 + Location: 50,66 + Owner: Neutral + Actor159: t08 + Location: 38,70 + Owner: Neutral + Actor160: t07 + Location: 60,83 + Owner: Neutral + Actor161: t06 + Location: 36,70 + Owner: Neutral + Actor162: t05 + Location: 46,75 + Owner: Neutral + Actor163: t03 + Location: 54,65 + Owner: Neutral + Actor164: t02 + Location: 27,64 + Owner: Neutral + Actor165: t01 + Location: 49,61 + Owner: Neutral + Actor166: tc05 + Location: 73,57 + Owner: Neutral + Actor167: tc04 + Location: 72,59 + Owner: Neutral + Actor168: t17 + Location: 73,60 + Owner: Neutral + Actor169: t16 + Location: 59,56 + Owner: Neutral + Actor170: tc02 + Location: 86,51 + Owner: Neutral + Actor171: tc02 + Location: 76,35 + Owner: Neutral + Actor172: tc02 + Location: 85,78 + Owner: Neutral + Actor173: mine + Location: 64,92 + Owner: Neutral + Actor174: mine + Location: 68,96 + Owner: Neutral + Actor175: tc05 + Location: 79,66 + Owner: Neutral + Actor176: tc04 + Location: 75,72 + Owner: Neutral + Actor177: tc03 + Location: 40,80 + Owner: Neutral + Actor178: tc04 + Location: 58,54 + Owner: Neutral + Actor179: tc05 + Location: 54,93 + Owner: Neutral + Actor180: tc03 + Location: 26,37 + Owner: Neutral + Actor181: t10 + Location: 27,79 + Owner: Neutral + Actor182: t08 + Location: 29,80 + Owner: Neutral + Actor183: tc04 + Location: 26,83 + Owner: Neutral + Actor184: tc03 + Location: 39,82 + Owner: Neutral + Actor185: tc04 + Location: 44,89 + Owner: Neutral + Actor186: tc01 + Location: 49,84 + Owner: Neutral + Actor187: t16 + Location: 46,97 + Owner: Neutral + Actor188: t15 + Location: 51,88 + Owner: Neutral + Actor189: t14 + Location: 28,72 + Owner: Neutral + Actor190: t12 + Location: 53,54 + Owner: Neutral + Actor191: t11 + Location: 34,65 + Owner: Neutral + Actor192: t12 + Location: 28,64 + Owner: Neutral + Actor193: t12 + Location: 35,66 + Owner: Neutral + SWVillage7: v04 + Location: 30,96 + Owner: Spain + SWVillage4: v03 + Location: 33,91 + Owner: Spain + SWVillage2: v02 + Location: 34,87 + Owner: Spain + SWVillage3: v01 + Location: 29,92 + Owner: Spain + SWVillage6: v07 + Location: 33,94 + Owner: Spain + SWVillage5: v08 + Location: 38,91 + Owner: Spain + SWVillage1: v10 + Location: 30,88 + Owner: Spain + SouthCabin: v11 + Location: 57,91 + Owner: Spain + NEVillage7: v10 + Location: 78,44 + Owner: Spain + NEVillage8: v11 + Location: 81,50 + Owner: Spain + NorthCabin: v08 + Location: 70,61 + Owner: Spain + NEVillage3: v07 + Location: 79,41 + Owner: Spain + NEVillage4: v06 + Location: 85,46 + Owner: Spain + NEVillage2: v05 + Location: 84,42 + Owner: Spain + NEVillage5: v04 + Location: 76,41 + Owner: Spain + NEVillage9: v03 + Location: 85,49 + Owner: Spain + NEVillage6: v02 + Location: 81,46 + Owner: Spain + NEVillage1: v01 + Location: 80,44 + Owner: Spain + Health: 53 + SETent1: tent + Location: 80,95 + Owner: Greece + NWTent2: tent + Location: 33,54 + Owner: GoodGuy + Actor214: hosp + Location: 86,87 + Owner: Greece + NWAdvPower: apwr + Location: 28,50 + Owner: GoodGuy + Actor216: apwr + Location: 79,87 + Owner: Greece + NWTent1: tent + Location: 30,54 + Owner: GoodGuy + SETent2: tent + Location: 77,95 + Owner: Greece + NWHospital: hosp + Location: 28,45 + Owner: GoodGuy + Actor220: v19 + Location: 42,96 + Owner: Greece + Actor221: v19 + Location: 44,94 + Owner: Greece + Actor222: v19 + Location: 63,49 + Owner: Neutral + Actor223: v19 + Location: 67,50 + Owner: Neutral + Actor224: brl3 + Location: 62,48 + Owner: Spain + Actor225: barl + Location: 65,49 + Owner: Spain + Actor226: barl + Location: 68,49 + Owner: Spain + Actor227: brl3 + Location: 44,95 + Owner: Greece + Actor228: barl + Location: 63,48 + Owner: Spain + Actor229: brl3 + Location: 67,49 + Owner: Spain + Actor230: brl3 + Location: 41,98 + Owner: Greece + Actor231: brl3 + Location: 43,97 + Owner: Greece + Actor232: brl3 + Location: 66,50 + Owner: Spain + Actor233: brl3 + Location: 64,48 + Owner: Spain + Actor234: barl + Location: 46,92 + Owner: Greece + Actor235: barl + Location: 69,49 + Owner: Spain + Actor236: barl + Location: 64,49 + Owner: Spain + Actor237: barl + Location: 66,49 + Owner: Spain + Actor238: barl + Location: 68,48 + Owner: Spain + Actor239: barl + Location: 44,96 + Owner: Greece + Actor240: barl + Location: 45,93 + Owner: Greece + Actor241: barl + Location: 42,97 + Owner: Greece + Actor242: barl + Location: 43,96 + Owner: Greece + Actor243: barl + Location: 45,94 + Owner: Greece + Actor244: barl + Location: 42,98 + Owner: Greece + Actor245: barl + Location: 41,97 + Owner: Greece + RadarDome: dome + Location: 28,40 + Owner: GoodGuy + Actor247: proc + Location: 73,88 + Owner: Greece + Actor248: silo + Location: 77,86 + Owner: Greece + Actor249: silo + Location: 77,87 + Owner: Greece + Actor250: silo + Location: 76,86 + Owner: Greece + Actor251: silo + Location: 76,87 + Owner: Greece + Actor252: silo + Location: 75,86 + Owner: Greece + Actor253: silo + Location: 75,87 + Owner: Greece + Actor254: apwr + Location: 86,95 + Owner: Greece + WarFactory: weap + Location: 73,95 + Owner: Greece + SouthPill1: pbox + Location: 79,81 + Owner: Greece + SouthPill2: pbox + Location: 85,78 + Owner: Greece + NorthPill1: pbox + Location: 46,53 + Owner: GoodGuy + NorthPill2: pbox + Location: 51,47 + Owner: GoodGuy + Actor260: powr + Location: 83,95 + Owner: Greece + Actor262: arty + Location: 79,68 + Owner: Greece + Facing: 63 + Actor263: arty + Location: 79,76 + Owner: Greece + Facing: 63 + Ltnk1: 1tnk + Location: 87,90 + Owner: Greece + Facing: 31 + Ltnk2: 1tnk + Location: 87,91 + Owner: Greece + Facing: 31 + Ltnk3: 1tnk + Location: 87,92 + Owner: Greece + Facing: 31 + Jeep3: jeep + Location: 88,92 + Owner: Greece + Facing: 31 + Jeep2: jeep + Location: 88,91 + Owner: Greece + Facing: 31 + Jeep1: jeep + Location: 88,90 + Owner: Greece + Facing: 31 + Actor270: e1 + Location: 38,45 + Owner: Greece + Health: 89 + Facing: 191 + SubCell: 1 + Actor271: e1 + Location: 87,84 + Owner: Greece + SubCell: 4 + Actor272: e1 + Location: 81,84 + Owner: Greece + SubCell: 3 + Actor273: e1 + Location: 38,49 + Owner: Greece + Facing: 191 + SubCell: 1 + LZ: waypoint + Location: 51,72 + Owner: Neutral + WaterEntryNW: waypoint + Location: 42,32 + Owner: Neutral + WaterLandingNW: waypoint + Location: 42,42 + Owner: Neutral + WaterEntryNE: waypoint + Location: 70,32 + Owner: Neutral + WaterLandingNE: waypoint + Location: 73,41 + Owner: Neutral + WaterEntrySE: waypoint + Location: 98,78 + Owner: Neutral + WaterLandingSE: waypoint + Location: 91,78 + Owner: Neutral + SouthwestLZ: waypoint + Location: 39,97 + Owner: Neutral + CivRallySE: waypoint + Location: 81,92 + Owner: Neutral + CivRallyNW: waypoint + Location: 31,47 + Owner: Neutral + NWSpawn1: waypoint + Location: 30,55 + Owner: Neutral + NWSpawn2: waypoint + Location: 33,55 + Owner: Neutral + NEHermitSpawn: waypoint + Location: 70,61 + Owner: Neutral + SouthHermitSpawn: waypoint + Location: 57,91 + Owner: Neutral + NECivSpawn1: waypoint + Location: 80,45 + Owner: Neutral + NECivSpawn2: waypoint + Location: 84,42 + Owner: Neutral + NECivSpawn3: waypoint + Location: 80,41 + Owner: Neutral + NECivSpawn4: waypoint + Location: 86,46 + Owner: Neutral + NECivSpawn5: waypoint + Location: 76,42 + Owner: Neutral + NECivSpawn6: waypoint + Location: 82,47 + Owner: Neutral + NECivSpawn9: waypoint + Location: 85,50 + Owner: Neutral + NECivSpawn8: waypoint + Location: 81,50 + Owner: Neutral + NECivSpawn7: waypoint + Location: 78,44 + Owner: Neutral + SWCivSpawn3: waypoint + Location: 29,93 + Owner: Neutral + SWCivSpawn4: waypoint + Location: 33,92 + Owner: Neutral + SWCivSpawn6: waypoint + Location: 33,94 + Owner: Neutral + SWCivSpawn2: waypoint + Location: 35,88 + Owner: Neutral + SWCivSpawn5: waypoint + Location: 38,91 + Owner: Neutral + SWCivSpawn1: waypoint + Location: 30,88 + Owner: Neutral + SWCivSpawn7: waypoint + Location: 30,97 + Owner: Neutral + SEBaseBombingRun: waypoint + Location: 78,87 + Owner: Neutral + MSubEntry: waypoint + Location: 98,57 + Owner: Neutral + MSubStop: waypoint + Location: 94,73 + Owner: Neutral + SEShockDrop: waypoint + Location: 83,79 + 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/shock-therapy/rules.yaml b/mods/ra/maps/shock-therapy/rules.yaml new file mode 100644 index 0000000000..55876c2b25 --- /dev/null +++ b/mods/ra/maps/shock-therapy/rules.yaml @@ -0,0 +1,30 @@ +World: + LuaScript: + Scripts: shock-therapy.lua + MissionData: + WinVideo: sovtstar.vqa + LossVideo: sovcemet.vqa + Briefing: A small border town has been voicing support for the Allied cause. These people are no longer soviets, but enemies to our great empire. As enemies, they must be destroyed.\n\nTake Stalin's elite shock troopers and show them the iron might of the Soviet army. No doubt, the rabble will seek help from the minute allied influence in the area.\n\nWhatever pathetic support they can muster, it will not be enough. Crush them all -- let nothing stop you. + +SHOCKDROP: + ParatroopersPower: + DisplayBeacon: False + DropItems: SHOK, SHOK, SHOK, SHOK, SHOK + AlwaysVisible: + +LST.Reinforcement: + Inherits: LST + RejectsOrders: + -Buildable: + -Selectable: + RenderSprites: + Image: lst + Interactable: + +powerproxy.parabombs: + AirstrikePower: + DisplayBeacon: False + +HEALCRATE: + Crate: + Lifetime: 0 diff --git a/mods/ra/maps/shock-therapy/shock-therapy.lua b/mods/ra/maps/shock-therapy/shock-therapy.lua new file mode 100644 index 0000000000..5c4778216c --- /dev/null +++ b/mods/ra/maps/shock-therapy/shock-therapy.lua @@ -0,0 +1,347 @@ +--[[ + 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. +]] +Cabins = { NorthCabin, SouthCabin } +NWFootprintTrigger = { CPos.New(41, 49), CPos.New(41, 48), CPos.New(41, 47), CPos.New(41, 46), CPos.New(41, 45), CPos.New(41, 44) } +SWFootprintTrigger = { CPos.New(26, 77), CPos.New(27, 77), CPos.New(28, 77), CPos.New(29, 77), CPos.New(33, 77), CPos.New(34, 77), CPos.New(35, 77), CPos.New(36, 77), CPos.New(37, 77), CPos.New(38, 77), CPos.New(39, 77) } +SEFootprintTrigger = { CPos.New(75, 83), CPos.New(76, 83), CPos.New(77, 83), CPos.New(78, 83), CPos.New(79, 83), CPos.New(80, 83), CPos.New(81, 83), CPos.New(82, 83), CPos.New(83, 83), CPos.New(84, 83), CPos.New(85, 83), CPos.New(86, 83), CPos.New(87, 83), CPos.New(88, 83), CPos.New(89, 83) } +NWWaterPath = { WaterEntryNW.Location, WaterLandingNW.Location } +NEWaterPath = { WaterEntryNE.Location, WaterLandingNE.Location } +SEWaterPath = { WaterEntrySE.Location, WaterLandingSE.Location } +NWWaterUnits = { "dtrk", "ttnk", "ttnk", "ttnk", "3tnk" } +NEWaterUnits = { "dtrk", "v2rl", "e6", "e6", "e6" } +SEWaterUnits = { "ttnk", "ttnk", "shok", "shok", "shok" } +NorthPillboxes = { NorthPill1, NorthPill2 } +SouthPillboxes = { SouthPill1, SouthPill2 } +VehicleSquad1 = { Ltnk1, Jeep1 } +VehicleSquad2 = { Ltnk2, Jeep2 } +VehicleSquad3 = { Ltnk3, Jeep3 } +CivSquads = { { "c1", "c3", "c7", "c10" }, { "c2", "c4", "c6", "c11" }, { "c11", "c10", "c9" }, { "c8", "c7", "c6" }, { "c5", "c4", "c3" }, { "c5", "c10" }, { "c4", "c2" }, { "c3", "c5" }, { "c9", "c11" } } +AlliedInfantry = { "e1", "e1", "e1", "e3" } +AttackGroupSize = 4 +InfantryDelay = DateTime.Seconds(10) +IdlingUnits = { } +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +MissionStart = function() + LZCamera = Actor.Create("camera", true, { Owner = USSR, Location = LZ.Location }) + ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.New(508)) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.New(520)) + end) + + Trigger.AfterDelay(DateTime.Seconds(4), function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + LZCamera.Destroy() + TroopsArrived = true + end) + + InfantryProduction() +end + +InfantryProduction = function() + if (SETent1.IsDead or SETent1.Owner ~= Greece) and (SETent2.IsDead or SETent2.Owner ~= Greece) then + return + end + + local toBuild = { Utils.Random(AlliedInfantry) } + + Greece.Build(toBuild, function(unit) + IdlingUnits[#IdlingUnits + 1] = unit[1] + Trigger.AfterDelay(InfantryDelay, InfantryProduction) + + if #IdlingUnits >= (AttackGroupSize * 1.5) then + SendAttack() + end + end) +end + +SendAttack = function() + local units = { } + + for i = 0, AttackGroupSize, 1 do + local number = Utils.RandomInteger(1, #IdlingUnits) + + if IdlingUnits[number] and not IdlingUnits[number].IsDead then + units[i] = IdlingUnits[number] + table.remove(IdlingUnits, number) + end + end + + Utils.Do(units, function(unit) + if not unit.IsDead then + IdleHunt(unit) + end + end) +end + +DomeCaptured = false +MissionTriggers = function() + local neFootTriggered + Trigger.OnEnteredProximityTrigger(NECivSpawn1.CenterPosition, WDist.FromCells(9), function(actor, id) + if actor.Owner == USSR and actor.Type ~= "badr" and not neFootTriggered then + Trigger.RemoveFootprintTrigger(id) + neFootTriggered = true + + local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR }) + proxy.TargetAirstrike(NECivSpawn6.CenterPosition, Angle.SouthEast) + proxy.Destroy() + + Utils.Do(VehicleSquad1, function(a) + if not a.IsDead then + a.AttackMove(NECivSpawn1.Location) + IdleHunt(a) + end + end) + + local neVillageCam = Actor.Create("camera", true, { Owner = USSR, Location = NECivSpawn1.Location }) + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + local neTroops = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", NEWaterUnits, NEWaterPath, { NEWaterPath[1] })[2] + Trigger.OnAllRemovedFromWorld(Utils.Where(neTroops, function(a) return a.Type == "e6" end), function() + if not DomeCaptured then + USSR.MarkFailedObjective(CaptureDome) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + if not NEVillage1.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn1.Location, CivRallyNW.Location }, 0) + end + if not NEVillage2.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn2.Location, CivRallyNW.Location }, 0) + end + end) + Trigger.AfterDelay(DateTime.Seconds(3), function() + if not NEVillage3.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn3.Location, CivRallyNW.Location }, 0) + end + if not NEVillage4.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn4.Location, CivRallyNW.Location }, 0) + end + end) + Trigger.AfterDelay(DateTime.Seconds(4), function() + if not NEVillage5.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn5.Location, CivRallyNW.Location }, 0) + end + if not NEVillage6.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn6.Location, CivRallySE.Location }, 0) + end + end) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not NEVillage7.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn7.Location, CivRallySE.Location }, 0) + end + if not NEVillage8.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn8.Location, CivRallySE.Location }, 0) + end + if not NEVillage9.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn9.Location, CivRallySE.Location }, 0) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + neVillageCam.Destroy() + end) + end + end) + + Trigger.OnDamaged(NorthCabin, function() + if not NorthCabinDamaged then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NEHermitSpawn.Location, CivRallyNW.Location }, 1) + NorthCabinDamaged = true + end + end) + + Trigger.OnDamaged(SouthCabin, function() + if not SouthCabinDamaged then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SouthHermitSpawn.Location, CivRallySE.Location }, 1) + SouthCabinDamaged = true + end + end) + + Trigger.OnAllKilled(Cabins, function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.SouthWest) + end) + + Trigger.OnAllKilled(NorthPillboxes, function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.South) + end) + + local nwFootTriggered + Trigger.OnEnteredFootprint(NWFootprintTrigger, function(actor, id) + if actor.Owner == USSR and not nwFootTriggered then + Trigger.RemoveFootprintTrigger(id) + nwFootTriggered = true + + local nwBarracks1 = Reinforcements.Reinforce(GoodGuy, AlliedInfantry, { NWSpawn1.Location }, 0) + Utils.Do(nwBarracks1, IdleHunt) + local nwBarracks2 = Reinforcements.Reinforce(GoodGuy, AlliedInfantry, { NWSpawn2.Location }, 0) + Utils.Do(nwBarracks2, IdleHunt) + + Utils.Do(VehicleSquad2, function(a) + if not a.IsDead then + a.AttackMove(SWCivSpawn1.Location) + IdleHunt(a) + end + end) + end + end) + + Trigger.OnKilled(RadarDome, function() + if not DomeCaptured then + USSR.MarkFailedObjective(CaptureDome) + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + ShockDrop.TargetParatroopers(CivRallyNW.CenterPosition, Angle.West) + end + end) + + Trigger.OnCapture(RadarDome, function() + DomeCaptured = true + USSR.MarkCompletedObjective(CaptureDome) + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + local nwTroops = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", NWWaterUnits, NWWaterPath, { NWWaterPath[1] })[2] + end) + + Trigger.OnAllKilled(SouthPillboxes, function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + local seTroops = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", SEWaterUnits, SEWaterPath, { SEWaterPath[1] })[2] + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Media.PlaySpeechNotification(USSR, "ReinforcementsArrived") + Reinforcements.Reinforce(USSR, { "msub", "msub" }, { MSubEntry.Location, MSubStop.Location }) + ShockDrop.TargetParatroopers(SEShockDrop.CenterPosition, Angle.SouthWest) + end) + end) + + local swFootTriggered + Trigger.OnEnteredFootprint(SWFootprintTrigger, function(actor, id) + if actor.Owner == USSR and actor.Type ~= "badr" and not swFootTriggered then + Trigger.RemoveFootprintTrigger(id) + swFootTriggered = true + + local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR }) + proxy.TargetAirstrike(SWCivSpawn3.CenterPosition, Angle.South) + proxy.Destroy() + local swVillageCam = Actor.Create("camera", true, { Owner = USSR, Location = SWCivSpawn2.Location }) + + local hiding = Reinforcements.Reinforce(Greece, { 'e1', 'e1', 'e3', 'e3', 'e3' }, { SWCivSpawn1.Location }, 0) + Utils.Do(hiding, IdleHunt) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + if not SWVillage1.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn1.Location, CivRallySE.Location }, 0) + end + if not SWVillage2.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn2.Location, CivRallySE.Location }, 0) + end + end) + Trigger.AfterDelay(DateTime.Seconds(4), function() + if not SWVillage3.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn3.Location, CivRallySE.Location }, 0) + end + if not SWVillage4.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn4.Location, CivRallyNW.Location }, 0) + end + end) + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not SWVillage5.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn5.Location, CivRallySE.Location }, 0) + end + if not SWVillage6.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn6.Location, CivRallyNW.Location }, 0) + end + if not SWVillage7.IsDead then + Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn7.Location, CivRallySE.Location }, 0) + end + end) + Trigger.AfterDelay(DateTime.Seconds(5), function() + ShockDrop.TargetParatroopers(SouthwestLZ.CenterPosition, Angle.SouthWest) + Utils.Do(VehicleSquad3, function(a) + if not a.IsDead then + a.AttackMove(NECivSpawn1.Location) + IdleHunt(a) + end + end) + swVillageCam.Destroy() + end) + end + end) + + local seFootTriggered + Trigger.OnEnteredFootprint(SEFootprintTrigger, function(actor, id) + if actor.Owner == USSR and not seFootTriggered then + Trigger.RemoveFootprintTrigger(id) + seFootTriggered = true + + local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR }) + proxy.TargetAirstrike(SEBaseBombingRun.CenterPosition, Angle.East) + proxy.Destroy() + end + end) +end + +TroopsArrived = false +Tick = function() + if USSR.HasNoRequiredUnits() and TroopsArrived then + Greece.MarkCompletedObjective(BeatRussia) + end + + if Greece.HasNoRequiredUnits() and GoodGuy.HasNoRequiredUnits() and Spain.HasNoRequiredUnits() then + USSR.MarkCompletedObjective(KillAll) + end +end + +WorldLoaded = function() + USSR = Player.GetPlayer("USSR") + Greece = Player.GetPlayer("Greece") + GoodGuy = Player.GetPlayer("GoodGuy") + Spain = Player.GetPlayer("Spain") + + Trigger.OnObjectiveAdded(USSR, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + BeatRussia = Greece.AddObjective("Stop Ivan.") + KillAll = USSR.AddObjective("Destroy all that oppose us.") + CaptureDome = USSR.AddObjective("Capture the enemy radar dome.", "Secondary", false) + + 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 = LZ.CenterPosition + ShockDrop = Actor.Create("shockdrop", false, { Owner = USSR }) + MissionStart() + MissionTriggers() +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 6cd510f58c..2ec16fbb3e 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -36,6 +36,7 @@ Counterstrike: Aftermath: production-disruption monster-tank-madness + shock-therapy situation-critical OpenRA Originals: evacuation