321 lines
12 KiB
Lua
321 lines
12 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.
|
|
]]
|
|
Cabins = { NorthCabin, SouthCabin }
|
|
NWFootprintTrigger = { CPos.New(41, 49), CPos.New(41, 48), CPos.New(41, 47), CPos.New(41, 46), CPos.New(41, 45), CPos.New(41, 44) }
|
|
SWFootprintTrigger = { CPos.New(26, 77), CPos.New(27, 77), CPos.New(28, 77), CPos.New(29, 77), CPos.New(33, 77), CPos.New(34, 77), CPos.New(35, 77), CPos.New(36, 77), CPos.New(37, 77), CPos.New(38, 77), CPos.New(39, 77) }
|
|
SEFootprintTrigger = { CPos.New(75, 83), CPos.New(76, 83), CPos.New(77, 83), CPos.New(78, 83), CPos.New(79, 83), CPos.New(80, 83), CPos.New(81, 83), CPos.New(82, 83), CPos.New(83, 83), CPos.New(84, 83), CPos.New(85, 83), CPos.New(86, 83), CPos.New(87, 83), CPos.New(88, 83), CPos.New(89, 83) }
|
|
NWWaterPath = { WaterEntryNW.Location, WaterLandingNW.Location }
|
|
NEWaterPath = { WaterEntryNE.Location, WaterLandingNE.Location }
|
|
SEWaterPath = { WaterEntrySE.Location, WaterLandingSE.Location }
|
|
NWWaterUnits = { "dtrk", "ttnk", "ttnk", "ttnk", "3tnk" }
|
|
NEWaterUnits = { "dtrk", "v2rl", "e6", "e6", "e6" }
|
|
SEWaterUnits = { "ttnk", "ttnk", "shok", "shok", "shok" }
|
|
NorthPillboxes = { NorthPill1, NorthPill2 }
|
|
SouthPillboxes = { SouthPill1, SouthPill2 }
|
|
VehicleSquad1 = { Ltnk1, Jeep1 }
|
|
VehicleSquad2 = { Ltnk2, Jeep2 }
|
|
VehicleSquad3 = { Ltnk3, Jeep3 }
|
|
CivSquads = { { "c1", "c3", "c7", "c10" }, { "c2", "c4", "c6", "c11" }, { "c11", "c10", "c9" }, { "c8", "c7", "c6" }, { "c5", "c4", "c3" }, { "c5", "c10" }, { "c4", "c2" }, { "c3", "c5" }, { "c9", "c11" } }
|
|
AlliedInfantry = { "e1", "e1", "e1", "e3" }
|
|
AttackGroupSize = 4
|
|
InfantryDelay = DateTime.Seconds(10)
|
|
IdlingUnits = { }
|
|
|
|
MissionStart = function()
|
|
LZCamera = Actor.Create("camera", true, { Owner = USSR, Location = LZ.Location })
|
|
ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.New(508))
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.New(520))
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(4), function()
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
|
LZCamera.Destroy()
|
|
TroopsArrived = true
|
|
end)
|
|
|
|
InfantryProduction()
|
|
end
|
|
|
|
InfantryProduction = function()
|
|
if (SETent1.IsDead or SETent1.Owner ~= Greece) and (SETent2.IsDead or SETent2.Owner ~= Greece) then
|
|
return
|
|
end
|
|
|
|
local toBuild = { Utils.Random(AlliedInfantry) }
|
|
|
|
Greece.Build(toBuild, function(unit)
|
|
IdlingUnits[#IdlingUnits + 1] = unit[1]
|
|
Trigger.AfterDelay(InfantryDelay, InfantryProduction)
|
|
|
|
if #IdlingUnits >= (AttackGroupSize * 1.5) then
|
|
SendAttack()
|
|
end
|
|
end)
|
|
end
|
|
|
|
SendAttack = function()
|
|
local units = { }
|
|
|
|
for i = 0, AttackGroupSize, 1 do
|
|
local number = Utils.RandomInteger(1, #IdlingUnits)
|
|
|
|
if IdlingUnits[number] and not IdlingUnits[number].IsDead then
|
|
units[i] = IdlingUnits[number]
|
|
table.remove(IdlingUnits, number)
|
|
end
|
|
end
|
|
|
|
Utils.Do(units, function(unit)
|
|
if not unit.IsDead then
|
|
IdleHunt(unit)
|
|
end
|
|
end)
|
|
end
|
|
|
|
DomeCaptured = false
|
|
MissionTriggers = function()
|
|
local neFootTriggered
|
|
Trigger.OnEnteredProximityTrigger(NECivSpawn1.CenterPosition, WDist.FromCells(9), function(actor, id)
|
|
if actor.Owner == USSR and actor.Type ~= "badr" and not neFootTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
neFootTriggered = true
|
|
|
|
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR })
|
|
proxy.TargetAirstrike(NECivSpawn6.CenterPosition, Angle.SouthEast)
|
|
proxy.Destroy()
|
|
|
|
Utils.Do(VehicleSquad1, function(a)
|
|
if not a.IsDead then
|
|
a.AttackMove(NECivSpawn1.Location)
|
|
IdleHunt(a)
|
|
end
|
|
end)
|
|
|
|
local neVillageCam = Actor.Create("camera", true, { Owner = USSR, Location = NECivSpawn1.Location })
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
local neTroops = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", NEWaterUnits, NEWaterPath, { NEWaterPath[1] })[2]
|
|
Trigger.OnAllRemovedFromWorld(Utils.Where(neTroops, function(a) return a.Type == "e6" end), function()
|
|
if not DomeCaptured then
|
|
USSR.MarkFailedObjective(CaptureDome)
|
|
end
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
if not NEVillage1.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn1.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
if not NEVillage2.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn2.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(3), function()
|
|
if not NEVillage3.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn3.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
if not NEVillage4.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn4.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(4), function()
|
|
if not NEVillage5.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn5.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
if not NEVillage6.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn6.Location, CivRallySE.Location }, 0)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
|
if not NEVillage7.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn7.Location, CivRallySE.Location }, 0)
|
|
end
|
|
if not NEVillage8.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn8.Location, CivRallySE.Location }, 0)
|
|
end
|
|
if not NEVillage9.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NECivSpawn9.Location, CivRallySE.Location }, 0)
|
|
end
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
|
neVillageCam.Destroy()
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnDamaged(NorthCabin, function()
|
|
if not NorthCabinDamaged then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { NEHermitSpawn.Location, CivRallyNW.Location }, 1)
|
|
NorthCabinDamaged = true
|
|
end
|
|
end)
|
|
|
|
Trigger.OnDamaged(SouthCabin, function()
|
|
if not SouthCabinDamaged then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SouthHermitSpawn.Location, CivRallySE.Location }, 1)
|
|
SouthCabinDamaged = true
|
|
end
|
|
end)
|
|
|
|
Trigger.OnAllKilled(Cabins, function()
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.SouthWest)
|
|
end)
|
|
|
|
Trigger.OnAllKilled(NorthPillboxes, function()
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
ShockDrop.TargetParatroopers(LZ.CenterPosition, Angle.South)
|
|
end)
|
|
|
|
local nwFootTriggered
|
|
Trigger.OnEnteredFootprint(NWFootprintTrigger, function(actor, id)
|
|
if actor.Owner == USSR and not nwFootTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
nwFootTriggered = true
|
|
|
|
local nwBarracks1 = Reinforcements.Reinforce(GoodGuy, AlliedInfantry, { NWSpawn1.Location }, 0)
|
|
Utils.Do(nwBarracks1, IdleHunt)
|
|
local nwBarracks2 = Reinforcements.Reinforce(GoodGuy, AlliedInfantry, { NWSpawn2.Location }, 0)
|
|
Utils.Do(nwBarracks2, IdleHunt)
|
|
|
|
Utils.Do(VehicleSquad2, function(a)
|
|
if not a.IsDead then
|
|
a.AttackMove(SWCivSpawn1.Location)
|
|
IdleHunt(a)
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnKilled(RadarDome, function()
|
|
if not DomeCaptured then
|
|
USSR.MarkFailedObjective(CaptureDome)
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
ShockDrop.TargetParatroopers(CivRallyNW.CenterPosition, Angle.West)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnCapture(RadarDome, function()
|
|
DomeCaptured = true
|
|
USSR.MarkCompletedObjective(CaptureDome)
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
local nwTroops = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", NWWaterUnits, NWWaterPath, { NWWaterPath[1] })[2]
|
|
end)
|
|
|
|
Trigger.OnAllKilled(SouthPillboxes, function()
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
local seTroops = Reinforcements.ReinforceWithTransport(USSR, "lst.reinforcement", SEWaterUnits, SEWaterPath, { SEWaterPath[1] })[2]
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
Reinforcements.Reinforce(USSR, { "msub", "msub" }, { MSubEntry.Location, MSubStop.Location })
|
|
ShockDrop.TargetParatroopers(SEShockDrop.CenterPosition, Angle.SouthWest)
|
|
end)
|
|
end)
|
|
|
|
local swFootTriggered
|
|
Trigger.OnEnteredFootprint(SWFootprintTrigger, function(actor, id)
|
|
if actor.Owner == USSR and actor.Type ~= "badr" and not swFootTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
swFootTriggered = true
|
|
|
|
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR })
|
|
proxy.TargetAirstrike(SWCivSpawn3.CenterPosition, Angle.South)
|
|
proxy.Destroy()
|
|
local swVillageCam = Actor.Create("camera", true, { Owner = USSR, Location = SWCivSpawn2.Location })
|
|
|
|
local hiding = Reinforcements.Reinforce(Greece, { 'e1', 'e1', 'e3', 'e3', 'e3' }, { SWCivSpawn1.Location }, 0)
|
|
Utils.Do(hiding, IdleHunt)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
if not SWVillage1.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn1.Location, CivRallySE.Location }, 0)
|
|
end
|
|
if not SWVillage2.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn2.Location, CivRallySE.Location }, 0)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(4), function()
|
|
if not SWVillage3.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn3.Location, CivRallySE.Location }, 0)
|
|
end
|
|
if not SWVillage4.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn4.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
|
if not SWVillage5.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn5.Location, CivRallySE.Location }, 0)
|
|
end
|
|
if not SWVillage6.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn6.Location, CivRallyNW.Location }, 0)
|
|
end
|
|
if not SWVillage7.IsDead then
|
|
Reinforcements.Reinforce(Spain, Utils.Random(CivSquads), { SWCivSpawn7.Location, CivRallySE.Location }, 0)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
|
ShockDrop.TargetParatroopers(SouthwestLZ.CenterPosition, Angle.SouthWest)
|
|
Utils.Do(VehicleSquad3, function(a)
|
|
if not a.IsDead then
|
|
a.AttackMove(NECivSpawn1.Location)
|
|
IdleHunt(a)
|
|
end
|
|
end)
|
|
swVillageCam.Destroy()
|
|
end)
|
|
end
|
|
end)
|
|
|
|
local seFootTriggered
|
|
Trigger.OnEnteredFootprint(SEFootprintTrigger, function(actor, id)
|
|
if actor.Owner == USSR and not seFootTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
seFootTriggered = true
|
|
|
|
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR })
|
|
proxy.TargetAirstrike(SEBaseBombingRun.CenterPosition, Angle.East)
|
|
proxy.Destroy()
|
|
end
|
|
end)
|
|
end
|
|
|
|
TroopsArrived = false
|
|
Tick = function()
|
|
if USSR.HasNoRequiredUnits() and TroopsArrived then
|
|
Greece.MarkCompletedObjective(BeatRussia)
|
|
end
|
|
|
|
if Greece.HasNoRequiredUnits() and GoodGuy.HasNoRequiredUnits() and Spain.HasNoRequiredUnits() then
|
|
USSR.MarkCompletedObjective(KillAll)
|
|
end
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
USSR = Player.GetPlayer("USSR")
|
|
Greece = Player.GetPlayer("Greece")
|
|
GoodGuy = Player.GetPlayer("GoodGuy")
|
|
Spain = Player.GetPlayer("Spain")
|
|
|
|
InitObjectives(USSR)
|
|
|
|
BeatRussia = Greece.AddObjective("Stop Ivan.")
|
|
KillAll = USSR.AddObjective("Destroy all that oppose us.")
|
|
CaptureDome = USSR.AddObjective("Capture the enemy radar dome.", "Secondary", false)
|
|
|
|
Camera.Position = LZ.CenterPosition
|
|
ShockDrop = Actor.Create("shockdrop", false, { Owner = USSR })
|
|
MissionStart()
|
|
MissionTriggers()
|
|
end
|