From 4a4885a905d55bf4a59e4287cb4fe3ff253836cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 29 Dec 2013 19:48:10 +0100 Subject: [PATCH 1/3] ported first Nod mission to Lua --- OpenRA.Mods.Cnc/Missions/Nod01Script.cs | 199 ------------------------ mods/cnc/maps/nod01/map.yaml | 111 +++++++------ mods/cnc/maps/nod01/mission.lua | 47 ++++++ 3 files changed, 110 insertions(+), 247 deletions(-) delete mode 100644 OpenRA.Mods.Cnc/Missions/Nod01Script.cs create mode 100644 mods/cnc/maps/nod01/mission.lua diff --git a/OpenRA.Mods.Cnc/Missions/Nod01Script.cs b/OpenRA.Mods.Cnc/Missions/Nod01Script.cs deleted file mode 100644 index b9d667360a..0000000000 --- a/OpenRA.Mods.Cnc/Missions/Nod01Script.cs +++ /dev/null @@ -1,199 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2013 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. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Linq; -using OpenRA.FileFormats; -using OpenRA.Graphics; -using OpenRA.Mods.RA; -using OpenRA.Mods.RA.Buildings; -using OpenRA.Mods.RA.Missions; -using OpenRA.Mods.RA.Move; -using OpenRA.Scripting; -using OpenRA.Traits; - -namespace OpenRA.Mods.Cnc.Missions -{ - class Nod01ScriptInfo : TraitInfo, Requires { } - - class Nod01Script : IHasObjectives, IWorldLoaded, ITick - { - public event Action OnObjectivesUpdated = notify => { }; - - public IEnumerable Objectives { get { return new[] { killnikoomba, levelvillage }; } } - - Objective killnikoomba = new Objective(ObjectiveType.Primary, KillNikoombaText, ObjectiveStatus.InProgress); - Objective levelvillage = new Objective(ObjectiveType.Primary, LevelVillageText, ObjectiveStatus.Inactive); - - const string KillNikoombaText = "Find Nikoomba. Once found he must be assasinated."; - const string LevelVillageText = "Nikoomba has met his demise, now level the village."; - - Player nod; - - Actor nikoomba; - Actor vil01; - Actor vil02; - Actor vil03; - Actor vil04; - Actor vil05; - Actor vil06; - Actor vil07; - Actor vil08; - Actor vil09; - Actor vil10; - Actor vil11; - Actor vil12; - Actor vil13; - Actor civ01; - Actor civ02; - Actor civ03; - Actor civ04; - Actor civ05; - Actor civ06; - Actor civ07; - - Actor nr1; - Actor nr2; - Actor nr3; - - World world; - - const string ReInfE1 = "E1"; - const string ReInfE3 = "E3"; - - void MissionFailed(string text) - { - MissionUtils.CoopMissionFailed(world, text, nod); - } - - void MissionAccomplished(string text) - { - MissionUtils.CoopMissionAccomplished(world, text, nod); - } - - public void Tick(Actor self) - { - if (nod.WinState != WinState.Undefined) return; - - if (world.FrameNumber == 700) - { - NODReinforceNthA(); - Sound.Play("reinfor1.aud"); - } - - if (world.FrameNumber == 1400) - { - NODReinforceNthB(); - Sound.Play("reinfor1.aud"); - } - - if (killnikoomba.Status == ObjectiveStatus.InProgress) - { - if (nikoomba.Destroyed) - { - killnikoomba.Status = ObjectiveStatus.Completed; - levelvillage.Status = ObjectiveStatus.InProgress; - OnObjectivesUpdated(true); - NODReinforceNWstA(); - Sound.Play("reinfor1.aud"); - } - } - - if (levelvillage.Status == ObjectiveStatus.InProgress) - { - if (vil01.Destroyed && vil02.Destroyed && vil03.Destroyed && vil04.Destroyed && vil05.Destroyed && vil06.Destroyed && - vil07.Destroyed && vil08.Destroyed && vil09.Destroyed && vil10.Destroyed && vil11.Destroyed && vil12.Destroyed && - vil13.Destroyed && civ01.Destroyed && civ02.Destroyed && civ03.Destroyed && civ04.Destroyed && civ05.Destroyed && - civ06.Destroyed && civ07.Destroyed) - { - levelvillage.Status = ObjectiveStatus.Completed; - OnObjectivesUpdated(true); - Sound.StopMusic(); - MissionAccomplished("Nikoomba was killed and the village was destroyed."); - } - } - - var unitsAndBuildings = world.Actors.Where(a => !a.IsDead() && a.IsInWorld && (a.HasTrait() || (a.HasTrait() && !a.HasTrait()))); - - if (!unitsAndBuildings.Any(a => a.Owner == nod)) - { - Action afterFMV = () => - { - Sound.StopMusic(); - MissionFailed("The Nod forces in the area have been wiped out."); - }; - Game.RunAfterDelay(0, () => Media.PlayFMVFullscreen(world, "nodlose.vqa", afterFMV)); - } - } - - void NODReinforceNthA() - { - nr1 = world.CreateActor(true, ReInfE1, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr1.Location) }); - nr1.QueueActivity(nr1.Trait().ScriptedMove(nr1.Location - new CVec(0, -2))); - nr1 = world.CreateActor(true, ReInfE1, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr1.Location) }); - nr1.QueueActivity(nr1.Trait().ScriptedMove(nr1.Location - new CVec(0, -2))); - } - - void NODReinforceNthB() - { - nr2 = world.CreateActor(true, ReInfE1, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr2.Location) }); - nr2.QueueActivity(nr2.Trait().ScriptedMove(nr2.Location - new CVec(0, -2))); - nr2 = world.CreateActor(true, ReInfE1, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr2.Location) }); - nr2.QueueActivity(nr2.Trait().ScriptedMove(nr2.Location - new CVec(0, -2))); - } - - void NODReinforceNWstA() - { - nr3 = world.CreateActor(true, ReInfE3, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr3.Location) }); - nr3.QueueActivity(nr3.Trait().ScriptedMove(nr3.Location - new CVec(0, -5))); - nr3 = world.CreateActor(true, ReInfE3, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr3.Location) }); - nr3.QueueActivity(nr3.Trait().ScriptedMove(nr3.Location - new CVec(0, -5))); - nr3 = world.CreateActor(true, ReInfE3, new TypeDictionary { new OwnerInit(nod), new LocationInit(nr3.Location) }); - nr3.QueueActivity(nr3.Trait().ScriptedMove(nr3.Location - new CVec(0, -5))); - } - - public void WorldLoaded(World w, WorldRenderer wr) - { - world = w; - nod = w.Players.Single(p => p.InternalName == "NOD"); - nod.PlayerActor.Trait().Cash = 0; - var actors = w.WorldActor.Trait().Actors; - nikoomba = actors["Nikoomba"]; - vil01 = actors["Vil01"]; - vil02 = actors["Vil02"]; - vil03 = actors["Vil03"]; - vil04 = actors["Vil04"]; - vil05 = actors["Vil05"]; - vil06 = actors["Vil06"]; - vil07 = actors["Vil07"]; - vil08 = actors["Vil08"]; - vil09 = actors["Vil09"]; - vil10 = actors["Vil10"]; - vil11 = actors["Vil11"]; - vil12 = actors["Vil12"]; - vil13 = actors["Vil13"]; - civ01 = actors["Civ01"]; - civ02 = actors["Civ02"]; - civ03 = actors["Civ03"]; - civ04 = actors["Civ04"]; - civ05 = actors["Civ05"]; - civ06 = actors["Civ06"]; - civ07 = actors["Civ07"]; - nr1 = actors["NODReinforceNthA"]; - nr2 = actors["NODReinforceNthB"]; - nr3 = actors["NODReinforceNWstA"]; - - wr.Viewport.Center(nr1.Location.CenterPosition); - Game.RunAfterDelay(0, () => Media.PlayFMVFullscreen(w, "nod1pre.vqa", () => - Media.PlayFMVFullscreen(w, "nod1.vqa", MissionUtils.PlayMissionMusic))); - } - } -} diff --git a/mods/cnc/maps/nod01/map.yaml b/mods/cnc/maps/nod01/map.yaml index 8e849ce85b..69cd8cbff4 100644 --- a/mods/cnc/maps/nod01/map.yaml +++ b/mods/cnc/maps/nod01/map.yaml @@ -6,9 +6,9 @@ RequiresMod: cnc Title: Nikoomba's Demise -Description: Conversion of first Nod mission from Cnc +Description: Conversion of the first Nod mission -Author: Dan9550 +Author: Westwood Studios Tileset: DESERT @@ -35,18 +35,18 @@ Players: OwnsWorld: True NonCombatant: True Race: gdi - PlayerReference@Creeps: - Name: Creeps + PlayerReference@Villagers: + Name: Villagers NonCombatant: True Race: gdi PlayerReference@GDI: Name: GDI Race: gdi ColorRamp: 31,222,183 - Allies: Creeps - Enemies: NOD - PlayerReference@NOD: - Name: NOD + Allies: Villagers + Enemies: Nod + PlayerReference@Nod: + Name: Nod Playable: True AllowBots: False Required: True @@ -56,7 +56,7 @@ Players: ColorRamp: 3,255,127 LockSpawn: True LockTeam: True - Enemies: GDI,Creeps + Enemies: GDI,Villagers Actors: Actor0: rock2 @@ -136,67 +136,67 @@ Actors: Owner: Neutral Vil01: v21 Location: 29,23 - Owner: Creeps + Owner: Villagers Vil02: v24 Location: 22,24 - Owner: Creeps + Owner: Villagers Vil03: v24 Location: 21,16 - Owner: Creeps + Owner: Villagers Vil04: v32 Location: 21,20 - Owner: Creeps + Owner: Villagers Vil05: v27 Location: 22,21 - Owner: Creeps + Owner: Villagers Vil06: v20 Location: 21,21 - Owner: Creeps + Owner: Villagers Vil07: v26 Location: 22,23 - Owner: Creeps + Owner: Villagers Vil08: v20 Location: 27,23 - Owner: Creeps + Owner: Villagers Vil09: v22 Location: 26,23 - Owner: Creeps + Owner: Villagers Vil10: v23 Location: 26,22 - Owner: Creeps + Owner: Villagers Vil11: v26 Location: 26,21 - Owner: Creeps + Owner: Villagers Vil12: v25 Location: 29,21 - Owner: Creeps + Owner: Villagers Vil13: v30 Location: 32,18 - Owner: Creeps + Owner: Villagers Civ01: c9 Location: 28,20 - Owner: Creeps + Owner: Villagers Civ02: c6 Location: 28,19 - Owner: Creeps + Owner: Villagers Civ03: c8 Location: 27,19 - Owner: Creeps + Owner: Villagers Civ04: c7 Location: 29,20 - Owner: Creeps + Owner: Villagers Civ05: c4 Location: 31,19 - Owner: Creeps + Owner: Villagers Civ06: c2 Location: 30,19 - Owner: Creeps + Owner: Villagers Civ07: c5 Location: 29,19 - Owner: Creeps + Owner: Villagers Nikoomba: c10 Location: 29,16 - Owner: Creeps + Owner: Villagers Actor46: e1 Location: 28,28 Owner: GDI @@ -244,43 +244,49 @@ Actors: Owner: GDI Actor61: e1 Location: 52,17 - Owner: NOD + Owner: Nod Actor62: e1 Location: 51,17 - Owner: NOD + Owner: Nod Actor63: e1 Location: 51,16 - Owner: NOD + Owner: Nod Actor64: e1 Location: 52,16 - Owner: NOD + Owner: Nod Actor65: e1 Location: 55,17 - Owner: NOD + Owner: Nod Actor66: e1 Location: 56,17 - Owner: NOD + Owner: Nod Actor67: e1 Location: 56,16 - Owner: NOD + Owner: Nod Actor68: e1 Location: 55,16 - Owner: NOD + Owner: Nod Actor69: bggy Location: 53,16 - Owner: NOD + Owner: Nod Actor70: bggy Location: 54,16 - Owner: NOD - NODReinforceNthA: waypoint + Owner: Nod + StartSpawnPointLeft: waypoint Location: 52,14 - Owner: NOD - NODReinforceNWstA: waypoint - Location: 24,14 - Owner: NOD - NODReinforceNthB: waypoint + Owner: Nod + StartSpawnPointRight: waypoint Location: 56,14 - Owner: NOD + Owner: Nod + StartRallyPoint: waypoint + Location: 54,16 + Owner: Nod + VillageSpawnPoint: waypoint + Location: 24,14 + Owner: Nod + VillageRallyPoint: waypoint + Location: 24,17 + Owner: Nod Actor27: jeep Location: 31,28 Owner: GDI @@ -297,12 +303,21 @@ Rules: -CrateSpawner: -SpawnMPUnits: -MPStartLocations: - Nod01Script: + LuaScriptInterface: + LuaScripts: mission.lua C10: Tooltip: Name: Nikoomba ^Bridge: Invulnerable: + ^CivBuilding: + MustBeDestroyed: + ^CivInfantry: + MustBeDestroyed: + ^Infantry: + MustBeDestroyed: + ^Vehicle: + MustBeDestroyed: Sequences: diff --git a/mods/cnc/maps/nod01/mission.lua b/mods/cnc/maps/nod01/mission.lua new file mode 100644 index 0000000000..7628104eb4 --- /dev/null +++ b/mods/cnc/maps/nod01/mission.lua @@ -0,0 +1,47 @@ +RifleInfantryReinforcements = { "e1", "e1", } +RocketInfantryReinforcements = { "e3", "e3", "e3" } + +MissionAccomplished = function() + Mission.MissionOver({ player }, nil, false) +end + +MissionFailed = function() + Mission.MissionOver(nil, { player }, false) + Media.PlayMovieFullscreen("nodlose.vqa") +end + +SendFirstInfantryReinforcements = function() + Media.PlaySpeechNotification("Reinforce") + Reinforcements.Reinforce(player, RifleInfantryReinforcements, StartSpawnPointRight.Location, StartRallyPoint.Location, 15) +end + +SendSecondInfantryReinforcements = function() + Media.PlaySpeechNotification("Reinforce") + Reinforcements.Reinforce(player, RifleInfantryReinforcements, StartSpawnPointLeft.Location, StartRallyPoint.Location, 15) +end + +SendLastInfantryReinforcements = function() + Media.PlaySpeechNotification("Reinforce") + Reinforcements.Reinforce(player, RocketInfantryReinforcements, VillageSpawnPoint.Location, VillageRallyPoint.Location, 15) +end + +WorldLoaded = function() + player = OpenRA.GetPlayer("Nod") + enemy = OpenRA.GetPlayer("Villagers") + + Media.PlayMovieFullscreen("nod1pre.vqa", function() Media.PlayMovieFullscreen("nod1.vqa") end) + + Actor.OnKilled(Nikoomba, SendLastInfantryReinforcements) + + OpenRA.RunAfterDelay(25 * 30, SendFirstInfantryReinforcements) + OpenRA.RunAfterDelay(25 * 60, SendSecondInfantryReinforcements) +end + +Tick = function() + if Mission.RequiredUnitsAreDestroyed(player) then + MissionFailed() + end + if Mission.RequiredUnitsAreDestroyed(enemy) then + MissionAccomplished() + end +end \ No newline at end of file From 7af935469da5e2c32165aed9ffa841c19032da1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 2 Jan 2014 16:15:07 +0100 Subject: [PATCH 2/3] hide GDI soldiers behind trees --- mods/cnc/maps/nod01/map.yaml | 90 ++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/mods/cnc/maps/nod01/map.yaml b/mods/cnc/maps/nod01/map.yaml index 69cd8cbff4..e47c291be5 100644 --- a/mods/cnc/maps/nod01/map.yaml +++ b/mods/cnc/maps/nod01/map.yaml @@ -59,6 +59,51 @@ Players: Enemies: GDI,Villagers Actors: + Actor46: e1 + Location: 28,28 + Owner: GDI + Actor47: e1 + Location: 29,28 + Owner: GDI + Actor48: e1 + Location: 29,30 + Owner: GDI + Actor49: e1 + Location: 33,35 + Owner: GDI + Actor50: e1 + Location: 34,36 + Owner: GDI + Actor51: e1 + Location: 41,19 + Owner: GDI + Actor52: e1 + Location: 40,19 + Owner: GDI + Actor53: e1 + Location: 40,18 + Owner: GDI + Actor54: e1 + Location: 40,31 + Owner: GDI + Actor55: e1 + Location: 43,34 + Owner: GDI + Actor56: e1 + Location: 46,22 + Owner: GDI + Actor57: e1 + Location: 51,25 + Owner: GDI + Actor58: e1 + Location: 51,30 + Owner: GDI + Actor59: e1 + Location: 55,33 + Owner: GDI + Actor60: e1 + Location: 56,32 + Owner: GDI Actor0: rock2 Location: 54,14 Owner: Neutral @@ -197,51 +242,6 @@ Actors: Nikoomba: c10 Location: 29,16 Owner: Villagers - Actor46: e1 - Location: 28,28 - Owner: GDI - Actor47: e1 - Location: 29,28 - Owner: GDI - Actor48: e1 - Location: 29,30 - Owner: GDI - Actor49: e1 - Location: 33,35 - Owner: GDI - Actor50: e1 - Location: 34,36 - Owner: GDI - Actor51: e1 - Location: 41,19 - Owner: GDI - Actor52: e1 - Location: 40,19 - Owner: GDI - Actor53: e1 - Location: 40,18 - Owner: GDI - Actor54: e1 - Location: 40,31 - Owner: GDI - Actor55: e1 - Location: 43,34 - Owner: GDI - Actor56: e1 - Location: 46,22 - Owner: GDI - Actor57: e1 - Location: 51,25 - Owner: GDI - Actor58: e1 - Location: 51,30 - Owner: GDI - Actor59: e1 - Location: 55,33 - Owner: GDI - Actor60: e1 - Location: 56,32 - Owner: GDI Actor61: e1 Location: 52,17 Owner: Nod From 752562dca72d776e56e6ce4257d5719b9cca2ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 2 Jan 2014 17:43:16 +0100 Subject: [PATCH 3/3] added a description that can be displayed as mission briefing --- mods/cnc/maps/nod01/map.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/cnc/maps/nod01/map.yaml b/mods/cnc/maps/nod01/map.yaml index e47c291be5..7882b6dd08 100644 --- a/mods/cnc/maps/nod01/map.yaml +++ b/mods/cnc/maps/nod01/map.yaml @@ -6,7 +6,7 @@ RequiresMod: cnc Title: Nikoomba's Demise -Description: Conversion of the first Nod mission +Description: In order for the Brotherhood to gain a foothold, we must begin by eliminating certain elements. Nikoomba, the nearby village's leader, is one such element. His views and ours do not coincide. He and his whole group must be eliminated. Author: Westwood Studios