diff --git a/mods/ra/maps/allies-08a/allies08a-AI.lua b/mods/ra/maps/allies-08a/allies08a-AI.lua new file mode 100644 index 0000000000..4991046eb5 --- /dev/null +++ b/mods/ra/maps/allies-08a/allies08a-AI.lua @@ -0,0 +1,242 @@ +--[[ + Copyright 2007-2018 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", "e2", "e4" } +SovietVehicles = { "3tnk", "3tnk", "v2rl" } +SovietAircraftType = { "mig" } +Migs = { } + +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +GroundWavesUpgradeDelay = DateTime.Minutes(12) +GroundAttackUnitType = "Normal" +GroundAttackUnits = +{ + Normal = { {"4tnk", "3tnk", "e2", "e2", "e2" }, { "3tnk", "v2rl", "e4", "e4", "e4" } }, + Upgraded = { {"4tnk", "3tnk", "ftrk", "apc", "apc", "e1", "e1", "e1", "e1", "e1", "e2", "e2", "e2" }, { "3tnk", "v2rl", "ftrk", "apc", "apc", "e1", "e1", "e1", "e1", "e1", "e4", "e4", "e4" } } +} +GroundAttackPaths = +{ + { SovEntry1.Location, ParaLZ3.Location, AttackChrono.Location }, + { SovEntry2.Location, ParaLZ5.Location, AttackChrono.Location }, + { SovEntry3.Location, ParaLZ5.Location, AttackChrono.Location } +} +GroundWavesDelays = +{ + easy = 4, + normal = 3, + hard = 2 +} + +WTransUnits = { { "4tnk", "3tnk", "e2", "e2", "e2" }, { "3tnk", "v2rl", "e4", "e4", "e4" } } +WTransWays = +{ + { DDEntry.Location, WaterLanding1.Location }, + { WaterEntry2.Location, WaterLanding2.Location }, + { WaterEntry2.Location, WaterLanding3.Location } +} +WTransDelays = +{ + easy = 5, + normal = 4, + hard = 3 +} + +ParadropLZs = { ParaLZ1.CenterPosition, ParaLZ2.CenterPosition, ParaLZ3.CenterPosition, ParaLZ4.CenterPosition, ParaLZ5.CenterPosition } +ParadropDelays = +{ + easy = 3, + normal = 2, + hard = 1 +} + +BombDelays = +{ + easy = 4, + normal = 3, + hard = 2 +} + +ProductionInterval = +{ + easy = DateTime.Seconds(20), + normal = DateTime.Seconds(10), + 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 + +ProduceInfantry = function() + if USSRRax.IsDead or USSRRax.Owner ~= ussr then + return + end + + ussr.Build({ Utils.Random(SovietInfantry) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceInfantry) + end) +end + +ProduceVehicles = 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")], ProduceVehicles) + 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 mig = units[1] + Migs[#Migs + 1] = mig + + Trigger.OnKilled(mig, ProduceAircraft) + + local alive = Utils.Where(Migs, function(y) return not y.IsDead end) + if #alive < 2 then + Trigger.AfterDelay(DateTime.Seconds(ProductionInterval[Map.LobbyOption("difficulty")] / 2), ProduceAircraft) + end + + TargetAndAttack(mig) + end) +end + +TargetAndAttack = function(mig, target) + if not target or target.IsDead or (not target.IsInWorld) then + local enemies = Utils.Where(greece.GetActors(), function(actor) + return actor.HasProperty("Health") and actor.Type ~= "brik" + end) + if #enemies > 0 then + target = Utils.Random(enemies) + end + end + + if target and mig.AmmoCount() > 0 and mig.CanTarget(target) then + mig.Attack(target) + else + mig.ReturnToBase() + end + + mig.CallFunc(function() + TargetAndAttack(mig, target) + end) +end + +GroundWaves = function() + local path = Utils.Random(GroundAttackPaths) + local units = Reinforcements.Reinforce(ussr, Utils.Random(GroundAttackUnits[GroundAttackUnitType]), { path[1] }) + local lastWaypoint = path[#path] + Utils.Do(units, function(unit) + Trigger.OnAddedToWorld(unit, function() + unit.Patrol(path) + Trigger.OnIdle(unit, function() + unit.AttackMove(lastWaypoint) + end) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(GroundWavesDelays), GroundWaves) +end + +WTransWaves = function() + local way = Utils.Random(WTransWays) + local units = Utils.Random(WTransUnits) + local attackUnits = Reinforcements.ReinforceWithTransport(ussr, "lst", units , way, { way[2], way[1] })[2] + Utils.Do(attackUnits, function(a) + Trigger.OnAddedToWorld(a, function() + a.AttackMove(AttackChrono.Location) + IdleHunt(a) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(WTransDelays), WTransWaves) +end + +Paradrop = function() + local units = PowerProxy.SendParatroopers(Utils.Random(ParadropLZs)) + Utils.Do(units, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + + Trigger.AfterDelay(DateTime.Minutes(ParadropDelays), Paradrop) +end + +SendParabombs = function() + local airfield = Airfield1 + if Airfield1.IsDead or Airfield1.Owner ~= ussr then + if Airfield2.IsDead or Airfield2.Owner ~= ussr then + return + end + + airfield = Airfield2 + end + + local targets = Utils.Where(greece.GetActors(), function(actor) + return + actor.HasProperty("Sell") and + actor.Type ~= "brik" and + actor.Type ~= "sbag" or + actor.Type == "pdox" or + actor.Type == "atek" + end) + + if #targets > 0 then + airfield.SendAirstrike(Utils.Random(targets).CenterPosition, true, 0) + end + + Trigger.AfterDelay(DateTime.Minutes(BombDelays), SendParabombs) +end + +ActivateAI = function() + local difficulty = Map.LobbyOption("difficulty") + GroundWavesDelays = GroundWavesDelays[difficulty] + WTransDelays = WTransDelays[difficulty] + ParadropDelays = ParadropDelays[difficulty] + BombDelays = BombDelays[difficulty] + + 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) + + ProduceInfantry() + ProduceVehicles() + ProduceAircraft() + Trigger.AfterDelay(DateTime.Minutes(GroundWavesDelays), GroundWaves) + Trigger.AfterDelay(DateTime.Minutes(WTransDelays), WTransWaves) + Trigger.AfterDelay(DateTime.Minutes(ParadropDelays), Paradrop) + Trigger.AfterDelay(DateTime.Minutes(BombDelays), SendParabombs) + Trigger.AfterDelay(GroundWavesUpgradeDelay, function() GroundAttackUnitType = "Upgraded" end) +end diff --git a/mods/ra/maps/allies-08a/allies08a.lua b/mods/ra/maps/allies-08a/allies08a.lua new file mode 100644 index 0000000000..1903683649 --- /dev/null +++ b/mods/ra/maps/allies-08a/allies08a.lua @@ -0,0 +1,192 @@ +--[[ + Copyright 2007-2018 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. +]] +AlliedBoatReinforcements = { "dd", "dd" } +TimerTicks = DateTime.Minutes(21) +ObjectiveBuildings = { Chronosphere, AlliedTechCenter } +ScientistTypes = { "chan", "chan", "chan", "chan" } +ScientistDiscoveryFootprint = { CPos.New(28, 83), CPos.New(29, 83) } +ScientistEvacuationFootprint = { CPos.New(29, 60), CPos.New(29, 61), CPos.New(29, 62), CPos.New(29, 63), CPos.New(29, 64), CPos.New(29, 65), CPos.New(29, 66) } + +InitialAlliedReinforcements = function() + Trigger.AfterDelay(DateTime.Seconds(2), function() + Media.PlaySpeechNotification(greece, "ReinforcementsArrived") + Reinforcements.Reinforce(greece, { "mcv" }, { MCVEntry.Location, MCVStop.Location }) + Reinforcements.Reinforce(greece, AlliedBoatReinforcements, { DDEntry.Location, DDStop.Location }) + end) +end + +CreateScientists = function() + scientists = Reinforcements.Reinforce(greece, ScientistTypes, { ScientistsExit.Location }) + Utils.Do(scientists, function(s) + s.Move(s.Location + CVec.New(0, 1)) + s.Scatter() + end) + + local flare = Actor.Create("flare", true, { Owner = greece, Location = DefaultCameraPosition.Location + CVec.New(-1, 0) }) + Trigger.AfterDelay(DateTime.Seconds(2), function() Media.PlaySpeechNotification(player, "SignalFlareNorth") end) + + Trigger.OnAnyKilled(scientists, function() + Media.PlaySpeechNotification(greece, "ObjectiveNotMet") + greece.MarkFailedObjective(EvacuateScientists) + end) + + -- Add the footprint trigger in a frame end task (delay 0) to avoid crashes + local left = #scientists + Trigger.AfterDelay(0, function() + local changeOwnerTrigger = Trigger.OnEnteredFootprint(ScientistEvacuationFootprint, function(a, id) + if a.Owner == greece and a.Type == "chan" then + a.Owner = germany + a.Stop() + a.Move(MCVEntry.Location) + + -- Constantly try to reach the exit (and thus avoid getting stuck if the path was blocked) + Trigger.OnIdle(a, function() + a.Move(MCVEntry.Location) + end) + end + end) + + -- Use a cell trigger to destroy the scientists preventing the player from causing glitchs by blocking the path + Trigger.OnEnteredFootprint({ MCVEntry.Location }, function(a, id) + if a.Owner == germany then + a.Stop() + a.Destroy() + + left = left - 1 + if left == 0 then + Trigger.RemoveFootprintTrigger(id) + Trigger.RemoveFootprintTrigger(changeOwnerTrigger) + flare.Destroy() + + if not greece.IsObjectiveCompleted(EvacuateScientists) and not greece.IsObjectiveFailed(EvacuateScientists) then + Media.PlaySpeechNotification(greece, "ObjectiveMet") + greece.MarkCompletedObjective(EvacuateScientists) + end + end + end + end) + end) + end + + +FinishTimer = function() + for i = 0, 5 do + local c = TimerColor + if i % 2 == 0 then + c = HSLColor.White + end + + Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText("The experiment is a success!", c) end) + end + Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end) +end + +DefendChronosphereCompleted = function() + local cells = Utils.ExpandFootprint({ ChronoshiftLocation.Location }, false) + local units = { } + for i = 1, #cells do + local unit = Actor.Create("2tnk", true, { Owner = greece, Facing = 0 }) + units[unit] = cells[i] + end + Chronosphere.Chronoshift(units) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + greece.MarkCompletedObjective(DefendChronosphere) + greece.MarkCompletedObjective(KeepBasePowered) + end) +end + +ticked = TimerTicks +Tick = function() + ussr.Cash = 5000 + + if ussr.HasNoRequiredUnits() then + greece.MarkCompletedObjective(DefendChronosphere) + greece.MarkCompletedObjective(KeepBasePowered) + end + + if greece.HasNoRequiredUnits() then + ussr.MarkCompletedObjective(BeatAllies) + end + + if ticked > 0 then + UserInterface.SetMissionText("Chronosphere experiment completes in " .. Utils.FormatTime(ticked), TimerColor) + ticked = ticked - 1 + elseif ticked == 0 and (greece.PowerState ~= "Normal") then + greece.MarkFailedObjective(KeepBasePowered) + elseif ticked == 0 then + DefendChronosphereCompleted() + ticked = ticked - 1 + end +end + +WorldLoaded = function() + greece = Player.GetPlayer("Greece") + ussr = Player.GetPlayer("USSR") + germany = Player.GetPlayer("Germany") + + DefendChronosphere = greece.AddPrimaryObjective("Defend the Chronosphere and the Tech Center\nat all costs.") + KeepBasePowered = greece.AddPrimaryObjective("The Chronosphere must have power when the\ntimer runs out.") + EvacuateScientists = greece.AddSecondaryObjective("Evacuate all scientists from the island to\nthe west.") + BeatAllies = ussr.AddPrimaryObjective("Defeat the Allied forces.") + + 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() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(greece, "MissionFailed") + end) + end) + Trigger.OnPlayerWon(greece, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(greece, "MissionAccomplished") + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(1), function() + Media.PlaySpeechNotification(greece, "TwentyMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(11), function() + Media.PlaySpeechNotification(greece, "TenMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(16), function() + Media.PlaySpeechNotification(greece, "WarningFiveMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(18), function() + Media.PlaySpeechNotification(greece, "WarningThreeMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(20), function() + Media.PlaySpeechNotification(greece, "WarningOneMinuteRemaining") + end) + + PowerProxy = Actor.Create("powerproxy.paratroopers", false, { Owner = ussr }) + + Camera.Position = DefaultCameraPosition.CenterPosition + TimerColor = greece.Color + + Trigger.OnAnyKilled(ObjectiveBuildings, function() + greece.MarkFailedObjective(DefendChronosphere) + end) + + Trigger.OnEnteredFootprint(ScientistDiscoveryFootprint, function(a, id) + if a.Owner == greece and not scientistsTriggered then + scientistsTriggered = true + Trigger.RemoveFootprintTrigger(id) + CreateScientists() + end + end) + + InitialAlliedReinforcements() + ActivateAI() +end diff --git a/mods/ra/maps/allies-08a/map.bin b/mods/ra/maps/allies-08a/map.bin new file mode 100644 index 0000000000..6640f805ed Binary files /dev/null and b/mods/ra/maps/allies-08a/map.bin differ diff --git a/mods/ra/maps/allies-08a/map.png b/mods/ra/maps/allies-08a/map.png new file mode 100644 index 0000000000..29bfd56141 Binary files /dev/null and b/mods/ra/maps/allies-08a/map.png differ diff --git a/mods/ra/maps/allies-08a/map.yaml b/mods/ra/maps/allies-08a/map.yaml new file mode 100644 index 0000000000..fbee55456b --- /dev/null +++ b/mods/ra/maps/allies-08a/map.yaml @@ -0,0 +1,988 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 08a: Protect the Chronosphere + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 23,57,87,54 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FF1400 + Enemies: Greece, Germany + PlayerReference@Germany: + Name: Germany + Faction: allies + Color: 505050 + Enemies: USSR + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: E2E6F6 + LockSpawn: True + LockTeam: True + Enemies: USSR + +Actors: + Actor0: brik + Location: 48,89 + Owner: Greece + Actor1: brik + Location: 49,89 + Owner: Greece + Actor2: brik + Location: 50,89 + Owner: Greece + Actor3: brik + Location: 51,89 + Owner: Greece + Actor4: brik + Location: 52,89 + Owner: Greece + Actor5: brik + Location: 53,89 + Owner: Greece + Actor6: brik + Location: 54,89 + Owner: Greece + Actor7: brik + Location: 55,89 + Owner: Greece + Actor8: brik + Location: 60,89 + Owner: Greece + Actor9: brik + Location: 61,89 + Owner: Greece + Actor10: brik + Location: 62,89 + Owner: Greece + Actor11: brik + Location: 63,89 + Owner: Greece + Actor12: brik + Location: 64,89 + Owner: Greece + Actor13: brik + Location: 65,89 + Owner: Greece + Actor14: brik + Location: 66,89 + Owner: Greece + Actor15: brik + Location: 67,89 + Owner: Greece + Actor16: brik + Location: 68,89 + Owner: Greece + Actor17: brik + Location: 69,89 + Owner: Greece + Actor18: brik + Location: 70,89 + Owner: Greece + Actor19: brik + Location: 48,90 + Owner: Greece + Actor20: brik + Location: 49,90 + Owner: Greece + Actor21: brik + Location: 54,90 + Owner: Greece + Actor22: brik + Location: 55,90 + Owner: Greece + Actor23: brik + Location: 60,90 + Owner: Greece + Actor24: brik + Location: 61,90 + Owner: Greece + Actor25: brik + Location: 70,90 + Owner: Greece + Actor26: brik + Location: 48,91 + Owner: Greece + Actor27: brik + Location: 49,91 + Owner: Greece + Actor28: brik + Location: 70,91 + Owner: Greece + Actor29: brik + Location: 70,92 + Owner: Greece + Actor30: brik + Location: 70,93 + Owner: Greece + Actor31: brik + Location: 48,94 + Owner: Greece + Actor32: brik + Location: 49,94 + Owner: Greece + Actor33: brik + Location: 70,94 + Owner: Greece + Actor34: brik + Location: 48,95 + Owner: Greece + Actor35: brik + Location: 49,95 + Owner: Greece + Actor36: brik + Location: 70,95 + Owner: Greece + Actor37: brik + Location: 49,96 + Owner: Greece + Actor38: brik + Location: 70,96 + Owner: Greece + Actor39: brik + Location: 49,97 + Owner: Greece + Actor40: brik + Location: 70,97 + Owner: Greece + Actor41: brik + Location: 46,98 + Owner: Greece + Actor42: brik + Location: 47,98 + Owner: Greece + Actor43: brik + Location: 48,98 + Owner: Greece + Actor44: brik + Location: 49,98 + Owner: Greece + Actor45: brik + Location: 56,98 + Owner: Greece + Actor46: brik + Location: 57,98 + Owner: Greece + Actor47: brik + Location: 60,98 + Owner: Greece + Actor48: brik + Location: 61,98 + Owner: Greece + Actor49: brik + Location: 70,98 + Owner: Greece + Actor50: brik + Location: 71,98 + Owner: Greece + Actor51: brik + Location: 46,99 + Owner: Greece + Actor52: brik + Location: 56,99 + Owner: Greece + Actor53: brik + Location: 57,99 + Owner: Greece + Actor54: brik + Location: 60,99 + Owner: Greece + Actor55: brik + Location: 61,99 + Owner: Greece + Actor56: brik + Location: 70,99 + Owner: Greece + Actor57: brik + Location: 71,99 + Owner: Greece + Actor58: brik + Location: 46,100 + Owner: Greece + Actor59: brik + Location: 56,100 + Owner: Greece + Actor60: brik + Location: 61,100 + Owner: Greece + Actor61: brik + Location: 35,101 + Owner: Greece + Actor62: brik + Location: 36,101 + Owner: Greece + Actor63: brik + Location: 37,101 + Owner: Greece + Actor64: brik + Location: 38,101 + Owner: Greece + Actor65: brik + Location: 39,101 + Owner: Greece + Actor66: brik + Location: 40,101 + Owner: Greece + Actor67: brik + Location: 41,101 + Owner: Greece + Actor68: brik + Location: 42,101 + Owner: Greece + Actor69: brik + Location: 43,101 + Owner: Greece + Actor70: brik + Location: 44,101 + Owner: Greece + Actor71: brik + Location: 45,101 + Owner: Greece + Actor72: brik + Location: 46,101 + Owner: Greece + Actor73: brik + Location: 56,101 + Owner: Greece + Actor74: brik + Location: 61,101 + Owner: Greece + Actor75: brik + Location: 35,102 + Owner: Greece + Actor76: brik + Location: 56,102 + Owner: Greece + Actor77: brik + Location: 61,102 + Owner: Greece + Actor78: brik + Location: 35,103 + Owner: Greece + Actor79: brik + Location: 36,103 + Owner: Greece + Actor80: brik + Location: 56,103 + Owner: Greece + Actor81: brik + Location: 61,103 + Owner: Greece + Actor82: brik + Location: 35,104 + Owner: Greece + Actor83: brik + Location: 36,104 + Owner: Greece + Actor84: brik + Location: 55,104 + Owner: Greece + Actor85: brik + Location: 56,104 + Owner: Greece + Actor86: brik + Location: 57,104 + Owner: Greece + Actor87: brik + Location: 58,104 + Owner: Greece + Actor88: brik + Location: 59,104 + Owner: Greece + Actor89: brik + Location: 60,104 + Owner: Greece + Actor90: brik + Location: 61,104 + Owner: Greece + Actor91: brik + Location: 62,104 + Owner: Greece + Actor92: brik + Location: 70,104 + Owner: Greece + Actor93: brik + Location: 71,104 + Owner: Greece + Actor94: brik + Location: 55,105 + Owner: Greece + Actor95: brik + Location: 56,105 + Owner: Greece + Actor96: brik + Location: 61,105 + Owner: Greece + Actor97: brik + Location: 62,105 + Owner: Greece + Actor98: brik + Location: 70,105 + Owner: Greece + Actor99: brik + Location: 71,105 + Owner: Greece + Actor100: brik + Location: 35,108 + Owner: Greece + Actor101: brik + Location: 36,108 + Owner: Greece + Actor102: brik + Location: 35,109 + Owner: Greece + Actor103: brik + Location: 36,109 + Owner: Greece + Actor104: brik + Location: 35,110 + Owner: Greece + Actor105: t08 + Location: 93,72 + Owner: Neutral + Actor106: t15 + Location: 82,69 + Owner: Neutral + Actor107: tc05 + Location: 80,71 + Owner: Neutral + Actor108: tc04 + Location: 88,71 + Owner: Neutral + Actor109: tc03 + Location: 89,70 + Owner: Neutral + Actor110: tc02 + Location: 86,73 + Owner: Neutral + Actor111: tc02 + Location: 64,63 + Owner: Neutral + Actor113: tc02 + Location: 70,57 + Owner: Neutral + Actor114: tc04 + Location: 70,60 + Owner: Neutral + Actor116: tc04 + Location: 93,73 + Owner: Neutral + Actor117: tc05 + Location: 90,72 + Owner: Neutral + Actor118: tc04 + Location: 81,105 + Owner: Neutral + Actor119: t13 + Location: 83,103 + Owner: Neutral + Actor120: t06 + Location: 88,105 + Owner: Neutral + Actor121: t07 + Location: 85,104 + Owner: Neutral + Actor122: t10 + Location: 85,106 + Owner: Neutral + Actor123: t06 + Location: 87,104 + Owner: Neutral + Actor124: t05 + Location: 54,87 + Owner: Neutral + Actor125: t01 + Location: 56,81 + Owner: Neutral + Actor126: t01 + Location: 61,83 + Owner: Neutral + Actor127: t08 + Location: 53,88 + Owner: Neutral + Actor128: t08 + Location: 68,87 + Owner: Neutral + Actor129: t12 + Location: 82,83 + Owner: Neutral + Actor130: t12 + Location: 69,84 + Owner: Neutral + Actor131: tc04 + Location: 62,84 + Owner: Neutral + Actor132: tc05 + Location: 82,87 + Owner: Neutral + Actor133: tc05 + Location: 40,61 + Owner: Neutral + Actor134: t11 + Location: 54,58 + Owner: Neutral + Actor144: t02 + Location: 53,80 + Owner: Neutral + Actor145: t02 + Location: 55,74 + Owner: Neutral + Actor146: t15 + Location: 57,75 + Owner: Neutral + Actor147: tc01 + Location: 46,78 + Owner: Neutral + Actor148: tc01 + Location: 49,87 + Owner: Neutral + Actor149: tc03 + Location: 54,81 + Owner: Neutral + Actor150: tc04 + Location: 54,76 + Owner: Neutral + Actor151: t15 + Location: 103,105 + Owner: Neutral + Actor153: tc01 + Location: 88,107 + Owner: Neutral + Actor154: tc04 + Location: 105,106 + Owner: Neutral + Actor155: tc05 + Location: 106,99 + Owner: Neutral + Actor156: tc04 + Location: 51,86 + Owner: Neutral + Actor157: t16 + Location: 34,109 + Owner: Neutral + Actor158: tc04 + Location: 36,64 + Owner: Neutral + Actor159: tc03 + Location: 33,57 + Owner: Neutral + Actor160: tc02 + Location: 43,66 + Owner: Neutral + Actor161: tc01 + Location: 52,60 + Owner: Neutral + Actor162: t17 + Location: 51,57 + Owner: Neutral + Actor163: t16 + Location: 47,62 + Owner: Neutral + Actor164: t15 + Location: 48,62 + Owner: Neutral + Actor165: t14 + Location: 63,59 + Owner: Neutral + Actor166: tc03 + Location: 100,57 + Owner: Neutral + Actor167: tc01 + Location: 80,59 + Owner: Neutral + Actor168: tc05 + Location: 81,57 + Owner: Neutral + Actor169: tc04 + Location: 66,71 + Owner: Neutral + Actor170: tc03 + Location: 60,66 + Owner: Neutral + Actor171: tc02 + Location: 60,70 + Owner: Neutral + Actor172: tc05 + Location: 97,80 + Owner: Neutral + Actor173: tc01 + Location: 97,77 + Owner: Neutral + Actor174: t17 + Location: 101,77 + Owner: Neutral + Actor175: t16 + Location: 94,80 + Owner: Neutral + Actor176: t13 + Location: 98,85 + Owner: Neutral + Actor177: t07 + Location: 23,76 + Owner: Neutral + Actor178: t08 + Location: 30,88 + Owner: Neutral + Actor179: t14 + Location: 24,89 + Owner: Neutral + Actor180: tc05 + Location: 23,84 + Owner: Neutral + Actor181: tc04 + Location: 29,80 + Owner: Neutral + Actor182: tc02 + Location: 47,96 + Owner: Neutral + Actor183: t17 + Location: 34,102 + Owner: Neutral + Actor184: tc02 + Location: 74,83 + Owner: Neutral + Actor185: tc01 + Location: 78,93 + Owner: Neutral + Actor186: t08 + Location: 71,97 + Owner: Neutral + Actor187: t01 + Location: 45,96 + Owner: Neutral + Actor188: t02 + Location: 45,98 + Owner: Neutral + Actor189: t03 + Location: 45,97 + Owner: Neutral + Actor190: t06 + Location: 44,97 + Owner: Neutral + Actor191: t07 + Location: 44,98 + Owner: Neutral + Actor192: t10 + Location: 42,97 + Owner: Neutral + Actor193: tc03 + Location: 41,99 + Owner: Neutral + Actor194: t12 + Location: 46,96 + Owner: Neutral + Actor195: t17 + Location: 43,98 + Owner: Neutral + Actor196: t10 + Location: 58,105 + Owner: Neutral + Actor197: t12 + Location: 70,105 + Owner: Neutral + Actor198: t02 + Location: 72,109 + Owner: Neutral + Actor199: t03 + Location: 69,109 + Owner: Neutral + Actor200: t06 + Location: 69,108 + Owner: Neutral + Actor201: t07 + Location: 70,108 + Owner: Neutral + Actor202: t08 + Location: 71,110 + Owner: Neutral + Actor203: t10 + Location: 68,107 + Owner: Neutral + Actor204: t01 + Location: 71,108 + Owner: Neutral + AAGun1: agun + Location: 62,101 + Owner: Greece + AAGun2: agun + Location: 55,101 + Owner: Greece + Dome: dome + Location: 67,93 + Owner: Greece + Health: 97 + Apwr1: apwr + Location: 37,108 + Owner: Greece + Apwr2: apwr + Location: 43,102 + Owner: Greece + Apwr3: apwr + Location: 40,102 + Owner: Greece + AlliedTechCenter: atek + Location: 58,95 + Owner: Greece + Health: 99 + Chronosphere: pdox + Location: 58,102 + Owner: Greece + Health: 99 + Gap1: gap + Location: 59,101 + Owner: Greece + Health: 97 + Gap2: gap + Location: 57,103 + Owner: Greece + Health: 97 + Gap3: gap + Location: 58,101 + Owner: Greece + Health: 97 + Gap4: gap + Location: 60,103 + Owner: Greece + Health: 97 + Gun1: gun + Location: 56,89 + Owner: Greece + Health: 99 + Gun2: gun + Location: 59,89 + Owner: Greece + Health: 99 + Gun3: gun + Location: 71,100 + Owner: Greece + Health: 99 + Facing: 191 + Gun4: gun + Location: 71,103 + Owner: Greece + Health: 99 + Facing: 191 + OreRef: proc + Location: 62,90 + Owner: Greece + Health: 99 + Apwr4: apwr + Location: 40,108 + Owner: Greece + Apwr5: apwr + Location: 37,102 + Owner: Greece + Apwr6: apwr + Location: 43,108 + Owner: Greece + ServiceDepot: fix + Location: 51,90 + Owner: Greece + Actor226: fact + Location: 88,62 + Owner: USSR + Actor227: powr + Location: 89,57 + Owner: USSR + Actor228: powr + Location: 91,57 + Owner: USSR + Actor229: proc + Location: 98,59 + Owner: USSR + Actor230: silo + Location: 98,57 + Owner: USSR + Actor231: silo + Location: 99,57 + Owner: USSR + USSRWarFactory: weap + Location: 92,64 + Owner: USSR + Actor233: proc + Location: 93,58 + Owner: USSR + Actor234: apwr + Location: 104,64 + Owner: USSR + Actor235: apwr + Location: 100,65 + Owner: USSR + USSRRax: barr + Location: 86,60 + Owner: USSR + Actor237: tsla + Location: 83,65 + Owner: USSR + Actor238: apwr + Location: 99,68 + Owner: USSR + Actor239: apwr + Location: 103,67 + Owner: USSR + Actor240: ftur + Location: 81,62 + Owner: USSR + Actor241: ftur + Location: 85,67 + Owner: USSR + Actor242: silo + Location: 99,58 + Owner: USSR + Actor243: silo + Location: 99,58 + Owner: USSR + Actor244: silo + Location: 98,58 + Owner: USSR + Actor245: stek + Location: 91,68 + Owner: USSR + Tent: tent + Location: 68,97 + Owner: Greece + Actor247: dome + Location: 26,79 + Owner: Germany + Health: 26 + Silo1: silo + Location: 64,90 + Owner: Greece + Silo2: silo + Location: 66,90 + Owner: Greece + Silo3: silo + Location: 65,91 + Owner: Greece + Silo4: silo + Location: 67,91 + Owner: Greece + Airfield1: afld.ukraine + Location: 102,58 + Owner: USSR + Airfield2: afld + Location: 106,57 + Owner: USSR + Actor254: v2rl + Location: 56,69 + Owner: USSR + Actor255: v2rl + Location: 52,69 + Owner: USSR + Actor256: 3tnk + Location: 54,65 + Owner: USSR + Actor257: 3tnk + Location: 54,63 + Owner: USSR + Actor258: 3tnk + Location: 56,66 + Owner: USSR + Actor259: 3tnk + Location: 56,64 + Owner: USSR + Facing: 31 + Actor260: 3tnk + Location: 52,66 + Owner: USSR + Actor261: 2tnk + Location: 28,60 + Owner: Greece + Facing: 159 + Actor262: 2tnk + Location: 28,66 + Owner: Greece + Facing: 191 + Actor263: 2tnk + Location: 28,64 + Owner: Greece + Facing: 191 + Actor264: 2tnk + Location: 30,66 + Owner: Greece + Facing: 223 + Actor265: 1tnk + Location: 30,64 + Owner: Greece + Facing: 191 + Actor266: 1tnk + Location: 29,62 + Owner: Greece + Facing: 191 + Actor267: mnly + Location: 27,61 + Owner: Greece + Facing: 191 + Actor268: mnly + Location: 26,60 + Owner: Greece + Facing: 191 + Actor269: jeep + Location: 32,61 + Owner: Greece + Facing: 223 + Actor270: arty + Location: 24,66 + Owner: Greece + Facing: 223 + Actor271: arty + Location: 25,67 + Owner: Greece + Facing: 223 + Actor272: harv + Location: 65,95 + Owner: Greece + Facing: 95 + Actor273: e1 + Location: 58,98 + Owner: Greece + Facing: 31 + SubCell: 4 + Actor274: e1 + Location: 59,98 + Owner: Greece + Facing: 223 + SubCell: 4 + Actor275: e1 + Location: 55,102 + Owner: Greece + Facing: 31 + SubCell: 0 + Actor276: e1 + Location: 62,102 + Owner: Greece + Facing: 223 + SubCell: 4 + Actor277: e1 + Location: 62,99 + Owner: Greece + SubCell: 4 + Actor278: e1 + Location: 55,91 + Owner: Greece + Facing: 191 + SubCell: 0 + Actor279: e1 + Location: 54,103 + Owner: Greece + SubCell: 4 + Actor280: e1 + Location: 55,99 + Owner: Greece + Facing: 31 + SubCell: 0 + Actor281: e1 + Location: 61,91 + Owner: Greece + Facing: 31 + SubCell: 0 + Actor282: e1 + Location: 63,104 + Owner: Greece + SubCell: 2 + Actor283: e1 + Location: 57,101 + Owner: Greece + SubCell: 1 + Actor284: e1 + Location: 60,101 + Owner: Greece + SubCell: 1 + MCVEntry: waypoint + Location: 23,64 + Owner: Neutral + MCVStop: waypoint + Location: 26,64 + Owner: Neutral + DDStop: waypoint + Location: 30,71 + Owner: Neutral + waypoint6: waypoint + Location: 41,109 + Owner: Neutral + waypoint9: waypoint + Location: 89,63 + Owner: Neutral + DDEntry: waypoint + Location: 23,71 + Owner: Neutral + WaterEntry2: waypoint + Location: 23,99 + Owner: Neutral + ParaLZ1: waypoint + Location: 29,106 + Owner: Neutral + ParaLZ2: waypoint + Owner: Neutral + Location: 47,84 + ParaLZ3: waypoint + Location: 66,77 + Owner: Neutral + ParaLZ4: waypoint + Owner: Neutral + Location: 77,88 + ParaLZ5: waypoint + Location: 91,95 + Owner: Neutral + SovEntry3: waypoint + Location: 109,110 + Owner: Neutral + SovEntry1: waypoint + Location: 86,57 + Owner: Neutral + WaterLanding1: waypoint + Location: 51,71 + Owner: Neutral + WaterLanding2: waypoint + Location: 45,93 + Owner: Neutral + SovEntry2: waypoint + Location: 109,72 + Owner: Neutral + WaterLanding3: waypoint + Location: 25,101 + Owner: Neutral + DefaultCameraPosition: waypoint + Location: 29,63 + Owner: Neutral + ScientistsExit: waypoint + Owner: Neutral + Location: 26,80 + AttackChrono: waypoint + Owner: Neutral + Location: 59,103 + ChronoshiftLocation: waypoint + Owner: Neutral + Location: 58,86 + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/ra/maps/allies-08a/rules.yaml b/mods/ra/maps/allies-08a/rules.yaml new file mode 100644 index 0000000000..3d95b366ea --- /dev/null +++ b/mods/ra/maps/allies-08a/rules.yaml @@ -0,0 +1,121 @@ +Player: + PlayerResources: + DefaultCash: 15000 + +World: + LuaScript: + Scripts: allies08a.lua, allies08a-AI.lua + MissionData: + Briefing: Our latest technology, the Chronosphere, is housed in this research station. The timer represents the appointed time for the completion of a vital experiment. The Soviets have learned of this and are moving in. \n\nProtect the Chronosphere and the Advanced-Tech research center. Make sure the base is fully powered at the appointed time. If not, all will be lost! + BriefingVideo: ally8.vqa + WinVideo: crontest.vqa + LossVideo: cronfail.vqa + StartVideo: aagun.vqa + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +powerproxy.paratroopers: + ParatroopersPower: + DropItems: E1,E1,E1,E2,E2 + +MCV: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +FTRK: + Buildable: + Prerequisites: ~disabled + +APC: + Buildable: + Prerequisites: ~disabled + +MRJ: + Buildable: + Prerequisites: ~disabled + +3TNK: + Buildable: + Prerequisites: ~vehicles.soviet + +V2RL: + Buildable: + Prerequisites: ~vehicles.soviet + +4TNK: + Buildable: + Prerequisites: ~vehicles.soviet + +QTNK: + Buildable: + Prerequisites: ~disabled + +HPAD: + Buildable: + Prerequisites: ~disabled + +AFLD.Ukraine: + -AirstrikePower@spyplane: + +CHAN: + Infiltrates: + Types: Mission Objectives + +ATEK: + Buildable: + Prerequisites: ~disabled + GpsPower: + ChargeInterval: 15000 + Targetable: + TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives + -Sellable: + +PDOX: + Inherits@IDISABLE: ^DisableOnLowPower + Buildable: + Prerequisites: ~disabled + ChronoshiftPower@chronoshift: + Prerequisites: ~disabled + -Sellable: + +IRON: + Buildable: + Prerequisites: ~disabled + +MSLO: + Buildable: + Prerequisites: ~disabled + +MECH: + Buildable: + Prerequisites: ~disabled + +HIJACKER: + Buildable: + Prerequisites: ~disabled + +E7: + Buildable: + Prerequisites: ~disabled + +E7.noautotarget: + Buildable: + Prerequisites: ~disabled + +CA: + Buildable: + Prerequisites: ~disabled + +MSUB: + Buildable: + Prerequisites: ~disabled diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index ad754dad8c..2e4d0419da 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -8,6 +8,7 @@ Allied Campaign: ./mods/ra/maps/allies-06a ./mods/ra/maps/allies-06b ./mods/ra/maps/allies-07 + ./mods/ra/maps/allies-08a Soviet Campaign: ./mods/ra/maps/soviet-01 ./mods/ra/maps/soviet-02a