diff --git a/OpenRA.sln b/OpenRA.sln index b07da30012..2e2b215e53 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -70,6 +70,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re mods\ra\maps\soviet-05\soviet05-reinforcements_teams.lua = mods\ra\maps\soviet-05\soviet05-reinforcements_teams.lua mods\ra\maps\soviet-06a\soviet06a.lua = mods\ra\maps\soviet-06a\soviet06a.lua mods\ra\maps\soviet-06a\soviet06a-AI.lua = mods\ra\maps\soviet-06a\soviet06a-AI.lua + mods\ra\maps\soviet-06b\soviet06b.lua = mods\ra\maps\soviet-06b\soviet06b.lua + mods\ra\maps\soviet-06b\soviet06b-AI.lua = mods\ra\maps\soviet-06b\soviet06b-AI.lua mods\ra\maps\soviet-07\soviet07.lua = mods\ra\maps\soviet-07\soviet07.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 diff --git a/mods/ra/maps/soviet-06a/soviet06a-AI.lua b/mods/ra/maps/soviet-06a/soviet06a-AI.lua index 048923d998..992e6ba8d8 100644 --- a/mods/ra/maps/soviet-06a/soviet06a-AI.lua +++ b/mods/ra/maps/soviet-06a/soviet06a-AI.lua @@ -43,7 +43,7 @@ BuildBuilding = function(building) enemy.Cash = enemy.Cash - building[3] building[4] = true - Trigger.OnKilled(actor, function() building[4] = true end) + Trigger.OnKilled(actor, function() building[4] = false end) Trigger.OnDamaged(actor, function(building) if building.Owner == enemy and building.Health < building.MaxHealth * 3/4 then building.StartBuildingRepairs() diff --git a/mods/ra/maps/soviet-06b/map.bin b/mods/ra/maps/soviet-06b/map.bin new file mode 100644 index 0000000000..f563616fc2 Binary files /dev/null and b/mods/ra/maps/soviet-06b/map.bin differ diff --git a/mods/ra/maps/soviet-06b/map.png b/mods/ra/maps/soviet-06b/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-06b/map.png differ diff --git a/mods/ra/maps/soviet-06b/map.yaml b/mods/ra/maps/soviet-06b/map.yaml new file mode 100644 index 0000000000..b153012e30 --- /dev/null +++ b/mods/ra/maps/soviet-06b/map.yaml @@ -0,0 +1,660 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 06b: Bridge over the River VizchGoi + +Description: There is a special cargo that needs to be transported to a nearby Soviet base in the northeast.\n\nMake sure the trucks reach their destination intact. Along the way, there is a bridge which the Allies may have destroyed.\n\nIf so, use the Naval options at your disposal. Our attack subs will make short work of any Allied boats you discover. + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 18,10,81,58 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: soviet6.vqa + GameStart: onthprwl.vqa + GameWon: sitduck.vqa + GameLost: dpthchrg.vqa + +Options: + Crates: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 11500 + ConfigurableStartingUnits: False + ShortGame: False + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + PlayerReference@Greece: + Name: Greece + 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: Greece, Creeps + +Actors: + Actor0: cycl + Location: 17,14 + Owner: Neutral + Actor1: cycl + Location: 17,15 + Owner: Neutral + Actor2: cycl + Location: 17,16 + Owner: Neutral + Actor3: cycl + Location: 17,17 + Owner: Neutral + Actor4: cycl + Location: 17,18 + Owner: Neutral + Actor5: sbag + Location: 62,37 + Owner: Greece + Actor6: sbag + Location: 63,37 + Owner: Greece + Actor7: sbag + Location: 64,37 + Owner: Greece + Actor8: sbag + Location: 65,37 + Owner: Greece + Actor9: sbag + Location: 65,38 + Owner: Greece + Actor10: sbag + Location: 66,38 + Owner: Greece + Actor11: sbag + Location: 71,38 + Owner: Greece + Actor12: sbag + Location: 72,38 + Owner: Greece + Actor13: sbag + Location: 73,38 + Owner: Greece + Actor14: sbag + Location: 74,38 + Owner: Greece + Actor15: sbag + Location: 82,38 + Owner: Greece + Actor16: sbag + Location: 83,38 + Owner: Greece + Actor17: sbag + Location: 70,39 + Owner: Greece + Actor18: sbag + Location: 71,39 + Owner: Greece + Actor19: sbag + Location: 83,39 + Owner: Greece + Actor20: sbag + Location: 83,40 + Owner: Greece + Actor21: sbag + Location: 57,43 + Owner: Greece + Actor22: sbag + Location: 58,43 + Owner: Greece + Actor23: sbag + Location: 57,44 + Owner: Greece + Actor24: sbag + Location: 80,46 + Owner: Greece + Actor25: sbag + Location: 80,47 + Owner: Greece + Actor26: sbag + Location: 63,48 + Owner: Greece + Actor27: sbag + Location: 64,48 + Owner: Greece + Actor28: sbag + Location: 79,48 + Owner: Greece + Actor29: sbag + Location: 80,48 + Owner: Greece + Actor30: sbag + Location: 64,49 + Owner: Greece + Actor31: sbag + Location: 64,50 + Owner: Greece + Actor32: sbag + Location: 65,50 + Owner: Greece + Actor33: t17 + Location: 66,28 + Owner: Neutral + Actor34: t08 + Location: 83,35 + Owner: Neutral + Actor35: t16 + Location: 82,34 + Owner: Neutral + Actor36: tc04 + Location: 63,26 + Owner: Neutral + Actor37: tc05 + Location: 67,30 + Owner: Neutral + Actor38: tc01 + Location: 79,32 + Owner: Neutral + Actor39: tc04 + Location: 34,20 + Owner: Neutral + Actor40: tc05 + Location: 82,15 + Owner: Neutral + Actor41: tc04 + Location: 90,17 + Owner: Neutral + Actor42: tc01 + Location: 92,18 + Owner: Neutral + Actor43: tc03 + Location: 82,14 + Owner: Neutral + Actor44: tc01 + Location: 95,15 + Owner: Neutral + Actor45: tc02 + Location: 83,12 + Owner: Neutral + Actor46: t17 + Location: 85,12 + Owner: Neutral + Actor47: t16 + Location: 86,13 + Owner: Neutral + Actor48: t16 + Location: 92,24 + Owner: Neutral + Actor49: t14 + Location: 93,24 + Owner: Neutral + Actor50: t11 + Location: 93,21 + Owner: Neutral + Actor51: tc05 + Location: 54,23 + Owner: Neutral + Actor52: tc05 + Location: 74,46 + Owner: Neutral + Actor53: tc04 + Location: 80,43 + Owner: Neutral + Actor54: tc02 + Location: 81,42 + Owner: Neutral + Actor55: tc01 + Location: 73,40 + Owner: Neutral + Actor56: t17 + Location: 71,40 + Owner: Neutral + Actor57: t15 + Location: 80,36 + Owner: Neutral + Actor58: t12 + Location: 31,57 + Owner: Neutral + Actor59: tc04 + Location: 54,26 + Owner: Neutral + Actor60: t14 + Location: 50,31 + Owner: Neutral + Actor62: t05 + Location: 48,39 + Owner: Neutral + Actor63: t06 + Location: 47,39 + Owner: Neutral + Actor66: t08 + Location: 49,38 + Owner: Neutral + Actor68: t08 + Location: 50,39 + Owner: Neutral + Actor69: tc05 + Location: 35,58 + Owner: Neutral + Actor70: tc04 + Location: 44,55 + Owner: Neutral + Actor71: tc02 + Location: 34,66 + Owner: Neutral + Actor72: tc04 + Location: 56,65 + Owner: Neutral + Actor73: t17 + Location: 49,66 + Owner: Neutral + Actor74: t16 + Location: 50,65 + Owner: Neutral + Actor75: tc02 + Location: 54,66 + Owner: Neutral + Actor76: tc01 + Location: 52,66 + Owner: Neutral + Actor77: tc02 + Location: 58,58 + Owner: Neutral + Actor78: t15 + Location: 59,60 + Owner: Neutral + Actor79: t14 + Location: 48,38 + Owner: Neutral + Actor81: tc03 + Location: 49,20 + Owner: Neutral + Actor82: tc02 + Location: 36,19 + Owner: Neutral + Actor83: t15 + Location: 39,25 + Owner: Neutral + Actor84: t08 + Location: 38,27 + Owner: Neutral + Actor85: t08 + Location: 40,25 + Owner: Neutral + Actor86: t13 + Location: 49,40 + Owner: Neutral + Actor88: t02 + Location: 50,37 + Owner: Neutral + Actor90: hbox + Location: 58,46 + Owner: Greece + Actor91: hbox + Location: 62,47 + Owner: Greece + Actor92: gun + Location: 57,46 + Owner: Greece + Facing: 160 + Actor93: gun + Location: 61,48 + Owner: Greece + Facing: 160 + Actor95: dome + Location: 67,49 + Owner: Greece + Actor103: 2tnk + Location: 76,30 + Owner: Greece + Facing: 160 + Actor104: 2tnk + Location: 76,29 + Owner: Greece + Facing: 160 + Actor106: arty + Location: 63,47 + Owner: Greece + Facing: 160 + Actor107: arty + Location: 58,44 + Owner: Greece + Facing: 160 + Actor110: 3tnk + Location: 43,63 + Owner: USSR + Health: 99 + Facing: 32 + Actor111: 3tnk + Location: 44,62 + Owner: USSR + Health: 99 + Facing: 32 + Actor112: v2rl + Location: 41,64 + Owner: USSR + Facing: 32 + Actor113: v2rl + Location: 43,64 + Owner: USSR + Facing: 32 + Actor115: 2tnk + Location: 75,30 + Owner: Greece + Facing: 160 + Actor116: 2tnk + Location: 75,31 + Owner: Greece + Facing: 160 + Actor117: 2tnk + Location: 83,20 + Owner: Greece + Facing: 160 + Actor118: 2tnk + Location: 88,21 + Owner: Greece + Facing: 160 + Actor119: 2tnk + Location: 62,44 + Owner: Greece + Facing: 160 + Actor120: 1tnk + Location: 59,44 + Owner: Greece + Facing: 160 + Actor121: 1tnk + Location: 63,46 + Owner: Greece + Facing: 160 + Actor123: ca + Location: 87,29 + Owner: Greece + Facing: 224 + Actor124: ca + Location: 87,31 + Owner: Greece + Facing: 160 + Actor125: ca + Location: 75,25 + Owner: Greece + Facing: 224 + Actor126: pt + Location: 71,16 + Owner: Greece + Facing: 224 + Actor127: pt + Location: 65,20 + Owner: Greece + Facing: 224 + Actor128: dd + Location: 70,20 + Owner: Greece + Facing: 224 + Actor129: waypoint + Location: 46,60 + Owner: Neutral + Actor144: silo + Owner: Greece + Location: 73,46 + Actor145: silo + Owner: Greece + Location: 73,47 + Actor146: silo + Owner: Greece + Location: 73,48 + Actor147: silo + Owner: Greece + Location: 73,49 + waypoint69: waypoint + Location: 21,28 + Owner: Neutral + waypoint78: waypoint + Location: 83,23 + Owner: Neutral + waypoint79: waypoint + Location: 87,19 + Owner: Neutral + waypoint80: waypoint + Location: 84,22 + Owner: Neutral + waypoint81: waypoint + Location: 76,22 + Owner: Neutral + waypoint82: waypoint + Location: 87,29 + Owner: Neutral + waypoint94: waypoint + Location: 49,16 + Owner: Neutral + APCWaypoint1: waypoint + Location: 39,62 + Owner: Neutral + APCWaypoint2: waypoint + Location: 46,66 + Owner: Neutral + Apwr: apwr + Location: 76,40 + Owner: Greece + Apwr2: apwr + Location: 77,44 + Owner: Greece + AttackWaypoint1: waypoint + Owner: Neutral + Location: 26,55 + AttackWaypoint2: waypoint + Owner: Neutral + Location: 41,55 + Barr: tent + Location: 67,45 + Owner: Greece + CameraStart: camera + Location: 46,61 + Owner: Neutral + CYard: fact + Location: 70,46 + Owner: Greece + CYardLocation: waypoint + Owner: Neutral + Location: 71,49 + Harvester: harv + Location: 77,39 + Owner: Greece + IntroEnemy1: 1tnk + Location: 55,49 + Owner: Greece + Facing: 160 + IntroEnemy2: 2tnk + Location: 56,50 + Owner: Greece + Facing: 160 + IntroEnemy3: 1tnk + Location: 58,50 + Owner: Greece + Facing: 160 + Mcv: mcv + Location: 51,55 + Owner: USSR + Health: 82 + Facing: 160 + McvWaypoint: waypoint + Location: 39,67 + Owner: Neutral + Proc: proc + Location: 71,41 + Owner: Greece + FreeActor: False + Truck1: truk + Location: 42,66 + Owner: USSR + Facing: 32 + Truck2: truk + Location: 39,65 + Owner: USSR + Facing: 32 + Weap: weap + Location: 67,41 + Owner: Greece + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + -EnemyWatcher: + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: soviet06b.lua, soviet06b-AI.lua + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + ^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Infantry: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Vehicle: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Ship: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Plane: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Wall: + Tooltip: + ShowOwnerRow: false + ^TechBuilding: + Tooltip: + ShowOwnerRow: false + ^Crate: + Tooltip: + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + APWR: + Buildable: + Prerequisites: ~disabled + ARTY: + Buildable: + Prerequisites: ~vehicles.allies, ~techlevel.low + BRIK: + Buildable: + Prerequisites: ~disabled + TSLA: + Buildable: + Prerequisites: ~disabled + SAM: + Buildable: + Prerequisites: ~disabled + IRON: + Buildable: + Prerequisites: ~disabled + MSLO: + Buildable: + Prerequisites: ~disabled + E3: + Buildable: + Prerequisites: ~tent + SHOK: + Buildable: + Prerequisites: ~disabled + SNIPER: + Buildable: + Prerequisites: ~disabled + HIJACKER: + Buildable: + Prerequisites: ~disabled + MIG: + Buildable: + Prerequisites: ~disabled + FTRK: + Buildable: + Prerequisites: ~disabled + 2TNK: + Buildable: + Prerequisites: ~vehicles.allies, ~techlevel.low + 4TNK: + Buildable: + Prerequisites: ~disabled + APC: + Buildable: + Prerequisites: ~disabled + TRUK: + -SpawnActorOnDeath: + -SupplyTruck: + Buildable: + Prerequisites: ~disabled + QTNK: + Buildable: + Prerequisites: ~disabled + MCV: + Buildable: + Prerequisites: ~disabled + MSUB: + Buildable: + Prerequisites: ~disabled + STEK: + Buildable: + Prerequisites: ~disabled + DOG: + Health: + HP: 25 + AutoTarget: + ScanRadius: 5 + HARV: + Harvester: + SearchFromProcRadius: 50 + SearchFromOrderRadius: 50 + AFLD: + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E1,E1 + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/ra/maps/soviet-06b/soviet06b-AI.lua b/mods/ra/maps/soviet-06b/soviet06b-AI.lua new file mode 100644 index 0000000000..8ef3e236fb --- /dev/null +++ b/mods/ra/maps/soviet-06b/soviet06b-AI.lua @@ -0,0 +1,112 @@ +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +IdlingUnits = function() + local lazyUnits = enemy.GetGroundAttackers() + + Utils.Do(lazyUnits, function(unit) + Trigger.OnDamaged(unit, function() + Trigger.ClearAll(unit) + Trigger.AfterDelay(0, function() IdleHunt(unit) end) + end) + end) +end + +BaseBuildings = +{ + { "apwr", CVec.New(5, -9), 500, true }, + { "tent", CVec.New(-4, -4), 400, true }, + { "proc", CVec.New(0, -8), 1400, true }, + { "weap", CVec.New(-4, -8), 2000, true }, + { "apwr", CVec.New(6, -5), 500, true } +} + +BuildBase = function() + if CYard.IsDead or CYard.Owner ~= enemy then + return + elseif Harvester.IsDead and enemy.Resources <= 299 then + return + end + + for i,v in ipairs(BaseBuildings) do + if not v[4] then + BuildBuilding(v) + return + end + end + + Trigger.AfterDelay(DateTime.Seconds(10), BuildBase) +end + +BuildBuilding = function(building) + Trigger.AfterDelay(Actor.BuildTime(building[1]), function() + local actor = Actor.Create(building[1], true, { Owner = enemy, Location = CYardLocation.Location + building[2] }) + enemy.Cash = enemy.Cash - building[3] + + building[4] = true + Trigger.OnKilled(actor, function() building[4] = false end) + Trigger.OnDamaged(actor, function(building) + if building.Owner == enemy and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), BuildBase) + end) +end + +ProduceInfantry = function() + if not BaseBuildings[2][4] then + return + elseif Harvester.IsDead and enemy.Resources <= 299 then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9)) + local toBuild = { Utils.Random(AlliedInfantryTypes) } + local Path = Utils.Random(AttackPaths) + enemy.Build(toBuild, function(unit) + InfAttack[#InfAttack + 1] = unit[1] + + if #InfAttack >= 10 then + SendUnits(InfAttack, Path) + InfAttack = { } + Trigger.AfterDelay(DateTime.Minutes(2), ProduceInfantry) + else + Trigger.AfterDelay(delay, ProduceInfantry) + end + end) +end + +ProduceArmor = function() + if not BaseBuildings[4][4] then + return + elseif Harvester.IsDead and enemy.Resources <= 599 then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17)) + local toBuild = { Utils.Random(AlliedArmorTypes) } + local Path = Utils.Random(AttackPaths) + enemy.Build(toBuild, function(unit) + ArmorAttack[#ArmorAttack + 1] = unit[1] + + if #ArmorAttack >= 6 then + SendUnits(ArmorAttack, Path) + ArmorAttack = { } + Trigger.AfterDelay(DateTime.Minutes(3), ProduceArmor) + else + Trigger.AfterDelay(delay, ProduceArmor) + end + end) +end + +SendUnits = function(units, waypoints) + Utils.Do(units, function(unit) + if not unit.IsDead then + Utils.Do(waypoints, function(waypoint) + unit.AttackMove(waypoint.Location) + end) + IdleHunt(unit) + end + end) +end diff --git a/mods/ra/maps/soviet-06b/soviet06b.lua b/mods/ra/maps/soviet-06b/soviet06b.lua new file mode 100644 index 0000000000..fd34eacee2 --- /dev/null +++ b/mods/ra/maps/soviet-06b/soviet06b.lua @@ -0,0 +1,107 @@ +IntroAttackers = { IntroEnemy1, IntroEnemy2, IntroEnemy3 } +Trucks = { Truck1, Truck2 } +InfAttack = { } +ArmorAttack = { } +AttackPaths = { { AttackWaypoint1 }, { AttackWaypoint2 } } + +AlliedInfantryTypes = { "e1", "e1", "e3" } +AlliedArmorTypes = { "jeep", "jeep", "1tnk", "1tnk", "2tnk", "2tnk", "arty" } + +SovietReinforcements1 = { "e6", "e6", "e6", "e6", "e6" } +SovietReinforcements2 = { "e4", "e4", "e2", "e2", "e2" } +SovietReinforcements1Waypoints = { McvWaypoint.Location, APCWaypoint1.Location } +SovietReinforcements2Waypoints = { McvWaypoint.Location, APCWaypoint2.Location } + +TruckGoalTrigger = { CPos.New(85, 10), CPos.New(85, 11), CPos.New(85, 12), CPos.New(86, 13), CPos.New(87, 13), CPos.New(88, 13), CPos.New(88, 14), CPos.New(89, 14), CPos.New(90, 14), CPos.New(90, 15), CPos.New(91, 15), CPos.New(91, 16), CPos.New(91, 17), CPos.New(92, 17), CPos.New(93, 17), CPos.New(94, 17), CPos.New(94, 18), CPos.New(95, 18), CPos.New(96, 18), CPos.New(96, 19), CPos.New(97, 19), CPos.New(98, 19)} + +Trigger.OnEnteredFootprint(TruckGoalTrigger, function(a, id) + if not truckGoalTrigger and a.Owner == player and a.Type == "truk" then + truckGoalTrigger = true + player.MarkCompletedObjective(sovietObjective) + end +end) + +Trigger.OnAllKilled(Trucks, function() + if not controlCenterTrigger then + enemy.MarkCompletedObjective(alliedObjective) + end +end) + +Trigger.OnKilled(Apwr, function(building) + BaseBuildings[1][4] = false +end) + +Trigger.OnKilled(Barr, function(building) + BaseBuildings[2][4] = false +end) + +Trigger.OnKilled(Proc, function(building) + BaseBuildings[3][4] = false +end) + +Trigger.OnKilled(Weap, function(building) + BaseBuildings[4][4] = false +end) + +Trigger.OnKilled(Apwr2, function(building) + BaseBuildings[5][4] = false +end) + +Trigger.OnRemovedFromWorld(Mcv, function() + if not mcvDeployed then + mcvDeployed = true + BuildBase() + Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry) + Trigger.AfterDelay(DateTime.Minutes(2), ProduceArmor) + end +end) + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + enemy = Player.GetPlayer("Greece") + Camera.Position = CameraStart.CenterPosition + Mcv.Move(McvWaypoint.Location) + Harvester.FindResources() + Utils.Do(IntroAttackers, function(actor) + IdleHunt(actor) + end) + Reinforcements.ReinforceWithTransport(player, "apc", SovietReinforcements1, SovietReinforcements1Waypoints) + Reinforcements.ReinforceWithTransport(player, "apc", SovietReinforcements2, SovietReinforcements2Waypoints) + Utils.Do(Map.NamedActors, function(actor) + if actor.Owner == enemy and actor.HasProperty("StartBuildingRepairs") then + Trigger.OnDamaged(actor, function(building) + if building.Owner == enemy and building.Health < 3/4 * building.MaxHealth 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.") + sovietObjective = player.AddPrimaryObjective("Escort the Convoy.") +end + +Tick = function() + if player.HasNoRequiredUnits() then + enemy.MarkCompletedObjective(alliedObjective) + 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 fc3010e951..0c1ac0c530 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -13,4 +13,5 @@ Soviet Campaign: ./mods/ra/maps/soviet-04b ./mods/ra/maps/soviet-05 ./mods/ra/maps/soviet-06a + ./mods/ra/maps/soviet-06b ./mods/ra/maps/soviet-07