diff --git a/OpenRA.sln b/OpenRA.sln index 01993e2e21..d37dfd595f 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -57,6 +57,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re mods\ra\maps\allies-05a\allies05a-AI.lua = mods\ra\maps\allies-05a\allies05a-AI.lua mods\ra\maps\soviet-01\soviet01.lua = mods\ra\maps\soviet-01\soviet01.lua mods\ra\maps\soviet-02a\soviet02a.lua = mods\ra\maps\soviet-02a\soviet02a.lua + mods\ra\maps\soviet-02b\soviet02b.lua = mods\ra\maps\soviet-02b\soviet02b.lua mods\ra\maps\soviet-03\soviet03.lua = mods\ra\maps\soviet-03\soviet03.lua mods\ra\maps\soviet-04a\soviet04a.lua = mods\ra\maps\soviet-04a\soviet04a.lua mods\ra\maps\soviet-04a\soviet04a-AI.lua = mods\ra\maps\soviet-04a\soviet04a-AI.lua diff --git a/mods/ra/maps/soviet-02b/map.bin b/mods/ra/maps/soviet-02b/map.bin new file mode 100644 index 0000000000..15a6dae167 Binary files /dev/null and b/mods/ra/maps/soviet-02b/map.bin differ diff --git a/mods/ra/maps/soviet-02b/map.png b/mods/ra/maps/soviet-02b/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-02b/map.png differ diff --git a/mods/ra/maps/soviet-02b/map.yaml b/mods/ra/maps/soviet-02b/map.yaml new file mode 100644 index 0000000000..d0c3193c55 --- /dev/null +++ b/mods/ra/maps/soviet-02b/map.yaml @@ -0,0 +1,681 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 02b: 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,52,54,35 + +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@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + PlayerReference@Germany: + Name: Germany + Faction: allies + ColorRamp: 161,134,236 + Enemies: USSR + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: Germany, Creeps + +Actors: + Actor0: sbag + Location: 53,52 + Owner: Germany + Actor1: sbag + Location: 54,52 + Owner: Germany + Actor2: sbag + Location: 53,53 + Owner: Neutral + Actor3: sbag + Location: 54,53 + Owner: Germany + Actor4: sbag + Location: 53,56 + Owner: Germany + Actor5: sbag + Location: 54,56 + Owner: Germany + Actor6: sbag + Location: 53,57 + Owner: Germany + Actor7: sbag + Location: 54,57 + Owner: Germany + Actor8: sbag + Location: 81,68 + Owner: Germany + Actor9: sbag + Location: 83,68 + Owner: Germany + Actor10: sbag + Location: 87,68 + Owner: Germany + Actor11: sbag + Location: 89,68 + Owner: Germany + Actor12: sbag + Location: 81,69 + Owner: Germany + Actor13: sbag + Location: 82,69 + Owner: Germany + Actor14: sbag + Location: 83,69 + Owner: Germany + Actor15: sbag + Location: 87,69 + Owner: Germany + Actor16: sbag + Location: 88,69 + Owner: Germany + Actor17: sbag + Location: 89,69 + Owner: Germany + Actor18: v14 + Location: 87,84 + Owner: Neutral + Actor19: v15 + Location: 88,84 + Owner: Neutral + Actor20: v16 + Location: 86,85 + Owner: Neutral + Actor21: v17 + Location: 87,85 + Owner: Neutral + Actor22: v18 + Location: 88,85 + Owner: Neutral + Actor23: tc05 + Location: 75,63 + Owner: Neutral + Actor24: tc02 + Location: 82,58 + Owner: Neutral + Actor25: tc01 + Location: 85,57 + Owner: Neutral + Actor26: t07 + Location: 83,60 + Owner: Neutral + Actor27: tc04 + Location: 36,55 + Owner: Neutral + Actor28: tc05 + Location: 41,52 + Owner: Neutral + Actor29: t01 + Location: 73,62 + Owner: Neutral + Actor30: tc01 + Location: 64,63 + Owner: Neutral + Actor31: t06 + Location: 69,62 + Owner: Neutral + Actor32: t07 + Location: 67,63 + Owner: Neutral + Actor33: tc02 + Location: 73,57 + Owner: Neutral + Actor34: t07 + Location: 74,55 + Owner: Neutral + Actor35: tc05 + Location: 61,60 + Owner: Neutral + Actor36: tc01 + Location: 69,72 + Owner: Neutral + Actor37: tc05 + Location: 36,81 + Owner: Neutral + Actor38: tc02 + Location: 43,85 + Owner: Neutral + Actor39: tc01 + Location: 47,85 + Owner: Neutral + Actor40: tc01 + Location: 39,84 + Owner: Neutral + Actor41: tc04 + Location: 51,65 + Owner: Neutral + Actor42: tc05 + Location: 47,66 + Owner: Neutral + Actor43: tc02 + Location: 88,65 + Owner: Neutral + Actor44: tc04 + Location: 79,84 + Owner: Neutral + Actor45: tc04 + Location: 66,72 + Owner: Neutral + Actor46: weap + Location: 84,59 + Owner: Germany + Actor47: dome + Location: 72,55 + Owner: Germany + Actor50: fact + Location: 75,55 + Owner: Germany + Actor51: proc + Location: 80,59 + Owner: Germany + FreeActor: False + Actor52: powr + Location: 83,55 + Owner: Germany + Actor53: powr + Location: 85,55 + Owner: Germany + Actor54: brl3 + Location: 69,64 + Owner: Creeps + Actor55: brl3 + Location: 68,65 + Owner: Creeps + Actor57: barl + Location: 73,64 + Owner: Creeps + Actor58: barl + Location: 72,63 + Owner: Creeps + Actor59: barl + Location: 70,63 + Owner: Creeps + Actor61: brl3 + Location: 70,56 + Owner: Creeps + Actor62: brl3 + Location: 71,56 + Owner: Creeps + Actor63: brl3 + Location: 70,55 + Owner: Creeps + Actor64: barl + Location: 69,54 + Owner: Creeps + Actor65: brl3 + Location: 68,54 + Owner: Creeps + Actor66: barl + Location: 67,53 + Owner: Creeps + Actor68: v03 + Location: 81,85 + Owner: Creeps + Actor69: v06 + Location: 87,83 + Owner: Creeps + Actor70: fact + Location: 41,76 + Owner: USSR + Actor71: powr + Location: 46,80 + Owner: USSR + Actor72: powr + Location: 49,80 + Owner: USSR + Actor73: powr + Location: 43,80 + Owner: USSR + Actor75: afld + Location: 45,77 + Owner: USSR + Actor76: afld + Location: 49,77 + Owner: USSR + Actor78: brl3 + Location: 82,70 + Owner: Germany + Actor79: brl3 + Location: 83,70 + Owner: Germany + Actor80: brl3 + Location: 88,70 + Owner: Germany + Actor81: barl + Location: 87,70 + Owner: Germany + Actor82: barl + Location: 84,69 + Owner: Germany + Actor83: tent + Location: 70,57 + Owner: Germany + Actor84: barl + Location: 74,55 + Owner: Creeps + Actor85: powr + Location: 52,80 + Owner: USSR + Actor86: jeep + Location: 85,66 + Owner: Germany + Health: 55 + Facing: 128 + Actor89: jeep + Location: 55,56 + Owner: Germany + Health: 59 + Facing: 224 + Actor90: jeep + Location: 79,54 + Owner: Germany + Facing: 128 + Actor92: e1 + Location: 47,75 + Owner: USSR + Facing: 64 + SubCell: 4 + Actor93: e1 + Location: 48,75 + Owner: USSR + Facing: 64 + SubCell: 3 + Actor94: e1 + Location: 47,76 + Owner: USSR + Facing: 64 + SubCell: 2 + Actor95: e1 + Location: 48,76 + Owner: USSR + Facing: 64 + SubCell: 1 + Actor96: dog + Location: 49,73 + Owner: USSR + Facing: 64 + SubCell: 3 + Actor97: dog + Location: 49,76 + Owner: USSR + Facing: 64 + SubCell: 1 + Actor98: dog + Location: 49,75 + Owner: USSR + Facing: 64 + SubCell: 3 + Actor99: dog + Location: 49,74 + Owner: USSR + Facing: 64 + SubCell: 1 + Actor100: e3 + Location: 88,68 + Owner: Germany + Facing: 160 + SubCell: 3 + Actor103: e1 + Location: 79,64 + Owner: Germany + Facing: 96 + SubCell: 3 + Actor104: e1 + Location: 79,64 + Owner: Germany + Facing: 96 + SubCell: 4 + Actor105: e3 + Location: 78,57 + Owner: Germany + Facing: 160 + SubCell: 4 + Actor106: e2 + Location: 47,73 + Owner: USSR + Facing: 64 + SubCell: 4 + Actor107: e2 + Location: 47,74 + Owner: USSR + Facing: 64 + SubCell: 2 + Actor108: e2 + Location: 48,74 + Owner: USSR + Facing: 64 + SubCell: 1 + Actor109: e2 + Location: 48,73 + Owner: USSR + Facing: 64 + SubCell: 3 + Actor110: e1 + Location: 72,61 + Owner: Germany + Facing: 160 + SubCell: 0 + Actor111: e1 + Location: 40,54 + Owner: Germany + Facing: 96 + SubCell: 0 + Actor112: e1 + Location: 83,85 + Owner: Germany + Facing: 224 + SubCell: 3 + Actor113: e1 + Location: 82,68 + Owner: Germany + Facing: 96 + SubCell: 4 + Actor114: e1 + Location: 69,55 + Owner: Germany + Facing: 160 + SubCell: 0 + BarrelBase: brl3 + Location: 71,55 + Owner: Creeps + BarrelBridge: brl3 + Location: 72,65 + Owner: Creeps + BridgeCheck1: waypoint + Owner: Neutral + Location: 60,60 + BridgeCheck2: waypoint + Owner: Neutral + Location: 80,75 + CameraStart: Camera + Location: 60,77 + Owner: Neutral + CameraBridge: Camera + Location: 69,67 + Owner: Neutral + CameraBase1: Camera + Location: 70,56 + Owner: Neutral + CameraBase2: Camera + Location: 82,58 + Owner: Neutral + CameraBaseEntrance: Camera + Location: 85,67 + Owner: Neutral + Church1: v01 + Location: 67,73 + Owner: Creeps + Church2: v01 + Location: 86,81 + Owner: Creeps + ForwardCommand: fcom + Location: 45,73 + Owner: USSR + BridgeGun1: gun + Location: 68,64 + Owner: Germany + Health: 56 + Facing: 160 + BridgeGun2: gun + Location: 74,64 + Owner: Germany + Health: 53 + Facing: 160 + IntroSoldier1: e1 + Location: 71,65 + Owner: Germany + Facing: 160 + SubCell: 3 + IntroSoldier2: e1 + Location: 71,60 + Owner: Germany + Facing: 128 + SubCell: 3 + IntroSoldier3: e1 + Location: 70,60 + Owner: Germany + Facing: 128 + SubCell: 4 + ParachuteBase1: waypoint + Location: 66,54 + Owner: Neutral + ParachuteBase2: waypoint + Location: 66,56 + Owner: Neutral + ParachuteBaseEntrance: waypoint + Location: 85,68 + Owner: Neutral + TransportTruck: truk + Location: 75,58 + Owner: Germany + Facing: 192 + TransportWaypoint1: waypoint + Location: 75,58 + Owner: Neutral + TransportWaypoint2: waypoint + Location: 86,83 + Owner: Neutral + TransportWaypoint3: waypoint + Location: 67,75 + Owner: Neutral + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + -EnemyWatcher: + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: soviet02b.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 + ^Crate: + 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 + GUN: + -RepairableBuilding: + FCOM: + RepairableBuilding: + Tooltip: + ShowOwnerRow: false + AFLD: + Buildable: + Prerequisites: ~disabled + AirstrikePower@spyplane: + Prerequisites: ~disabled + ParatroopersPower@paratroopers: + Prerequisites: ~disabled + DOG: + Health: + HP: 25 + AutoTarget: + ScanRadius: 5 + HARV: + Harvester: + SearchFromProcRadius: 50 + SearchFromOrderRadius: 50 + BARL: + Health: + HP: 1 + Explodes: + Weapon: MissionBarrelExplode + BRL3: + Health: + HP: 1 + Explodes: + Weapon: MissionBarrelExplode + MONEYCRATE: + GiveCashCrateAction: + Amount: 2000 + powerproxy.paratroopers: + ParatroopersPower: + DropItems: E1,E1,E2,E2,E2 + powerproxy.paratroopers2: + Inherits: powerproxy.paratroopers + ParatroopersPower: + DropItems: E2,E2,E2,E2,E2 + powerproxy.paratroopers3: + Inherits: powerproxy.paratroopers + ParatroopersPower: + DropItems: E1,E1,E1,E1,E1 + +Sequences: + +VoxelSequences: + +Weapons: + MissionBarrelExplode: + Warhead@1Dam: SpreadDamage + Spread: 600 + Damage: 100 + Falloff: 1000, 368, 135, 50, 18, 7, 0 + Delay: 5 + Versus: + None: 120 + Wood: 200 + Light: 50 + Heavy: 25 + Concrete: 10 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + Warhead@2Smu: LeaveSmudge + SmudgeType: Scorch + Size: 2,1 + Delay: 5 + Warhead@3Eff: CreateEffect + Explosion: napalm + ImpactSound: firebl3.aud + Delay: 5 + +Voices: + +Notifications: + +Translations: diff --git a/mods/ra/maps/soviet-02b/soviet02b.lua b/mods/ra/maps/soviet-02b/soviet02b.lua new file mode 100644 index 0000000000..ef93fa84ba --- /dev/null +++ b/mods/ra/maps/soviet-02b/soviet02b.lua @@ -0,0 +1,174 @@ +IntroAttackers = { IntroSoldier1, IntroSoldier2, IntroSoldier3 } + +BridgeShroudTrigger = { CPos.New(63, 71), CPos.New(64, 71), CPos.New(65, 71), CPos.New(69, 65), CPos.New(70, 65), CPos.New(71, 65) } +BridgeExplosionTrigger = { CPos.New(66, 69), CPos.New(67, 69), CPos.New(68, 69) } +TransportTrigger = { CPos.New(75, 58) } +EnemyBaseShroudTrigger = { CPos.New(64, 52), CPos.New(64, 53), CPos.New(64, 54), CPos.New(64, 55), CPos.New(64, 56), CPos.New(64, 57), CPos.New(64, 58), CPos.New(64, 59), CPos.New(64, 60), CPos.New(64, 61), CPos.New(64, 62), CPos.New(64, 63), CPos.New(64, 64) } +ParachuteTrigger = { CPos.New(80, 66), CPos.New(81, 66), CPos.New(82, 66), CPos.New(83, 66), CPos.New(84, 66), CPos.New(85, 66),CPos.New(86, 66), CPos.New(87, 66), CPos.New(88, 66), CPos.New(89, 66) } +EnemyBaseEntranceShroudTrigger = { CPos.New(80, 73), CPos.New(81, 73), CPos.New(82, 73), CPos.New(83, 73), CPos.New(84, 73), CPos.New(85, 73),CPos.New(86, 73), CPos.New(87, 73), CPos.New(88, 73), CPos.New(89, 73) } + +SendUSSRParadrops = function() + paraproxy1 = Actor.Create("powerproxy.paratroopers", false, { Owner = player }) + paraproxy1.SendParatroopers(ParachuteBaseEntrance.CenterPosition, false, Facing.North) + paraproxy1.Destroy() +end + +SendUSSRParadropsBase = function() + paraproxy2 = Actor.Create("powerproxy.paratroopers2", false, { Owner = player }) + paraproxy2.SendParatroopers(ParachuteBase1.CenterPosition, false, Facing.East) + paraproxy2.Destroy() + paraproxy3 = Actor.Create("powerproxy.paratroopers3", false, { Owner = player }) + paraproxy3.SendParatroopers(ParachuteBase2.CenterPosition, false, Facing.East) + paraproxy3.Destroy() +end + +Trigger.OnEnteredFootprint(BridgeShroudTrigger, function(a, id) + if not bridgeShroudTrigger and a.Owner == player then + bridgeShroudTrigger = true + local cameraBridge = Actor.Create("camera", true, { Owner = player, Location = CameraBridge.Location }) + Trigger.AfterDelay(DateTime.Seconds(15), function() + cameraBridge.Kill() + end) + end +end) + +Trigger.OnEnteredFootprint(BridgeExplosionTrigger, function(a, id) + if not bridgeExplosionTrigger and a.Owner == player then + bridgeExplosionTrigger = true + if not BarrelBridge.IsDead then + BarrelBridge.Kill() + end + end +end) + +Trigger.OnEnteredFootprint(EnemyBaseEntranceShroudTrigger, function(a, id) + if not enemyBaseEntranceShroudTrigger and a.Owner == player then + enemyBaseEntranceShroudTrigger = true + local cameraBaseEntrance = Actor.Create("camera", true, { Owner = player, Location = CameraBaseEntrance.Location }) + Trigger.AfterDelay(DateTime.Seconds(15), function() + cameraBaseEntrance.Kill() + end) + end +end) + +Trigger.OnEnteredFootprint(EnemyBaseShroudTrigger, function(a, id) + if not enemyBaseShroudTrigger and a.Owner == player then + enemyBaseShroudTrigger = true + local cameraBase1 = Actor.Create("camera", true, { Owner = player, Location = CameraBase1.Location }) + local cameraBase2 = Actor.Create("camera", true, { Owner = player, Location = CameraBase2.Location }) + Trigger.AfterDelay(DateTime.Seconds(15), function() + cameraBase1.Kill() + cameraBase2.Kill() + end) + end +end) + +Trigger.OnEnteredFootprint(ParachuteTrigger, function(a, id) + if not parachuteTrigger and a.Owner == player then + parachuteTrigger = true + SendUSSRParadrops() + Media.PlaySpeechNotification(player, "ReinforcementsArrived") + end +end) + +Trigger.OnEnteredFootprint(TransportTrigger, function(a, id) + if not transportTrigger and a.Type == "truk" then + transportTrigger = true + if not TransportTruck.IsDead then + TransportTruck.Wait(DateTime.Seconds(5)) + TransportTruck.Move(TransportWaypoint2.Location) + TransportTruck.Wait(DateTime.Seconds(5)) + TransportTruck.Move(TransportWaypoint3.Location) + TransportTruck.Wait(DateTime.Seconds(5)) + TransportTruck.Move(TransportWaypoint1.Location) + end + Trigger.AfterDelay(DateTime.Seconds(10), function() + transportTrigger = false + end) + end +end) + +Trigger.OnKilled(BarrelBase, function() + SendUSSRParadropsBase() + Media.PlaySpeechNotification(player, "ReinforcementsArrived") +end) + +Trigger.OnKilled(BarrelBridge, function() + local bridgepart = Map.ActorsInBox(BridgeCheck1.CenterPosition, BridgeCheck2.CenterPosition, function(self) return self.Type == "br1" end)[1] + if not bridgepart.IsDead then + bridgepart.Kill() + end +end) + +Trigger.OnKilled(Church1, function() + Actor.Create("moneycrate", true, { Owner = player, Location = TransportWaypoint3.Location }) +end) + +Trigger.OnKilled(Church2, function() + Actor.Create("healcrate", true, { Owner = player, Location = Church2.Location }) +end) + +Trigger.OnKilled(ForwardCommand, function() + enemy.MarkCompletedObjective(alliedObjective) +end) + +Trigger.OnKilled(IntroSoldier1, function() + local cameraIntro = Actor.Create("camera", true, { Owner = player, Location = CameraStart.Location }) + Trigger.AfterDelay(DateTime.Seconds(15), function() + cameraIntro.Kill() + end) +end) + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + enemy = Player.GetPlayer("Germany") + Utils.Do(IntroAttackers, function(actor) + if not actor.IsDead then + Trigger.OnIdle(actor, actor.Hunt) + end + end) + Trigger.AfterDelay(0, function() + local buildings = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(self) return self.Owner == enemy and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(actor) + Trigger.OnDamaged(actor, function(building, attacker) + if building.Owner == enemy and building.Health < building.MaxHealth * 0.8 then + building.StartBuildingRepairs() + end + end) + end) + end) + 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) + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "Win") + end) + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "Lose") + end) + alliedObjective = enemy.AddPrimaryObjective("Destroy all Soviet troops.") + sovietObjective1 = player.AddPrimaryObjective("Protect the Command Center.") + sovietObjective2 = player.AddPrimaryObjective("Destroy all Allied units and structures.") +end + +Tick = function() + if player.HasNoRequiredUnits() then + enemy.MarkCompletedObjective(alliedObjective) + end + + if enemy.HasNoRequiredUnits() then + player.MarkCompletedObjective(sovietObjective1) + player.MarkCompletedObjective(sovietObjective2) + end + + if enemy.Resources >= enemy.ResourceCapacity * 0.75 then + enemy.Cash = enemy.Cash + enemy.Resources - enemy.ResourceCapacity * 0.25 + enemy.Resources = enemy.ResourceCapacity * 0.25 + end +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index 7d69163f97..63aeea6c27 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -7,6 +7,7 @@ Allied Campaign: Soviet Campaign: ./mods/ra/maps/soviet-01 ./mods/ra/maps/soviet-02a + ./mods/ra/maps/soviet-02b ./mods/ra/maps/soviet-03 ./mods/ra/maps/soviet-04a ./mods/ra/maps/soviet-04b