Files
OpenRA/mods/cnc/maps/nod08b/nod08b.lua
2020-06-19 17:28:01 +02:00

172 lines
6.4 KiB
Lua

--[[
Copyright 2007-2020 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.
]]
WaypointGroup1 = { waypoint1, waypoint2, waypoint3, waypoint9, waypoint10 }
WaypointGroup2 = { waypoint5, waypoint6, waypoint7, waypoint8 }
WaypointGroup3 = { waypoint1, waypoint2, waypoint4, waypoint11 }
GDI1 = { units = { ['e2'] = 2, ['e3'] = 2 }, waypoints = WaypointGroup1, delay = 30 }
GDI2 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup2, delay = 40 }
GDI3 = { units = { ['e1'] = 3, ['e2'] = 3 }, waypoints = WaypointGroup3, delay = 40 }
GDI4 = { units = { ['jeep'] = 2 }, waypoints = WaypointGroup2, delay = 20 }
Auto1 = { units = { ['e1'] = 3, ['e2'] = 1 }, waypoints = WaypointGroup2, delay = 30 }
Auto2 = { units = { ['e1'] = 2, ['e2'] = 1 }, waypoints = WaypointGroup3, delay = 40 }
Auto3 = { units = { ['e1'] = 2, ['e2'] = 2 }, waypoints = WaypointGroup1, delay = 30 }
Auto4 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup1, delay = 30 }
Auto5 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup3, delay = 40 }
Auto6 = { units = { ['jeep'] = 1 }, waypoints = WaypointGroup3, delay = 40 }
Auto7 = { units = { ['jeep'] = 1 }, waypoints = WaypointGroup1, delay = 50 }
AutoAttackWaves = { GDI1, GDI2, GDI3, GDI4, Auto1, Auto2, Auto3, Auto4, Auto5, Auto6, Auto7 }
NodBase = { NodCYard, NodNuke, NodHand }
Outpost = { OutpostCYard, OutpostProc }
IntroGuards = { Actor171, Actor172, Actor173, Actor145, Actor159, Actor160, Actor161 }
OutpostGuards = { Actor177, Actor178, Actor180, Actor187, Actor188, Actor185, Actor186, Actor184, Actor148, Actor179, Actor176, Actor183, Actor182 }
IntroReinforcements = { "e1", "e1", "e1", "e1", "e1", "e1", "e3", "e3", "e3", "e3" }
NodBaseTrigger = { CPos.New(52, 2), CPos.New(52, 3), CPos.New(52, 4), CPos.New(52, 5), CPos.New(52, 6), CPos.New(52, 7), CPos.New(52, 8) }
AirstrikeDelay = DateTime.Minutes(2) + DateTime.Seconds(30)
NodBaseCapture = function()
Nod.MarkCompletedObjective(LocateNodBase)
Utils.Do(NodBase, function(actor)
actor.Owner = Nod
end)
Trigger.AfterDelay(DateTime.Seconds(1), function()
Media.PlaySpeechNotification(Nod, "NewOptions")
end)
end
-- Provide Nod with a helicopter until the outpost got captured
SendHelicopter = function()
Trigger.AfterDelay(DateTime.Seconds(5), function()
if not Nod.IsObjectiveCompleted(CaptureGDIOutpost) then
Media.PlaySpeechNotification(Nod, "Reinforce")
local heli = Reinforcements.ReinforceWithTransport(Nod, "tran", nil, { ReinforcementsHelicopterSpawn.Location, waypoint0.Location })[1]
Trigger.OnKilled(heli, SendHelicopter)
end
end)
end
SendGDIAirstrike = function(hq, delay)
if not hq.IsDead and hq.Owner == GDI then
local target = GetAirstrikeTarget(Nod)
if target then
hq.TargetAirstrike(target, Angle.NorthEast + Angle.New(16))
Trigger.AfterDelay(delay, function() SendGDIAirstrike(hq, delay) end)
else
Trigger.AfterDelay(delay/4, function() SendGDIAirstrike(hq, delay) end)
end
end
end
SendWaves = function(counter, Waves)
if counter <= #Waves then
local team = Waves[counter]
for type, amount in pairs(team.units) do
MoveAndHunt(Utils.Take(amount, GDI.GetActorsByType(type)), team.waypoints)
end
Trigger.AfterDelay(DateTime.Seconds(team.delay), function() SendWaves(counter + 1, Waves) end)
end
end
Trigger.OnAllKilled(IntroGuards, function()
FlareCamera1 = Actor.Create("camera", true, { Owner = Nod, Location = waypoint25.Location })
FlareCamera2 = Actor.Create("camera", true, { Owner = Nod, Location = FlareExtraCamera.Location })
Flare = Actor.Create("flare", true, { Owner = Nod, Location = waypoint25.Location })
SendHelicopter()
Nod.MarkCompletedObjective(LocateNodBase)
NodBaseCapture()
end)
Trigger.OnAllKilledOrCaptured(Outpost, function()
if not Nod.IsObjectiveCompleted(CaptureGDIOutpost) then
Nod.MarkCompletedObjective(CaptureGDIOutpost)
Trigger.AfterDelay(DateTime.Minutes(1), function()
if not GDIHQ.IsDead and (not NodHand.IsDead or not NodNuke.IsDead) then
local airstrikeproxy = Actor.Create("airstrike.proxy", false, { Owner = GDI })
airstrikeproxy.TargetAirstrike(AirstrikeTarget.CenterPosition, Angle.NorthEast + Angle.New(16))
airstrikeproxy.Destroy()
end
end)
Trigger.AfterDelay(DateTime.Seconds(15), function()
Utils.Do(OutpostGuards, IdleHunt)
end)
Trigger.AfterDelay(DateTime.Minutes(1), function()
FlareCamera1.Destroy()
FlareCamera2.Destroy()
Flare.Destroy()
end)
Trigger.AfterDelay(DateTime.Minutes(1), function() SendWaves(1, AutoAttackWaves) end)
Trigger.AfterDelay(AirstrikeDelay, function() SendGDIAirstrike(GDIHQ, AirstrikeDelay) end)
Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceInfantry(GDIPyle) end)
Trigger.AfterDelay(DateTime.Minutes(3), function() ProduceVehicle(GDIWeap) end)
end
end)
Trigger.OnCapture(OutpostCYard, function()
Trigger.AfterDelay(DateTime.Seconds(4), function()
Media.PlaySpeechNotification(Nod, "NewOptions")
end)
end)
Trigger.OnAnyKilled(Outpost, function()
if not Nod.IsObjectiveCompleted(CaptureGDIOutpost) then
Nod.MarkFailedObjective(CaptureGDIOutpost)
end
end)
Trigger.OnEnteredFootprint(NodBaseTrigger, function(a, id)
if not Nod.IsObjectiveCompleted(LocateNodBase) and a.Owner == Nod then
NodBaseCapture()
Trigger.RemoveFootprintTrigger(id)
end
end)
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
Camera.Position = waypoint26.CenterPosition
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.ReinforceWithTransport(Nod, "tran.in", IntroReinforcements, { ReinforcementsHelicopterSpawn.Location, ReinforcementsHelicopterRally.Location }, { ReinforcementsHelicopterSpawn.Location })
StartAI()
AutoGuard(GDI.GetGroundAttackers())
InitObjectives(Nod)
LocateNodBase = Nod.AddObjective("Locate the Nod base.")
CaptureGDIOutpost = Nod.AddObjective("Capture the GDI outpost.")
NodObjective3 = Nod.AddObjective("Eliminate all GDI forces in the area.")
GDIObjective = GDI.AddObjective("Eliminate all Nod forces in the area.")
end
Tick = function()
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
GDI.MarkCompletedObjective(GDIObjective)
end
if DateTime.GameTime > 2 and GDI.HasNoRequiredUnits() then
Nod.MarkCompletedObjective(NodObjective3)
end
end