Files
OpenRA/mods/ra/maps/desert-shellmap/desert-shellmap.lua
2023-10-17 14:04:39 +02:00

209 lines
6.6 KiB
Lua

--[[
Copyright (c) The OpenRA Developers and Contributors
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.
]]
-- Halloween easter egg
if DateTime.CurrentMonth == 10 and DateTime.CurrentDay == 31 then
UnitTypes = { "ant", "ant", "ant" }
BeachUnitTypes = { "ant", "ant" }
ProxyType = "powerproxy.parazombies"
ProducedUnitTypes =
{
{ factory = AlliedBarracks1, types = { "e1", "e3" } },
{ factory = AlliedBarracks2, types = { "e1", "e3" } },
{ factory = SovietBarracks1, types = { "ant" } },
{ factory = SovietBarracks2, types = { "ant" } },
{ factory = SovietBarracks3, types = { "ant" } },
{ factory = AlliedWarFactory1, types = { "jeep", "1tnk", "2tnk", "arty", "ctnk" } },
{ factory = SovietWarFactory1, types = { "3tnk", "4tnk", "v2rl", "ttnk", "apc" } }
}
else
UnitTypes = { "3tnk", "ftrk", "ttnk", "apc" }
BeachUnitTypes = { "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4" }
ProxyType = "powerproxy.paratroopers"
ProducedUnitTypes =
{
{ factory = AlliedBarracks1, types = { "e1", "e3" } },
{ factory = AlliedBarracks2, types = { "e1", "e3" } },
{ factory = SovietBarracks1, types = { "dog", "e1", "e2", "e3", "e4", "shok" } },
{ factory = SovietBarracks2, types = { "dog", "e1", "e2", "e3", "e4", "shok" } },
{ factory = SovietBarracks3, types = { "dog", "e1", "e2", "e3", "e4", "shok" } },
{ factory = AlliedWarFactory1, types = { "jeep", "1tnk", "2tnk", "arty", "ctnk" } },
{ factory = SovietWarFactory1, types = { "3tnk", "4tnk", "v2rl", "ttnk", "apc" } }
}
end
ShipUnitTypes = { "1tnk", "1tnk", "jeep", "2tnk", "2tnk" }
HelicopterUnitTypes = { "e1", "e1", "e1", "e1", "e3", "e3" };
ParadropWaypoints = { Paradrop1, Paradrop2, Paradrop3, Paradrop4, Paradrop5, Paradrop6, Paradrop7, Paradrop8 }
Mig1Waypoints = { Mig11, Mig12, Mig13, Mig14 }
Mig2Waypoints = { Mig21, Mig22, Mig23, Mig24 }
BindActorTriggers = function(a)
if a.HasProperty("Hunt") then
if a.Owner == Allies then
Trigger.OnIdle(a, function(a)
if a.IsInWorld then
a.Hunt()
end
end)
else
Trigger.OnIdle(a, function(a)
if a.IsInWorld then
a.AttackMove(AlliedTechnologyCenter.Location)
end
end)
end
end
if a.HasProperty("HasPassengers") then
Trigger.OnPassengerExited(a, function(t, p)
BindActorTriggers(p)
end)
Trigger.OnDamaged(a, function()
if a.HasPassengers then
a.Stop()
a.UnloadPassengers()
end
end)
end
end
SendSovietUnits = function(entryCell, unitTypes, interval)
local units = Reinforcements.Reinforce(Soviets, unitTypes, { entryCell }, interval)
Utils.Do(units, function(unit)
BindActorTriggers(unit)
end)
Trigger.OnAllKilled(units, function() SendSovietUnits(entryCell, unitTypes, interval) end)
end
SendMigs = function(waypoints)
local migEntryPath = { waypoints[1].Location, waypoints[2].Location }
local migs = Reinforcements.Reinforce(Soviets, { "mig" }, migEntryPath, 4)
Utils.Do(migs, function(mig)
mig.Move(waypoints[3].Location)
mig.Move(waypoints[4].Location)
mig.Destroy()
end)
Trigger.AfterDelay(DateTime.Seconds(40), function() SendMigs(waypoints) end)
end
ShipAlliedUnits = function()
local units = Reinforcements.ReinforceWithTransport(Allies, "lst",
ShipUnitTypes, { LstEntry.Location, LstUnload.Location }, { LstEntry.Location })[2]
Utils.Do(units, function(unit)
BindActorTriggers(unit)
end)
Trigger.AfterDelay(DateTime.Seconds(60), ShipAlliedUnits)
end
--- @param hpad actor
InsertAlliedChinookReinforcements = function(entry, hpad)
local units = Reinforcements.ReinforceWithTransport(Allies, "tran",
HelicopterUnitTypes, { entry.Location, hpad.Location + CVec.New(1, 2) }, { entry.Location })[2]
Utils.Do(units, function(unit)
BindActorTriggers(unit)
end)
Trigger.AfterDelay(DateTime.Seconds(60), function() InsertAlliedChinookReinforcements(entry, hpad) end)
end
ParadropSovietUnits = function()
local lz = Utils.Random(ParadropWaypoints)
local aircraft = PowerProxy.TargetParatroopers(lz.CenterPosition)
Utils.Do(aircraft, function(a)
Trigger.OnPassengerExited(a, function(t, p)
BindActorTriggers(p)
end)
end)
Trigger.AfterDelay(DateTime.Seconds(35), ParadropSovietUnits)
end
ProduceUnits = function(t)
local factory = t.factory
if not factory.IsDead then
local unitType = t.types[Utils.RandomInteger(1, #t.types + 1)]
factory.Wait(Actor.BuildTime(unitType))
factory.Produce(unitType)
factory.CallFunc(function() ProduceUnits(t) end)
end
end
SetupAlliedUnits = function()
Utils.Do(Map.NamedActors, function(a)
if a.Owner == Allies and a.HasProperty("AcceptsCondition") and a.AcceptsCondition("unkillable") then
a.GrantCondition("unkillable")
a.Stance = "Defend"
end
end)
end
SetupFactories = function()
Utils.Do(ProducedUnitTypes, function(production)
Trigger.OnProduction(production.factory, function(_, a) BindActorTriggers(a) end)
end)
end
ChronoshiftAlliedUnits = function()
local cells = Utils.ExpandFootprint({ ChronoshiftLocation.Location }, false)
local units = { }
for i = 1, #cells do
local unit = Actor.Create("2tnk", true, { Owner = Allies, Facing = Angle.North })
BindActorTriggers(unit)
units[unit] = cells[i]
end
Chronosphere.Chronoshift(units)
Trigger.AfterDelay(DateTime.Seconds(60), ChronoshiftAlliedUnits)
end
Ticks = 0
Speed = 5
Tick = function()
Ticks = Ticks + 1
local t = (Ticks + 45) % (360 * Speed) * (math.pi / 180) / Speed;
Camera.Position = ViewportOrigin + WVec.New(19200 * math.sin(t), 20480 * math.cos(t), 0)
end
WorldLoaded = function()
Allies = Player.GetPlayer("Allies")
Soviets = Player.GetPlayer("Soviets")
ViewportOrigin = Camera.Position
SetupAlliedUnits()
SetupFactories()
ShipAlliedUnits()
InsertAlliedChinookReinforcements(Chinook1Entry, HeliPad1)
InsertAlliedChinookReinforcements(Chinook2Entry, HeliPad2)
PowerProxy = Actor.Create(ProxyType, false, { Owner = Soviets })
ParadropSovietUnits()
Trigger.AfterDelay(DateTime.Seconds(5), ChronoshiftAlliedUnits)
Utils.Do(ProducedUnitTypes, ProduceUnits)
Trigger.AfterDelay(DateTime.Seconds(30), function() SendMigs(Mig1Waypoints) end)
Trigger.AfterDelay(DateTime.Seconds(30), function() SendMigs(Mig2Waypoints) end)
SendSovietUnits(Entry1.Location, UnitTypes, 50)
SendSovietUnits(Entry2.Location, UnitTypes, 50)
SendSovietUnits(Entry3.Location, UnitTypes, 50)
SendSovietUnits(Entry4.Location, UnitTypes, 50)
SendSovietUnits(Entry5.Location, UnitTypes, 50)
SendSovietUnits(Entry6.Location, UnitTypes, 50)
SendSovietUnits(Entry7.Location, BeachUnitTypes, 15)
end