diff --git a/OpenRA.sln b/OpenRA.sln index ae84a57a1fc9..c62966e069ef 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -98,6 +98,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re mods\ra\maps\soviet-07\soviet07.lua = mods\ra\maps\soviet-07\soviet07.lua mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea.lua = mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea.lua mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea-AI.lua = mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea-AI.lua + mods\ra\maps\top-o-the-world\scu36ea.lua = mods\ra\maps\top-o-the-world\scu36ea.lua mods\ra\maps\survival01\survival01.lua = mods\ra\maps\survival01\survival01.lua mods\ra\maps\survival02\survival02.lua = mods\ra\maps\survival02\survival02.lua EndProjectSection diff --git a/mods/ra/maps/top-o-the-world/map.bin b/mods/ra/maps/top-o-the-world/map.bin new file mode 100644 index 000000000000..abff2a05621f Binary files /dev/null and b/mods/ra/maps/top-o-the-world/map.bin differ diff --git a/mods/ra/maps/top-o-the-world/map.png b/mods/ra/maps/top-o-the-world/map.png new file mode 100644 index 000000000000..dc774179f296 Binary files /dev/null and b/mods/ra/maps/top-o-the-world/map.png differ diff --git a/mods/ra/maps/top-o-the-world/map.yaml b/mods/ra/maps/top-o-the-world/map.yaml new file mode 100644 index 000000000000..2d330f5d883f --- /dev/null +++ b/mods/ra/maps/top-o-the-world/map.yaml @@ -0,0 +1,898 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: Top o' the world + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 29,31,70,65 + +Visibility: MissionSelector + +Categories: Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: Greece, GoodGuy, USSR, BadGuy + PlayerReference@BadGuy: + Name: BadGuy + Faction: soviet + Color: FE1100 + Allies: USSR + Enemies: Greece, GoodGuy, Creeps + Bot: campaign + PlayerReference@Greece: + Name: Greece + Faction: allies + Color: ABB7E4 + Allies: GoodGuy + Enemies: USSR, Creeps + Bot: campaign + PlayerReference@GoodGuy: + Name: GoodGuy + Faction: allies + Color: ABB7E4 + Allies: Greece + Enemies: USSR, Creeps + Bot: campaign + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Allies: BadGuy + Enemies: Greece, GoodGuy, Creeps + +Actors: + Actor0: brik + Location: 61,37 + Owner: BadGuy + Actor1: brik + Location: 62,37 + Owner: BadGuy + Actor2: brik + Location: 65,37 + Owner: BadGuy + Actor3: brik + Location: 66,37 + Owner: BadGuy + Actor4: brik + Location: 70,37 + Owner: BadGuy + Actor5: brik + Location: 71,37 + Owner: BadGuy + Actor6: brik + Location: 74,37 + Owner: BadGuy + Actor7: brik + Location: 75,37 + Owner: BadGuy + Actor8: brik + Location: 61,38 + Owner: BadGuy + Actor9: brik + Location: 62,38 + Owner: BadGuy + Actor10: brik + Location: 63,38 + Owner: BadGuy + Actor11: brik + Location: 64,38 + Owner: BadGuy + Actor12: brik + Location: 65,38 + Owner: BadGuy + Actor13: brik + Location: 66,38 + Owner: BadGuy + Actor14: brik + Location: 70,38 + Owner: BadGuy + Actor15: brik + Location: 71,38 + Owner: BadGuy + Actor16: brik + Location: 72,38 + Owner: BadGuy + Actor17: brik + Location: 73,38 + Owner: BadGuy + Actor18: brik + Location: 74,38 + Owner: BadGuy + Actor19: brik + Location: 75,38 + Owner: BadGuy + Actor20: sbag + Location: 73,66 + Owner: GoodGuy + Actor21: sbag + Location: 74,66 + Owner: GoodGuy + Actor22: sbag + Location: 74,67 + Owner: GoodGuy + Actor23: sbag + Location: 93,73 + Owner: GoodGuy + Actor24: sbag + Location: 95,73 + Owner: GoodGuy + Actor25: sbag + Location: 91,76 + Owner: GoodGuy + Actor26: sbag + Location: 92,76 + Owner: GoodGuy + Actor27: sbag + Location: 97,76 + Owner: GoodGuy + Actor28: sbag + Location: 98,76 + Owner: GoodGuy + Actor29: sbag + Location: 91,77 + Owner: GoodGuy + Actor30: sbag + Location: 98,77 + Owner: GoodGuy + Actor31: sbag + Location: 76,81 + Owner: GoodGuy + Actor32: sbag + Location: 77,81 + Owner: GoodGuy + Actor33: sbag + Location: 80,81 + Owner: GoodGuy + Actor34: sbag + Location: 75,82 + Owner: GoodGuy + Actor35: sbag + Location: 76,82 + Owner: GoodGuy + Actor36: sbag + Location: 80,82 + Owner: GoodGuy + Actor37: sbag + Location: 75,83 + Owner: GoodGuy + Actor38: sbag + Location: 80,83 + Owner: GoodGuy + Actor39: sbag + Location: 79,84 + Owner: GoodGuy + Actor40: sbag + Location: 80,84 + Owner: GoodGuy + Actor41: sbag + Location: 90,93 + Owner: GoodGuy + Actor42: sbag + Location: 90,94 + Owner: GoodGuy + Actor43: sbag + Location: 87,95 + Owner: GoodGuy + Actor44: sbag + Location: 88,95 + Owner: GoodGuy + Actor45: sbag + Location: 89,95 + Owner: GoodGuy + Actor46: sbag + Location: 90,95 + Owner: GoodGuy + Actor47: tc02 + Location: 34,31 + Owner: Neutral + Actor48: tc01 + Location: 45,31 + Owner: Neutral + Actor49: tc05 + Location: 86,30 + Owner: Neutral + Actor50: tc03 + Location: 97,31 + Owner: Neutral + Actor51: tc05 + Location: 55,31 + Owner: Neutral + Actor52: t12 + Location: 60,32 + Owner: Neutral + Actor53: t17 + Location: 76,32 + Owner: Neutral + Actor54: tc04 + Location: 29,33 + Owner: Neutral + Actor55: t08 + Location: 40,35 + Owner: Neutral + Actor56: tc02 + Location: 56,36 + Owner: Neutral + Actor57: t13 + Location: 76,36 + Owner: Neutral + Actor58: tc01 + Location: 43,37 + Owner: Neutral + Actor59: t10 + Location: 82,37 + Owner: Neutral + Actor60: t12 + Location: 83,38 + Owner: Neutral + Actor61: t11 + Location: 77,39 + Owner: Neutral + Actor62: tc02 + Location: 96,42 + Owner: Neutral + Actor63: tc05 + Location: 29,43 + Owner: Neutral + Actor64: tc04 + Location: 87,44 + Owner: Neutral + Actor65: tc03 + Location: 29,46 + Owner: Neutral + Actor66: t14 + Location: 29,50 + Owner: Neutral + Actor67: tc02 + Location: 38,51 + Owner: Neutral + Actor68: ice02 + Location: 97,52 + Owner: Neutral + Actor69: t15 + Location: 40,53 + Owner: Neutral + Actor70: t16 + Location: 30,55 + Owner: Neutral + Actor71: tc04 + Location: 29,56 + Owner: Neutral + Actor72: tc03 + Location: 29,59 + Owner: Neutral + Actor73: tc05 + Location: 45,59 + Owner: Neutral + Actor74: ice04 + Location: 96,61 + Owner: Neutral + Actor75: tc04 + Location: 40,60 + Owner: Neutral + Actor76: tc04 + Location: 66,60 + Owner: Neutral + Actor77: tc02 + Location: 76,61 + Owner: Neutral + Actor78: t08 + Location: 85,63 + Owner: Neutral + Actor79: tc01 + Location: 45,63 + Owner: Neutral + Actor80: t17 + Location: 86,66 + Owner: Neutral + Actor81: tc04 + Location: 55,68 + Owner: Neutral + Actor82: tc01 + Location: 29,71 + Owner: Neutral + Actor83: tc02 + Location: 60,72 + Owner: Neutral + Actor84: tc03 + Location: 50,73 + Owner: Neutral + Actor85: t08 + Location: 46,76 + Owner: Neutral + Actor86: t10 + Location: 42,76 + Owner: Neutral + Actor87: tc02 + Location: 36,77 + Owner: Neutral + Actor88: t16 + Location: 70,77 + Owner: Neutral + Actor89: tc04 + Location: 30,78 + Owner: Neutral + Actor90: tc02 + Location: 66,79 + Owner: Neutral + Actor91: t08 + Location: 69,80 + Owner: Neutral + Actor92: tc05 + Location: 69,78 + Owner: Neutral + Actor93: t07 + Location: 57,80 + Owner: Neutral + Actor94: tc01 + Location: 64,80 + Owner: Neutral + Actor95: t08 + Location: 34,82 + Owner: Neutral + Actor96: tc05 + Location: 54,80 + Owner: Neutral + Actor97: tc04 + Location: 52,81 + Owner: Neutral + Actor98: t06 + Location: 57,82 + Owner: Neutral + Actor99: tc04 + Location: 58,81 + Owner: Neutral + Actor100: t08 + Location: 60,83 + Owner: Neutral + Actor101: t11 + Location: 61,82 + Owner: Neutral + Actor102: tc01 + Location: 83,82 + Owner: Neutral + Actor103: tc02 + Location: 62,83 + Owner: Neutral + Actor104: tc05 + Location: 29,85 + Owner: Neutral + Actor105: tc01 + Location: 63,86 + Owner: Neutral + Actor106: t11 + Location: 29,88 + Owner: Neutral + Actor107: t08 + Location: 42,90 + Owner: Neutral + Actor108: tc04 + Location: 57,90 + Owner: Neutral + Actor109: tc01 + Location: 56,92 + Owner: Neutral + Actor110: tc02 + Location: 63,92 + Owner: Neutral + Actor111: t08 + Location: 71,93 + Owner: Neutral + Actor112: tc05 + Location: 41,93 + Owner: Neutral + Actor113: tc02 + Location: 49,94 + Owner: Neutral + Actor114: tc05 + Location: 51,93 + Owner: Neutral + Actor115: tc01 + Location: 55,94 + Owner: Neutral + Actor116: tc04 + Location: 68,93 + Owner: Neutral + Actor117: tc02 + Location: 70,94 + Owner: Neutral + Actor118: apwr + Location: 64,32 + Owner: BadGuy + Actor119: apwr + Location: 70,32 + Owner: BadGuy + Actor120: apwr + Location: 61,33 + Owner: BadGuy + USSRTechCenter01: stek + Location: 67,33 + Owner: BadGuy + Actor122: apwr + Location: 73,33 + Owner: BadGuy + Actor123: tsla + Location: 65,36 + Owner: BadGuy + Actor124: tsla + Location: 71,36 + Owner: BadGuy + Actor125: tsla + Location: 63,37 + Owner: BadGuy + Actor126: tsla + Location: 73,37 + Owner: BadGuy + BridgeBarrel01: brl3 + Location: 84,38 + Owner: Greece + BridgeBarrel02: barl + Location: 84,39 + Owner: Greece + BridgeBarrel03: brl3 + Location: 87,39 + Owner: Greece + Actor130: gun + Location: 43,40 + Owner: Greece + Facing: 223 + Actor131: gun + Location: 40,41 + Owner: Greece + Facing: 95 + Actor132: gap + Location: 42,42 + Owner: Greece + Actor133: apwr + Location: 90,41 + Owner: Greece + Actor134: apwr + Location: 93,41 + Owner: Greece + Actor135: gun + Location: 44,43 + Owner: Greece + Facing: 223 + Actor136: gun + Location: 40,44 + Owner: Greece + Facing: 95 + Actor137: gun + Location: 44,46 + Owner: Greece + Facing: 223 + Actor138: gun + Location: 41,47 + Owner: Greece + Facing: 95 + Actor139: hbox + Location: 87,47 + Owner: Greece + AAGun01: agun + Location: 53,61 + Owner: GoodGuy + Facing: 95 + AAGun02: agun + Location: 67,62 + Owner: GoodGuy + Facing: 95 + Actor142: gun + Location: 73,67 + Owner: GoodGuy + Facing: 95 + AAGun03: agun + Location: 62,69 + Owner: GoodGuy + Facing: 223 + AAGun04: agun + Location: 59,73 + Owner: GoodGuy + Facing: 63 + Actor145: gun + Location: 94,73 + Owner: GoodGuy + Facing: 127 + AAGun05: agun + Location: 70,75 + Owner: GoodGuy + Facing: 159 + Actor147: gun + Location: 92,77 + Owner: GoodGuy + Facing: 127 + Actor148: gun + Location: 97,77 + Owner: GoodGuy + Facing: 127 + AAGun06: agun + Location: 39,78 + Owner: GoodGuy + Facing: 159 + Actor150: brl3 + Location: 77,82 + Owner: GoodGuy + Actor151: v19 + Location: 76,83 + Owner: GoodGuy + Actor152: barl + Location: 77,83 + Owner: GoodGuy + Actor153: brl3 + Location: 79,83 + Owner: GoodGuy + AlliedGNRLHouse: v10 + Location: 89,94 + Owner: Greece + Actor155: 2tnk + Location: 94,46 + Owner: Greece + Facing: 95 + AlliedSquad05MTank01: 2tnk + Location: 57,56 + Owner: GoodGuy + Facing: 31 + AlliedSquad05MTank02: 2tnk + Location: 63,56 + Owner: GoodGuy + Facing: 31 + AlliedSquad04MGG01: mgg + Location: 34,61 + Owner: Greece + Facing: 127 + AlliedSquad04MTank01: 2tnk + Location: 31,63 + Owner: GoodGuy + Facing: 127 + AlliedSquad04Arty01: arty + Location: 33,63 + Owner: Greece + Facing: 127 + AlliedSquad04Arty02: arty + Location: 35,63 + Owner: Greece + Facing: 127 + AlliedSquad04MTank02: 2tnk + Location: 37,63 + Owner: GoodGuy + Facing: 127 + AlliedSquad03LTank01: 1tnk + Location: 78,63 + Owner: GoodGuy + Facing: 159 + AlliedSquad04MTank03: 2tnk + Location: 33,64 + Owner: GoodGuy + Facing: 127 + AlliedSquad04Arty03: arty + Location: 34,64 + Owner: GoodGuy + Facing: 127 + AlliedSquad04MTank04: 2tnk + Location: 35,64 + Owner: GoodGuy + Facing: 127 + AlliedSquad04MTank05: 2tnk + Location: 34,65 + Owner: GoodGuy + Facing: 127 + Actor168: 1tnk + Location: 66,65 + Owner: GoodGuy + Facing: 127 + Actor169: 2tnk + Location: 75,78 + Owner: GoodGuy + Facing: 191 + Actor170: 2tnk + Location: 78,82 + Owner: GoodGuy + Actor171: 2tnk + Location: 55,83 + Owner: GoodGuy + Facing: 95 + USSRHTank01: 3tnk + Location: 35,87 + Owner: USSR + USSRHTank02: 3tnk + Location: 37,87 + Owner: USSR + USSRHTank03: 3tnk + Location: 39,87 + Owner: USSR + USSRMTank01: 4tnk + Location: 35,89 + Owner: USSR + USSRMTank02: 4tnk + Location: 39,89 + Owner: USSR + USSRV201: v2rl + Location: 34,93 + Owner: USSR + USSRV202: v2rl + Location: 37,93 + Owner: USSR + USSRV203: v2rl + Location: 40,93 + Owner: USSR + ObjectiveTruck01: truk + Location: 37,95 + Owner: USSR + Actor181: e3 + Location: 47,33 + Owner: GoodGuy + Facing: 63 + SubCell: 1 + Actor182: e3 + Location: 47,34 + Owner: GoodGuy + Facing: 63 + SubCell: 1 + AlliedSquad03RocketInf01: e3 + Location: 78,61 + Owner: Greece + Facing: 127 + SubCell: 1 + AlliedSquad03RocketInf02: e3 + Location: 84,61 + Owner: Greece + Facing: 95 + SubCell: 3 + Actor185: e3 + Location: 72,62 + Owner: Greece + SubCell: 4 + AlliedSquad03RocketInf03: e3 + Location: 80,64 + Owner: Greece + Facing: 95 + SubCell: 3 + Actor187: e3 + Location: 72,66 + Owner: Greece + Facing: 95 + SubCell: 0 + Actor188: e3 + Location: 74,68 + Owner: Greece + Facing: 95 + SubCell: 2 + Actor189: e3 + Location: 60,69 + Owner: GoodGuy + Facing: 191 + SubCell: 4 + Actor190: e3 + Location: 60,71 + Owner: GoodGuy + Facing: 191 + SubCell: 0 + Actor191: e3 + Location: 69,78 + Owner: Greece + SubCell: 4 + AlliedSquad02RifleInf01: e1 + Location: 88,85 + Owner: Greece + SubCell: 2 + AlliedSquad02RifleInf02: e1 + Location: 89,85 + Owner: Greece + SubCell: 2 + AlliedSquad02RifleInf03: e1 + Location: 89,85 + Owner: Greece + SubCell: 1 + AlliedSquad02RifleInf04: e1 + Location: 88,86 + Owner: Greece + SubCell: 2 + AlliedSquad02RifleInf05: e1 + Location: 89,86 + Owner: Greece + SubCell: 2 + AlliedSquad02RifleInf06: e1 + Location: 89,86 + Owner: Greece + SubCell: 1 + AlliedSquad02RifleInf07: e1 + Location: 88,87 + Owner: Greece + SubCell: 2 + AlliedSquad02RifleInf08: e1 + Location: 89,87 + Owner: Greece + SubCell: 2 + AlliedSquad02RifleInf09: e1 + Location: 89,87 + Owner: Greece + SubCell: 1 + USSRDog01: dog + Location: 35,91 + Owner: USSR + SubCell: 1 + USSRDog02: dog + Location: 35,91 + Owner: USSR + SubCell: 2 + USSRGrenadier01: e2 + Location: 37,91 + Owner: USSR + SubCell: 1 + USSRGrenadier02: e2 + Location: 37,91 + Owner: USSR + SubCell: 4 + USSRGrenadier03: e2 + Location: 37,91 + Owner: USSR + SubCell: 3 + USSRGrenadier04: e2 + Location: 37,91 + Owner: USSR + SubCell: 5 + USSRGrenadier05: e2 + Location: 37,91 + Owner: USSR + SubCell: 2 + USSRDog03: dog + Location: 39,91 + Owner: USSR + SubCell: 2 + USSRDog04: dog + Location: 40,91 + Owner: USSR + SubCell: 1 + USSRFlame01: e4 + Location: 35,92 + Owner: USSR + SubCell: 1 + USSRFlame02: e4 + Location: 35,92 + Owner: USSR + SubCell: 2 + USSRFlame03: e4 + Location: 39,92 + Owner: USSR + SubCell: 2 + USSRFlame04: e4 + Location: 40,92 + Owner: USSR + SubCell: 1 + AlliedSquad01RocketInf01: e3 + Location: 90,92 + Owner: GoodGuy + Facing: 31 + SubCell: 5 + AlliedSquad01RocketInf02: e3 + Location: 88,93 + Owner: GoodGuy + Facing: 31 + SubCell: 1 + AlliedSquad01RocketInf03: e3 + Location: 89,93 + Owner: GoodGuy + Facing: 31 + SubCell: 2 + AlliedSquad01RocketInf04: e3 + Location: 87,94 + Owner: GoodGuy + Facing: 31 + SubCell: 4 + AlliedSquad01RocketInf05: e3 + Location: 88,94 + Owner: GoodGuy + Facing: 31 + SubCell: 4 + Actor219: e3 + Location: 74,95 + Owner: Greece + SubCell: 1 + Actor220: e3 + Location: 75,95 + Owner: Greece + SubCell: 1 + hcrate01: healcrate + Location: 72,63 + Owner: Neutral + hcrate02: healcrate + Location: 78,83 + Owner: Neutral + AlliedHuntingPartySpawn: waypoint + Location: 93,31 + Owner: Neutral + WaystationWP02: waypoint + Location: 68,32 + Owner: Neutral + WaystationWP01: waypoint + Location: 68,37 + Owner: Neutral + AlliedHuntingPartyWP01: waypoint + Location: 85,38 + Owner: Neutral + AlliedHuntingPartyWP06: waypoint + Location: 36,41 + Owner: Neutral + AlliedHuntingPartyWP05: waypoint + Location: 49,41 + Owner: Neutral + AlliedHuntingPartyWP02: waypoint + Location: 63,48 + Owner: Neutral + AlliedHuntingPartyWP04: waypoint + Location: 51,50 + Owner: Neutral + AlliedHuntingPartyWP07: waypoint + Location: 34,53 + Owner: Neutral + AlliedHuntingPartyWP03: waypoint + Location: 61,53 + Owner: Neutral + AlliedDestroyer02WP02: waypoint + Location: 90,55 + Owner: Neutral + AlliedDestroyer01WP02: waypoint + Location: 88,57 + Owner: Neutral + AlliedDestroyer02WP01: waypoint + Location: 94,57 + Owner: Neutral + AlliedDestroyer02Spawn: waypoint + Location: 98,57 + Owner: Neutral + AlliedDestroyer01WP01: waypoint + Location: 94,59 + Owner: Neutral + AlliedDestroyer01Spawn: waypoint + Location: 98,59 + Owner: Neutral + UnusedWaypoint: waypoint + Location: 95,62 + Owner: Neutral + MapCenterPoint: waypoint + Location: 64,64 + Owner: Neutral + PlayerStartLocation: waypoint + Location: 37,85 + Owner: Neutral + DefaultCameraPosition: waypoint + Location: 37,91 + Owner: Neutral + AlliedGNRLDestination: waypoint + Location: 87,92 + Owner: Neutral + AlliedParadropLZ01: waypoint + Location: 35,93 + Owner: Neutral + AlliedParadropLZ02: waypoint + Location: 39,93 + Owner: Neutral + AlliedGNRLSpawn: waypoint + Location: 89,94 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml + +Weapons: weapons.yaml diff --git a/mods/ra/maps/top-o-the-world/rules.yaml b/mods/ra/maps/top-o-the-world/rules.yaml new file mode 100644 index 000000000000..8a4ac7246601 --- /dev/null +++ b/mods/ra/maps/top-o-the-world/rules.yaml @@ -0,0 +1,75 @@ +World: + LuaScript: + Scripts: scu36ea.lua + MissionData: + Briefing: A critical cargo held in this supply truck must reach the waystation atop this mountain. The way is blocked by Allied squads, but do not let that deter you -- the cargo must reach its destination.\n\nIn addition, the onset of nightfall has brought sub-zero temperatures with it. The Allies are prepared for this -- our units are not. The life expectancy of your troops in these extremes is limited. Infantry may last 12 minutes, while vehicles could survive for up to 36 minutes. You have little time. Go.\n + WinVideo: sovtstar.vqa + LossVideo: sovbatl.vqa + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +^Palettes: + IndexedPlayerPalette@truk: + BaseName: truk + BasePalette: player + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + PlayerIndex: + USSR: 200, 200, 201, 202, 203, 203, 204, 205, 206, 206, 207, 221, 222, 222, 223, 223 + AllowModifiers: True + +MSLO: + Buildable: + Prerequisites: ~disabled + +HEALCRATE: + Crate: + Lifetime: 9999 + +AGUN: + Power: + Amount: 125 + +TRUK: + -SpawnActorOnDeath: + RenderSprites: + PlayerPalette: truk + +GNRL: + Armament: + Weapon: SilencedPPK + +SCAMERA: + Inherits: CAMERA + RevealsShroud: + Range: 5c512 + +powerproxy.spyplane: + AlwaysVisible: + AirstrikePower: + OrderName: SovietSpyPlane + Icon: spyplane + ChargeInterval: 4500 + Description: Spy Plane (Single Use) + LongDesc: Reveals an area of the map and cloaked enemy units. + OneShot: true + SelectTargetSpeechNotification: SelectTarget + EndChargeSpeechNotification: SpyPlaneReady + CameraActor: camera.spyplane + CameraRemoveDelay: 150 + UnitType: u2 + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: camicon + ArrowSequence: arrow + ClockSequence: clock + CircleSequence: circles + +powerproxy.parabombs: + AirstrikePower: + ChargeInterval: 4500 diff --git a/mods/ra/maps/top-o-the-world/scu36ea.lua b/mods/ra/maps/top-o-the-world/scu36ea.lua new file mode 100644 index 000000000000..7d722296ab7e --- /dev/null +++ b/mods/ra/maps/top-o-the-world/scu36ea.lua @@ -0,0 +1,371 @@ +--[[ + Copyright 2007-2019 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. +]] + +--All timers have been reduced by 40% because time was flying 40% faster than reality in the original game. +--That's why instead of having an hour to complete the mission you only have 36 minutes. + +--Unit Groups Setup +USSRDie01 = { USSRGrenadier01, USSRGrenadier02, USSRGrenadier03, USSRFlame01, USSRFlame03 } +USSRDie02 = { USSRGrenadier04, USSRGrenadier05, USSRFlame02, USSRFlame04 } +USSRDie03 = { USSRHTank01, USSRHTank02 } +USSRDie04 = { USSRDog01, USSRDog03 } +USSRDie05 = { USSRDog02, USSRDog04 } +USSRDie06 = { USSRV202, USSRV203 } +AlliedSquad01 = { AlliedSquad01RocketInf01, AlliedSquad01RocketInf02, AlliedSquad01RocketInf03, AlliedSquad01RocketInf04, AlliedSquad01RocketInf05 } +AlliedSquad02 = { AlliedSquad02RifleInf01, AlliedSquad02RifleInf02, AlliedSquad02RifleInf03, AlliedSquad02RifleInf04, AlliedSquad02RifleInf05, AlliedSquad02RifleInf06, AlliedSquad02RifleInf07, AlliedSquad02RifleInf08, AlliedSquad02RifleInf09 } +AlliedSquad03 = { AlliedSquad03LTank01, AlliedSquad03RocketInf01, AlliedSquad03RocketInf02, AlliedSquad03RocketInf03 } +AlliedSquad04 = { AlliedSquad04MGG01, AlliedSquad04MTank01, AlliedSquad04MTank02, AlliedSquad04MTank03, AlliedSquad04MTank04, AlliedSquad04MTank05, AlliedSquad04Arty01, AlliedSquad04Arty02, AlliedSquad04Arty03 } +AlliedTanksReinforcement = { "2tnk", "2tnk" } +if Map.LobbyOption("difficulty") == "easy" then + AlliedHuntingParty = { "1tnk" } +elseif Map.LobbyOption("difficulty") == "normal" then + AlliedHuntingParty = { "1tnk", "1tnk" } +elseif Map.LobbyOption("difficulty") == "hard" then + AlliedHuntingParty = { "1tnk", "1tnk", "1tnk" } +end + +--Building Group Setup +AlliedAAGuns = { AAGun01, AAGun02, AAGun03, AAGun04, AAGun05, AAGun06 } + +--Area Triggers Setup +WaystationTrigger = { CPos.New(61, 37), CPos.New(62, 37), CPos.New(63, 37), CPos.New(64, 37), CPos.New(65, 37), CPos.New(66, 37), CPos.New(67, 37), CPos.New(68, 37), CPos.New(69, 37), CPos.New(70, 37), CPos.New(71, 37), CPos.New(72, 37), CPos.New(73, 37), CPos.New(74, 37), CPos.New(75, 37), CPos.New(61, 38), CPos.New(62, 38), CPos.New(63, 38), CPos.New(64, 38), CPos.New(65, 38), CPos.New(66, 38), CPos.New(67, 38), CPos.New(68, 38), CPos.New(69, 38), CPos.New(70, 38), CPos.New(71, 38), CPos.New(72, 38), CPos.New(73, 38), CPos.New(74, 38), CPos.New(75, 38), CPos.New(61, 39), CPos.New(62, 39), CPos.New(63, 39), CPos.New(64, 39), CPos.New(65, 39), CPos.New(66, 39), CPos.New(67, 39), CPos.New(68, 39), CPos.New(69, 39), CPos.New(70, 39), CPos.New(71, 39), CPos.New(72, 39), CPos.New(73, 39), CPos.New(74, 39), CPos.New(75, 39) } +Inf01Trigger = { CPos.New(81, 90), CPos.New(81, 91), CPos.New(81, 92), CPos.New(81, 93), CPos.New(81, 94), CPos.New(81, 95), CPos.New(82, 90), CPos.New(82, 91), CPos.New(82, 92), CPos.New(82, 93), CPos.New(82, 94), CPos.New(82, 95) } +Inf02Trigger = { CPos.New(85, 90), CPos.New(85, 91), CPos.New(85, 92), CPos.New(85, 93), CPos.New(85, 94), CPos.New(85, 95), CPos.New(86, 90), CPos.New(86, 91), CPos.New(86, 92), CPos.New(86, 93), CPos.New(86, 94), CPos.New(86, 95) } +RevealBridgeTrigger = { CPos.New(74, 52), CPos.New(75, 52), CPos.New(76, 52), CPos.New(77, 52), CPos.New(78, 52), CPos.New(79, 52), CPos.New(80, 52), CPos.New(81, 52), CPos.New(82, 52), CPos.New(83, 52), CPos.New(84, 52), CPos.New(85, 52), CPos.New(86, 52), CPos.New(87, 52), CPos.New(88, 52), CPos.New(76, 53), CPos.New(77, 53), CPos.New(78, 53), CPos.New(79, 53), CPos.New(80, 53), CPos.New(81, 53), CPos.New(82, 53), CPos.New(83, 53), CPos.New(84, 53), CPos.New(85, 53), CPos.New(86, 53), CPos.New(87, 53) } + +--Mission Variables Setup +RemainingTime = DateTime.Minutes(36) +BridgeIsIntact = true + +--Mission Functions Setup +HuntObjectiveTruck = function(a) + if a.HasProperty("Hunt") then + if a.Owner == greece or a.Owner == goodguy then + Trigger.OnIdle(a, function(a) + if a.IsInWorld and not ObjectiveTruck01.IsDead then + a.AttackMove(ObjectiveTruck01.Location, 2) + elseif a.IsInWorld then + a.Hunt() + end + end) + end + end +end + +HuntEnemyUnits = function(a) + if a.HasProperty("Hunt") then + Trigger.OnIdle(a, function(a) + if a.IsInWorld then + a.Hunt() + end + end) + end +end + +AlliedGroundPatrols = function(a) + if a.HasProperty("Hunt") then + if a.IsInWorld then + a.Patrol({ AlliedHuntingPartyWP02.Location, AlliedHuntingPartyWP03.Location, AlliedHuntingPartyWP04.Location, AlliedHuntingPartyWP05.Location, AlliedHuntingPartyWP06.Location, AlliedHuntingPartyWP07.Location }, false, 50) + end + end +end + +SpawnAlliedHuntingParty = function() + Trigger.AfterDelay(DateTime.Minutes(3), function() + if BridgeIsIntact then + local tanks = Reinforcements.Reinforce(greece, AlliedHuntingParty, { AlliedHuntingPartySpawn.Location, AlliedHuntingPartyWP01.Location,AlliedHuntingPartyWP03.Location, AlliedHuntingPartyWP05.Location }, 0) + Utils.Do(tanks, function(units) + HuntObjectiveTruck(units) + end) + SpawnAlliedHuntingParty() + end + end) +end + +WorldLoaded = function() +--Players Setup + player = Player.GetPlayer("USSR") + greece = Player.GetPlayer("Greece") + goodguy = Player.GetPlayer("GoodGuy") + badguy = Player.GetPlayer("BadGuy") + neutral = Player.GetPlayer("Neutral") + creeps = Player.GetPlayer("Creeps") + + Camera.Position = DefaultCameraPosition.CenterPosition + +--Objectives Setup + Trigger.OnObjectiveAdded(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + Trigger.OnObjectiveCompleted(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + BringSupplyTruck = player.AddPrimaryObjective("Bring the supply truck to the waystation.") + ProtectWaystation = player.AddPrimaryObjective("The waystation must not be destroyed.") + DestroyAAGuns = player.AddSecondaryObjective("Destroy all the AA Guns to enable air support.") + PreventAlliedIncursions = player.AddSecondaryObjective("Find and destroy the bridge the allies are using\nto bring their reinforcements in the area.") + + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "MissionAccomplished") + end) + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "MissionFailed") + end) + + Trigger.OnKilled(USSRTechCenter01, function() + player.MarkFailedObjective(ProtectWaystation) + end) + + Trigger.OnKilled(ObjectiveTruck01, function() + player.MarkFailedObjective(BringSupplyTruck) + end) + + Trigger.OnEnteredFootprint(WaystationTrigger, function(unit, id) + if unit == ObjectiveTruck01 then + Trigger.RemoveFootprintTrigger(id) + player.MarkCompletedObjective(BringSupplyTruck) + player.MarkCompletedObjective(ProtectWaystation) + end + end) + + Trigger.OnAllKilled(AlliedAAGuns, function() + player.MarkCompletedObjective(DestroyAAGuns) + Media.PlaySpeechNotification(player, "ObjectiveMet") + Trigger.AfterDelay(DateTime.Seconds(2), function() + Actor.Create("powerproxy.spyplane", true, { Owner = player }) + Actor.Create("powerproxy.parabombs", true, { Owner = player }) + Media.DisplayMessage("Very good comrade general! Our air units just took off\nand should be in your area in approximately three minutes.") + end) + end) + +--Triggers Setup + SpawnAlliedHuntingParty() + + Trigger.AfterDelay(0, function() + local PlayerRevealCam = Actor.Create("camera", true, { Owner = player, Location = PlayerStartLocation.Location }) + Trigger.AfterDelay(1, function() + if PlayerRevealCam.IsInWorld then PlayerRevealCam.Destroy() end + end) + end) + + Trigger.OnEnteredFootprint(Inf01Trigger, function(unit, id) + if unit.Owner == player then + if not AlliedGNRLHouse.IsDead then + Reinforcements.Reinforce(greece, { "gnrl" }, { AlliedGNRLSpawn.Location, AlliedGNRLDestination.Location }, 0, function(unit) + HuntEnemyUnits(unit) + end) + end + Utils.Do(AlliedSquad01, function(actor) + HuntEnemyUnits(actor) + end) + local AlliedGNRLCamera = Actor.Create("scamera", true, { Owner = player, Location = AlliedGNRLSpawn.Location }) + Trigger.AfterDelay(DateTime.Seconds(6), function() + if AlliedGNRLCamera.IsInWorld then AlliedGNRLCamera.Destroy() end + end) + Trigger.RemoveFootprintTrigger(id) + end + end) + + Trigger.OnEnteredFootprint(Inf02Trigger, function(unit, id) + if unit.Owner == player then + Utils.Do(AlliedSquad02, function(actor) + HuntEnemyUnits(actor) + end) + Trigger.RemoveFootprintTrigger(id) + end + end) + + Utils.Do(AlliedSquad03, function(actor) + Trigger.OnDamaged(actor, function(unit, attacker) + if attacker.Owner == player then + Utils.Do(AlliedSquad03, function(actor) + HuntEnemyUnits(actor) + end) + end + end) + end) + + Trigger.OnEnteredFootprint(RevealBridgeTrigger, function(unit, id) + if unit.Owner == player then + local BridgeCamera01 = Actor.Create("camera", true, { Owner = player, Location = AlliedHuntingPartySpawn.Location }) + local BridgeCamera02 = Actor.Create("camera", true, { Owner = player, Location = AlliedHuntingPartyWP01.Location }) + Trigger.AfterDelay(DateTime.Seconds(6), function() + if BridgeCamera01.IsInWorld then BridgeCamera01.Destroy() end + if BridgeCamera02.IsInWorld then BridgeCamera02.Destroy() end + end) + if Map.LobbyOption("difficulty") == "normal" then + Reinforcements.Reinforce(goodguy, { "dd" }, { AlliedDestroyer01Spawn.Location, AlliedDestroyer01WP01.Location, AlliedDestroyer01WP02.Location }, 0, function(unit) + unit.Stance = "Defend" + end) + end + if Map.LobbyOption("difficulty") == "hard" then + Reinforcements.Reinforce(goodguy, { "dd" }, { AlliedDestroyer01Spawn.Location, AlliedDestroyer01WP01.Location, AlliedDestroyer01WP02.Location }, 0, function(unit) + unit.Stance = "Defend" + end) + Reinforcements.Reinforce(goodguy, { "dd" }, { AlliedDestroyer02Spawn.Location, AlliedDestroyer02WP01.Location, AlliedDestroyer02WP02.Location }, 0, function(unit) + unit.Stance = "Defend" + end) + end + Trigger.RemoveFootprintTrigger(id) + end + end) + + Trigger.AfterDelay(DateTime.Minutes(9), function() + local powerproxy01 = Actor.Create("powerproxy.paratroopers", true, { Owner = greece }) + local paratroopers01 = powerproxy01.SendParatroopers(AlliedParadropLZ01.CenterPosition, false, Facing.SouthWest) + local powerproxy02 = Actor.Create("powerproxy.paratroopers", true, { Owner = goodguy }) + local paratroopers02 = powerproxy02.SendParatroopers(AlliedParadropLZ02.CenterPosition, false, Facing.SouthWest) + Utils.Do(paratroopers01, function(unit) + HuntObjectiveTruck(unit) + end) + Utils.Do(paratroopers02, function(unit) + HuntObjectiveTruck(unit) + end) + end) + + Trigger.AfterDelay(0, function() + BridgeEnd = Map.ActorsInBox(AlliedHuntingPartySpawn.CenterPosition, AlliedHuntingPartyWP01.CenterPosition, function(self) return self.Type == "br2" end)[1] + Trigger.OnKilled(BridgeEnd, function() + BridgeIsIntact = false + if not BridgeBarrel01.IsDead then BridgeBarrel01.Kill() end + if not BridgeBarrel03.IsDead then BridgeBarrel03.Kill() end + player.MarkCompletedObjective(PreventAlliedIncursions) + Media.PlaySpeechNotification(player, "ObjectiveMet") + Trigger.AfterDelay(DateTime.Seconds(2), function() + Media.DisplayMessage("This should stop the allied forces from getting their ground based reinforcements.") + end) + end) + end) + + Trigger.OnAnyKilled({ BridgeBarrel01, BridgeBarrel03 }, function() + if not BridgeEnd.IsDead then + BridgeEnd.Kill() + end + end) + + Trigger.OnAnyKilled(AlliedSquad04, function() + if BridgeIsIntact then + local tanks = Reinforcements.Reinforce(greece, AlliedTanksReinforcement, { AlliedHuntingPartySpawn.Location, AlliedHuntingPartyWP01.Location }, 0, function(units) + AlliedGroundPatrols(units) + end) + Trigger.OnAllKilled(tanks, function() + if BridgeIsIntact then + Reinforcements.Reinforce(greece, AlliedTanksReinforcement, { AlliedHuntingPartySpawn.Location, AlliedHuntingPartyWP01.Location }, 0, function(units) + AlliedGroundPatrols(units) + end) + end + end) + end + end) + + Trigger.OnAllKilled(AlliedSquad04, function() + if BridgeIsIntact then + local tanks = Reinforcements.Reinforce(greece, AlliedTanksReinforcement, { AlliedHuntingPartySpawn.Location, AlliedHuntingPartyWP01.Location }, 0, function(units) + AlliedGroundPatrols(units) + end) + Trigger.OnAllKilled(tanks, function() + if BridgeIsIntact then + Reinforcements.Reinforce(greece, AlliedTanksReinforcement, { AlliedHuntingPartySpawn.Location, AlliedHuntingPartyWP01.Location }, 0, function(units) + AlliedGroundPatrols(units) + end) + end + end) + end + end) + +--Units Death Setup + Trigger.AfterDelay(DateTime.Minutes(11), function() + Utils.Do(USSRDie01, function(actor) + if not actor.IsDead then actor.Kill() end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(12.4), function() + Utils.Do(USSRDie02, function(actor) + if not actor.IsDead then actor.Kill() end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(18.7), function() + if not USSRHTank03.IsDead then USSRHTank03.Kill() end + end) + + Trigger.AfterDelay(DateTime.Minutes(20.5), function() + Utils.Do(USSRDie03, function(actor) + if not actor.IsDead then actor.Kill() end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(22.3), function() + Utils.Do(USSRDie04, function(actor) + if not actor.IsDead then actor.Kill() end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(23.6), function() + Utils.Do(USSRDie05, function(actor) + if not actor.IsDead then actor.Kill() end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(27.8), function() + if not USSRV201.IsDead then USSRV201.Kill() end + end) + + Trigger.AfterDelay(DateTime.Minutes(29.1), function() + Utils.Do(USSRDie06, function(actor) + if not actor.IsDead then actor.Kill() end + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(33.9), function() + if not USSRMTank02.IsDead then USSRMTank02.Kill() end + end) + + Trigger.AfterDelay(DateTime.Minutes(35.7), function() + if not USSRMTank01.IsDead then USSRMTank01.Kill() end + end) + + Trigger.AfterDelay(DateTime.Minutes(36), function() + if not ObjectiveTruck01.IsDead then ObjectiveTruck01.Kill() end + end) +end + +Tick = function() + +-- Timer Setup + if RemainingTime == DateTime.Minutes(30) then + Media.PlaySpeechNotification(player, "ThirtyMinutesRemaining") + elseif RemainingTime == DateTime.Minutes(20) then + Media.PlaySpeechNotification(player, "TwentyMinutesRemainingg") + elseif RemainingTime == DateTime.Minutes(10) then + Media.PlaySpeechNotification(player, "TenMinutesRemaining") + elseif RemainingTime == DateTime.Minutes(5) then + Media.PlaySpeechNotification(player, "WarningFiveMinutesRemaining") + elseif RemainingTime == DateTime.Minutes(4) then + Media.PlaySpeechNotification(player, "WarningFourMinutesRemaining") + elseif RemainingTime == DateTime.Minutes(3) then + Media.PlaySpeechNotification(player, "WarningThreeMinutesRemaining") + elseif RemainingTime == DateTime.Minutes(2) then + Media.PlaySpeechNotification(player, "WarningTwoMinutesRemaining") + elseif RemainingTime == DateTime.Minutes(1) then + Media.PlaySpeechNotification(player, "WarningOneMinuteRemaining") + end + + if RemainingTime > 0 then + UserInterface.SetMissionText("Time Remaining: " .. Utils.FormatTime(RemainingTime), neutral.Color) + RemainingTime = RemainingTime - 1 + elseif RemainingTime == 0 then + UserInterface.SetMissionText("") + end +end \ No newline at end of file diff --git a/mods/ra/maps/top-o-the-world/weapons.yaml b/mods/ra/maps/top-o-the-world/weapons.yaml new file mode 100644 index 000000000000..5b923af99c52 --- /dev/null +++ b/mods/ra/maps/top-o-the-world/weapons.yaml @@ -0,0 +1,2 @@ +TeslaZap: + Range: 6c0 diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index f5e19be633da..76032be03ebf 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -25,6 +25,7 @@ Soviet Campaign: Counterstrike: sarin-gas-1-crackdown soviet-soldier-volkov-n-chitzkoi + top-o-the-world Aftermath: monster-tank-madness OpenRA Originals: