diff --git a/mods/ra/maps/in-the-nick-of-time/in-the-nick-of-time.lua b/mods/ra/maps/in-the-nick-of-time/in-the-nick-of-time.lua new file mode 100644 index 0000000000..c416fcded2 --- /dev/null +++ b/mods/ra/maps/in-the-nick-of-time/in-the-nick-of-time.lua @@ -0,0 +1,414 @@ +--[[ + 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. +]] +StartUnits = { "jeep", "jeep", "1tnk", "1tnk", "1tnk", "1tnk", "2tnk", "2tnk" } +StartingPlanes = { Yak1, Yak2 } +ReinforcementFootprint1 = { CPos.New(93,78), CPos.New(94,78), CPos.New(95,78) } +InfantrySquad = { "e1", "e1", "e1", "e3", "e3" } +ReinforcementFootprint2 = { CPos.New(63,84), CPos.New(63,85), CPos.New(63,86), CPos.New(63,87) } +SouthWaterPath1 = { SouthWaterEntry.Location, SouthWaterLanding1.Location } +SouthWaterPath2 = { SouthWaterEntry.Location, SouthWaterLanding2.Location } +SouthWaterTeam = { "dtrk", "1tnk", "1tnk", "2tnk", "2tnk" } +SouthChinookPath = { ChinookEntry1.Location, ChinookLZ1.Location } +SouthChinookChalk = { "e3", "e3", "e3", "e1", "e1" } +MammothAttackFootprint = { CPos.New(49,81), CPos.New(50,81), CPos.New(51,81), CPos.New(52,81), CPos.New(53,81) } +BridgeMammoths = { Mammoth2, Mammoth3 } +ReinforcementFootprint3 = { CPos.New(60,74), CPos.New(61,74) } +MoneyTrucks = { "truk", "truk" } +SovietHouseSquad = { "e2", "e2", "e2", "e3", "e3" } +AlliedHouseSquad = { "e6", "e6", "medi", "spy", "mech" } +MediumTanks = { Medium1, Medium2, Medium3, Medium4 } +ReinforcementFootprint4 = { CPos.New(77,64), CPos.New(78,64), CPos.New(79,64), CPos.New(85,67), CPos.New(85,68), CPos.New(85,69) } +LightTanks = { LightTank1, LightTank2 } +ReinforcementFootprint5 = { CPos.New(92,54), CPos.New(92,55), CPos.New(92,56), CPos.New(92,57), CPos.New(96,62), CPos.New(97,62), CPos.New(98,62), CPos.New(99,62) } +ReinforcementFootprint6 = { CPos.New(97,51), CPos.New(98,51) } +NorthChinookPath = { ChinookEntry2.Location, ChinookLZ2.Location } +NorthChinookChalk = { "e3", "e3", "e3", "e3", "e3" } +Scientists = { "einstein", "chan", "chan", "chan", "chan" } +NorthWaterPath1 = { NorthWaterEntry.Location, NorthWaterLanding1.Location } +NorthWaterPath2 = { NorthWaterEntry.Location, NorthWaterLanding2.Location } +NorthWaterPath3 = { NorthWaterEntry.Location, NorthWaterLanding3.Location } +NorthWaterTeam = { "1tnk", "1tnk", "1tnk", "2tnk", "2tnk" } +BoatofMammoths = { "4tnk", "4tnk", "4tnk", "4tnk", "4tnk" } +EvacuateFootprint = { CPos.New(93,92), CPos.New(94,92), CPos.New(95,92), CPos.New(96,92), CPos.New(97,92), CPos.New(98,92), CPos.New(99,92) } +TimerTicks = DateTime.Minutes(54) +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +AlliedReinforcements = function() + Reinforcements.Reinforce(Greece, StartUnits, { AlliesEntry.Location, AlliesRally.Location }, 6) + Trigger.AfterDelay(DateTime.Seconds(1), function() + UnitsArrived = true + end) + + local foot1Triggered + Trigger.OnEnteredFootprint(ReinforcementFootprint1, function(actor, id) + if actor.Owner == Greece and not foot1Triggered then + Trigger.RemoveFootprintTrigger(id) + foot1Triggered = true + + Media.PlaySpeechNotification(Greece, "ReinforcementsArrived") + Reinforcements.Reinforce(Greece, InfantrySquad, { InfantrySquadEntry.Location, InfantrySquadStop.Location }, 2) + end + end) + + local foot2Triggered + Trigger.OnEnteredFootprint(ReinforcementFootprint2, function(actor, id) + if actor.Owner == Greece and not foot2Triggered then + Trigger.RemoveFootprintTrigger(id) + foot2Triggered = true + + Media.PlaySpeechNotification(Greece, "ReinforcementsArrived") + local demoTeam = Reinforcements.ReinforceWithTransport(Greece, "lst.reinforcement", SouthWaterTeam, SouthWaterPath1, { SouthWaterPath1[1] }) + local chinookChalk1 = Reinforcements.ReinforceWithTransport(Greece, "tran.reinforcement", SouthChinookChalk, SouthChinookPath, { SouthChinookPath[1] }) + end + end) + + local foot3Triggered + Trigger.OnEnteredFootprint(ReinforcementFootprint3, function(actor, id) + if actor.Owner == Greece and not foot3Triggered then + Trigger.RemoveFootprintTrigger(id) + foot3Triggered = true + + Media.PlaySound("chrono2.aud") + Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoBeam1.Location }) + Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoBeam1.Location + CVec.New(1,1) }) + + Reinforcements.Reinforce(USSR, MoneyTrucks, { AlliesEntry.Location, TruckStop1.Location }, 0) + Utils.Do(StartingPlanes, function(yaks) + InitializeAttackAircraft(yaks, Greece) + end) + + if not USSRHouse.IsDead then + local houseSquad = Reinforcements.Reinforce(USSR, SovietHouseSquad, { VillageSpawnUSSR.Location }, 0) + Utils.Do(houseSquad, IdleHunt) + Trigger.OnAllKilled(houseSquad, function() + if not AlliesHouse.IsDead then + Media.PlaySoundNotification(Greece, "AlertBleep") + Media.DisplayMessage("Friendlies coming out!", "Medic") + Reinforcements.Reinforce(Greece, AlliedHouseSquad, { VillageSpawnAllies.Location, VillageRally.Location }, 0) + end + end) + end + end + end) + + local foot4Triggered + Trigger.OnEnteredFootprint(ReinforcementFootprint4, function(actor, id) + if actor.Owner == Greece and not foot4Triggered then + Trigger.RemoveFootprintTrigger(id) + foot4Triggered = true + + Media.PlaySpeechNotification(Greece, "ReinforcementsArrived") + Paradrop3.TargetParatroopers(ParaLZ3.CenterPosition, Angle.New(935)) + end + end) + + local foot5Triggered + Trigger.OnEnteredFootprint(ReinforcementFootprint5, function(actor, id) + if actor.Owner == Greece and not foot5Triggered then + Trigger.RemoveFootprintTrigger(id) + foot5Triggered = true + + Media.PlaySound("chrono2.aud") + Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoBeam2.Location }) + Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoBeam2.Location + CVec.New(1,1) }) + + Utils.Do(LightTanks, IdleHunt) + end + end) + + local foot6Triggered + Trigger.OnEnteredFootprint(ReinforcementFootprint6, function(actor, id) + if actor.Owner == Greece and not foot6Triggered then + Trigger.RemoveFootprintTrigger(id) + foot6Triggered = true + + Media.PlaySpeechNotification(Greece, "ReinforcementsArrived") + local chinookChalk2 = Reinforcements.ReinforceWithTransport(Greece, "tran.reinforcement", NorthChinookChalk, NorthChinookPath, { NorthChinookPath[1] }) + InfantryProduction() + TankProduction() + end + end) + + Trigger.OnEnteredProximityTrigger(ScientistEscape.CenterPosition, WDist.FromCells(3), function(actor, id) + if actor.Owner == Greece then + Trigger.RemoveProximityTrigger(id) + ScientistsFreed = true + + Media.PlaySpeechNotification(Greece, "TargetFreed") + VIPs = Reinforcements.Reinforce(Greece, Scientists, { ScientistEscape.Location, ScientistRally.Location }, 2) + Actor.Create("flare", true, { Owner = Greece, Location = DefaultCameraPosition.Location }) + + Trigger.OnAnyKilled(VIPs, function() + Greece.MarkFailedObjective(RescueScientists) + end) + + -- Add the footprint trigger in a frame end task (delay 0) to avoid crashes + local left = #VIPs + Trigger.AfterDelay(0, function() + Trigger.OnEnteredFootprint(EvacuateFootprint, function(a, id) + if a.Type == "chan" or a.Type == "einstein" then + a.Owner = GoodGuy + a.Stop() + a.Move(AlliesEntry.Location) + + -- in case units get stuck + Trigger.OnIdle(a, function() + a.Move(AlliesEntry.Location) + end) + end + end) + + Trigger.OnEnteredFootprint({ AlliesEntry.Location }, function(a, id) + if a.Type == "chan" or a.Type == "einstein" then + a.Stop() + a.Destroy() + + left = left - 1 + if left == 0 then + if not Greece.IsObjectiveCompleted(RescueScientists) and not Greece.IsObjectiveFailed(RescueScientists) then + Greece.MarkCompletedObjective(RescueScientists) + end + end + else + a.Stop() + a.Destroy() + end + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Media.PlaySpeechNotification(Greece, "ReinforcementsArrived") + Media.DisplayMessage("Commander, we're detecting Soviet transports headed your way. Get those scientists back to the extraction point in the southeast!", "LANDCOM 16") + local northTeam = Reinforcements.ReinforceWithTransport(Greece, "lst.reinforcement", NorthWaterTeam, NorthWaterPath1, { NorthWaterPath1[1] }) + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Media.PlaySpeechNotification(Greece, "SovietForcesApproaching") + local mammoths1 = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", BoatofMammoths, NorthWaterPath2, { NorthWaterPath2[1] })[2] + Utils.Do(mammoths1, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + local mammoths2 = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", BoatofMammoths, NorthWaterPath3, { NorthWaterPath3[1] })[2] + Utils.Do(mammoths2, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + end) + + local footMammoth2Triggered + Trigger.OnEnteredFootprint(MammothAttackFootprint, function(actor, id) + if actor.Type == "chan" and not footMammoth2Triggered then + Trigger.RemoveFootprintTrigger(id) + footMammoth2Triggered = true + + Trigger.AfterDelay(DateTime.Seconds(10), function() + Media.PlaySpeechNotification(Greece, "SovietForcesApproaching") + local mammoths3 = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", BoatofMammoths, SouthWaterPath1, { SouthWaterPath1[1] })[2] + Utils.Do(mammoths3, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + local mammoths4 = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", BoatofMammoths, SouthWaterPath2, { SouthWaterPath2[1] })[2] + Utils.Do(mammoths4, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + end) + end + end) + end + end) +end + +EnemyActions = function() + Utils.Do(StartingPlanes, function(a) + a.ReturnToBase() + end) + + local firstDrop = Paradrop1.TargetParatroopers(ParaLZ1.CenterPosition, Angle.New(214)) + Utils.Do(firstDrop, function(a) + Trigger.OnPassengerExited(a, function(t, p) + IdleHunt(p) + end) + end) + + local footMammothTriggered + Trigger.OnEnteredFootprint(MammothAttackFootprint, function(actor, id) + if actor.Owner == Greece and not footMammothTriggered then + Trigger.RemoveFootprintTrigger(id) + footMammothTriggered = true + + Utils.Do(BridgeMammoths, IdleHunt) + + local secondDrop = Paradrop2.TargetParatroopers(ParaLZ2.CenterPosition, Angle.New(808)) + Utils.Do(secondDrop, function(a) + Trigger.OnPassengerExited(a, function(t, p) + IdleHunt(p) + end) + end) + end + end) + + Trigger.OnKilled(Tesla2, function() + Utils.Do(MediumTanks, function(tank) + if not tank.IsDead then + IdleHunt(tank) + end + end) + end) +end + +EnemyInfantry = { "e1", "e1", "e3" } +Tanks = { "1tnk", "3tnk" } +AttackGroupSize = 4 +ProductionDelay = DateTime.Seconds(10) +IdlingUnits = { } + +InfantryProduction = function() + if (Tent1.IsDead or Tent1.Owner ~= USSR) and (Tent2.IsDead or Tent2.Owner ~= USSR) then + return + end + + local toBuild = { Utils.Random(EnemyInfantry) } + + USSR.Build(toBuild, function(unit) + IdlingUnits[#IdlingUnits + 1] = unit[1] + Trigger.AfterDelay(ProductionDelay, InfantryProduction) + + if #IdlingUnits >= (AttackGroupSize * 1.5) then + SendAttack() + end + end) +end + +TankProduction = function() + if WarFactory.IsDead or WarFactory.Owner ~= USSR then + return + end + + local toBuild = { Utils.Random(Tanks) } + + USSR.Build(toBuild, function(unit) + IdlingUnits[#IdlingUnits + 1] = unit[1] + Trigger.AfterDelay(ProductionDelay, TankProduction) + + if #IdlingUnits >= (AttackGroupSize * 1.5) then + SendAttack() + end + end) +end + +SendAttack = function() + local units = { } + + for i = 0, AttackGroupSize, 1 do + local number = Utils.RandomInteger(1, #IdlingUnits) + + if IdlingUnits[number] and not IdlingUnits[number].IsDead then + units[i] = IdlingUnits[number] + table.remove(IdlingUnits, number) + end + end + + Utils.Do(units, function(unit) + if not unit.IsDead then + IdleHunt(unit) + end + end) +end + +LoseTriggers = function() + Trigger.OnKilled(ForwardCommand, function() + if not ScientistsFreed then + Greece.MarkFailedObjective(RescueScientists) + Media.DisplayMessage("The scientists were in the Command Center!", "LANDCOM 16") + end + end) + + Trigger.OnKilled(Chronosphere, function() + Greece.MarkFailedObjective(RescueScientists) + end) + + Trigger.OnCapture(Chronosphere, function() + Chronosphere.Kill() + end) +end + +ticked = TimerTicks +Tick = function() + if Greece.HasNoRequiredUnits() and UnitsArrived then + USSR.MarkCompletedObjective(SovietObj) + end + + if ticked > 0 then + UserInterface.SetMissionText("Chronosphere explodes in " .. Utils.FormatTime(ticked), TimerColor) + ticked = ticked - 1 + elseif ticked == 0 then + UserInterface.SetMissionText("We're too late!", USSR.Color) + USSR.MarkCompletedObjective(SovietObj) + end +end + +WorldLoaded = function() + Greece = Player.GetPlayer("Greece") + USSR = Player.GetPlayer("USSR") + GoodGuy = Player.GetPlayer("GoodGuy") + + Trigger.OnObjectiveAdded(Greece, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + SovietObj = USSR.AddObjective("Defeat Allies.") + RescueScientists = Greece.AddObjective("Rescue the scientists and escort them back to the\nextraction point.") + + 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) + + Camera.Position = DefaultCameraPosition.CenterPosition + Paradrop1 = Actor.Create("paradrop1", false, { Owner = USSR }) + Paradrop2 = Actor.Create("paradrop2", false, { Owner = USSR }) + Paradrop3 = Actor.Create("paradrop3", false, { Owner = Greece }) + TimerColor = Greece.Color + Tent1.IsPrimaryBuilding = true + AlliedReinforcements() + EnemyActions() + LoseTriggers() + + Trigger.AfterDelay(DateTime.Minutes(24), function() + Media.PlaySpeechNotification(Greece, "ThirtyMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(34), function() + Media.PlaySpeechNotification(Greece, "TwentyMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(44), function() + Media.PlaySpeechNotification(Greece, "TenMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(49), function() + Media.PlaySpeechNotification(Greece, "WarningFiveMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(50), function() + Media.PlaySpeechNotification(Greece, "WarningFourMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(51), function() + Media.PlaySpeechNotification(Greece, "WarningThreeMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(52), function() + Media.PlaySpeechNotification(Greece, "WarningTwoMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(53), function() + Media.PlaySpeechNotification(Greece, "WarningOneMinuteRemaining") + end) +end diff --git a/mods/ra/maps/in-the-nick-of-time/map.bin b/mods/ra/maps/in-the-nick-of-time/map.bin new file mode 100644 index 0000000000..c2459c0260 Binary files /dev/null and b/mods/ra/maps/in-the-nick-of-time/map.bin differ diff --git a/mods/ra/maps/in-the-nick-of-time/map.png b/mods/ra/maps/in-the-nick-of-time/map.png new file mode 100644 index 0000000000..29bfd56141 Binary files /dev/null and b/mods/ra/maps/in-the-nick-of-time/map.png differ diff --git a/mods/ra/maps/in-the-nick-of-time/map.yaml b/mods/ra/maps/in-the-nick-of-time/map.yaml new file mode 100644 index 0000000000..73e7b9e8bc --- /dev/null +++ b/mods/ra/maps/in-the-nick-of-time/map.yaml @@ -0,0 +1,957 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: In the Nick of Time + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 29,32,71,67 + +Visibility: MissionSelector + +Categories: Mission + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: england + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FF1400 + Enemies: Greece + PlayerReference@GoodGuy: + Name: GoodGuy + Faction: allies + Color: E2E6F6 + Allies: Greece + Enemies: USSR + PlayerReference@Greece: + Name: Greece + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: E2E6F6 + LockSpawn: True + LockTeam: True + Allies: GoodGuy + Enemies: USSR + +Actors: + Actor0: brik + Location: 50,41 + Owner: USSR + Actor1: brik + Location: 51,41 + Owner: USSR + Actor2: brik + Location: 56,41 + Owner: USSR + Actor3: brik + Location: 57,41 + Owner: USSR + Actor4: brik + Location: 36,42 + Owner: USSR + Actor5: brik + Location: 37,42 + Owner: USSR + Actor6: brik + Location: 38,42 + Owner: USSR + Actor7: brik + Location: 39,42 + Owner: USSR + Actor8: brik + Location: 40,42 + Owner: USSR + Actor9: brik + Location: 41,42 + Owner: USSR + Actor10: brik + Location: 42,42 + Owner: USSR + Actor11: brik + Location: 43,42 + Owner: USSR + Actor12: brik + Location: 44,42 + Owner: USSR + Actor13: brik + Location: 45,42 + Owner: USSR + Actor14: brik + Location: 46,42 + Owner: USSR + Actor15: brik + Location: 47,42 + Owner: USSR + Actor16: brik + Location: 48,42 + Owner: USSR + Actor17: brik + Location: 49,42 + Owner: USSR + Actor18: brik + Location: 50,42 + Owner: USSR + Actor19: brik + Location: 51,42 + Owner: USSR + Actor20: brik + Location: 56,42 + Owner: USSR + Actor21: brik + Location: 57,42 + Owner: USSR + Actor22: brik + Location: 36,43 + Owner: USSR + Actor23: brik + Location: 57,43 + Owner: USSR + Actor24: brik + Location: 36,44 + Owner: USSR + Actor25: brik + Location: 57,44 + Owner: USSR + Actor26: brik + Location: 36,45 + Owner: USSR + Actor27: brik + Location: 57,45 + Owner: USSR + Actor28: brik + Location: 36,46 + Owner: USSR + Actor29: brik + Location: 57,46 + Owner: USSR + Actor30: brik + Location: 36,47 + Owner: USSR + Actor31: brik + Location: 57,47 + Owner: USSR + Actor32: brik + Location: 36,48 + Owner: USSR + Actor33: brik + Location: 57,48 + Owner: USSR + Actor34: brik + Location: 36,49 + Owner: USSR + Actor35: brik + Location: 57,49 + Owner: USSR + Actor36: brik + Location: 36,50 + Owner: USSR + Actor37: brik + Location: 57,50 + Owner: USSR + Actor38: brik + Location: 36,51 + Owner: USSR + Actor39: brik + Location: 57,51 + Owner: USSR + Actor40: brik + Location: 36,52 + Owner: USSR + Actor41: brik + Location: 46,52 + Owner: USSR + Actor42: brik + Location: 47,52 + Owner: USSR + Actor43: brik + Location: 48,52 + Owner: USSR + Actor44: brik + Location: 49,52 + Owner: USSR + Actor45: brik + Location: 57,52 + Owner: USSR + Actor46: brik + Location: 58,52 + Owner: USSR + Actor47: brik + Location: 36,53 + Owner: USSR + Actor48: brik + Location: 46,53 + Owner: USSR + Actor49: brik + Location: 49,53 + Owner: USSR + Actor50: brik + Location: 57,53 + Owner: USSR + Actor51: brik + Location: 58,53 + Owner: USSR + Actor52: brik + Location: 36,54 + Owner: USSR + Actor53: brik + Location: 46,54 + Owner: USSR + Actor54: brik + Location: 49,54 + Owner: USSR + Actor55: brik + Location: 36,55 + Owner: USSR + Actor56: brik + Location: 46,55 + Owner: USSR + Actor57: brik + Location: 47,55 + Owner: USSR + Actor58: brik + Location: 48,55 + Owner: USSR + Actor59: brik + Location: 49,55 + Owner: USSR + Actor60: brik + Location: 36,56 + Owner: USSR + Actor61: brik + Location: 36,57 + Owner: USSR + Actor62: brik + Location: 36,58 + Owner: USSR + Actor63: brik + Location: 57,58 + Owner: USSR + Actor64: brik + Location: 58,58 + Owner: USSR + Actor65: brik + Location: 36,59 + Owner: USSR + Actor66: brik + Location: 57,59 + Owner: USSR + Actor67: brik + Location: 58,59 + Owner: USSR + Actor68: brik + Location: 36,60 + Owner: USSR + Actor69: brik + Location: 57,60 + Owner: USSR + Actor70: brik + Location: 36,61 + Owner: USSR + Actor71: brik + Location: 37,61 + Owner: USSR + Actor72: brik + Location: 38,61 + Owner: USSR + Actor73: brik + Location: 39,61 + Owner: USSR + Actor74: brik + Location: 40,61 + Owner: USSR + Actor75: brik + Location: 57,61 + Owner: USSR + Actor76: brik + Location: 39,62 + Owner: USSR + Actor77: brik + Location: 40,62 + Owner: USSR + Actor78: brik + Location: 45,62 + Owner: USSR + Actor79: brik + Location: 46,62 + Owner: USSR + Actor80: brik + Location: 47,62 + Owner: USSR + Actor81: brik + Location: 57,62 + Owner: USSR + Actor82: brik + Location: 39,63 + Owner: USSR + Actor83: brik + Location: 40,63 + Owner: USSR + Actor84: brik + Location: 45,63 + Owner: USSR + Actor85: brik + Location: 46,63 + Owner: USSR + Actor86: brik + Location: 47,63 + Owner: USSR + Actor87: brik + Location: 57,63 + Owner: USSR + Actor88: brik + Location: 47,64 + Owner: USSR + Actor89: brik + Location: 57,64 + Owner: USSR + Actor90: brik + Location: 47,65 + Owner: USSR + Actor91: brik + Location: 48,65 + Owner: USSR + Actor92: brik + Location: 49,65 + Owner: USSR + Actor93: brik + Location: 50,65 + Owner: USSR + Actor94: brik + Location: 51,65 + Owner: USSR + Actor95: brik + Location: 52,65 + Owner: USSR + Actor96: brik + Location: 53,65 + Owner: USSR + Actor97: brik + Location: 54,65 + Owner: USSR + Actor98: brik + Location: 55,65 + Owner: USSR + Actor99: brik + Location: 56,65 + Owner: USSR + Actor100: brik + Location: 57,65 + Owner: USSR + Actor288: fenc + Owner: USSR + Location: 94,32 + Actor289: fenc + Owner: USSR + Location: 95,32 + Actor290: fenc + Owner: USSR + Location: 96,32 + Actor291: fenc + Owner: USSR + Location: 97,32 + Actor292: fenc + Owner: USSR + Location: 98,32 + Actor293: fenc + Owner: USSR + Location: 99,32 + Actor294: fenc + Owner: USSR + Location: 99,33 + Actor295: fenc + Owner: USSR + Location: 99,34 + Actor296: fenc + Owner: USSR + Location: 99,35 + Actor297: fenc + Owner: USSR + Location: 99,36 + Actor298: fenc + Owner: USSR + Location: 98,36 + Actor299: fenc + Owner: USSR + Location: 94,33 + Actor300: fenc + Owner: USSR + Location: 94,34 + Actor301: fenc + Owner: USSR + Location: 94,35 + Actor302: fenc + Owner: USSR + Location: 94,36 + Actor303: fenc + Owner: USSR + Location: 95,36 + Actor103: t11 + Location: 98,73 + Owner: Neutral + Actor104: tc01 + Location: 91,75 + Owner: Neutral + Actor105: t17 + Location: 99,72 + Owner: Neutral + Actor106: t15 + Location: 89,75 + Owner: Neutral + Actor107: tc04 + Location: 98,75 + Owner: Neutral + Actor108: t16 + Location: 87,75 + Owner: Neutral + Actor109: t17 + Location: 99,76 + Owner: Neutral + Actor110: t08 + Location: 84,82 + Owner: Neutral + Actor111: t11 + Location: 83,80 + Owner: Neutral + Actor112: t13 + Location: 84,79 + Owner: Neutral + Actor113: t14 + Location: 84,78 + Owner: Neutral + Actor114: t12 + Location: 79,91 + Owner: Neutral + Actor115: t12 + Location: 85,95 + Owner: Neutral + Actor116: t08 + Location: 85,97 + Owner: Neutral + Actor117: t11 + Location: 83,94 + Owner: Neutral + Actor118: tc01 + Location: 81,94 + Owner: Neutral + Actor119: tc01 + Location: 80,93 + Owner: Neutral + Actor120: t17 + Location: 82,93 + Owner: Neutral + Actor121: t16 + Location: 80,92 + Owner: Neutral + Actor122: t16 + Location: 84,95 + Owner: Neutral + Actor123: t11 + Location: 85,72 + Owner: Neutral + Actor124: t12 + Location: 81,75 + Owner: Neutral + Actor125: t13 + Location: 82,76 + Owner: Neutral + Actor126: t12 + Location: 82,77 + Owner: Neutral + Actor127: tc03 + Location: 82,74 + Owner: Neutral + Actor128: t16 + Location: 84,74 + Owner: Neutral + Actor129: t08 + Location: 86,72 + Owner: Neutral + Actor130: t07 + Location: 84,73 + Owner: Neutral + Actor131: ice01 + Location: 36,85 + Owner: Neutral + Actor132: ice02 + Location: 33,38 + Owner: Neutral + Actor133: t13 + Location: 54,86 + Owner: Neutral + Actor134: t11 + Location: 55,82 + Owner: Neutral + Actor135: t06 + Location: 55,83 + Owner: Neutral + Actor136: t07 + Location: 55,84 + Owner: Neutral + Actor137: mine + Location: 44,77 + Owner: Neutral + Actor138: mine + Location: 38,74 + Owner: Neutral + Actor139: t01 + Location: 74,59 + Owner: Neutral + Actor140: t01 + Location: 82,61 + Owner: Neutral + Actor141: tc04 + Location: 91,62 + Owner: Neutral + Actor142: t17 + Location: 83,62 + Owner: Neutral + Actor143: ice03 + Location: 29,98 + Owner: Neutral + Actor144: ice03 + Location: 31,32 + Owner: Neutral + Actor145: t01 + Location: 71,62 + Owner: Neutral + Actor146: t03 + Location: 70,62 + Owner: Neutral + Actor147: tc02 + Location: 69,61 + Owner: Neutral + Actor148: tc03 + Location: 58,67 + Owner: Neutral + Actor149: tc04 + Location: 55,68 + Owner: Neutral + Actor150: tc05 + Location: 84,46 + Owner: Neutral + Actor151: tc05 + Location: 61,42 + Owner: Neutral + Actor152: tc03 + Location: 61,48 + Owner: Neutral + Actor153: tc03 + Location: 83,48 + Owner: Neutral + Actor154: tc01 + Location: 98,40 + Owner: Neutral + Actor155: t17 + Location: 90,39 + Owner: Neutral + Actor156: tc02 + Location: 69,35 + Owner: Neutral + Actor157: tc03 + Location: 70,37 + Owner: Neutral + Actor158: t15 + Location: 68,36 + Owner: Neutral + Actor159: t15 + Location: 85,44 + Owner: Neutral + Actor160: apwr + Location: 37,51 + Owner: USSR + Actor161: apwr + Location: 37,43 + Owner: USSR + Actor162: apwr + Location: 37,47 + Owner: USSR + Actor163: fix + Location: 47,47 + Owner: USSR + Tent2: tent + Location: 46,58 + Owner: USSR + Actor165: proc + Location: 37,57 + Owner: USSR + Actor166: proc + Location: 53,50 + Owner: USSR + Actor167: dome + Location: 38,54 + Owner: USSR + Chronosphere: pdox + Location: 47,53 + Owner: USSR + Health: 50 + WarFactory: weap + Location: 49,43 + Owner: USSR + USSRHouse: v03 + Location: 67,76 + Owner: Neutral + AlliesHouse: v02 + Location: 76,77 + Owner: Neutral + Actor172: v01 + Location: 75,79 + Owner: Neutral + Actor173: v05 + Location: 73,76 + Owner: Neutral + Actor174: v06 + Location: 71,80 + Owner: Neutral + Actor175: v07 + Location: 68,79 + Owner: Neutral + Actor176: tsla + Location: 54,88 + Owner: USSR + Health: 56 + Tesla2: tsla + Location: 86,64 + Owner: USSR + Health: 51 + Actor178: tsla + Location: 86,42 + Owner: USSR + Health: 51 + Barracks: barr + Location: 51,58 + Owner: USSR + Actor180: kenn + Location: 49,58 + Owner: USSR + Actor181: apwr + Location: 41,47 + Owner: USSR + Actor182: apwr + Location: 41,43 + Owner: USSR + Actor183: apwr + Location: 41,51 + Owner: USSR + Actor184: apwr + Location: 54,62 + Owner: USSR + Actor185: brl3 + Location: 85,63 + Owner: USSR + Actor186: barl + Location: 87,63 + Owner: USSR + Actor187: brl3 + Location: 87,64 + Owner: USSR + Actor188: barl + Location: 87,62 + Owner: USSR + Actor189: barl + Location: 88,63 + Owner: USSR + Actor190: brl3 + Location: 86,63 + Owner: USSR + Tent1: tent + Location: 97,33 + Owner: USSR + Health: 56 + Actor192: v03 + Location: 45,82 + Owner: Neutral + Actor193: v02 + Location: 41,82 + Owner: Neutral + Actor194: v01 + Location: 40,86 + Owner: Neutral + Actor195: v04 + Location: 45,84 + Owner: Neutral + Actor196: v05 + Location: 42,90 + Owner: Neutral + ForwardCommand: fcom + Location: 48,62 + Owner: USSR + Actor198: powr + Location: 51,62 + Owner: USSR + Actor199: apwr + Location: 45,43 + Owner: USSR + Actor200: brl3 + Location: 85,42 + Owner: USSR + Actor201: brl3 + Location: 86,43 + Owner: USSR + Actor202: barl + Location: 85,43 + Owner: USSR + Actor203: barl + Location: 86,44 + Owner: USSR + Actor204: barl + Location: 85,44 + Owner: USSR + Actor205: barl + Location: 84,43 + Owner: USSR + Actor206: v09 + Location: 62,64 + Owner: Neutral + Actor207: v10 + Location: 64,61 + Owner: Neutral + Actor208: v03 + Location: 66,63 + Owner: Neutral + Actor209: v02 + Location: 67,59 + Owner: Neutral + Actor210: minv + Location: 88,38 + Owner: USSR + Actor211: minv + Location: 87,37 + Owner: USSR + Actor212: minv + Location: 88,36 + Owner: USSR + Actor213: minv + Location: 87,35 + Owner: USSR + Actor214: minv + Location: 88,34 + Owner: USSR + Actor217: powr + Location: 95,33 + Owner: USSR + Health: 56 + Actor218: minv + Location: 87,39 + Owner: USSR + Actor219: pbox + Location: 72,47 + Owner: USSR + Actor220: pbox + Location: 72,51 + Owner: USSR + Actor221: 2tnk + Location: 82,86 + Owner: USSR + Health: 50 + Facing: 764 + Actor222: 2tnk + Location: 82,90 + Owner: USSR + Health: 50 + Facing: 764 + Actor223: v2rl + Location: 72,87 + Owner: USSR + Facing: 764 + Mammoth2: 4tnk + Location: 61,72 + Owner: USSR + Health: 62 + Facing: 380 + Mammoth3: 4tnk + Location: 64,72 + Owner: USSR + Health: 62 + Facing: 380 + Medium4: 2tnk + Location: 88,69 + Owner: USSR + Health: 50 + Facing: 252 + Medium3: 2tnk + Location: 88,67 + Owner: USSR + Health: 50 + Facing: 252 + LightTank1: 1tnk + Location: 96,50 + Owner: USSR + Facing: 508 + LightTank2: 1tnk + Location: 98,50 + Owner: USSR + Facing: 508 + Medium1: 2tnk + Location: 77,61 + Owner: USSR + Health: 50 + Facing: 508 + Medium2: 2tnk + Location: 79,61 + Owner: USSR + Health: 50 + Facing: 508 + Actor234: 3tnk + Location: 91,40 + Owner: USSR + Health: 47 + Facing: 636 + Actor235: 3tnk + Location: 97,41 + Owner: USSR + Health: 50 + Facing: 380 + Mammoth1: 4tnk + Location: 43,86 + Owner: USSR + Health: 64 + Facing: 636 + Actor237: 3tnk + Location: 79,88 + Owner: USSR + Health: 50 + Facing: 764 + Actor238: dog + Location: 79,42 + Owner: USSR + Facing: 124 + SubCell: 1 + Actor239: dog + Location: 73,35 + Owner: USSR + Facing: 636 + SubCell: 4 + Actor240: dog + Location: 47,51 + Owner: USSR + Facing: 892 + SubCell: 4 + Actor241: ss + Location: 30,33 + Owner: USSR + Facing: 636 + Actor242: ss + Location: 34,63 + Owner: USSR + Facing: 124 + Actor243: ss + Location: 34,93 + Owner: USSR + Facing: 764 + Actor244: ss + Location: 36,97 + Owner: USSR + Facing: 764 + Actor304: afld + Owner: USSR + Location: 79,49 + Actor305: afld + Owner: USSR + Location: 79,47 + Yak2: yak + Owner: USSR + Location: 77,44 + Facing: 384 + Yak1: yak + Owner: USSR + Location: 77,45 + Facing: 384 + DefaultCameraPosition: waypoint + Location: 95,96 + Owner: Neutral + AlliesEntry: waypoint + Location: 95,98 + Owner: Neutral + AlliesRally: waypoint + Location: 95,93 + Owner: Neutral + ParaLZ1: waypoint + Location: 69,86 + Owner: Neutral + ParaLZ2: waypoint + Location: 87,86 + Owner: Neutral + ParaLZ3: waypoint + Location: 84,57 + Owner: Neutral + InfantrySquadEntry: waypoint + Location: 99,75 + Owner: Neutral + InfantrySquadStop: waypoint + Location: 94,80 + Owner: Neutral + SouthWaterEntry: waypoint + Location: 29,84 + Owner: Neutral + SouthWaterLanding1: waypoint + Location: 43,97 + Owner: Neutral + SouthWaterLanding2: waypoint + Location: 44,93 + Owner: Neutral + ChinookEntry1: waypoint + Location: 99,58 + Owner: Neutral + ChinookLZ1: waypoint + Location: 47,90 + Owner: Neutral + ChronoBeam1: waypoint + Location: 65,69 + Owner: Neutral + TruckStop1: waypoint + Location: 95,38 + Owner: Neutral + VillageSpawnUSSR: waypoint + Location: 67,77 + Owner: Neutral + VillageSpawnAllies: waypoint + Location: 76,78 + Owner: Neutral + VillageRally: waypoint + Location: 66,78 + Owner: Neutral + ChronoBeam2: waypoint + Location: 96,56 + Owner: Neutral + ChinookEntry2: waypoint + Location: 64,98 + Owner: Neutral + ChinookLZ2: waypoint + Location: 82,45 + Owner: Neutral + ScientistEscape: waypoint + Location: 48,62 + Owner: Neutral + ScientistRally: waypoint + Location: 49,60 + Owner: Neutral + NorthWaterEntry: waypoint + Location: 29,43 + Owner: Neutral + NorthWaterLanding1: waypoint + Location: 48,34 + Owner: Neutral + NorthWaterLanding2: waypoint + Location: 41,37 + Owner: Neutral + NorthWaterLanding3: waypoint + Location: 46,38 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/ra/maps/in-the-nick-of-time/rules.yaml b/mods/ra/maps/in-the-nick-of-time/rules.yaml new file mode 100644 index 0000000000..b75b2f46c5 --- /dev/null +++ b/mods/ra/maps/in-the-nick-of-time/rules.yaml @@ -0,0 +1,91 @@ +World: + LuaScript: + Scripts: campaign-global.lua, in-the-nick-of-time.lua + MissionData: + WinVideo: cronfail.vqa + LossVideo: sfrozen.vqa + Briefing: The situation is critical! The Soviets have taken over a small research base in the north. During the conflict, a chronosphere was badly damaged. We fear it could explode.\n\nInside the base is a group of scientists that were captured during the takeover. They must be rescued before the chronosphere explodes. Fight your way back into the base and retrieve them.\n\nBe careful -- there is only one way in and out of the base, a lone bridge. It must be protected to ensure evacuation. + +LST.Reinforcement: + Inherits: LST + RejectsOrders: + -Buildable: + -Selectable: + RenderSprites: + Image: lst + Interactable: + +TRAN.Reinforcement: + Inherits: TRAN + RevealsShroud: + Range: 0c0 + -RevealsShroud@GAPGEN: + RejectsOrders: + -Selectable: + RenderSprites: + Image: tran + Interactable: + +PARADROP1: + ParatroopersPower: + DropItems: E2, E2, E2, E3, E3 + AlwaysVisible: + +PARADROP2: + ParatroopersPower: + DropItems: E1, E1, SHOK, E4, E4 + AlwaysVisible: + +PARADROP3: + ParatroopersPower: + DisplayBeacon: False + DropItems: 1TNK, 2TNK + AlwaysVisible: + +V01: + SpawnActorOnDeath: + Actor: healcrate + +1TNK: + Buildable: + Prerequisites: ~vehicles.soviet + +2TNK: + Buildable: + Prerequisites: ~vehicles.soviet + +4TNK: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +QTNK: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +FTRK: + Buildable: + Prerequisites: ~disabled + +APC: + Buildable: + Prerequisites: ~disabled + +E7: + Buildable: + Prerequisites: ~disabled + +E7.noautotarget: + Buildable: + Prerequisites: ~disabled + +MIG: + Buildable: + Prerequisites: ~disabled diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index d706088760..d8504823e6 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -42,6 +42,7 @@ Counterstrike Soviet Missions: soviet-soldier-volkov-n-chitzkoi top-o-the-world Aftermath Allied Missions: + in-the-nick-of-time production-disruption monster-tank-madness Aftermath Soviet Missions: