diff --git a/OpenRA.sln b/OpenRA.sln index 46b71c67de..16921572c2 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -61,6 +61,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re mods\ra\maps\soviet-01\soviet01.lua = mods\ra\maps\soviet-01\soviet01.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 + mods\ra\maps\soviet-02a\soviet02a.lua = mods\ra\maps\soviet-02a\soviet02a.lua EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dune 2000 Lua scripts", "Dune 2000 Lua scripts", "{06B1AE07-DDB0-4287-8700-A8CD9A0E652E}" diff --git a/mods/ra/maps/soviet-02a/map.bin b/mods/ra/maps/soviet-02a/map.bin new file mode 100644 index 0000000000..b22bdb30b7 Binary files /dev/null and b/mods/ra/maps/soviet-02a/map.bin differ diff --git a/mods/ra/maps/soviet-02a/map.png b/mods/ra/maps/soviet-02a/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-02a/map.png differ diff --git a/mods/ra/maps/soviet-02a/map.yaml b/mods/ra/maps/soviet-02a/map.yaml new file mode 100644 index 0000000000..e4d4ee055b --- /dev/null +++ b/mods/ra/maps/soviet-02a/map.yaml @@ -0,0 +1,707 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 02a: The thin red line + +Description: Tomorrow, the attack on Germany begins, but today, we must protect our facility from Allied attacks.\n\nKeep the Command Center intact at all costs, and destroy any Allied fortification you might find. + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 36,38,50,40 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: soviet2.vqa + GameStart: spotter.vqa + GameWon: sovtstar.vqa + GameLost: sovcemet.vqa + +Options: + Crates: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 5000 + ConfigurableStartingUnits: False + ShortGame: False + +Players: + PlayerReference@USSR: + Name: USSR + Playable: True + AllowBots: False + Required: True + LockRace: True + Race: soviet + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: Germany + PlayerReference@Germany: + Name: Germany + Race: allies + ColorRamp: 161,134,236 + Enemies: USSR + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: allies + +Actors: + Actor0: t02 + Location: 37,45 + Owner: Neutral + Actor1: t06 + Location: 50,63 + Owner: Neutral + Actor2: t06 + Location: 59,71 + Owner: Neutral + Actor3: tc01 + Location: 52,76 + Owner: Neutral + Actor4: tc01 + Location: 37,66 + Owner: Neutral + Actor5: tc03 + Location: 37,65 + Owner: Neutral + Actor6: t16 + Location: 37,63 + Owner: Neutral + Actor7: t12 + Location: 37,70 + Owner: Neutral + Actor8: t08 + Location: 36,70 + Owner: Neutral + Actor9: t07 + Location: 36,68 + Owner: Neutral + Actor10: tc04 + Location: 40,74 + Owner: Neutral + Actor11: tc05 + Location: 42,69 + Owner: Neutral + Actor12: t10 + Location: 50,50 + Owner: Neutral + Actor13: t17 + Location: 68,47 + Owner: Neutral + Actor14: t13 + Location: 39,69 + Owner: Neutral + Actor15: t01 + Location: 69,60 + Owner: Neutral + Actor16: t01 + Location: 77,39 + Owner: Neutral + Actor17: tc01 + Location: 72,42 + Owner: Neutral + Actor18: t15 + Location: 76,64 + Owner: Neutral + Actor19: t01 + Location: 56,44 + Owner: Neutral + Actor20: t03 + Location: 61,41 + Owner: Neutral + Actor21: t01 + Location: 66,73 + Owner: Neutral + Actor22: t02 + Location: 66,71 + Owner: Neutral + Actor23: t01 + Location: 67,57 + Owner: Neutral + Actor24: t05 + Location: 69,51 + Owner: Neutral + Actor25: tc03 + Location: 47,48 + Owner: Neutral + Actor26: t05 + Location: 70,66 + Owner: Neutral + Actor27: t01 + Location: 59,51 + Owner: Neutral + Actor28: t06 + Location: 62,57 + Owner: Neutral + Actor29: tc05 + Location: 73,37 + Owner: Neutral + Actor30: tc04 + Location: 70,37 + Owner: Neutral + Actor31: tc04 + Location: 83,37 + Owner: Neutral + Actor32: tc03 + Location: 84,40 + Owner: Neutral + Actor33: t17 + Location: 82,39 + Owner: Neutral + Actor34: fact + Location: 72,52 + Owner: USSR + Health: 99 + Actor35: weap + Location: 41,50 + Owner: Germany + Health: 98 + Actor37: fact + Location: 39,54 + Owner: Germany + Actor39: powr + Location: 36,55 + Owner: Germany + Actor40: powr + Location: 36,52 + Owner: Germany + Health: 99 + Actor41: tent + Location: 41,58 + Owner: Germany + Actor42: gun + Location: 39,61 + Owner: Germany + Facing: 96 + Actor44: powr + Location: 36,49 + Owner: Germany + Actor45: gun + Location: 50,55 + Owner: Germany + Facing: 96 + Actor46: gun + Location: 50,59 + Owner: Germany + Facing: 32 + Actor47: brl3 + Location: 38,48 + Owner: Germany + Actor48: v19 + Location: 39,48 + Owner: Germany + Actor49: v19 + Location: 40,46 + Owner: Germany + Actor50: brl3 + Location: 40,47 + Owner: Germany + Actor51: barl + Location: 39,49 + Owner: Germany + Actor52: brl3 + Location: 40,48 + Owner: Germany + Actor53: barl + Location: 38,49 + Owner: Germany + Actor54: brl3 + Location: 39,50 + Owner: Germany + Actor55: barl + Location: 38,51 + Owner: Germany + Actor56: barl + Location: 38,52 + Owner: Germany + Actor57: brl3 + Location: 39,53 + Owner: Germany + Actor58: barl + Location: 38,54 + Owner: Germany + Actor59: brl3 + Location: 38,53 + Owner: Germany + Actor60: brl3 + Location: 41,45 + Owner: Germany + Actor61: barl + Location: 41,46 + Owner: Germany + Actor62: brl3 + Location: 58,54 + Owner: Germany + Actor63: v19 + Location: 59,53 + Owner: Germany + Actor64: barl + Location: 58,52 + Owner: Germany + Actor66: barl + Location: 60,53 + Owner: Germany + Actor67: brl3 + Location: 58,53 + Owner: Germany + Actor68: barl + Location: 59,51 + Owner: Germany + Actor70: barl + Location: 60,59 + Owner: Germany + Actor71: v19 + Location: 61,59 + Owner: Germany + Actor73: barl + Location: 60,61 + Owner: Germany + Actor74: powr + Location: 79,52 + Owner: USSR + Actor75: powr + Location: 82,52 + Owner: USSR + Actor76: powr + Location: 83,56 + Owner: USSR + Actor77: afld + Location: 79,56 + Owner: USSR + Actor78: afld + Location: 75,56 + Owner: USSR + Actor80: jeep + Location: 57,43 + Owner: Germany + Facing: 96 + Actor81: jeep + Location: 46,70 + Owner: Germany + Facing: 96 + Actor82: jeep + Location: 42,48 + Owner: Germany + Facing: 32 + Actor83: e1 + Location: 70,52 + Owner: USSR + Facing: 160 + SubCell: 4 + Actor84: e1 + Location: 70,55 + Owner: USSR + Facing: 192 + SubCell: 3 + Actor86: e1 + Location: 44,67 + Owner: Germany + Facing: 64 + SubCell: 0 + Actor87: e1 + Location: 68,53 + Owner: USSR + Facing: 192 + SubCell: 2 + Actor88: e1 + Location: 69,54 + Owner: USSR + Facing: 160 + SubCell: 0 + Actor89: e1 + Location: 70,56 + Owner: USSR + Facing: 160 + SubCell: 4 + Actor90: e1 + Location: 69,57 + Owner: USSR + Facing: 192 + SubCell: 2 + Actor91: e1 + Location: 69,55 + Owner: USSR + Facing: 160 + SubCell: 3 + Actor92: dog + Location: 77,58 + Owner: USSR + Facing: 192 + SubCell: 3 + Actor93: dog + Location: 82,50 + Owner: USSR + Facing: 192 + SubCell: 0 + Actor96: dog + Location: 73,50 + Owner: USSR + Facing: 32 + SubCell: 3 + Actor97: dog + Location: 73,58 + Owner: USSR + Facing: 160 + SubCell: 1 + Actor98: e3 + Location: 47,44 + Owner: Germany + Facing: 96 + SubCell: 0 + Actor99: e3 + Location: 49,57 + Owner: Germany + Facing: 64 + SubCell: 1 + Actor100: e3 + Location: 44,49 + Owner: Germany + Facing: 96 + SubCell: 0 + Actor101: e3 + Location: 39,51 + Owner: Germany + Facing: 96 + SubCell: 4 + Actor102: e3 + Location: 43,60 + Owner: Germany + Facing: 64 + SubCell: 0 + Actor103: e3 + Location: 42,56 + Owner: Germany + Facing: 64 + SubCell: 3 + Actor104: e1 + Location: 48,43 + Owner: Germany + Facing: 96 + SubCell: 1 + Actor113: e1 + Location: 71,50 + Owner: USSR + SubCell: 2 + Actor114: e1 + Location: 74,50 + Owner: USSR + SubCell: 3 + waypoint8: waypoint + Location: 62,38 + Owner: Neutral + waypoint9: waypoint + Location: 52,72 + Owner: Neutral + waypoint10: waypoint + Location: 83,77 + Owner: Neutral + waypoint11: waypoint + Location: 64,62 + Owner: Neutral + waypoint23: waypoint + Location: 66,53 + Owner: Neutral + waypoint25: waypoint + Location: 75,59 + Owner: Neutral + waypoint26: waypoint + Location: 79,67 + Owner: Neutral + waypoint27: waypoint + Location: 85,63 + Owner: Neutral + waypoint28: waypoint + Location: 85,53 + Owner: Neutral + waypoint42: waypoint + Location: 42,53 + Owner: Neutral + waypoint49: waypoint + Location: 42,59 + Owner: Neutral + waypoint52: waypoint + Location: 60,60 + Owner: Neutral + waypoint53: waypoint + Location: 61,59 + Owner: Neutral + waypoint94: waypoint + Location: 77,53 + Owner: Neutral + waypoint95: waypoint + Location: 59,44 + Owner: Neutral + waypoint1: waypoint + Location: 47,57 + Owner: Neutral + waypoint4: waypoint + Location: 57,59 + Owner: Neutral + waypoint5: waypoint + Location: 63,52 + Owner: Neutral + waypoint6: waypoint + Location: 68,39 + Owner: Neutral + Actor121: fenc + Location: 68,59 + Owner: USSR + Actor122: fenc + Location: 68,58 + Owner: USSR + Actor123: fenc + Location: 68,57 + Owner: USSR + Actor124: fenc + Location: 68,56 + Owner: USSR + Actor125: fenc + Location: 68,52 + Owner: USSR + Actor126: fenc + Location: 68,51 + Owner: USSR + Actor127: fenc + Location: 70,51 + Owner: USSR + Actor128: fenc + Location: 75,51 + Owner: USSR + Actor129: fenc + Location: 76,51 + Owner: USSR + Actor130: fenc + Location: 77,51 + Owner: USSR + Actor131: fenc + Location: 78,51 + Owner: USSR + Actor132: fenc + Location: 79,51 + Owner: USSR + Actor133: fenc + Location: 69,51 + Owner: USSR + CameraWaypoint: waypoint + Location: 68,54 + Owner: Neutral + ParadropLZ: waypoint + Location: 45,43 + Owner: Neutral + AttackWaypoint1: waypoint + Location: 73,49 + Owner: Neutral + AttackWaypoint2: waypoint + Location: 73,76 + Owner: Neutral + CommandCenter: fcom + Location: 76,52 + Owner: USSR + Health: 99 + AlliedDome: dome + Location: 45,50 + Owner: Germany + Health: 98 + AlliedProc: proc + Location: 43,53 + Owner: Germany + Health: 99 + Barrel: brl3 + Location: 60,60 + Owner: Germany + BridgeBarrel1: brl3 + Location: 61,58 + Owner: Germany + BridgeBarrel2: brl3 + Location: 59,54 + Owner: Germany + Follower: e1 + Location: 69,53 + Owner: USSR + Facing: 160 + SubCell: 2 + Fleeing1: e1 + Location: 62,52 + Owner: Germany + Facing: 64 + SubCell: 4 + Fleeing2: e1 + Location: 63,53 + Owner: Germany + Facing: 64 + SubCell: 4 + Attacker1: e1 + Location: 59,44 + Owner: Germany + Facing: 96 + SubCell: 4 + Attacker2: e1 + Location: 60,44 + Owner: Germany + Facing: 64 + SubCell: 1 + Attacker3: e1 + Location: 59,43 + Owner: Germany + Facing: 64 + SubCell: 4 + Attacker4: e1 + Location: 59,44 + Owner: Germany + Facing: 64 + SubCell: 1 + Hunter1: e3 + Location: 74,67 + Owner: Germany + SubCell: 3 + Hunter2: e1 + Location: 73,68 + Owner: Germany + SubCell: 3 + Hunter3: e1 + Location: 72,67 + Owner: Germany + SubCell: 4 + Hunter4: e1 + Location: 54,74 + Owner: Germany + SubCell: 2 + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + -EnemyWatcher: + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: soviet02a.lua + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + ^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Infantry: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Vehicle: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Plane: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Wall: + Tooltip: + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + SPEN: + Buildable: + Prerequisites: ~disabled + DOME: + Buildable: + Prerequisites: ~disabled + WEAP: + Buildable: + Prerequisites: ~disabled + FIX: + Buildable: + Prerequisites: ~disabled + APWR: + Buildable: + Prerequisites: ~disabled + STEK: + Buildable: + Prerequisites: ~disabled + BRIK: + Buildable: + Prerequisites: ~disabled + TSLA: + Buildable: + Prerequisites: ~disabled + SAM: + Buildable: + Prerequisites: ~disabled + IRON: + Buildable: + Prerequisites: ~disabled + MSLO: + Buildable: + Prerequisites: ~disabled + E3: + Buildable: + Prerequisites: ~disabled + E4: + Buildable: + Prerequisites: ~disabled + E6: + Buildable: + Prerequisites: ~disabled + SHOK: + Buildable: + Prerequisites: ~disabled + SNIPER: + Buildable: + Prerequisites: ~disabled + HIJACKER: + Buildable: + Prerequisites: ~disabled + MIG: + Buildable: + Prerequisites: ~disabled + AFLD: + Buildable: + Prerequisites: ~disabled + AirstrikePower@spyplane: + Prerequisites: ~disabled + ParatroopersPower@paratroopers: + Prerequisites: ~disabled + DOG: + Health: + HP: 25 + AutoTarget: + ScanRadius: 5 + powerproxy.paratroopers: + ParatroopersPower: + DropItems: E2,E2,E2,E2,E2 + HARV: + Harvester: + SearchFromProcRadius: 50 + SearchFromOrderRadius: 50 + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/ra/maps/soviet-02a/soviet02a.lua b/mods/ra/maps/soviet-02a/soviet02a.lua new file mode 100644 index 0000000000..611773deba --- /dev/null +++ b/mods/ra/maps/soviet-02a/soviet02a.lua @@ -0,0 +1,137 @@ +CameraTriggerArea = { CPos.New(42, 45), CPos.New(43, 45), CPos.New(44, 45), CPos.New(45, 45), CPos.New(46, 45), CPos.New(47, 45), CPos.New(48, 45), CPos.New(48, 56), CPos.New(48, 57), CPos.New(48, 58), CPos.New(48, 59), CPos.New(40, 63), CPos.New(41, 63), CPos.New(42, 63), CPos.New(43, 63), CPos.New(44, 63), CPos.New(45, 63), CPos.New(46, 63), CPos.New(47, 63) } +PassingBridgeLocation = { CPos.New(59, 56), CPos.New(60, 56) } + +CmdAtk = { Attacker1, Attacker2, Attacker3, Attacker4 } +FleeingUnits = { Fleeing1, Fleeing2 } +HuntingUnits = { Hunter1, Hunter2, Hunter3, Hunter4 } + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + germany = Player.GetPlayer("Germany") + + 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) + + CommandCenterIntact = player.AddPrimaryObjective("Protect the Command Center.") + DestroyAllAllied = player.AddPrimaryObjective("Destroy all Allied units and structures.") + + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "MissionAccomplished") + end) + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "MissionFailed") + end) + + Camera.Position = CameraWaypoint.CenterPosition + + Trigger.OnKilled(CommandCenter, function() + player.MarkFailedObjective(CommandCenterIntact) + end) + + Trigger.AfterDelay(0, function() + local buildings = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(self) return self.Owner == germany and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(actor) + Trigger.OnDamaged(actor, function(building, attacker) + if building.Owner == germany and building.Health < building.MaxHealth * 0.8 then + building.StartBuildingRepairs() + if attacker.Type ~= "yak" and not AlreadyHunting then + AlreadyHunting = true + Utils.Do(germany.GetGroundAttackers(), function(unit) + Trigger.OnIdle(unit, unit.Hunt) + end) + end + end + end) + end) + + -- Find the bridge actors + bridgepart1 = Map.ActorsInBox(waypoint23.CenterPosition, waypoint49.CenterPosition, function(self) return self.Type == "br1" end)[1] + bridgepart2 = Map.ActorsInBox(waypoint23.CenterPosition, waypoint49.CenterPosition, function(self) return self.Type == "br2" end)[1] + end) + + -- Discover the area around the bridge exposing the two german soldiers + -- When the two infantry near the bridge are discovered move them accross the bridge to waypoint4 + -- in the meanwhile one USSR soldier hunts them down + Trigger.AfterDelay(DateTime.Seconds(1), function() + Actor.Create("camera", true, { Owner = player, Location = waypoint23.Location }) + + Utils.Do(FleeingUnits, function(unit) + unit.Move(waypoint4.Location) + end) + Follower.AttackMove(waypoint4.Location) + end) + + -- To make it look more smooth we will blow up the bridge when the barrel closest to it blows up + Trigger.OnAnyKilled({ BridgeBarrel1, BridgeBarrel2 }, function() + -- Destroy the bridge + if not bridgepart1.IsDead then + bridgepart1.Kill() + end + if not bridgepart2.IsDead then + bridgepart2.Kill() + end + end) + + -- If player passes over the bridge, blow up the barrel and destroy the bridge + Trigger.OnEnteredFootprint(PassingBridgeLocation, function(unit, id) + if unit.Owner == player then + Trigger.RemoveFootprintTrigger(id) + + -- Also don't if the bridge is already dead + if bridgepart1.IsDead and bridgepart2.IsDead then + return + end + + -- Don't "shoot" at the barrels if there is noone to shoot + if not FleeingUnits[1].IsDead then + FleeingUnits[1].Attack(Barrel) + elseif not FleeingUnits[2].IsDead then + FleeingUnits[2].Attack(Barrel) + end + end + end) + + -- Four infantry from the small island move towards the USSR command center and attack it after 24 Seconds + Trigger.AfterDelay(DateTime.Seconds(24), function() + Utils.Do(CmdAtk, function(unit) + unit.AttackMove(AttackWaypoint1.Location) + Trigger.OnIdle(unit, unit.Hunt) + end) + end) + + -- Start hunting + Hunter4.AttackMove(AttackWaypoint2.Location) -- Move the unit in the correct direction first + Utils.Do(HuntingUnits, function(unit) + Trigger.OnIdle(unit, unit.Hunt) + end) + + -- When destroying the allied radar dome or the refinery drop 2 badgers with 5 grenadiers each + Trigger.OnAnyKilled({ AlliedDome, AlliedProc }, function() + local powerproxy = Actor.Create("powerproxy.paratroopers", true, { Owner = player }) + powerproxy.SendParatroopers(ParadropLZ.CenterPosition, false, Facing.South) + powerproxy.SendParatroopers(ParadropLZ.CenterPosition, false, Facing.SouthEast) + powerproxy.Destroy() + end) +end + +Tick = function() + if germany.HasNoRequiredUnits() then + player.MarkCompletedObjective(CommandCenterIntact) + player.MarkCompletedObjective(DestroyAllAllied) + end + + if player.HasNoRequiredUnits() then + player.MarkFailedObjective(DestroyAllAllied) + end + + if germany.Resources > germany.ResourceCapacity / 2 then + germany.Resources = germany.ResourceCapacity / 2 + end +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index ca46b01e52..49300d5d6c 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -6,5 +6,5 @@ Allied Campaign: ./mods/ra/maps/allies-05a Soviet Campaign: ./mods/ra/maps/soviet-01 + ./mods/ra/maps/soviet-02a ./mods/ra/maps/soviet-05 -