diff --git a/mods/ra/maps/allies-05c/allies05c-AI.lua b/mods/ra/maps/allies-05c/allies05c-AI.lua new file mode 100644 index 0000000000..ac672dbc7c --- /dev/null +++ b/mods/ra/maps/allies-05c/allies05c-AI.lua @@ -0,0 +1,102 @@ +--[[ + Copyright 2007-2021 The OpenRA Developers (see AUTHORS) + This file is part of OpenRA, which is free software. It is made + available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] +AttackGroup = { } +AttackGroupSize = 10 + +SovietInfantry = { "e1", "e1", "e2" } +SovietVehicles = { "3tnk", "3tnk", "apc" } +SovietAircraftType = { "yak" } +Planes = { } +SovietProduction = { Conyard, USSRBarracks, USSRWarFactory } + +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +ProductionInterval = +{ + easy = DateTime.Seconds(25), + normal = DateTime.Seconds(15), + hard = DateTime.Seconds(5) +} + +SendAttackGroup = function() + if #AttackGroup < AttackGroupSize then + return + end + + Utils.Do(AttackGroup, function(unit) + if not unit.IsDead then + Trigger.OnIdle(unit, unit.Hunt) + end + end) + + AttackGroup = { } +end + +ProduceUSSRInfantry = function() + if USSRBarracks.IsDead or USSRBarracks.Owner ~= USSR then + return + end + + USSR.Build({ Utils.Random(SovietInfantry) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceUSSRInfantry) + end) +end + +ProduceUSSRVehicles = function() + if USSRWarFactory.IsDead or USSRWarFactory.Owner ~= USSR then + return + end + + USSR.Build({ Utils.Random(SovietVehicles) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceUSSRVehicles) + end) +end + +ProduceAircraft = function() + if (Airfield1.IsDead or Airfield1.Owner ~= USSR) and (Airfield2.IsDead or Airfield2.Owner ~= USSR) then + return + end + + USSR.Build(SovietAircraftType, function(units) + local plane = units[1] + Planes[#Planes + 1] = plane + + Trigger.OnKilled(plane, ProduceAircraft) + + local alive = Utils.Where(Planes, function(y) return not y.IsDead end) + if #alive < 2 then + Trigger.AfterDelay(DateTime.Seconds(ProductionInterval[Map.LobbyOption("difficulty")] / 2), ProduceAircraft) + end + + InitializeAttackAircraft(plane, Greece) + end) +end + +ActivateAI = function() + local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == USSR and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(actor) + Trigger.OnDamaged(actor, function(building) + if building.Owner == USSR and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + end) + + ProduceUSSRInfantry() + Trigger.AfterDelay(DateTime.Minutes(2), ProduceUSSRVehicles) + Trigger.AfterDelay(DateTime.Minutes(4), ProduceAircraft) + + Trigger.OnAllKilled(SovietProduction, function() + Utils.Do(USSR.GetGroundAttackers(), IdleHunt) + end) +end diff --git a/mods/ra/maps/allies-05c/allies05c.lua b/mods/ra/maps/allies-05c/allies05c.lua new file mode 100644 index 0000000000..bea9ece177 --- /dev/null +++ b/mods/ra/maps/allies-05c/allies05c.lua @@ -0,0 +1,373 @@ +--[[ + Copyright 2007-2021 The OpenRA Developers (see AUTHORS) + This file is part of OpenRA, which is free software. It is made + available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] +if Map.LobbyOption("difficulty") == "easy" then + TanyaType = "e7" + ReinforceCash = 5000 + HoldAITime = DateTime.Minutes(3) + SpecialCameras = true +elseif Map.LobbyOption("difficulty") == "normal" then + TanyaType = "e7.noautotarget" + ReinforceCash = 3500 + HoldAITime = DateTime.Minutes(2) + SpecialCameras = true +else + TanyaType = "e7.noautotarget" + ReinforceCash = 2250 + HoldAITime = DateTime.Minutes(1) + DateTime.Seconds(30) +end + +SpyType = { "spy" } +SpyEntryPath = { SpyEntry.Location, SpyLoadout.Location } +InsertionTransport = "lst.in" + +TrukPath = { TrukWaypoint1, TrukWaypoint2, TrukWaypoint3, TrukWaypoint4, TrukWaypoint5, TrukWaypoint6, TrukWaypoint7, TrukWaypoint8, TrukWaypoint9, TrukWaypoint10 } + +ExtractionHeliType = "tran" +ExtractionPath = { ExtractionEntry.Location, ExtractionLZ.Location } +HeliReinforcements = { "medi", "mech", "mech" } + +GreeceReinforcements1 = +{ + { types = { "2tnk", "2tnk", "2tnk", "2tnk", "2tnk" }, entry = { SpyEntry.Location, LSTLanding1.Location } }, + { types = { "e3", "e3", "e3", "e3", "e1" }, entry = { LSTEntry2.Location, LSTLanding2.Location } } +} + +GreeceReinforcements2 = +{ + { types = { "arty", "arty", "jeep", "jeep" }, entry = { SpyEntry.Location, LSTLanding1.Location } }, + { types = { "e1", "e1", "e6", "e6", "e6" }, entry = { LSTEntry2.Location, LSTLanding2.Location } } +} + +DogPatrol = { Dog1, Dog2 } +RiflePatrol = { RiflePatrol1, RiflePatrol2, RiflePatrol3, RiflePatrol4, RiflePatrol5 } +BasePatrol = { BasePatrol1, BasePatrol2, BasePatrol3 } + +DogPatrolPath = { DogPatrolRally1.Location, SpyCamera2.Location, DogPatrolRally3.Location } +RiflePath = { RiflePath1.Location, RiflePath2.Location, RiflePath3.Location } +BasePatrolPath = { BasePatrolPath1.Location, BasePatrolPath2.Location, BasePatrolPath3.Location } + +TanyaVoices = { "tuffguy", "bombit", "laugh", "gotit", "lefty", "keepem" } +SpyVoice = "sking" + +SamSites = { Sam1, Sam2, Sam3, Sam4, Sam5, Sam6 } + +SendSpy = function() + Camera.Position = SpyEntry.CenterPosition + Spy = Reinforcements.ReinforceWithTransport(Greece, InsertionTransport, SpyType, SpyEntryPath, { SpyEntryPath[1] })[2][1] + + Trigger.OnKilled(Spy, function() USSR.MarkCompletedObjective(USSRObj) end) + + if SpecialCameras then + SpyCameraA = Actor.Create("camera", true, { Owner = Greece, Location = SpyCamera1.Location }) + SpyCameraB = Actor.Create("camera", true, { Owner = Greece, Location = SpyCamera2.Location }) + SpyCameraC = Actor.Create("camera", true, { Owner = Greece, Location = SpyCamera3.Location }) + else + SpyCameraHard = Actor.Create("camera.small", true, { Owner = Greece, Location = RiflePath1.Location + CVec.New(0, 3) }) + end + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Media.DisplayMessage("Commander! You have to disguise me in order to get through the enemy patrols.", "Spy") + end) +end + +ActivatePatrols = function() + Trigger.AfterDelay(DateTime.Seconds(3), function() + GroupPatrol(DogPatrol, DogPatrolPath, DateTime.Seconds(6)) + GroupPatrol(RiflePatrol, RiflePath, DateTime.Seconds(7)) + GroupPatrol(BasePatrol, BasePatrolPath, DateTime.Seconds(6)) + end) +end + +GroupPatrol = function(units, waypoints, delay) + local i = 1 + local stop = false + + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function() + if stop then + return + end + + if unit.Location == waypoints[i] then + local bool = Utils.All(units, function(actor) return actor.IsIdle end) + + if bool then + stop = true + + i = i + 1 + if i > #waypoints then + i = 1 + end + + Trigger.AfterDelay(delay, function() stop = false end) + end + else + unit.AttackMove(waypoints[i]) + end + end) + end) +end + +SendReinforcements = function() + GreeceReinforcementsArrived = true + Camera.Position = SpyLoadout.CenterPosition + Greece.Cash = Greece.Cash + ReinforceCash + Media.PlaySpeechNotification(Greece, "AlliedReinforcementsArrived") + Utils.Do(GreeceReinforcements1, function(reinforcements) + Reinforcements.ReinforceWithTransport(Greece, InsertionTransport, reinforcements.types, reinforcements.entry, { SpyEntry.Location }) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Media.PlaySpeechNotification(Greece, "AlliedReinforcementsArrived") + Utils.Do(GreeceReinforcements2, function(reinforcements) + Reinforcements.ReinforceWithTransport(Greece, InsertionTransport, reinforcements.types, reinforcements.entry, { SpyEntry.Location }) + end) + end) + + ActivateAI() +end + +ExtractUnits = function(extractionUnit, pos, after) + if extractionUnit.IsDead or not extractionUnit.HasPassengers then + return + end + + extractionUnit.Move(pos) + extractionUnit.Destroy() + + Trigger.OnRemovedFromWorld(extractionUnit, after) +end + +WarfactoryInfiltrated = function() + FollowTruk = true + Truk.GrantCondition("hijacked") + + Truk.Wait(DateTime.Seconds(1)) + Utils.Do(TrukPath, function(waypoint) + Truk.Move(waypoint.Location) + end) + + if SpecialCameras then + Trigger.AfterDelay(DateTime.Seconds(2), function() + SpyCameraA.Destroy() + SpyCameraB.Destroy() + SpyCameraC.Destroy() + end) + else + SpyCameraHard.Destroy() + end +end + +MissInfiltrated = function() + for i = 0, 5, 1 do + local sound = Utils.Random(TanyaVoices) + Trigger.AfterDelay(DateTime.Seconds(i), function() + Media.PlaySoundNotification(Greece, sound) + end) + end + Prison.Attack(Prison) + + Trigger.AfterDelay(DateTime.Seconds(6), FreeTanya) +end + +FreeTanya = function() + Prison.Stop() + Tanya = Actor.Create(TanyaType, true, { Owner = Greece, Location = Prison.Location + CVec.New(1, 1) }) + Tanya.Demolish(Prison) + Tanya.Move(Tanya.Location + CVec.New(Utils.RandomInteger(-1, 2), 1)) + + if TanyaType == "e7.noautotarget" then + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.DisplayMessage("According to the rules of engagement I need your explicit orders to fire, Commander!", "Tanya") + end) + end + + Trigger.OnKilled(Tanya, function() USSR.MarkCompletedObjective(USSRObj) end) + + if Map.LobbyOption("difficulty") == "tough" then + KillSams = Greece.AddObjective("Destroy all six SAM Sites that block\nour reinforcements' helicopter.") + + Greece.MarkCompletedObjective(MainObj) + SurviveObj = Greece.AddObjective("Tanya must not die!") + Media.PlaySpeechNotification(Greece, "TanyaRescued") + else + KillSams = Greece.AddObjective("Destroy all six SAM sites that block\nthe extraction helicopter.") + + Media.PlaySpeechNotification(Greece, "TargetFreed") + end + + if not SpecialCameras and PrisonCamera and PrisonCamera.IsInWorld then + PrisonCamera.Destroy() + end +end + +InitTriggers = function() + Trigger.OnInfiltrated(Warfactory, function() + if Greece.IsObjectiveCompleted(InfWarfactory) then + return + elseif Truk.IsDead then + if not Greece.IsObjectiveCompleted(MainObj) then + USSR.MarkCompletedObjective(USSRObj) + end + + return + end + + Trigger.ClearAll(Spy) + Greece.MarkCompletedObjective(InfWarfactory) + WarfactoryInfiltrated() + end) + + Trigger.OnKilled(Truk, function() + if not Greece.IsObjectiveCompleted(InfWarfactory) then + Greece.MarkFailedObjective(InfWarfactory) + elseif FollowTruk then + USSR.MarkCompletedObjective(USSRObj) + end + end) + + Trigger.OnInfiltrated(Prison, function() + if Greece.IsObjectiveCompleted(MainObj) then + return + end + + if not Greece.IsObjectiveCompleted(InfWarfactory) then + Media.DisplayMessage("Good work! But next time skip the heroics!", "Battlefield Control") + Greece.MarkCompletedObjective(InfWarfactory) + end + + if not PrisonCamera then + if SpecialCameras then + PrisonCamera = Actor.Create("camera", true, { Owner = Greece, Location = SpyJump.Location }) + else + PrisonCamera = Actor.Create("camera.small", true, { Owner = Greece, Location = Prison.Location + CVec.New(1, 1) }) + end + end + + if SpecialCameras and SpyCameraA and not SpyCameraA.IsDead then + SpyCameraA.Destroy() + SpyCameraB.Destroy() + end + + Trigger.ClearAll(Spy) + Trigger.AfterDelay(DateTime.Seconds(2), MissInfiltrated) + end) + + Trigger.OnEnteredFootprint({ SpyJump.Location }, function(a, id) + if a == Truk then + Trigger.RemoveFootprintTrigger(id) + + Spy = Actor.Create("spy", true, { Owner = Greece, Location = SpyJump.Location }) + Spy.DisguiseAsType("e1", USSR) + Spy.Move(SpyWaypoint.Location) + Spy.Infiltrate(Prison) + Media.PlaySoundNotification(Greece, SpyVoice) + + FollowTruk = false + + if SpecialCameras then + PrisonCamera = Actor.Create("camera", true, { Owner = Greece, Location = SpyJump.Location }) + else + PrisonCamera = Actor.Create("camera.small", true, { Owner = Greece, Location = Prison.Location + CVec.New(1, 1) }) + end + + Trigger.OnKilled(Spy, function() USSR.MarkCompletedObjective(USSRObj) end) + end + end) + + Trigger.OnEnteredFootprint({ TrukWaypoint10.Location }, function(a, id) + if a == Truk then + Trigger.RemoveFootprintTrigger(id) + Truk.Stop() + Truk.Kill() + ExplosiveBarrel.Kill() + end + end) + + Trigger.OnAllKilled(SamSites, function() + Greece.MarkCompletedObjective(KillSams) + + local flare = Actor.Create("flare", true, { Owner = Greece, Location = ExtractionPath[2] + CVec.New(0, -1) }) + Trigger.AfterDelay(DateTime.Seconds(7), flare.Destroy) + Media.PlaySpeechNotification(Greece, "SignalFlare") + + ExtractionHeli = Reinforcements.ReinforceWithTransport(Greece, ExtractionHeliType, nil, ExtractionPath)[1] + local exitPos = CPos.New(ExtractionPath[1].X, ExtractionPath[2].Y) + + Trigger.OnKilled(ExtractionHeli, function() USSR.MarkCompletedObjective(USSRObj) end) + Trigger.OnRemovedFromWorld(Tanya, function() + ExtractUnits(ExtractionHeli, exitPos, function() + + Media.PlaySpeechNotification(Greece, "TanyaRescued") + Greece.MarkCompletedObjective(MainObj) + Trigger.AfterDelay(DateTime.Seconds(2), function() + SendReinforcements() + end) + + if PrisonCamera and PrisonCamera.IsInWorld then + PrisonCamera.Destroy() + end + end) + end) + end) +end + +Tick = function() + if FollowTruk and not Truk.IsDead then + Camera.Position = Truk.CenterPosition + end + + if USSR.HasNoRequiredUnits() then + if not Greece.IsObjectiveCompleted(KillAll) and Map.LobbyOption("difficulty") == "tough" then + SendWaterExtraction() + end + Greece.MarkCompletedObjective(KillAll) + end + + if GreeceReinforcementsArrived and Greece.HasNoRequiredUnits() then + USSR.MarkCompletedObjective(USSRObj) + end + + if USSR.Resources >= USSR.ResourceCapacity * 0.75 then + USSR.Cash = USSR.Cash + USSR.Resources - USSR.ResourceCapacity * 0.25 + USSR.Resources = USSR.ResourceCapacity * 0.25 + end +end + +WorldLoaded = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + + Trigger.OnObjectiveAdded(Greece, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + USSRObj = USSR.AddObjective("Deny the Allies.") + MainObj = Greece.AddObjective("Rescue Tanya.") + KillAll = Greece.AddObjective("Eliminate all Soviet units in this area.") + InfWarfactory = Greece.AddObjective("Infiltrate the Soviet warfactory.", "Secondary", false) + + Trigger.OnObjectiveCompleted(Greece, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(Greece, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerLost(Greece, function() + Media.PlaySpeechNotification(Greece, "Lose") + end) + Trigger.OnPlayerWon(Greece, function() + Media.PlaySpeechNotification(Greece, "Win") + end) + + InitTriggers() + SendSpy() + Trigger.AfterDelay(DateTime.Seconds(3), ActivatePatrols) +end diff --git a/mods/ra/maps/allies-05c/map.bin b/mods/ra/maps/allies-05c/map.bin new file mode 100644 index 0000000000..dcfd67276c Binary files /dev/null and b/mods/ra/maps/allies-05c/map.bin differ diff --git a/mods/ra/maps/allies-05c/map.png b/mods/ra/maps/allies-05c/map.png new file mode 100644 index 0000000000..29bfd56141 Binary files /dev/null and b/mods/ra/maps/allies-05c/map.png differ diff --git a/mods/ra/maps/allies-05c/map.yaml b/mods/ra/maps/allies-05c/map.yaml new file mode 100644 index 0000000000..ab6dfbfe8f --- /dev/null +++ b/mods/ra/maps/allies-05c/map.yaml @@ -0,0 +1,1067 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 05c: Tanya's Tale + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 33,34,64,64 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FF1400 + Allies: BadGuy + Enemies: Greece + PlayerReference@BadGuy: + Name: BadGuy + Faction: soviet + Color: FF1400 + Allies: USSR + Enemies: Greece + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: E2E6F6 + LockSpawn: True + LockTeam: True + Enemies: USSR, BadGuy + +Actors: + Actor0: cycl + Location: 43,34 + Owner: BadGuy + Actor1: cycl + Location: 44,34 + Owner: BadGuy + Actor2: cycl + Location: 45,34 + Owner: BadGuy + Actor3: cycl + Location: 46,34 + Owner: BadGuy + Actor4: cycl + Location: 47,34 + Owner: BadGuy + Actor5: cycl + Location: 48,34 + Owner: BadGuy + Actor6: cycl + Location: 49,34 + Owner: BadGuy + Actor7: cycl + Location: 50,34 + Owner: BadGuy + Actor8: cycl + Location: 51,34 + Owner: BadGuy + Actor9: cycl + Location: 52,34 + Owner: BadGuy + Actor10: cycl + Location: 53,34 + Owner: BadGuy + Actor11: cycl + Location: 54,34 + Owner: BadGuy + Actor12: cycl + Location: 55,34 + Owner: BadGuy + Actor13: cycl + Location: 56,34 + Owner: BadGuy + Actor14: cycl + Location: 57,34 + Owner: BadGuy + Actor15: cycl + Location: 58,34 + Owner: BadGuy + Actor16: cycl + Location: 59,34 + Owner: BadGuy + Actor17: cycl + Location: 60,34 + Owner: BadGuy + Actor18: cycl + Location: 61,34 + Owner: BadGuy + Actor19: cycl + Location: 62,34 + Owner: BadGuy + Actor20: cycl + Location: 63,34 + Owner: BadGuy + Actor21: cycl + Location: 64,34 + Owner: BadGuy + Actor22: cycl + Location: 65,34 + Owner: BadGuy + Actor23: cycl + Location: 65,35 + Owner: BadGuy + Actor24: cycl + Location: 65,36 + Owner: BadGuy + Actor25: cycl + Location: 65,37 + Owner: BadGuy + Actor26: cycl + Location: 64,38 + Owner: BadGuy + Actor27: cycl + Location: 65,38 + Owner: BadGuy + Actor28: cycl + Location: 64,39 + Owner: BadGuy + Actor29: cycl + Location: 65,39 + Owner: BadGuy + Actor30: cycl + Location: 61,44 + Owner: BadGuy + Actor31: cycl + Location: 62,44 + Owner: BadGuy + Actor32: cycl + Location: 61,45 + Owner: BadGuy + Actor33: cycl + Location: 62,45 + Owner: BadGuy + Actor34: cycl + Location: 55,46 + Owner: BadGuy + Actor35: cycl + Location: 56,46 + Owner: BadGuy + Actor36: cycl + Location: 57,46 + Owner: BadGuy + Actor37: cycl + Location: 58,46 + Owner: BadGuy + Actor38: cycl + Location: 59,46 + Owner: BadGuy + Actor39: cycl + Location: 60,46 + Owner: BadGuy + Actor40: cycl + Location: 61,46 + Owner: BadGuy + Actor41: cycl + Location: 62,46 + Owner: BadGuy + Actor42: brik + Location: 47,61 + Owner: USSR + Actor43: brik + Location: 48,61 + Owner: USSR + Actor44: brik + Location: 55,61 + Owner: USSR + Actor45: brik + Location: 56,61 + Owner: USSR + Actor46: brik + Location: 57,61 + Owner: USSR + Actor47: brik + Location: 47,62 + Owner: USSR + Actor48: brik + Location: 48,62 + Owner: USSR + Actor49: brik + Location: 55,62 + Owner: USSR + Actor50: brik + Location: 56,62 + Owner: USSR + Actor51: brik + Location: 57,62 + Owner: USSR + Actor52: brik + Location: 57,63 + Owner: USSR + Actor53: brik + Location: 57,64 + Owner: USSR + Actor54: brik + Location: 57,65 + Owner: USSR + Actor55: brik + Location: 57,66 + Owner: USSR + Actor56: brik + Location: 58,66 + Owner: USSR + Actor57: brik + Location: 59,66 + Owner: USSR + Actor58: brik + Location: 59,67 + Owner: USSR + Actor59: brik + Location: 59,68 + Owner: USSR + Actor60: brik + Location: 58,69 + Owner: USSR + Actor61: brik + Location: 59,69 + Owner: USSR + Actor62: brik + Location: 58,70 + Owner: USSR + Actor63: brik + Location: 59,70 + Owner: USSR + Actor64: brik + Location: 58,76 + Owner: USSR + Actor65: brik + Location: 59,76 + Owner: USSR + Actor66: brik + Location: 56,77 + Owner: USSR + Actor67: brik + Location: 57,77 + Owner: USSR + Actor68: brik + Location: 58,77 + Owner: USSR + Actor69: brik + Location: 59,77 + Owner: USSR + Actor70: brik + Location: 56,78 + Owner: USSR + Actor71: brik + Location: 55,79 + Owner: USSR + Actor72: brik + Location: 56,79 + Owner: USSR + Actor73: brik + Location: 55,80 + Owner: USSR + Actor74: brik + Location: 56,80 + Owner: USSR + Actor75: brik + Location: 62,84 + Owner: USSR + Actor76: brik + Location: 63,84 + Owner: USSR + Actor77: brik + Location: 62,85 + Owner: USSR + Actor78: brik + Location: 63,85 + Owner: USSR + Actor79: brik + Location: 62,90 + Owner: USSR + Actor80: brik + Location: 63,90 + Owner: USSR + Actor81: brik + Location: 61,91 + Owner: USSR + Actor82: brik + Location: 62,91 + Owner: USSR + Actor83: brik + Location: 63,91 + Owner: USSR + Actor84: brik + Location: 60,92 + Owner: USSR + Actor85: brik + Location: 61,92 + Owner: USSR + Actor86: brik + Location: 62,92 + Owner: USSR + Actor87: brik + Location: 63,92 + Owner: USSR + Actor88: brik + Location: 60,93 + Owner: USSR + Actor89: brik + Location: 61,93 + Owner: USSR + Actor90: brik + Location: 60,94 + Owner: USSR + Actor91: brik + Location: 61,94 + Owner: USSR + Actor92: t01 + Location: 86,86 + Owner: Neutral + Actor93: tc04 + Location: 81,47 + Owner: Neutral + Actor94: tc05 + Location: 84,34 + Owner: Neutral + Actor95: tc03 + Location: 77,34 + Owner: Neutral + Actor96: tc02 + Location: 69,34 + Owner: Neutral + Actor97: tc01 + Location: 72,36 + Owner: Neutral + Actor98: t15 + Location: 74,43 + Owner: Neutral + Actor99: tc03 + Location: 34,82 + Owner: Neutral + Actor100: tc05 + Location: 33,89 + Owner: Neutral + Actor101: tc02 + Location: 33,86 + Owner: Neutral + Actor102: t16 + Location: 33,92 + Owner: Neutral + Actor103: t13 + Location: 34,87 + Owner: Neutral + Actor104: t01 + Location: 60,58 + Owner: Neutral + Actor105: tc04 + Location: 51,66 + Owner: Neutral + Actor106: tc03 + Location: 43,63 + Owner: Neutral + Actor107: t16 + Location: 44,61 + Owner: Neutral + Actor108: tc02 + Location: 40,61 + Owner: Neutral + Actor109: tc02 + Location: 58,63 + Owner: Neutral + Actor110: tc03 + Location: 75,39 + Owner: Neutral + Actor111: tc02 + Location: 67,41 + Owner: Neutral + Actor112: tc01 + Location: 70,50 + Owner: Neutral + Actor113: t15 + Location: 72,45 + Owner: Neutral + Actor114: t12 + Location: 66,49 + Owner: Neutral + Actor115: tc04 + Location: 48,51 + Owner: Neutral + Actor116: tc03 + Location: 39,45 + Owner: Neutral + Actor117: tc02 + Location: 84,59 + Owner: Neutral + Actor118: t14 + Location: 77,60 + Owner: Neutral + Actor119: t11 + Location: 60,54 + Owner: Neutral + Actor120: tc03 + Location: 46,67 + Owner: Neutral + Actor121: tc02 + Location: 56,67 + Owner: Neutral + Actor122: tc05 + Location: 42,53 + Owner: Neutral + Actor123: tc05 + Location: 74,73 + Owner: Neutral + Actor124: tc01 + Location: 56,81 + Owner: Neutral + Actor125: t17 + Location: 57,83 + Owner: Neutral + Actor126: t15 + Location: 50,48 + Owner: Neutral + Actor127: tc04 + Location: 46,59 + Owner: Neutral + Actor128: t01 + Location: 54,45 + Owner: Neutral + Actor129: tc03 + Location: 36,70 + Owner: Neutral + Actor130: t16 + Location: 36,68 + Owner: Neutral + Actor131: t11 + Location: 57,93 + Owner: Neutral + Actor132: tc04 + Location: 38,89 + Owner: Neutral + Actor133: tc05 + Location: 62,80 + Owner: Neutral + Actor134: tc03 + Location: 60,78 + Owner: Neutral + Actor135: tc04 + Location: 69,75 + Owner: Neutral + Actor136: tc05 + Location: 61,66 + Owner: Neutral + Actor137: tc01 + Location: 69,67 + Owner: Neutral + Actor138: tc01 + Location: 36,74 + Owner: Neutral + Actor139: t08 + Location: 36,76 + Owner: Neutral + Actor140: mine + Location: 39,53 + Owner: Neutral + Actor141: mine + Location: 53,90 + Owner: Neutral + Prison: miss + Location: 83,86 + Owner: USSR + Sam6: sam + Location: 84,91 + Facing: 636 + Owner: USSR + Sam3: sam + Location: 78,91 + Facing: 380 + Owner: USSR + Sam1: sam + Location: 71,84 + Facing: 380 + Owner: USSR + Sam2: sam + Location: 68,91 + Facing: 636 + Owner: USSR + Sam4: sam + Location: 82,83 + Facing: 636 + Owner: USSR + Sam5: sam + Location: 84,84 + Facing: 508 + Owner: USSR + Actor149: spen + Location: 38,36 + Owner: BadGuy + Actor150: v19 + Location: 81,35 + Owner: Neutral + Actor151: v19 + Location: 85,46 + Owner: Neutral + Actor152: brl3 + Location: 84,45 + Owner: USSR + Actor153: brl3 + Location: 85,47 + Owner: USSR + Actor154: barl + Location: 83,46 + Owner: USSR + Actor155: brl3 + Location: 81,36 + Owner: USSR + Actor156: brl3 + Location: 82,34 + Owner: USSR + Actor157: barl + Location: 83,34 + Owner: USSR + Actor158: barl + Location: 82,35 + Owner: USSR + Actor159: v19 + Location: 84,47 + Owner: Neutral + Warfactory: weap.infiltratable + Location: 46,35 + Owner: BadGuy + Actor161: fix + Location: 62,35 + Owner: BadGuy + Actor162: barr + Location: 52,39 + Owner: BadGuy + Actor163: ftur + Location: 62,41 + Owner: BadGuy + Actor164: fact + Location: 51,35 + Owner: BadGuy + Actor165: powr + Location: 56,35 + Owner: BadGuy + Actor166: powr + Location: 58,35 + Owner: BadGuy + Airfield1: afld + Location: 41,77 + Owner: USSR + Airfield2: afld + Location: 45,77 + Owner: USSR + Actor169: kenn + Location: 60,84 + Owner: USSR + Actor170: ftur + Location: 49,62 + Owner: USSR + Actor171: silo + Location: 41,80 + Owner: USSR + Actor172: silo + Location: 41,82 + Owner: USSR + Actor173: silo + Location: 43,82 + Owner: USSR + Actor174: silo + Location: 44,81 + Owner: USSR + USSRWarFactory: weap + Location: 54,72 + Owner: USSR + USSRBarracks: barr + Location: 47,72 + Owner: USSR + Actor177: powr + Location: 38,76 + Owner: USSR + Conyard: fact + Location: 40,84 + Owner: USSR + Actor179: kenn + Location: 56,69 + Owner: USSR + Actor180: brl3 + Location: 54,40 + Owner: USSR + Actor181: brl3 + Location: 51,40 + Owner: USSR + Actor182: barl + Location: 54,39 + Owner: USSR + Actor183: brl3 + Location: 50,41 + Owner: USSR + Actor184: barl + Location: 54,41 + Owner: USSR + ExplosiveBarrel: brl3 + Location: 86,89 + Owner: USSR + Actor186: barl + Location: 85,90 + Owner: USSR + Actor187: barl + Location: 84,90 + Owner: USSR + Actor188: ftur + Location: 54,62 + Owner: USSR + Actor189: ftur + Location: 61,88 + Owner: USSR + Actor190: tsla + Location: 51,72 + Owner: USSR + Actor191: ftur + Location: 59,71 + Owner: USSR + Actor192: ftur + Location: 59,75 + Owner: USSR + Actor193: ftur + Location: 48,46 + Owner: BadGuy + Actor194: powr + Location: 43,37 + Owner: BadGuy + Actor195: silo + Location: 42,81 + Owner: USSR + Actor196: silo + Location: 43,80 + Owner: USSR + Actor197: silo + Location: 45,82 + Owner: USSR + Actor198: powr + Location: 39,73 + Owner: USSR + Actor199: powr + Location: 42,71 + Owner: USSR + Actor200: powr + Location: 37,79 + Owner: USSR + Actor201: powr + Location: 38,82 + Owner: USSR + Actor202: powr + Location: 37,85 + Owner: USSR + Actor310: powr + Owner: USSR + Location: 42,74 + Truk: truk.mission + Location: 47,37 + Owner: BadGuy + Facing: 636 + Actor204: 3tnk + Location: 43,88 + Owner: USSR + Facing: 636 + Actor205: 3tnk + Location: 54,66 + Owner: USSR + Actor206: 3tnk + Location: 50,66 + Owner: USSR + Actor207: 3tnk + Location: 56,70 + Owner: USSR + Facing: 252 + Actor208: 3tnk + Location: 46,75 + Owner: USSR + Facing: 636 + Actor209: 3tnk + Location: 50,86 + Owner: USSR + Actor210: 3tnk + Location: 61,73 + Owner: USSR + Facing: 764 + Actor211: v2rl + Location: 63,77 + Owner: USSR + Facing: 892 + Actor212: v2rl + Location: 47,69 + Owner: USSR + Facing: 636 + Actor213: v2rl + Location: 58,67 + Owner: USSR + Facing: 892 + Actor214: v2rl + Location: 57,76 + Owner: USSR + Facing: 764 + Actor215: v2rl + Location: 61,70 + Owner: USSR + Facing: 636 + Actor216: 3tnk + Location: 59,44 + Owner: USSR + Facing: 892 + Actor217: 3tnk + Location: 43,46 + Owner: USSR + Facing: 636 + Actor218: 3tnk + Location: 61,39 + Owner: USSR + Facing: 636 + Actor219: e1.autotarget + Location: 71,89 + Owner: USSR + Facing: 380 + SubCell: 2 + Actor220: e1.autotarget + Location: 72,86 + Owner: USSR + Facing: 124 + SubCell: 1 + Actor221: e2.autotarget + Location: 65,85 + Owner: USSR + Facing: 508 + SubCell: 3 + Actor222: e2.autotarget + Location: 64,89 + Owner: USSR + Facing: 252 + SubCell: 1 + Actor223: e2.autotarget + Location: 63,86 + Owner: USSR + Facing: 764 + SubCell: 2 + Actor224: e2.autotarget + Location: 65,88 + Owner: USSR + Facing: 636 + SubCell: 3 + Actor225: dog + Location: 61,85 + Owner: USSR + Facing: 380 + SubCell: 3 + Actor226: dog + Location: 49,87 + Owner: BadGuy + Facing: 636 + SubCell: 1 + BasePatrol1: e1 + Location: 43,41 + Owner: BadGuy + SubCell: 1 + BasePatrol2: dog + Location: 43,41 + Owner: BadGuy + SubCell: 3 + BasePatrol3: dog + Location: 43,41 + Owner: BadGuy + SubCell: 4 + Dog1: dog + Location: 81,39 + Owner: USSR + Facing: 764 + SubCell: 3 + Dog2: dog + Location: 81,40 + Owner: USSR + Facing: 764 + SubCell: 3 + RiflePatrol1: e1 + Location: 72,40 + Owner: USSR + SubCell: 5 + RiflePatrol2: e1 + Location: 72,40 + Owner: USSR + SubCell: 4 + RiflePatrol3: e1 + Location: 72,40 + Owner: USSR + SubCell: 3 + RiflePatrol4: e1 + Location: 72,40 + Owner: USSR + SubCell: 1 + RiflePatrol5: e1 + Location: 72,40 + Owner: USSR + SubCell: 2 + Actor237: e2 + Location: 53,63 + Owner: USSR + SubCell: 3 + Actor238: e2 + Location: 53,65 + Owner: USSR + SubCell: 1 + Actor239: e2 + Location: 51,63 + Owner: USSR + SubCell: 4 + Actor240: e2 + Location: 51,65 + Owner: USSR + SubCell: 2 + Actor241: e1 + Location: 54,64 + Owner: USSR + SubCell: 1 + Actor242: e1 + Location: 50,64 + Owner: USSR + SubCell: 2 + Actor243: dog + Location: 55,67 + Owner: USSR + Facing: 892 + SubCell: 4 + Actor244: e1 + Location: 53,73 + Owner: USSR + SubCell: 4 + Actor245: e1 + Location: 50,73 + Owner: USSR + SubCell: 4 + Actor246: e1 + Location: 50,48 + Owner: USSR + Facing: 252 + SubCell: 4 + Actor247: e1 + Location: 51,48 + Owner: USSR + Facing: 764 + SubCell: 3 + Actor248: dog + Location: 57,73 + Owner: USSR + Facing: 636 + SubCell: 2 + Actor249: dog + Location: 66,72 + Owner: USSR + Facing: 636 + SubCell: 0 + Actor250: dog + Location: 52,63 + Owner: USSR + Facing: 380 + SubCell: 3 + Actor311: proc + Owner: USSR + Location: 44,84 + Actor312: proc + Owner: USSR + Location: 47,80 + Actor313: fix + Owner: USSR + Location: 48,75 + waypoint0: waypoint + Location: 47,66 + Owner: Neutral + waypoint1: waypoint + Location: 56,66 + Owner: Neutral + waypoint2: waypoint + Location: 56,75 + Owner: Neutral + waypoint6: waypoint + Location: 84,87 + Owner: Neutral + waypoint7: waypoint + Location: 85,87 + Owner: Neutral + waypoint8: waypoint + Location: 46,52 + Owner: Neutral + waypoint11: waypoint + Location: 52,78 + Owner: Neutral + waypoint13: waypoint + Location: 62,88 + Owner: Neutral + waypoint15: waypoint + Location: 65,73 + Owner: Neutral + waypoint18: waypoint + Location: 79,88 + Owner: Neutral + waypoint19: waypoint + Location: 39,40 + Owner: Neutral + waypoint20: waypoint + Location: 54,92 + Owner: Neutral + waypoint26: waypoint + Location: 59,85 + Owner: Neutral + waypoint27: waypoint + Location: 59,94 + Owner: Neutral + waypoint28: waypoint + Location: 41,88 + Owner: Neutral + waypoint29: waypoint + Location: 49,79 + Owner: Neutral + waypoint30: waypoint + Location: 45,73 + Owner: Neutral + waypoint35: waypoint + Location: 86,88 + Owner: Neutral + waypoint37: waypoint + Location: 51,60 + Owner: Neutral + waypoint39: waypoint + Location: 53,59 + Owner: Neutral + waypoint47: waypoint + Location: 33,37 + Owner: Neutral + waypoint50: waypoint + Location: 33,88 + Owner: Neutral + waypoint53: waypoint + Location: 52,85 + Owner: Neutral + waypoint79: waypoint + Location: 68,56 + Owner: Neutral + waypoint80: waypoint + Location: 77,49 + Owner: Neutral + waypoint84: waypoint + Location: 68,44 + Owner: Neutral + waypoint94: waypoint + Location: 84,41 + Owner: Neutral + waypoint99: waypoint + Location: 65,66 + Owner: Neutral + DefaultCameraPosition: waypoint + Location: 88,40 + Owner: Neutral + SpyEntry: waypoint + Location: 96,40 + Owner: Neutral + SpyLoadout: waypoint + Location: 90,40 + Owner: Neutral + SpyCamera1: waypoint + Location: 81,40 + Owner: Neutral + SpyCamera2: waypoint + Location: 58,41 + Owner: Neutral + SpyCamera3: waypoint + Location: 47,41 + Owner: Neutral + DogPatrolRally1: waypoint + Location: 72,40 + Owner: Neutral + DogPatrolRally3: waypoint + Location: 64,49 + Owner: Neutral + BasePatrolPath1: waypoint + Location: 50,43 + Owner: Neutral + BasePatrolPath2: waypoint + Location: 60,35 + Owner: Neutral + BasePatrolPath3: waypoint + Location: 43,35 + Owner: Neutral + RiflePath1: waypoint + Location: 62,38 + Owner: Neutral + RiflePath2: waypoint + Location: 55,43 + Owner: Neutral + RiflePath3: waypoint + Location: 43,36 + Owner: Neutral + TrukWaypoint1: waypoint + Location: 46,47 + Owner: Neutral + TrukWaypoint2: waypoint + Location: 46,56 + Owner: Neutral + TrukWaypoint3: waypoint + Location: 52,56 + Owner: Neutral + TrukWaypoint4: waypoint + Location: 52,62 + Owner: Neutral + TrukWaypoint5: waypoint + Location: 52,69 + Owner: Neutral + TrukWaypoint6: waypoint + Location: 52,86 + Owner: Neutral + TrukWaypoint7: waypoint + Location: 53,87 + Owner: Neutral + TrukWaypoint8: waypoint + Location: 71,87 + Owner: Neutral + TrukWaypoint9: waypoint + Location: 73,89 + Owner: Neutral + TrukWaypoint10: waypoint + Location: 85,89 + Owner: Neutral + SpyJump: waypoint + Location: 80,89 + Owner: Neutral + SpyWaypoint: waypoint + Location: 79,89 + Owner: Neutral + ExtractionEntry: waypoint + Location: 96,89 + Owner: Neutral + ExtractionLZ: waypoint + Location: 77,89 + Owner: Neutral + LSTEntry2: waypoint + Location: 96,41 + Owner: Neutral + LSTLanding1: waypoint + Location: 88,37 + Owner: Neutral + LSTLanding2: waypoint + Location: 88,43 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml + +Weapons: weapons.yaml + +Notifications: notifications.yaml diff --git a/mods/ra/maps/allies-05c/notifications.yaml b/mods/ra/maps/allies-05c/notifications.yaml new file mode 100644 index 0000000000..970b7059a4 --- /dev/null +++ b/mods/ra/maps/allies-05c/notifications.yaml @@ -0,0 +1,9 @@ +Sounds: + Notifications: + bombit: bombit1 + laugh: laugh1 + gotit: gotit1 + lefty: lefty1 + keepem: keepem1 + tuffguy: tuffguy1 + sking: sking1 diff --git a/mods/ra/maps/allies-05c/rules.yaml b/mods/ra/maps/allies-05c/rules.yaml new file mode 100644 index 0000000000..4d769557e0 --- /dev/null +++ b/mods/ra/maps/allies-05c/rules.yaml @@ -0,0 +1,195 @@ +World: + LuaScript: + Scripts: allies05c.lua, allies05c-AI.lua, campaign-global.lua + MissionData: + BriefingVideo: ally5.vqa + WinVideo: tanya2.vqa + LossVideo: grvestne.vqa + StartVideo: tanya1.vqa + Briefing: Rescue Tanya.\n\nOnce disguised, your spy can move past any enemy unit, except dogs, without being detected. Direct him into the weapons factory located at a nearby Soviet Base where he will hijack a truck and free Tanya.\n\nWith Tanya's help, take out the air defenses on the island and a Chinook will arrive to rescue her.\n\nThen destroy all remaining Soviet buildings and units. + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +Camera.Small: + Inherits: CAMERA + RevealsShroud: + Range: 4c0 + +TSLA: + Buildable: + Prerequisites: ~disabled + +SAM: + Buildable: + Prerequisites: ~disabled + Power: + Amount: 0 + +LST: + -Selectable: + Targetable: + TargetTypes: GroundActor, WaterActor + Interactable: + +LST.IN: + Inherits: LST + RenderSprites: + Image: LST + Cargo: + Types: disabled + +TRAN: + -Selectable: + RevealsShroud: + Range: 4c0 + Targetable@GROUND: + TargetTypes: GroundActor + Interactable: + +TRAN.IN: + Inherits: TRAN + RenderSprites: + Image: TRAN + Cargo: + Types: disabled + +TRUK.mission: + Inherits: TRUK + Buildable: + Prerequisites: ~disabled + WithFacingSpriteBody: + -SpawnActorOnDeath: + RevealsShroud: + Range: 4c0 + ValidRelationships: Ally, Enemy + RequiresCondition: hijacked + ExternalCondition@hijacked: + Condition: hijacked + RenderSprites: + Image: TRUK + +SPY: + Infiltrates: + Types: Mission Objectives + +WEAP: + -InfiltrateForSupportPower: + Targetable: + TargetTypes: GroundActor, C4, DetonateAttack, Structure + +WEAP.infiltratable: + Inherits: WEAP + Buildable: + Prerequisites: ~disabled + Targetable@Spy: + TargetTypes: GroundActor, C4, DetonateAttack, Structure, Mission Objectives + RenderSprites: + Image: WEAP + ProvidesPrerequisite: + Prerequisite: weap + +MISS: + Tooltip: + Name: Prison + Targetable: + TargetTypes: GroundActor, C4, DetonateAttack, Structure, Mission Objectives + AttackOmni: + Armament: + Weapon: PrisonColt + +E1.autotarget: + Inherits: E1 + Buildable: + Prerequisites: ~disabled + RevealsShroud: + Range: 8c0 + AutoTarget: + ScanRadius: 7 + RenderSprites: + Image: E1 + +E2.autotarget: + Inherits: E2 + Buildable: + Prerequisites: ~disabled + RevealsShroud: + Range: 8c0 + AutoTarget: + ScanRadius: 7 + RenderSprites: + Image: E2 + +AFLD: + AirstrikePower@spyplane: + Prerequisites: ~disabled + ParatroopersPower@paratroopers: + Prerequisites: ~disabled + +FCOM: + MustBeDestroyed: + +4TNK: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +MNLY: + Buildable: + Prerequisites: ~disabled + +TTNK: + Buildable: + Prerequisites: ~disabled + +FTRK: + Buildable: + Prerequisites: ~disabled + +DTRK: + Buildable: + Prerequisites: ~disabled + +QTNK: + Buildable: + Prerequisites: ~disabled + +MSLO: + Buildable: + Prerequisites: ~disabled + +SPEN: + Buildable: + Prerequisites: ~disabled + +IRON: + Buildable: + Prerequisites: ~disabled + +STEK: + Buildable: + Prerequisites: ~disabled + +E6: + Buildable: + Prerequisites: ~disabled + +THF: + Buildable: + Prerequisites: ~disabled + +SHOK: + Buildable: + Prerequisites: ~disabled + +MIG: + Buildable: + Prerequisites: ~disabled diff --git a/mods/ra/maps/allies-05c/weapons.yaml b/mods/ra/maps/allies-05c/weapons.yaml new file mode 100644 index 0000000000..158d83cb0e --- /dev/null +++ b/mods/ra/maps/allies-05c/weapons.yaml @@ -0,0 +1,8 @@ +PrisonColt: + ValidTargets: Ground, GroundActor + ReloadDelay: 5 + Report: gun5.aud + Projectile: InstantHit + Warhead@1Dam: SpreadDamage + AffectsParent: true + ValidTargets: Ground, GroundActor diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index cacfabaa62..74803335d2 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -6,6 +6,7 @@ Allied Campaign: allies-04 allies-05a allies-05b + allies-05c allies-06a allies-06b allies-07