230 lines
7.7 KiB
Lua
230 lines
7.7 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.
|
|
]]
|
|
|
|
SovietEntryPoints = { Entry1, Entry2, Entry3, Entry4, Entry5, Entry6, Entry7, Entry8 }
|
|
PatrolWaypoints = { Entry2, Entry4, Entry6, Entry8 }
|
|
ParadropWaypoints = { Paradrop1, Paradrop2, Paradrop3, Paradrop4 }
|
|
SpawnPoints = { Spawn1, Spawn2, Spawn3, Spawn4 }
|
|
Snipers = { Sniper1, Sniper2, Sniper3, Sniper4, Sniper5, Sniper6, Sniper7, Sniper8, Sniper9, Sniper10, Sniper11, Sniper12 }
|
|
|
|
Walls =
|
|
{
|
|
{ WallTopRight1, WallTopRight2, WallTopRight3, WallTopRight4, WallTopRight5, WallTopRight6, WallTopRight7, WallTopRight8, WallTopRight9 },
|
|
{ WallTopLeft1, WallTopLeft2, WallTopLeft3, WallTopLeft4, WallTopLeft5, WallTopLeft6, WallTopLeft7, WallTopLeft8, WallTopLeft9 },
|
|
{ WallBottomLeft1, WallBottomLeft2, WallBottomLeft3, WallBottomLeft4, WallBottomLeft5, WallBottomLeft6, WallBottomLeft7, WallBottomLeft8, WallBottomLeft9 },
|
|
{ WallBottomRight1, WallBottomRight2, WallBottomRight3, WallBottomRight4, WallBottomRight5, WallBottomRight6, WallBottomRight7, WallBottomRight8, WallBottomRight9 }
|
|
}
|
|
|
|
if Map.LobbyOption("difficulty") == "veryeasy" then
|
|
ParaChance = 20
|
|
Patrol = { "e1", "e2", "e1" }
|
|
Infantry = { "e4", "e1", "e1", "e2", "e2" }
|
|
Vehicles = { "apc" }
|
|
Tank = { "3tnk" }
|
|
LongRange = { "arty" }
|
|
Boss = { "v2rl" }
|
|
Swarm = { "shok", "shok", "shok" }
|
|
elseif Map.LobbyOption("difficulty") == "easy" then
|
|
ParaChance = 25
|
|
Patrol = { "e1", "e2", "e1" }
|
|
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1" }
|
|
Vehicles = { "ftrk", "apc", "arty" }
|
|
Tank = { "3tnk" }
|
|
LongRange = { "v2rl" }
|
|
Boss = { "4tnk" }
|
|
Swarm = { "shok", "shok", "shok", "shok", "ttnk" }
|
|
elseif Map.LobbyOption("difficulty") == "normal" then
|
|
ParaChance = 30
|
|
Patrol = { "e1", "e2", "e1", "e1" }
|
|
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1" }
|
|
Vehicles = { "ftrk", "ftrk", "apc", "arty" }
|
|
Tank = { "3tnk" }
|
|
LongRange = { "v2rl" }
|
|
Boss = { "4tnk" }
|
|
Swarm = { "shok", "shok", "shok", "shok", "ttnk", "ttnk", "ttnk" }
|
|
elseif Map.LobbyOption("difficulty") == "hard" then
|
|
ParaChance = 35
|
|
Patrol = { "e1", "e2", "e1", "e1", "e4" }
|
|
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1" }
|
|
Vehicles = { "arty", "ftrk", "ftrk", "apc", "apc" }
|
|
Tank = { "3tnk" }
|
|
LongRange = { "v2rl" }
|
|
Boss = { "4tnk" }
|
|
Swarm = { "shok", "shok", "shok", "shok", "shok", "ttnk", "ttnk", "ttnk", "ttnk" }
|
|
else
|
|
ParaChance = 40
|
|
Patrol = { "e1", "e2", "e1", "e1", "e4", "e4" }
|
|
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1", "e1" }
|
|
Vehicles = { "arty", "arty", "ftrk", "apc", "apc" }
|
|
Tank = { "ftrk", "3tnk" }
|
|
LongRange = { "v2rl" }
|
|
Boss = { "4tnk" }
|
|
Swarm = { "shok", "shok", "shok", "shok", "shok", "shok", "ttnk", "ttnk", "ttnk", "ttnk", "ttnk" }
|
|
end
|
|
|
|
Wave = 0
|
|
Waves =
|
|
{
|
|
{ delay = 500, units = { Infantry } },
|
|
{ delay = 500, units = { Patrol, Patrol } },
|
|
{ delay = 700, units = { Infantry, Infantry, Vehicles }, },
|
|
{ delay = 1500, units = { Infantry, Infantry, Infantry, Infantry } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Vehicles } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Tank, Vehicles } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Tank, Tank, Swarm } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, LongRange } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, LongRange, Tank, LongRange } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, Infantry, LongRange, LongRange, Tank, Tank, Vehicles } },
|
|
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, Infantry, Infantry, Boss, Swarm } }
|
|
}
|
|
|
|
-- Now do some adjustments to the waves
|
|
if Map.LobbyOption("difficulty") == "tough" or Map.LobbyOption("difficulty") == "endless" then
|
|
Waves[8] = { delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry }, ironUnits = { LongRange } }
|
|
Waves[9] = { delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, Infantry, LongRange, LongRange, Vehicles, Tank }, ironUnits = { Tank } }
|
|
Waves[11] = { delay = 1500, units = { Vehicles, Infantry, Patrol, Patrol, Patrol, Infantry, LongRange, Tank, Boss, Infantry, Infantry, Patrol } }
|
|
end
|
|
|
|
IdleHunt = function(actor)
|
|
Trigger.OnIdle(actor, function(a)
|
|
if a.IsInWorld then
|
|
a.Hunt()
|
|
end
|
|
end)
|
|
end
|
|
|
|
SendUnits = function(entryCell, unitTypes, targetCell, extraData)
|
|
Reinforcements.Reinforce(soviets, unitTypes, { entryCell }, 40, function(a)
|
|
if not a.HasProperty("AttackMove") then
|
|
Trigger.OnIdle(a, function(a)
|
|
a.Move(targetCell)
|
|
end)
|
|
return
|
|
end
|
|
|
|
a.AttackMove(targetCell)
|
|
Trigger.OnIdle(a, function(a)
|
|
a.Hunt()
|
|
end)
|
|
|
|
if extraData == "IronCurtain" then
|
|
a.GrantCondition("invulnerability", DateTime.Seconds(25))
|
|
end
|
|
end)
|
|
end
|
|
|
|
SendWave = function()
|
|
Wave = Wave + 1
|
|
local wave = Waves[Wave]
|
|
|
|
Trigger.AfterDelay(wave.delay, function()
|
|
Utils.Do(wave.units, function(units)
|
|
local entry = Utils.Random(SovietEntryPoints).Location
|
|
local target = Utils.Random(SpawnPoints).Location
|
|
|
|
SendUnits(entry, units, target)
|
|
end)
|
|
|
|
if wave.ironUnits then
|
|
Utils.Do(wave.ironUnits, function(units)
|
|
local entry = Utils.Random(SovietEntryPoints).Location
|
|
local target = Utils.Random(SpawnPoints).Location
|
|
|
|
SendUnits(entry, units, target, "IronCurtain")
|
|
end)
|
|
end
|
|
|
|
Utils.Do(players, function(player)
|
|
Media.PlaySpeechNotification(player, "EnemyUnitsApproaching")
|
|
end)
|
|
|
|
if (Wave < #Waves) then
|
|
if Utils.RandomInteger(1, 100) < ParaChance then
|
|
local aircraft = ParaProxy.ActivateParatroopers(Utils.Random(ParadropWaypoints).CenterPosition)
|
|
Utils.Do(aircraft, function(a)
|
|
Trigger.OnPassengerExited(a, function(t, p)
|
|
IdleHunt(p)
|
|
end)
|
|
end)
|
|
|
|
local delay = Utils.RandomInteger(DateTime.Seconds(20), DateTime.Seconds(45))
|
|
Trigger.AfterDelay(delay, SendWave)
|
|
else
|
|
SendWave()
|
|
end
|
|
else
|
|
if Map.LobbyOption("difficulty") == "endless" then
|
|
Wave = 0
|
|
IncreaseDifficulty()
|
|
SendWave()
|
|
return
|
|
end
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(1), SovietsRetreating)
|
|
Media.DisplayMessage("You almost survived the onslaught! No more waves incoming.")
|
|
end
|
|
end)
|
|
end
|
|
|
|
SovietsRetreating = function()
|
|
Utils.Do(Snipers, function(a)
|
|
if not a.IsDead and a.Owner == soviets then
|
|
a.Destroy()
|
|
end
|
|
end)
|
|
end
|
|
|
|
IncreaseDifficulty = function()
|
|
local additions = { Infantry, Patrol, Vehicles, Tank, LongRange, Boss, Swarm }
|
|
Utils.Do(Waves, function(wave)
|
|
wave.units[#wave.units + 1] = Utils.Random(additions)
|
|
end)
|
|
end
|
|
|
|
Tick = function()
|
|
if (Utils.RandomInteger(1, 200) == 10) then
|
|
local delay = Utils.RandomInteger(1, 10)
|
|
Lighting.Flash("LightningStrike", delay)
|
|
Trigger.AfterDelay(delay, function()
|
|
Media.PlaySound("thunder" .. Utils.RandomInteger(1,6) .. ".aud")
|
|
end)
|
|
end
|
|
if (Utils.RandomInteger(1, 200) == 10) then
|
|
Media.PlaySound("thunder-ambient.aud")
|
|
end
|
|
end
|
|
|
|
SetupWallOwners = function()
|
|
Utils.Do(players, function(player)
|
|
Utils.Do(Walls[player.Spawn], function(wall)
|
|
wall.Owner = player
|
|
end)
|
|
end)
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
soviets = Player.GetPlayer("Soviets")
|
|
players = { }
|
|
for i = 0, 4 do
|
|
local player = Player.GetPlayer("Multi" ..i)
|
|
players[i] = player
|
|
|
|
if players[i] and players[i].IsBot then
|
|
ActivateAI(players[i], i)
|
|
end
|
|
end
|
|
|
|
Media.DisplayMessage("Defend Fort Lonestar at all costs!")
|
|
|
|
SetupWallOwners()
|
|
|
|
ParaProxy = Actor.Create("powerproxy.paratroopers", false, { Owner = soviets })
|
|
SendWave()
|
|
end
|