Files
OpenRA/mods/cnc/maps/gdi05a/gdi05a.lua
2021-07-03 00:25:53 +02:00

190 lines
5.9 KiB
Lua

--[[
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.
]]
Difficulty = Map.LobbyOption("difficulty")
RepairThreshold = { easy = 0.3, normal = 0.6, hard = 0.9 }
ActorRemovals =
{
easy = { Actor167, Actor168, Actor190, Actor191, Actor193, Actor194, Actor196, Actor198, Actor200 },
normal = { Actor167, Actor194, Actor196, Actor197 },
hard = { },
}
GdiTanks = { "mtnk", "mtnk" }
GdiApc = { "apc" }
GdiInfantry = { "e1", "e1", "e1", "e1", "e1", "e2", "e2", "e2", "e2", "e2" }
GDIBase = { GdiNuke1, GdiNuke2, GdiProc, GdiSilo1, GdiSilo2, GdiPyle, GdiWeap, GdiHarv }
NodSams = { Sam1, Sam2, Sam3, Sam4 }
CoreNodBase = { NodConYard, NodRefinery, HandOfNod, Airfield }
Guard1UnitTypes = { "bggy" }
Guard1Path = { waypoint4.Location, waypoint5.Location, waypoint10.Location }
Guard1Delay = { easy = DateTime.Minutes(2), normal = DateTime.Minutes(1), hard = DateTime.Seconds(30) }
Guard2UnitTypes = { "bggy" }
Guard2Path = { waypoint0.Location, waypoint1.Location, waypoint2.Location }
Guard3Path = { waypoint4.Location, waypoint5.Location, waypoint9.Location }
AttackDelayMin = { easy = DateTime.Minutes(1), normal = DateTime.Seconds(45), hard = DateTime.Seconds(30) }
AttackDelayMax = { easy = DateTime.Minutes(2), normal = DateTime.Seconds(90), hard = DateTime.Minutes(1) }
AttackUnitTypes =
{
easy =
{
{ factory = HandOfNod, types = { "e1", "e1" } },
{ factory = HandOfNod, types = { "e1", "e3" } },
{ factory = HandOfNod, types = { "e1", "e1", "e3" } },
{ factory = HandOfNod, types = { "e1", "e3", "e3" } },
},
normal =
{
{ factory = HandOfNod, types = { "e1", "e1", "e3" } },
{ factory = HandOfNod, types = { "e1", "e3", "e3" } },
{ factory = HandOfNod, types = { "e1", "e1", "e3", "e3" } },
{ factory = Airfield, types = { "bggy" } },
},
hard =
{
{ factory = HandOfNod, types = { "e1", "e1", "e3", "e3" } },
{ factory = HandOfNod, types = { "e1", "e1", "e1", "e3", "e3" } },
{ factory = HandOfNod, types = { "e1", "e1", "e3", "e3", "e3" } },
{ factory = Airfield, types = { "bggy" } },
{ factory = Airfield, types = { "ltnk" } },
}
}
AttackPaths =
{
{ waypoint0.Location, waypoint1.Location, waypoint2.Location, waypoint3.Location },
{ waypoint4.Location, waypoint9.Location, waypoint7.Location, waypoint8.Location },
}
Attack = function()
local production = Utils.Random(AttackUnitTypes[Difficulty])
local path = Utils.Random(AttackPaths)
local toBuild = function() return production.types end
ProduceUnits(Nod, production.factory, nil, toBuild, function(units)
Utils.Do(units, function(unit)
unit.Patrol(path, false)
IdleHunt(unit)
end)
end)
Trigger.AfterDelay(Utils.RandomInteger(AttackDelayMin[Difficulty], AttackDelayMax[Difficulty]), Attack)
end
Guard1Action = function()
ProduceUnits(Nod, Airfield, nil, function() return Guard1UnitTypes end, function(units)
Trigger.OnAllKilled(units, function()
Trigger.AfterDelay(Guard1Delay[Difficulty], Guard1Action)
end)
Utils.Do(units, function(unit)
unit.Patrol(Guard1Path, true, DateTime.Seconds(7))
end)
end)
end
Guard2Action = function()
ProduceUnits(Nod, Airfield, nil, function() return Guard2UnitTypes end, function(units)
Utils.Do(units, function(unit)
unit.Patrol(Guard2Path, true, DateTime.Seconds(5))
end)
end)
end
DiscoverGDIBase = function(actor, discoverer)
if BaseDiscovered or not discoverer == GDI then
return
end
Utils.Do(GDIBase, function(actor)
actor.Owner = GDI
end)
BaseDiscovered = true
EliminateNod = GDI.AddObjective("Eliminate all Nod forces in the area.")
GDI.MarkCompletedObjective(FindBase)
Attack()
end
SetupWorld = function()
Utils.Do(ActorRemovals[Difficulty], function(unit)
unit.Destroy()
end)
Media.PlaySpeechNotification(GDI, "Reinforce")
Reinforcements.Reinforce(GDI, GdiTanks, { GdiTankEntry.Location, GdiTankRallyPoint.Location }, DateTime.Seconds(1), function(actor) actor.Stance = "Defend" end)
Reinforcements.Reinforce(GDI, GdiApc, { GdiApcEntry.Location, GdiApcRallyPoint.Location }, DateTime.Seconds(1), function(actor) actor.Stance = "Defend" end)
Reinforcements.Reinforce(GDI, GdiInfantry, { GdiInfantryEntry.Location, GdiInfantryRallyPoint.Location }, 15, function(actor) actor.Stance = "Defend" end)
Trigger.OnPlayerDiscovered(AbandonedBase, DiscoverGDIBase)
RepairNamedActors(Nod, RepairThreshold[Difficulty])
Trigger.OnAllKilled(NodSams, function()
GDI.MarkCompletedObjective(DestroySAMs)
Actor.Create("airstrike.proxy", true, { Owner = GDI })
end)
Trigger.AfterDelay(0, function()
GdiHarv.Stop()
end)
if Difficulty ~= "easy" then
Trigger.OnDamaged(NodHarv, function()
Utils.Do(Nod.GetGroundAttackers(), function(unit)
unit.AttackMove(NodHarv.Location)
if Difficulty == "hard" then
IdleHunt(unit)
end
end)
end)
end
Trigger.AfterDelay(DateTime.Seconds(45), Guard1Action)
Trigger.AfterDelay(DateTime.Minutes(3), Guard2Action)
Trigger.OnKilled(GuardTank1, function()
if not GuardTank2.IsDead then
GuardTank2.Patrol(Guard3Path, true, DateTime.Seconds(11))
end
end)
GuardTank1.Patrol(Guard3Path, true, DateTime.Seconds(11))
end
WorldLoaded = function()
AbandonedBase = Player.GetPlayer("AbandonedBase")
GDI = Player.GetPlayer("GDI")
Nod = Player.GetPlayer("Nod")
InitObjectives(GDI)
NodObjective = Nod.AddObjective("Destroy all GDI troops.")
FindBase = GDI.AddObjective("Find the GDI base.")
DestroySAMs = GDI.AddObjective("Destroy all SAM sites to receive air support.", "Secondary", false)
SetupWorld()
Camera.Position = GdiTankRallyPoint.CenterPosition
end
Tick = function()
if DateTime.GameTime > 2 and GDI.HasNoRequiredUnits() then
Nod.MarkCompletedObjective(NodObjective)
end
if BaseDiscovered and Nod.HasNoRequiredUnits() then
GDI.MarkCompletedObjective(EliminateNod)
end
end