diff --git a/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs index 955e58b4d7..68feddcb9f 100644 --- a/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs @@ -59,6 +59,12 @@ namespace OpenRA.Mods.Common.Scripting return true; } + [Desc("Returns the first n values from a collection.")] + public LuaValue[] Take(int n, LuaValue[] source) + { + return source.Take(n).ToArray(); + } + [Desc("Skips over the first numElements members of a table and return the rest.")] public LuaTable Skip(LuaTable table, int numElements) { diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs index fbedf9b41a..4be4b6839a 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs @@ -9,6 +9,7 @@ #endregion using System; +using System.Collections.Generic; using System.Linq; using Eluant; using OpenRA.Mods.Common.Traits; @@ -32,5 +33,20 @@ namespace OpenRA.Mods.Common.Scripting .Where(a => a.Owner == Player && !a.IsDead && a.IsInWorld && a.HasTrait()) .ToArray(); } + + [Desc("Returns all living actors of the specified type of this player")] + public Actor[] GetActorsByType(string type) + { + var result = new List(); + + ActorInfo ai; + if (!Context.World.Map.Rules.Actors.TryGetValue(type, out ai)) + throw new LuaException("Unknown actor type '{0}'".F(type)); + + result.AddRange(Player.World.ActorMap.ActorsInWorld() + .Where(actor => actor.Owner == Player && !actor.IsDead && actor.IsInWorld && actor.Info.Name == ai.Name)); + + return result.ToArray(); + } } } diff --git a/OpenRA.sln b/OpenRA.sln index 5f261293e6..60e0005e27 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -30,6 +30,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts", mods\cnc\maps\gdi04b\gdi04b.lua = mods\cnc\maps\gdi04b\gdi04b.lua mods\cnc\maps\gdi04c\gdi04c.lua = mods\cnc\maps\gdi04c\gdi04c.lua mods\cnc\maps\gdi05a\gdi05a.lua = mods\cnc\maps\gdi05a\gdi05a.lua + mods\cnc\maps\gdi05b\gdi05b.lua = mods\cnc\maps\gdi05b\gdi05b.lua mods\cnc\maps\nod01\nod01.lua = mods\cnc\maps\nod01\nod01.lua mods\cnc\maps\nod02a\nod02a.lua = mods\cnc\maps\nod02a\nod02a.lua mods\cnc\maps\nod02b\nod02b.lua = mods\cnc\maps\nod02b\nod02b.lua diff --git a/mods/cnc/maps/gdi05b/gdi05b.lua b/mods/cnc/maps/gdi05b/gdi05b.lua new file mode 100644 index 0000000000..8ec36d355e --- /dev/null +++ b/mods/cnc/maps/gdi05b/gdi05b.lua @@ -0,0 +1,194 @@ +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 = +{ + { { ['e1'] = 1, ['e3'] = 3 }, AtkRoute2 }, + { { ['e1'] = 3, ['e3'] = 1 }, AtkRoute2 }, + { { ['e3'] = 4 } , AtkRoute1 }, + { { ['e1'] = 4 } , AtkRoute1 }, + { { ['bggy'] = 1 } , AtkRoute1 }, + { { ['bggy'] = 1 } , AtkRoute2 }, + { { ['ltnk'] = 1 } , AtkRoute1 }, + { { ['ltnk'] = 1 } , 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 = nod.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[1]) do + MoveThenHunt(Utils.Take(count, nod.GetActorsByType(type)), team[2]) + end + + Trigger.AfterDelay(Utils.RandomInteger(AutoAtkMinDelay, AutoAtkMaxDelay), AutoCreateTeam) +end + +DiscoverGdiBase = function(actor, discoverer) + if baseDiscovered or not discoverer == gdi then + return + end + + Utils.Do(GdiBase, function(actor) + actor.Owner = gdi + end) + GdiHarv.FindResources() + + baseDiscovered = true + + gdiObjective3 = gdi.AddPrimaryObjective("Eliminate all Nod forces in the area") + gdi.MarkCompletedObjective(gdiObjective1) +end + +Atk1TriggerFunction = function() + MoveThenHunt(Utils.Take(2, nod.GetActorsByType('e1')), AtkRoute1) + MoveThenHunt(Utils.Take(3, nod.GetActorsByType('e3')), AtkRoute1) +end + +Atk2TriggerFunction = function() + MoveThenHunt(Utils.Take(3, nod.GetActorsByType('e1')), AtkRoute2) + MoveThenHunt(Utils.Take(3, nod.GetActorsByType('e3')), AtkRoute2) +end + +Atk3TriggerFunction = function() + MoveThenHunt(Utils.Take(1, nod.GetActorsByType('bggy')), AtkRoute1) +end + +Atk4TriggerFunction = function() + MoveThenHunt(Utils.Take(1, nod.GetActorsByType('bggy')), AtkRoute2) +end + +Atk5TriggerFunction = function() + MoveThenHunt(Utils.Take(1, nod.GetActorsByType('ltnk')), AtkRoute2) +end + +StartProduction = function(type) + if Hand1.IsInWorld then + Hand1.Build(type) + Trigger.AfterDelay(DateTime.Seconds(30), function() StartProduction(type) end) + end +end + +InsertGdiUnits = function() + Reinforcements.Reinforce(gdi, GdiUnits, { UnitsEntry.Location, UnitsRally.Location }, 15) +end + +IdleHunt = function(unit) + if not unit.IsDead then + Trigger.OnIdle(unit, unit.Hunt) + end +end + +WorldLoaded = function() + gdi = Player.GetPlayer("GDI") + gdiBase = Player.GetPlayer("AbandonedBase") + nod = Player.GetPlayer("Nod") + + Trigger.OnObjectiveAdded(gdi, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + Trigger.OnObjectiveCompleted(gdi, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(gdi, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerWon(gdi, function() + Media.PlaySpeechNotification(nod, "Win") + end) + + Trigger.OnPlayerLost(gdi, function() + Media.PlaySpeechNotification(nod, "Lose") + end) + + Utils.Do(Map.NamedActors, function(actor) + if actor.Owner == nod and actor.HasProperty("StartBuildingRepairs") then + Trigger.OnDamaged(actor, function(building) + if building.Owner == nod and building.Health < RepairThreshold * building.MaxHealth then + building.StartBuildingRepairs() + end + end) + end + end) + + gdiObjective1 = gdi.AddPrimaryObjective("Find the GDI base") + gdiObjective2 = gdi.AddSecondaryObjective("Destroy all SAM sites to receive air support") + nodObjective = nod.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 == gdi 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() + gdi.MarkCompletedObjective(gdiObjective2) + Actor.Create("airstrike.proxy", true, { Owner = gdi }) + end) + + Camera.Position = UnitsRally.CenterPosition + + InsertGdiUnits() +end + +Tick = function() + if gdi.HasNoRequiredUnits() then + if DateTime.GameTime > 2 then + nod.MarkCompletedObjective(nodObjective) + end + end + if baseDiscovered and nod.HasNoRequiredUnits() then + gdi.MarkCompletedObjective(gdiObjective3) + end +end diff --git a/mods/cnc/maps/gdi05b/map.bin b/mods/cnc/maps/gdi05b/map.bin new file mode 100644 index 0000000000..3462de6bff Binary files /dev/null and b/mods/cnc/maps/gdi05b/map.bin differ diff --git a/mods/cnc/maps/gdi05b/map.png b/mods/cnc/maps/gdi05b/map.png new file mode 100644 index 0000000000..8d422c298d Binary files /dev/null and b/mods/cnc/maps/gdi05b/map.png differ diff --git a/mods/cnc/maps/gdi05b/map.yaml b/mods/cnc/maps/gdi05b/map.yaml new file mode 100644 index 0000000000..75fdd17378 --- /dev/null +++ b/mods/cnc/maps/gdi05b/map.yaml @@ -0,0 +1,786 @@ +MapFormat: 7 + +RequiresMod: cnc + +Title: Repair the GDI base (b) + +Description: A GDI field base is under attack. They have fended off one attack but will not survive another.\n\nMove to the base, repair the structures and then launch a strike force to destroy the Nod base in the area.\n\nDestroy all Nod units and structures. + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 64,64 + +Bounds: 8,13,51,47 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + BackgroundInfo: podium.vqa + Briefing: gdi5.vqa + GameStart: seige.vqa + GameWon: nodlose.vqa + GameLost: gdilose.vqa + +Options: + Crates: False + Creeps: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 4000 + ConfigurableStartingUnits: False + ShortGame: False + +Players: + PlayerReference@Nod: + Name: Nod + Race: nod + ColorRamp: 3,255,127 + Enemies: GDI, Neutral, AbandonedBase + PlayerReference@GDI: + Name: GDI + Playable: True + AllowBots: False + Required: True + LockRace: True + Race: gdi + LockColor: True + ColorRamp: 31,222,183 + LockSpawn: True + LockTeam: True + Enemies: Nod + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: gdi + ColorRamp: 31,222,183 + Enemies: Nod + PlayerReference@AbandonedBase: + Name: AbandonedBase + OwnsWorld: True + NonCombatant: True + Race: gdi + ColorRamp: 31,222,183 + Enemies: Nod + +Actors: + Actor0: sbag + Location: 38,59 + Owner: Neutral + Actor1: sbag + Location: 37,59 + Owner: Neutral + Actor2: sbag + Location: 36,59 + Owner: Neutral + Actor3: sbag + Location: 35,59 + Owner: Neutral + Actor4: sbag + Location: 34,59 + Owner: Neutral + Actor5: sbag + Location: 33,59 + Owner: Neutral + Actor6: sbag + Location: 32,59 + Owner: Neutral + Actor7: sbag + Location: 31,59 + Owner: Neutral + Actor8: sbag + Location: 30,59 + Owner: Neutral + Actor9: sbag + Location: 29,59 + Owner: Neutral + Actor10: sbag + Location: 28,59 + Owner: Neutral + Actor11: sbag + Location: 27,59 + Owner: Neutral + Actor12: sbag + Location: 26,59 + Owner: Neutral + Actor13: sbag + Location: 25,59 + Owner: Neutral + Actor14: sbag + Location: 25,58 + Owner: Neutral + Actor15: sbag + Location: 25,57 + Owner: Neutral + Actor16: sbag + Location: 24,57 + Owner: Neutral + Actor17: sbag + Location: 38,54 + Owner: Neutral + Actor18: sbag + Location: 25,54 + Owner: Neutral + Actor19: sbag + Location: 24,54 + Owner: Neutral + Actor20: sbag + Location: 38,53 + Owner: Neutral + Actor21: sbag + Location: 25,53 + Owner: Neutral + Actor22: sbag + Location: 25,51 + Owner: Neutral + Actor23: sbag + Location: 38,50 + Owner: Neutral + Actor24: sbag + Location: 37,50 + Owner: Neutral + Actor25: sbag + Location: 36,50 + Owner: Neutral + Actor26: sbag + Location: 35,50 + Owner: Neutral + Actor27: sbag + Location: 34,50 + Owner: Neutral + Actor28: sbag + Location: 33,50 + Owner: Neutral + Actor29: sbag + Location: 32,50 + Owner: Neutral + Actor30: sbag + Location: 31,50 + Owner: Neutral + Actor31: sbag + Location: 30,50 + Owner: Neutral + Actor32: sbag + Location: 29,50 + Owner: Neutral + Actor33: sbag + Location: 27,50 + Owner: Neutral + Actor34: sbag + Location: 26,50 + Owner: Neutral + Actor35: sbag + Location: 25,50 + Owner: Neutral + Actor36: sbag + Location: 54,26 + Owner: Neutral + Actor37: sbag + Location: 53,26 + Owner: Neutral + Actor38: sbag + Location: 52,26 + Owner: Neutral + Actor39: sbag + Location: 51,26 + Owner: Neutral + Actor40: sbag + Location: 50,26 + Owner: Neutral + Actor41: sbag + Location: 45,26 + Owner: Neutral + Actor42: sbag + Location: 44,26 + Owner: Neutral + Actor43: sbag + Location: 43,26 + Owner: Neutral + Actor44: sbag + Location: 42,26 + Owner: Neutral + Actor45: sbag + Location: 41,26 + Owner: Neutral + Actor46: sbag + Location: 40,26 + Owner: Neutral + Actor47: sbag + Location: 39,26 + Owner: Neutral + Actor48: sbag + Location: 38,26 + Owner: Neutral + Actor49: sbag + Location: 37,26 + Owner: Neutral + Actor50: sbag + Location: 54,25 + Owner: Neutral + Actor51: sbag + Location: 51,25 + Owner: Neutral + Actor52: sbag + Location: 50,25 + Owner: Neutral + Actor53: sbag + Location: 45,25 + Owner: Neutral + Actor54: sbag + Location: 44,25 + Owner: Neutral + Actor55: sbag + Location: 37,25 + Owner: Neutral + Actor56: sbag + Location: 37,24 + Owner: Neutral + Actor57: sbag + Location: 37,23 + Owner: Neutral + Actor58: t01 + Location: 22,51 + Owner: Neutral + Actor59: t01 + Location: 24,50 + Owner: Neutral + Actor60: t01 + Location: 28,49 + Owner: Neutral + Actor61: t05 + Location: 30,15 + Owner: Neutral + Actor62: t03 + Location: 13,34 + Owner: Neutral + Actor63: t03 + Location: 26,42 + Owner: Neutral + Actor64: tc04 + Location: 26,37 + Owner: Neutral + Actor65: tc02 + Location: 22,50 + Owner: Neutral + Actor66: t01 + Location: 24,30 + Owner: Neutral + Actor67: tc01 + Location: 8,23 + Owner: Neutral + Actor68: tc02 + Location: 21,22 + Owner: Neutral + Actor69: tc04 + Location: 39,26 + Owner: Neutral + Actor70: tc02 + Location: 10,25 + Owner: Neutral + Actor71: t07 + Location: 46,42 + Owner: Neutral + Actor72: t12 + Location: 46,39 + Owner: Neutral + Actor73: tc04 + Location: 48,41 + Owner: Neutral + Actor74: tc01 + Location: 12,32 + Owner: Neutral + Actor75: tc04 + Location: 20,23 + Owner: Neutral + Actor76: t01 + Location: 20,40 + Owner: Neutral + Actor77: t05 + Location: 8,48 + Owner: Neutral + Actor78: t06 + Location: 18,45 + Owner: Neutral + Actor79: tc01 + Location: 8,58 + Owner: Neutral + Actor80: tc04 + Location: 20,52 + Owner: Neutral + Actor81: tc04 + Location: 17,32 + Owner: Neutral + Actor82: t01 + Location: 31,41 + Owner: Neutral + Actor83: t01 + Location: 31,44 + Owner: Neutral + Actor84: t01 + Location: 22,40 + Owner: Neutral + Actor85: t02 + Location: 27,42 + Owner: Neutral + Actor86: t02 + Location: 17,41 + Owner: Neutral + Actor87: t05 + Location: 19,42 + Owner: Neutral + Actor88: tc01 + Location: 27,15 + Owner: Neutral + Actor89: tc04 + Location: 17,17 + Owner: Neutral + Actor90: t07 + Location: 44,26 + Owner: Neutral + Actor91: t07 + Location: 23,29 + Owner: Neutral + Actor92: t07 + Location: 50,30 + Owner: Neutral + Actor93: t16 + Location: 38,47 + Owner: Neutral + Actor94: tc02 + Location: 38,48 + Owner: Neutral + Actor95: tc02 + Location: 44,43 + Owner: Neutral + Actor96: tc01 + Location: 14,22 + Owner: Neutral + Actor97: tc04 + Location: 16,21 + Owner: Neutral + Actor98: t01 + Location: 22,35 + Owner: Neutral + Actor99: t06 + Location: 34,44 + Owner: Neutral + Actor100: tc01 + Location: 55,25 + Owner: Neutral + Actor101: tc02 + Location: 40,30 + Owner: Neutral + Actor102: t03 + Location: 36,24 + Owner: Neutral + Actor121: gun + Location: 50,27 + Owner: Nod + Facing: 128 + Actor122: gun + Location: 45,27 + Owner: Nod + Facing: 128 + Actor127: gun + Location: 36,24 + Owner: Nod + Facing: 192 + Actor128: bggy + Location: 39,19 + Owner: Nod + Facing: 128 + Actor129: bggy + Location: 38,23 + Owner: Nod + Facing: 192 + Actor130: ltnk + Location: 38,24 + Owner: Nod + Facing: 192 + Actor131: ltnk + Location: 45,21 + Owner: Nod + Facing: 128 + Actor132: ltnk + Location: 44,21 + Owner: Nod + Facing: 128 + Actor133: bggy + Location: 23,32 + Owner: Nod + Facing: 224 + Actor134: ltnk + Location: 13,32 + Owner: Nod + Facing: 224 + Actor135: ltnk + Location: 48,41 + Owner: Nod + Facing: 96 + Actor142: bggy + Location: 53,27 + Owner: Nod + Facing: 160 + Actor143: bggy + Location: 42,27 + Owner: Nod + Facing: 96 + Actor144: e3 + Location: 23,29 + Owner: Nod + Facing: 96 + SubCell: 4 + Actor145: e3 + Location: 40,30 + Owner: Nod + SubCell: 0 + Actor146: e3 + Location: 35,31 + Owner: Nod + SubCell: 2 + Actor147: e3 + Location: 43,27 + Owner: Nod + Facing: 128 + SubCell: 0 + Actor148: e3 + Location: 11,39 + Owner: Nod + SubCell: 1 + Actor149: e1 + Location: 18,25 + Owner: Nod + SubCell: 1 + Actor150: e1 + Location: 18,40 + Owner: Nod + Facing: 96 + SubCell: 4 + Actor151: e3 + Location: 12,38 + Owner: Nod + Facing: 224 + SubCell: 4 + Actor152: e3 + Location: 12,40 + Owner: Nod + Facing: 224 + SubCell: 1 + Actor153: e3 + Location: 44,43 + Owner: Nod + Facing: 64 + SubCell: 1 + Actor154: e1 + Location: 17,27 + Owner: Nod + Facing: 160 + SubCell: 1 + Actor163: e1 + Location: 17,25 + Owner: Nod + Facing: 128 + SubCell: 3 + Actor164: e3 + Location: 21,22 + Owner: Nod + Facing: 96 + SubCell: 2 + Actor165: e3 + Location: 18,41 + Owner: Nod + SubCell: 3 + Actor166: e3 + Location: 17,41 + Owner: Nod + Facing: 160 + SubCell: 4 + waypoint27: waypoint + Location: 32,41 + Owner: Neutral + waypoint26: waypoint + Location: 8,13 + Owner: Neutral + waypoint11: waypoint + Location: 34,20 + Owner: Neutral + waypoint10: waypoint + Location: 34,29 + Owner: Neutral + waypoint9: waypoint + Location: 56,29 + Owner: Neutral + waypoint8: waypoint + Location: 20,57 + Owner: Neutral + waypoint7: waypoint + Location: 11,51 + Owner: Neutral + waypoint6: waypoint + Location: 12,30 + Owner: Neutral + waypoint5: waypoint + Location: 12,21 + Owner: Neutral + waypoint4: waypoint + Location: 35,22 + Owner: Neutral + waypoint3: waypoint + Location: 42,54 + Owner: Neutral + waypoint2: waypoint + Location: 53,53 + Owner: Neutral + waypoint1: waypoint + Location: 53,42 + Owner: Neutral + waypoint0: waypoint + Location: 47,27 + Owner: Neutral + UnitsEntry: waypoint + Location: 11,13 + Owner: Neutral + UnitsRally: waypoint + Location: 12,17 + Owner: Neutral + Silo1: silo + Location: 51,20 + Owner: Nod + Nuke1: nuke + Location: 45,18 + Owner: Nod + Proc1: proc + Location: 46,21 + Owner: Nod + Silo2: silo + Location: 49,22 + Owner: Nod + Silo3: silo + Location: 49,20 + Owner: Nod + Silo4: silo + Location: 51,22 + Owner: Nod + Afld1: afld + Location: 40,18 + Owner: Nod + Hand1: hand + Location: 41,21 + Owner: Nod + Nuke2: nuke + Location: 47,18 + Owner: Nod + Nuke3: nuke + Location: 49,17 + Owner: Nod + Fact1: fact + Location: 51,17 + Owner: Nod + GdiNuke1: nuke + Location: 33,51 + Owner: AbandonedBase + Health: 0.4570313 + GdiProc1: proc + Location: 27,52 + Owner: AbandonedBase + Health: 0.4765625 + FreeActor: False + GdiHarv: harv + Location: 27,55 + Owner: AbandonedBase + Facing: 64 + GdiWeap1: weap + Location: 35,51 + Owner: AbandonedBase + Health: 0.4140625 + GdiNuke2: nuke + Location: 31,51 + Owner: AbandonedBase + Health: 0.3945313 + GdiPyle1: pyle + Location: 31,54 + Owner: AbandonedBase + Health: 0.4570313 + GdiSilo1: silo + Location: 26,51 + Owner: AbandonedBase + Health: 0.40625 + GdiSilo2: silo + Location: 29,51 + Owner: AbandonedBase + Sam1: sam + Location: 52,25 + Owner: Nod + Sam2: sam + Location: 38,25 + Owner: Nod + Sam3: sam + Location: 40,17 + Owner: Nod + Sam4: sam + Location: 26,37 + Owner: Nod + +Smudges: + sc3 15,56 0: + sc2 40,53 0: + sc2 24,53 0: + sc5 39,52 0: + sc1 24,52 0: + sc4 39,51 0: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + EnemyWatcher: + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + LuaScript: + Scripts: gdi05b.lua + ^Vehicle: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Tank: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Helicopter: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Infantry: + SpawnViceroid: + Probability: 0 + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Plane: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Ship: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + AnnounceOnSeen: + ^Wall: + Tooltip: + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + SBAG: + Buildable: + Prerequisites: ~disabled + GTWR: + Buildable: + Prerequisites: ~disabled + ATWR: + Buildable: + Prerequisites: ~disabled + WEAP: + Buildable: + Prerequisites: ~disabled + CYCL: + Buildable: + Prerequisites: ~disabled + NUK2: + Buildable: + Prerequisites: ~disabled + FIX: + Buildable: + Prerequisites: ~disabled + HPAD: + Buildable: + Prerequisites: ~disabled + BRIK: + Buildable: + Prerequisites: ~disabled + EYE: + Buildable: + Prerequisites: ~disabled + GUN: + Buildable: + Prerequisites: ~disabled + OBLI: + Buildable: + Prerequisites: ~disabled + TMPL: + Buildable: + Prerequisites: ~disabled + E2: + Buildable: + Prerequisites: ~pyle + E3: + Buildable: + Prerequisites: ~disabled + HARV: + Buildable: + Prerequisites: ~disabled + MTNK: + Buildable: + Prerequisites: ~disabled + HTNK: + Buildable: + Prerequisites: ~disabled + RMBO: + Buildable: + Prerequisites: ~disabled + MSAM: + Buildable: + Prerequisites: ~disabled + MCV: + Buildable: + Prerequisites: ~disabled + FTNK: + Buildable: + Prerequisites: ~disabled + airstrike.proxy: + AirstrikePower: + Icon: airstrike + StartFullyCharged: True + ChargeTime: 120 + SquadSize: 1 + QuantizedFacings: 8 + Description: Air Strike + LongDesc: Deploy an aerial napalm strike.\nBurns buildings and infantry along a line. + EndChargeSound: airredy1.aud + SelectTargetSound: select1.aud + InsufficientPowerSound: nopower1.aud + IncomingSound: enemya.aud + UnitType: a10 + DisplayBeacon: True + BeaconPoster: airstrike + DisplayRadarPing: True + CameraActor: camera + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index 3cec5f8b64..9a8dfee81f 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -6,6 +6,7 @@ GDI Campaign: ./mods/cnc/maps/gdi04b ./mods/cnc/maps/gdi04c ./mods/cnc/maps/gdi05a + ./mods/cnc/maps/gdi05b Nod Campaign: ./mods/cnc/maps/nod01