196 lines
5.9 KiB
Lua
196 lines
5.9 KiB
Lua
AllToHuntTrigger =
|
|
{
|
|
Silo1, Proc1, Silo2, Silo3, Silo4, Afld1, Hand1, Nuke1, Nuke2, Nuke3, Fact1
|
|
}
|
|
|
|
AtkRoute1 = { waypoint4.Location, waypoint5.Location, waypoint6.Location, waypoint7.Location, waypoint8.Location }
|
|
AtkRoute2 = { waypoint0.Location, waypoint1.Location, waypoint2.Location, waypoint3.Location }
|
|
|
|
AutoCreateTeams =
|
|
{
|
|
{ types = { e1 = 1, e3 = 3 }, route = AtkRoute2 },
|
|
{ types = { e1 = 3, e3 = 1 }, route = AtkRoute2 },
|
|
{ types = { e3 = 4 } , route = AtkRoute1 },
|
|
{ types = { e1 = 4 } , route = AtkRoute1 },
|
|
{ types = { bggy = 1 } , route = AtkRoute1 },
|
|
{ types = { bggy = 1 } , route = AtkRoute2 },
|
|
{ types = { ltnk = 1 } , route = AtkRoute1 },
|
|
{ types = { ltnk = 1 } , route = AtkRoute2 }
|
|
}
|
|
|
|
RepairThreshold = 0.6
|
|
|
|
Atk1Delay = DateTime.Seconds(40)
|
|
Atk2Delay = DateTime.Seconds(60)
|
|
Atk3Delay = DateTime.Seconds(70)
|
|
Atk4Delay = DateTime.Seconds(90)
|
|
AutoAtkStartDelay = DateTime.Seconds(115)
|
|
AutoAtkMinDelay = DateTime.Seconds(45)
|
|
AutoAtkMaxDelay = DateTime.Seconds(90)
|
|
|
|
Atk5CellTriggers =
|
|
{
|
|
CPos.New(17,55), CPos.New(16,55), CPos.New(15,55), CPos.New(50,54), CPos.New(49,54),
|
|
CPos.New(48,54), CPos.New(16,54), CPos.New(15,54), CPos.New(14,54), CPos.New(50,53),
|
|
CPos.New(49,53), CPos.New(48,53), CPos.New(50,52), CPos.New(49,52)
|
|
}
|
|
|
|
GdiBase = { GdiNuke1, GdiProc1, GdiWeap1, GdiNuke2, GdiPyle1, GdiSilo1, GdiSilo2, GdiHarv }
|
|
GdiUnits = { "e2", "e2", "e2", "e2", "e1", "e1", "e1", "e1", "mtnk", "mtnk", "jeep", "jeep", "apc" }
|
|
NodSams = { Sam1, Sam2, Sam3, Sam4 }
|
|
|
|
AllToHunt = function()
|
|
local list = enemy.GetGroundAttackers()
|
|
Utils.Do(list, function(unit)
|
|
unit.Hunt()
|
|
end)
|
|
end
|
|
|
|
MoveThenHunt = function(actors, path)
|
|
Utils.Do(actors, function(actor)
|
|
actor.Patrol(path, false)
|
|
IdleHunt(actor)
|
|
end)
|
|
end
|
|
|
|
AutoCreateTeam = function()
|
|
local team = Utils.Random(AutoCreateTeams)
|
|
for type, count in pairs(team.types) do
|
|
MoveThenHunt(Utils.Take(count, enemy.GetActorsByType(type)), team.route)
|
|
end
|
|
|
|
Trigger.AfterDelay(Utils.RandomInteger(AutoAtkMinDelay, AutoAtkMaxDelay), AutoCreateTeam)
|
|
end
|
|
|
|
DiscoverGdiBase = function(actor, discoverer)
|
|
if baseDiscovered or not discoverer == player then
|
|
return
|
|
end
|
|
|
|
Utils.Do(GdiBase, function(actor)
|
|
actor.Owner = player
|
|
end)
|
|
GdiHarv.FindResources()
|
|
|
|
baseDiscovered = true
|
|
|
|
gdiObjective3 = player.AddPrimaryObjective("Eliminate all Nod forces in the area.")
|
|
player.MarkCompletedObjective(gdiObjective1)
|
|
end
|
|
|
|
Atk1TriggerFunction = function()
|
|
MoveThenHunt(Utils.Take(2, enemy.GetActorsByType('e1')), AtkRoute1)
|
|
MoveThenHunt(Utils.Take(3, enemy.GetActorsByType('e3')), AtkRoute1)
|
|
end
|
|
|
|
Atk2TriggerFunction = function()
|
|
MoveThenHunt(Utils.Take(3, enemy.GetActorsByType('e1')), AtkRoute2)
|
|
MoveThenHunt(Utils.Take(3, enemy.GetActorsByType('e3')), AtkRoute2)
|
|
end
|
|
|
|
Atk3TriggerFunction = function()
|
|
MoveThenHunt(Utils.Take(1, enemy.GetActorsByType('bggy')), AtkRoute1)
|
|
end
|
|
|
|
Atk4TriggerFunction = function()
|
|
MoveThenHunt(Utils.Take(1, enemy.GetActorsByType('bggy')), AtkRoute2)
|
|
end
|
|
|
|
Atk5TriggerFunction = function()
|
|
MoveThenHunt(Utils.Take(1, enemy.GetActorsByType('ltnk')), AtkRoute2)
|
|
end
|
|
|
|
StartProduction = function(type)
|
|
if Hand1.IsInWorld and Hand1.Owner == enemy then
|
|
Hand1.Build(type)
|
|
Trigger.AfterDelay(DateTime.Seconds(30), function() StartProduction(type) end)
|
|
end
|
|
end
|
|
|
|
InsertGdiUnits = function()
|
|
Media.PlaySpeechNotification(player, "Reinforce")
|
|
Reinforcements.Reinforce(player, GdiUnits, { UnitsEntry.Location, UnitsRally.Location }, 15)
|
|
end
|
|
|
|
IdleHunt = function(unit)
|
|
if not unit.IsDead then
|
|
Trigger.OnIdle(unit, unit.Hunt)
|
|
end
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
player = Player.GetPlayer("GDI")
|
|
gdiBase = Player.GetPlayer("AbandonedBase")
|
|
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)
|
|
|
|
Utils.Do(Map.NamedActors, function(actor)
|
|
if actor.Owner == enemy and actor.HasProperty("StartBuildingRepairs") then
|
|
Trigger.OnDamaged(actor, function(building)
|
|
if building.Owner == enemy and building.Health < RepairThreshold * building.MaxHealth then
|
|
building.StartBuildingRepairs()
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
gdiObjective1 = player.AddPrimaryObjective("Find the GDI base.")
|
|
gdiObjective2 = player.AddSecondaryObjective("Destroy all SAM sites to receive air support.")
|
|
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops.")
|
|
|
|
Trigger.AfterDelay(Atk1Delay, Atk1TriggerFunction)
|
|
Trigger.AfterDelay(Atk2Delay, Atk2TriggerFunction)
|
|
Trigger.AfterDelay(Atk3Delay, Atk3TriggerFunction)
|
|
Trigger.AfterDelay(Atk4Delay, Atk4TriggerFunction)
|
|
Trigger.OnEnteredFootprint(Atk5CellTriggers, function(a, id)
|
|
if a.Owner == player then
|
|
Atk5TriggerFunction()
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(AutoAtkStartDelay, AutoCreateTeam)
|
|
|
|
Trigger.OnAllRemovedFromWorld(AllToHuntTrigger, AllToHunt)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(40), function() StartProduction({ "e1" }) end)
|
|
|
|
Trigger.OnPlayerDiscovered(gdiBase, DiscoverGdiBase)
|
|
|
|
Trigger.OnAllKilled(NodSams, function()
|
|
player.MarkCompletedObjective(gdiObjective2)
|
|
Actor.Create("airstrike.proxy", true, { Owner = player })
|
|
end)
|
|
|
|
Camera.Position = UnitsRally.CenterPosition
|
|
|
|
InsertGdiUnits()
|
|
end
|
|
|
|
Tick = function()
|
|
if player.HasNoRequiredUnits() then
|
|
if DateTime.GameTime > 2 then
|
|
enemy.MarkCompletedObjective(nodObjective)
|
|
end
|
|
end
|
|
if baseDiscovered and enemy.HasNoRequiredUnits() then
|
|
player.MarkCompletedObjective(gdiObjective3)
|
|
end
|
|
end
|