278 lines
9.2 KiB
Lua
278 lines
9.2 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")
|
|
AlliedReinforcementsA = { "jeep", "jeep" }
|
|
AlliedReinforcementsB = { "e1", "e1", "e1", "e3", "e3" }
|
|
AlliedReinforcementsC = { "jeep", "mcv" }
|
|
IslandPatrol = { SubPatrol1.Location, SubPatrol2.Location, SubPatrol3.Location, SubPatrol4.Location }
|
|
Submarines = { Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7, Sub8 }
|
|
RifleSquad = { Rifle1, Rifle2, Rifle3 }
|
|
NWVillageTrigger = { CPos.New(31, 64), CPos.New(32, 64), CPos.New(34, 51), CPos.New(35, 51), CPos.New(36, 51) }
|
|
SWVillageTrigger = { CPos.New(44, 97), CPos.New(45, 97), CPos.New(46, 97), CPos.New(47, 97) }
|
|
MiddleVillageTrigger = { CPos.New(52, 70), CPos.New(53, 70), CPos.New(54, 70) }
|
|
EastVillageTrigger = { CPos.New(78, 61), CPos.New(79, 61), CPos.New(80, 61), CPos.New(81, 61), CPos.New(82, 61) }
|
|
CivilianTypes = { "c2", "c3", "c4", "c5", "c6", "c8", "c9", "c10", "c11" }
|
|
NWVillage = { NWChurch, NWHouse1, NWHouse2, NWHouse3 }
|
|
SWVillage = { SWChurch, SWHouse1, SWHouse2, SWHouse3, SWHouse4 }
|
|
MiddleVillage = { MiddleChurch, MiddleHouse1, MiddleHouse2, MiddleHouse3, MiddleHouse4 }
|
|
EastVillage = { EastChurch, EastHouse1, EastHouse2, EastHouse3 }
|
|
|
|
MissionStart = function()
|
|
Reinforcements.Reinforce(Allies, AlliedReinforcementsA, { AlliedSpawn.Location, AlliedBase.Location }, 5)
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
AlliesArrived = true
|
|
Reinforcements.Reinforce(Allies, AlliedReinforcementsB, { AlliedSpawn.Location, AlliedBase.Location }, 2)
|
|
Utils.Do(RifleSquad, function(actor)
|
|
if not actor.IsDead then
|
|
actor.AttackMove(AlliedBase.Location)
|
|
actor.Hunt()
|
|
end
|
|
end)
|
|
end)
|
|
|
|
Sub1.Patrol(IslandPatrol, true, 1)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
|
Reinforcements.Reinforce(Allies, AlliedReinforcementsC, { AlliedSpawn.Location, AlliedBase.Location }, 5)
|
|
end)
|
|
|
|
Trigger.OnKilled(NWChurch, function()
|
|
if not NWChurchEmpty then
|
|
CiviliansKilled = CiviliansKilled + 5
|
|
end
|
|
end)
|
|
Trigger.OnKilled(EastChurch, function()
|
|
if not EastChurchEmpty then
|
|
CiviliansKilled = CiviliansKilled + 5
|
|
end
|
|
end)
|
|
Trigger.OnKilled(MiddleChurch, function()
|
|
if not MiddleChurchEmpty then
|
|
CiviliansKilled = CiviliansKilled + 5
|
|
end
|
|
end)
|
|
Trigger.OnKilled(SWChurch, function()
|
|
if not SWChurchEmpty then
|
|
CiviliansKilled = CiviliansKilled + 5
|
|
end
|
|
end)
|
|
|
|
Trigger.OnAllKilled(Submarines, function()
|
|
Allies.MarkCompletedObjective(ClearWaterway)
|
|
end)
|
|
end
|
|
|
|
VillageSetup = function()
|
|
local foot1Triggered
|
|
Trigger.OnEnteredFootprint(NWVillageTrigger, function(actor, id)
|
|
if actor.Owner == Allies and not foot1Triggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
foot1Triggered = true
|
|
|
|
Utils.Do(NWVillage, function(building)
|
|
building.Owner = Allies
|
|
end)
|
|
|
|
Civs1 = Reinforcements.Reinforce(Allies, Utils.Take(5, Utils.Shuffle(CivilianTypes)), { ChurchNorthwest.Location, VillageNorthwest.Location }, 0)
|
|
if not NWChurch.IsDead then
|
|
Utils.Do(Civs1, function(civ)
|
|
Trigger.OnKilled(civ, function()
|
|
CiviliansKilled = CiviliansKilled + 1
|
|
end)
|
|
end)
|
|
NWChurchEmpty = true
|
|
end
|
|
end
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(30), function()
|
|
local nwAttackers = Reinforcements.Reinforce(USSR, { "3tnk", "3tnk", "3tnk" }, { NWVillageAttack.Location, VillageNorthwest.Location }, 20)
|
|
Utils.Do(nwAttackers, IdleHunt)
|
|
end)
|
|
end)
|
|
|
|
local foot2Triggered
|
|
Trigger.OnEnteredFootprint(EastVillageTrigger, function(actor, id)
|
|
if actor.Owner == Allies and not foot2Triggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
foot2Triggered = true
|
|
|
|
Utils.Do(EastVillage, function(building)
|
|
building.Owner = Allies
|
|
end)
|
|
|
|
Civs2 = Reinforcements.Reinforce(Allies, Utils.Take(5, Utils.Shuffle(CivilianTypes)), { ChurchEast.Location, VillageEast.Location }, 0)
|
|
if not EastChurch.IsDead then
|
|
Utils.Do(Civs2, function(civ)
|
|
Trigger.OnKilled(civ, function()
|
|
CiviliansKilled = CiviliansKilled + 1
|
|
end)
|
|
end)
|
|
EastChurchEmpty = true
|
|
end
|
|
|
|
local villageDrop = FlamerDrop.TargetParatroopers(VillageEast.CenterPosition, Angle.North)
|
|
Utils.Do(villageDrop, function(a)
|
|
Trigger.OnPassengerExited(a, function(t, p)
|
|
IdleHunt(p)
|
|
end)
|
|
end)
|
|
end
|
|
end)
|
|
|
|
local foot3Triggered
|
|
Trigger.OnEnteredFootprint(MiddleVillageTrigger, function(actor, id)
|
|
if actor.Owner == Allies and not foot3Triggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
foot3Triggered = true
|
|
|
|
Utils.Do(MiddleVillage, function(building)
|
|
building.Owner = Allies
|
|
end)
|
|
|
|
Civs3 = Reinforcements.Reinforce(Allies, Utils.Take(5, Utils.Shuffle(CivilianTypes)), { ChurchMiddle.Location, VillageMiddle.Location }, 0)
|
|
if not MiddleChurch.IsDead then
|
|
Utils.Do(Civs3, function(civ)
|
|
Trigger.OnKilled(civ, function()
|
|
CiviliansKilled = CiviliansKilled + 1
|
|
end)
|
|
end)
|
|
MiddleChurchEmpty = true
|
|
end
|
|
|
|
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR })
|
|
proxy.TargetAirstrike(ChurchMiddle.CenterPosition, Angle.NorthWest)
|
|
end
|
|
end)
|
|
|
|
local foot4Triggered
|
|
Trigger.OnEnteredFootprint(SWVillageTrigger, function(actor, id)
|
|
if actor.Owner == Allies and not foot4Triggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
foot4Triggered = true
|
|
|
|
Utils.Do(SWVillage, function(building)
|
|
building.Owner = Allies
|
|
end)
|
|
|
|
Civs4 = Reinforcements.Reinforce(Allies, Utils.Take(5, Utils.Shuffle(CivilianTypes)), { ChurchSouthwest.Location, VillageSouthwest.Location }, 0)
|
|
if not SWChurch.IsDead then
|
|
Utils.Do(Civs4, function(civ)
|
|
Trigger.OnKilled(civ, function()
|
|
CiviliansKilled = CiviliansKilled + 1
|
|
end)
|
|
end)
|
|
SWChurchEmpty = true
|
|
end
|
|
end
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(30), function()
|
|
local swAttackers = Reinforcements.Reinforce(USSR, { "3tnk", "3tnk", "3tnk", "ttnk", "e4", "e4", "e4" }, { SWVillageAttack.Location, VillageSouthwest.Location }, 20)
|
|
Utils.Do(swAttackers, IdleHunt)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
CiviliansEvacuatedThreshold =
|
|
{
|
|
hard = 20,
|
|
normal = 15,
|
|
easy = 10
|
|
}
|
|
CiviliansKilledThreshold =
|
|
{
|
|
hard = 1,
|
|
normal = 6,
|
|
easy = 11
|
|
}
|
|
CiviliansEvacuated = 0
|
|
CiviliansKilled = 0
|
|
EvacuateCivilians = function()
|
|
Trigger.OnInfiltrated(SafeHouse, function()
|
|
CiviliansEvacuated = CiviliansEvacuated + 1
|
|
UserInterface.SetMissionText(CiviliansEvacuated .. "/" .. CiviliansEvacuatedThreshold .. " civilians evacuated.", TextColor)
|
|
end)
|
|
|
|
Trigger.OnKilled(SafeHouse, function()
|
|
USSR.MarkCompletedObjective(SovietObj)
|
|
end)
|
|
|
|
local enemyBase = Utils.Where(USSR.GetActors(), function(actor)
|
|
return
|
|
actor.HasProperty("Sell") and
|
|
actor.Type ~= "brik"
|
|
end)
|
|
|
|
Trigger.OnAllKilled(enemyBase, function()
|
|
Media.PlaySoundNotification(Allies, "AlertBleep")
|
|
Media.DisplayMessage("Alfa Niner this is Pegasus. We are on site and ready to assist with the evacuation.", "Chinook pilot")
|
|
Reinforcements.Reinforce(Allies, { "tran" }, { ChinookEntry.Location, ChinookLZ.Location })
|
|
end)
|
|
end
|
|
|
|
Tick = function()
|
|
USSR.Cash = 10000
|
|
if CiviliansEvacuated >= CiviliansEvacuatedThreshold then
|
|
Allies.MarkCompletedObjective(RescueCivilians)
|
|
end
|
|
|
|
if CiviliansKilled >= CiviliansKilledThreshold then
|
|
Allies.MarkFailedObjective(RescueCivilians)
|
|
end
|
|
|
|
if AlliesArrived and Allies.HasNoRequiredUnits() then
|
|
USSR.MarkCompletedObjective(SovietObj)
|
|
end
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
Allies = Player.GetPlayer("Allies")
|
|
USSR = Player.GetPlayer("USSR")
|
|
|
|
Trigger.OnObjectiveAdded(Allies, function(p, id)
|
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
|
end)
|
|
|
|
if Map.LobbyOption("difficulty") == "easy" then
|
|
RescueCivilians = Allies.AddObjective("Evacuate at least half of the civilians to the island\nshelter.")
|
|
elseif Map.LobbyOption("difficulty") == "normal" then
|
|
RescueCivilians = Allies.AddObjective("Evacuate at least three quarters of the civilians to\nthe island shelter.")
|
|
else
|
|
RescueCivilians = Allies.AddObjective("Evacuate all civilians to the island shelter.")
|
|
end
|
|
|
|
ClearWaterway = Allies.AddObjective("Clear the area of enemy submarine activity.", "Secondary", false)
|
|
SovietObj = USSR.AddObjective("Defeat Allies.")
|
|
|
|
Trigger.OnObjectiveCompleted(Allies, function(p, id)
|
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
|
end)
|
|
Trigger.OnObjectiveFailed(Allies, function(p, id)
|
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
|
end)
|
|
|
|
Trigger.OnPlayerLost(Allies, function()
|
|
Media.PlaySpeechNotification(Allies, "Lose")
|
|
end)
|
|
Trigger.OnPlayerWon(Allies, function()
|
|
Media.PlaySpeechNotification(Allies, "Win")
|
|
end)
|
|
|
|
CiviliansEvacuatedThreshold = CiviliansEvacuatedThreshold[Difficulty]
|
|
CiviliansKilledThreshold = CiviliansKilledThreshold[Difficulty]
|
|
TextColor = Allies.Color
|
|
UserInterface.SetMissionText(CiviliansEvacuated .. "/" .. CiviliansEvacuatedThreshold .. " civilians evacuated.", TextColor)
|
|
StandardDrop = Actor.Create("paradrop", false, { Owner = USSR })
|
|
FlamerDrop = Actor.Create("flamerdrop", false, { Owner = USSR })
|
|
Camera.Position = DefaultCameraPosition.CenterPosition
|
|
MissionStart()
|
|
VillageSetup()
|
|
EvacuateCivilians()
|
|
ActivateAI()
|
|
end
|