Files
OpenRA/mods/cnc/maps/cnc64gdi01/cnc64gdi01.lua

232 lines
6.5 KiB
Lua

--[[
Copyright 2007-2019 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.
]]
CommandoReinforcements = { "rmbo" }
MCVReinforcements = { "mcv" }
inf1 = { "e4" }
AutocreateSquads =
{
{ "stnk", "stnk" },
{ "ftnk", "ftnk" },
{ "ltnk", "ltnk", "bike" },
{ "arty", "arty", "bike", "bike" },
{ "ltnk", "ltnk" },
{ "stnk", "stnk" },
{ "ltnk", "ltnk" },
{ "arty", "arty" }
}
HeliPatrolPaths =
{
{ HeliPatrol1.Location, HeliPatrol2.Location, HeliPatrol3.Location, HeliPatrol4.Location, HeliPatrol5.Location, HeliPatrol6.Location },
{ HeliPatrol5.Location, HeliPatrol4.Location, HeliPatrol3.Location, HeliPatrol2.Location, HeliPatrol1.Location, HeliPatrol6.Location }
}
AttackTriggers = { AttackTrigger1, AttackTrigger2, AttackTrigger3, AttackTrigger4 }
harvester = { "harv" }
SamSites = { SAM01, SAM02 }
WorldLoaded = function()
player = Player.GetPlayer("GDI")
enemy = Player.GetPlayer("Nod")
Trigger.OnObjectiveAdded(player, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
end)
Trigger.OnObjectiveCompleted(player, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
end)
Trigger.OnObjectiveFailed(player, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
end)
Trigger.OnPlayerWon(player, function()
Media.PlaySpeechNotification(player, "Win")
end)
Trigger.OnPlayerLost(player, function()
Media.PlaySpeechNotification(player, "Lose")
end)
destroySAMsCenterObjective = player.AddPrimaryObjective("Destroy the SAM sites protecting the Obelisk.")
destroyObeliskObjective = player.AddPrimaryObjective("Destroy the Obelisk.")
destroyBiotechCenterObjective = player.AddPrimaryObjective("Destroy the biotech facility.")
Trigger.OnAllKilled(SamSites, function()
AirSupport = Actor.Create("airstrike.proxy", true, { Owner = player })
AirSupportEnabled = true
player.MarkCompletedObjective(destroySAMsCenterObjective)
end)
Trigger.OnDamaged(Obelisk01, function()
Trigger.AfterDelay(DateTime.Seconds(1), Obelisk01.Kill)
end)
Trigger.OnKilled(Obelisk01, function()
player.MarkCompletedObjective(destroyObeliskObjective)
Trigger.AfterDelay(DateTime.Seconds(5), function() Reinforce(MCVReinforcements) end)
ObeliskFlare.Destroy()
if AirSupportEnabled then AirSupport.Destroy() end
end)
Trigger.OnKilled(Biolab, function()
player.MarkCompletedObjective(destroyBiotechCenterObjective)
end)
Trigger.OnCapture(Biolab, function()
Biolab.Kill()
end)
Trigger.OnDamaged(Biolab, HuntTriggerFunction)
AIRepairBuildings(enemy)
AIRebuildHarvesters(enemy)
Utils.Do(AttackTriggers, function(a)
Trigger.OnKilledOrCaptured(a, function()
NodVehicleProduction(Utils.Random(AutocreateSquads))
end)
end)
Trigger.AfterDelay(DateTime.Seconds(150), AutoCreateTeam)
Trigger.AfterDelay(DateTime.Minutes(5), HeliHunt)
NodInfantryProduction()
Camera.Position = UnitsRally.CenterPosition
ObeliskFlare = Actor.Create('flare', true, { Owner = player, Location = Flare.Location })
Reinforce(CommandoReinforcements)
end
Tick = function()
if DateTime.GameTime > DateTime.Seconds(5) and player.HasNoRequiredUnits() then
player.MarkFailedObjective(destroyBiotechCenterObjective)
end
end
Reinforce = function(units)
Media.PlaySpeechNotification(player, "Reinforce")
ReinforceWithLandingCraft(units, lstStart.Location, lstEnd.Location, UnitsRally.Location)
end
ReinforceWithLandingCraft = function(units, transportStart, transportUnload, rallypoint)
local transport = Actor.Create("oldlst", true, { Owner = player, Facing = 0, Location = transportStart })
local subcell = 0
Utils.Do(units, function(a)
transport.LoadPassenger(Actor.Create(a, false, { Owner = transport.Owner, Facing = transport.Facing, Location = transportUnload, SubCell = subcell }))
subcell = subcell + 1
end)
transport.ScriptedMove(transportUnload)
transport.CallFunc(function()
Utils.Do(units, function()
local a = transport.UnloadPassenger()
a.IsInWorld = true
a.MoveIntoWorld(transport.Location - CVec.New(0, 1))
if rallypoint ~= nil then
a.Move(rallypoint)
end
end)
end)
transport.Wait(5)
transport.ScriptedMove(transportStart)
transport.Destroy()
end
HuntTriggerFunction = function()
local list = enemy.GetGroundAttackers()
Utils.Do(list, function(unit)
IdleHunt(unit)
end)
end
IdleHunt = function(unit)
if not unit.IsDead then
Trigger.OnIdle(unit, function()
unit.AttackMove(UnitsRally.Location, 50)
unit.Hunt()
end)
end
end
NodInfantryProduction = function()
if HandOfNod.IsDead or HandOfNod.Owner == player then
return
end
HandOfNod.Build(inf1, SquadHunt)
Trigger.AfterDelay(DateTime.Seconds(15), NodInfantryProduction)
end
NodVehicleProduction = function(Squad)
if Airfield.IsDead or not Airfield.Owner == enemy then
return
end
Airfield.Build(Squad, SquadHunt)
end
AIRepairBuildings = function(ai)
Utils.Do(Map.NamedActors, function(actor)
if actor.Owner == ai and actor.HasProperty("StartBuildingRepairs") then
Trigger.OnDamaged(actor, function(building)
if building.Owner == ai and building.Health < 0.9 * building.MaxHealth then
building.StartBuildingRepairs()
end
end)
end
end)
end
HeliHunt = function()
local helicopters = enemy.GetActorsByType("heli")
local patrolpath = Utils.Random(HeliPatrolPaths)
Utils.Do(helicopters, function(actor)
Trigger.OnIdle(actor, function()
actor.Patrol(patrolpath)
end)
end)
end
SquadHunt = function(actors)
Utils.Do(actors, function(actor)
Trigger.OnIdle(actor, function()
actor.AttackMove(UnitsRally.Location, 50)
actor.Hunt()
end)
end)
end
AIRebuildHarvesters = function(ai)
if AIHarvesterCount == NIL or AIHarvesterCount == 0 then
AIHarvesterCount = #ai.GetActorsByType("harv")
IsBuildingHarvester = false
end
local CurrentHarvesterCount = #ai.GetActorsByType("harv")
if CurrentHarvesterCount < AIHarvesterCount and Airfield.Owner == enemy and not IsBuildingHarvester and not Airfield.IsDead then
IsBuildingHarvester = true
Airfield.Build(harvester, function()
IsBuildingHarvester = false
end)
end
Trigger.AfterDelay(DateTime.Seconds(5), function() AIRebuildHarvesters(ai) end)
end
AutoCreateTeam = function()
NodVehicleProduction(Utils.Random(AutocreateSquads))
Trigger.AfterDelay(DateTime.Seconds(150), AutoCreateTeam)
end