From c0a3a8d09a9b096ca53aa8093646d64eb7bd17d8 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Mon, 17 Mar 2014 22:15:39 +0100 Subject: [PATCH] Add port of scg04ea mission --- mods/cnc/maps/gdi04a/gdi04a.lua | 150 +++++++++ mods/cnc/maps/gdi04a/map.bin | Bin 0 -> 20485 bytes mods/cnc/maps/gdi04a/map.yaml | 578 ++++++++++++++++++++++++++++++++ 3 files changed, 728 insertions(+) create mode 100644 mods/cnc/maps/gdi04a/gdi04a.lua create mode 100644 mods/cnc/maps/gdi04a/map.bin create mode 100644 mods/cnc/maps/gdi04a/map.yaml diff --git a/mods/cnc/maps/gdi04a/gdi04a.lua b/mods/cnc/maps/gdi04a/gdi04a.lua new file mode 100644 index 0000000000..9651a21b58 --- /dev/null +++ b/mods/cnc/maps/gdi04a/gdi04a.lua @@ -0,0 +1,150 @@ +Nod1Template = { {HandOfNod, {"e1", "e1", "e1", "e3", "e3"}} } +Auto1Template = { {HandOfNod, {"e1", "e1", "e3"}} } + +if OpenRA.GetDifficulty() == "Easy" then + KillsUntilReinforcements = 8 + HeliDelay = {83, 137, 211} +else + KillsUntilReinforcements = 16 + HeliDelay = {57, 89, 123} +end + +GDIReinforcements = {"e2", "e2", "e2", "e2"} +GDIReinforcementsWaypoints = {GDIReinforcementsEntry, GDIReinforcementsWP1} + +NodHelis = { + {Utils.Seconds(HeliDelay[1]), {NodHeliEntry, NodHeliLZ1}, {"e1", "e3", "e3"}}, + {Utils.Seconds(HeliDelay[2]), {NodHeliEntry, NodHeliLZ2}, {"e1", "e1", "e1", "e1", "e1"}}, + {Utils.Seconds(HeliDelay[3]), {NodHeliEntry, NodHeliLZ3}, {"e1", "e1", "e3"}} + } + +SendHeli = function(heli, func) + Reinforcements.ReinforceWithCargo(nod, "tran", heli[2], heli[3], func) + OpenRA.RunAfterDelay(heli[1], function() SendHeli(heli, func) end) +end + +HeliAction = function(heliActor, team) + Actor.AfterMove(heliActor) + Actor.UnloadCargo(heliActor, true) + Actor.Wait(heliActor, Utils.Seconds(2)) + Actor.ScriptedMove(heliActor, NodHeliEntry) + Actor.RemoveSelf(heliActor) + + Team.Do(team, function(actor) + Actor.Hunt(actor) + Actor.OnIdle(actor, Actor.Hunt) + Actor.OnKilled(actor, KillCounter) + end) +end + +SendGDIReinforcements = function() + Reinforcements.ReinforceWithCargo(player, "apc", GDIReinforcementsWaypoints, GDIReinforcements, function(apc, team) + Team.Add(team, apc) + Actor.OnKilled(apc, SendGDIReinforcements) + Team.Do(team, function(unit) Actor.SetStance(unit, "Defend") end) + end) +end + +BuildNod1 = function() + Production.BuildTeamFromTemplate(nod, Nod1Template, function(team) + Team.Do(team, function(actor) + if not Actor.IsDead(actor) then + if OpenRA.GetDifficulty() == "Normal" then + Actor.OnIdle(actor, Actor.Hunt) + else + Actor.Scatter(actor) + end + Actor.OnKilled(actor, KillCounter) + end + end) + Team.AddEventHandler(team.OnAllKilled, BuildNod1) + end) +end + +BuildAuto1 = function() + Production.BuildTeamFromTemplate(nod, Auto1Template, function(team) + Team.Do(team, function(actor) + if not Actor.IsDead(actor) then + Actor.OnIdle(actor, Actor.Hunt) + Actor.OnKilled(actor, KillCounter) + end + end) + end) +end + +kills = 0 +KillCounter = function() kills = kills + 1 end + +Auto1Triggered = false +GDIHeliTriggered = false +ReinforcementsSent = false +Tick = function() + if not ReinforcementsSent and kills >= KillsUntilReinforcements then + ReinforcementsSent = true + SendGDIReinforcements() + end + + if Mission.RequiredUnitsAreDestroyed(player) then + OpenRA.RunAfterDelay(Utils.Seconds(1), MissionFailed) + end + + if not Auto1Triggered then + -- FIXME: replace with cell trigger when available + local units = Map.FindUnitsInCircle(player, Auto1Trigger, 2) + if #units > 0 then + Auto1Triggered = true + BuildAuto1() + end + elseif not GDIHeliTriggered then + -- FIXME: replace with cell trigger when available + local units = Map.FindUnitsInCircle(player, GDIHeliLZ, 2) + if #units > 0 then + GDIHeliTriggered = true + Reinforcements.ReinforceWithCargo(player, "tran", {GDIHeliEntry, GDIHeliLZ}, nil, Actor.AfterMove) + end + end +end + +SetupWorld = function() + OpenRA.GiveCash(nod, 10000) + Production.EventHandlers.Setup(nod) + + Utils.Do(Mission.GetGroundAttackersOf(nod), function(unit) + Actor.OnKilled(unit, KillCounter) + end) + + Utils.Do(Mission.GetGroundAttackersOf(player), function(unit) + Actor.SetStance(unit, "Defend") + end) + + Actor.Hunt(Hunter1) + Actor.Hunt(Hunter2) + + Actor.OnRemovedFromWorld(crate, MissionAccomplished) +end + +WorldLoaded = function() + Media.PlayMovieFullscreen("bkground.vqa", function() Media.PlayMovieFullscreen("gdi4b.vqa", function() Media.PlayMovieFullscreen("nitejump.vqa") end) end) + + player = OpenRA.GetPlayer("GDI") + nod = OpenRA.GetPlayer("Nod") + + SetupWorld() + + OpenRA.RunAfterDelay(1, BuildNod1) + Utils.Do(NodHelis, function(heli) + OpenRA.RunAfterDelay(heli[1], function() SendHeli(heli, HeliAction) end) + end) + + OpenRA.SetViewportCenterPosition(Actor56.CenterPosition) +end + +MissionAccomplished = function() + Mission.MissionOver({ player }, nil, false) + Media.PlayMovieFullscreen("burdet1.vqa") +end + +MissionFailed = function() + Mission.MissionOver(nil, { player }, false) + Media.PlayMovieFullscreen("gameover.vqa") +end diff --git a/mods/cnc/maps/gdi04a/map.bin b/mods/cnc/maps/gdi04a/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..0823eb4293b2badc7d739419749d913ce73ea0bb GIT binary patch literal 20485 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