diff --git a/OpenRA.sln b/OpenRA.sln index 9963797ee2..d1d53e0ee3 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -37,6 +37,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts", mods\cnc\maps\nod03a\nod03a.lua = mods\cnc\maps\nod03a\nod03a.lua mods\cnc\maps\nod03b\nod03b.lua = mods\cnc\maps\nod03b\nod03b.lua mods\cnc\maps\nod04a\nod04a.lua = mods\cnc\maps\nod04a\nod04a.lua + mods\cnc\maps\nod04b\nod04b.lua = mods\cnc\maps\nod04b\nod04b.lua mods\cnc\maps\shellmap\shellmap.lua = mods\cnc\maps\shellmap\shellmap.lua EndProjectSection EndProject diff --git a/mods/cnc/maps/nod04a/map.yaml b/mods/cnc/maps/nod04a/map.yaml index 5258d81f03..cfdb3d1a7a 100644 --- a/mods/cnc/maps/nod04a/map.yaml +++ b/mods/cnc/maps/nod04a/map.yaml @@ -4,7 +4,7 @@ RequiresMod: cnc Title: Mao Civil War (a) -Description: A small village friendly to our cause has been increasingly harassed by GDI, and the Brotherhood, wishes you to assist them in their efforts. \n\nSeek out the enemy village and destroy it. The event will be disguised as a GDI attack. +Description: A small village friendly to our cause has been increasingly harassed by GDI, and the Brotherhood wishes you to assist them in their efforts.\n\nSeek out the enemy village and destroy it. The event will be disguised as a GDI attack. Author: Westwood Studios diff --git a/mods/cnc/maps/nod04b/map.bin b/mods/cnc/maps/nod04b/map.bin new file mode 100644 index 0000000000..674281dc6b Binary files /dev/null and b/mods/cnc/maps/nod04b/map.bin differ diff --git a/mods/cnc/maps/nod04b/map.png b/mods/cnc/maps/nod04b/map.png new file mode 100644 index 0000000000..28b02ca5b1 Binary files /dev/null and b/mods/cnc/maps/nod04b/map.png differ diff --git a/mods/cnc/maps/nod04b/map.yaml b/mods/cnc/maps/nod04b/map.yaml new file mode 100644 index 0000000000..60d711d739 --- /dev/null +++ b/mods/cnc/maps/nod04b/map.yaml @@ -0,0 +1,565 @@ +MapFormat: 7 + +RequiresMod: cnc + +Title: Oum Hadjer (b) + +Description: A small village friendly to our cause has been increasingly harassed by GDI, and the Brotherhood wishes you to assist them in their efforts.\n\nSeek out the enemy village and destroy it. The event will be disguised as a GDI attack. + +Author: Westwood Studios + +Tileset: DESERT + +MapSize: 64,64 + +Bounds: 7,17,52,44 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: nod4b.vqa + GameLost: nodlose.vqa + +Options: + Crates: False + Creeps: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 0 + ConfigurableStartingUnits: False + ShortGame: False + +Players: + PlayerReference@GDI: + Name: GDI + Race: gdi + ColorRamp: 31,222,183 + Enemies: Nod + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: gdi + Allies: GDI + Enemies: Nod + PlayerReference@Nod: + Name: Nod + Playable: True + AllowBots: False + Required: True + LockRace: True + Race: nod + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: GDI + +Actors: + Actor0: sbag + Location: 58,26 + Owner: Neutral + Actor1: sbag + Location: 57,26 + Owner: Neutral + Actor2: sbag + Location: 56,26 + Owner: Neutral + Actor3: sbag + Location: 55,26 + Owner: Neutral + Actor4: sbag + Location: 54,26 + Owner: Neutral + Actor5: sbag + Location: 53,26 + Owner: Neutral + Actor6: sbag + Location: 52,26 + Owner: Neutral + Actor7: sbag + Location: 51,26 + Owner: Neutral + Actor8: sbag + Location: 50,26 + Owner: Neutral + Actor9: sbag + Location: 49,26 + Owner: Neutral + Actor10: sbag + Location: 48,26 + Owner: Neutral + Actor11: sbag + Location: 47,26 + Owner: Neutral + Actor12: sbag + Location: 58,25 + Owner: Neutral + Actor13: sbag + Location: 47,25 + Owner: Neutral + Actor14: sbag + Location: 58,24 + Owner: Neutral + Actor15: sbag + Location: 47,24 + Owner: Neutral + Actor16: sbag + Location: 58,23 + Owner: Neutral + Actor17: sbag + Location: 58,22 + Owner: Neutral + Actor18: sbag + Location: 58,21 + Owner: Neutral + Actor19: sbag + Location: 47,21 + Owner: Neutral + Actor20: sbag + Location: 58,20 + Owner: Neutral + Actor21: sbag + Location: 47,20 + Owner: Neutral + Actor22: sbag + Location: 58,19 + Owner: Neutral + Actor23: sbag + Location: 47,19 + Owner: Neutral + Actor24: sbag + Location: 58,18 + Owner: Neutral + Actor25: sbag + Location: 57,18 + Owner: Neutral + Actor26: sbag + Location: 48,18 + Owner: Neutral + Actor27: sbag + Location: 47,18 + Owner: Neutral + Actor28: sbag + Location: 58,17 + Owner: Neutral + Actor29: sbag + Location: 57,17 + Owner: Neutral + Actor30: sbag + Location: 56,17 + Owner: Neutral + Actor31: sbag + Location: 55,17 + Owner: Neutral + Actor32: sbag + Location: 54,17 + Owner: Neutral + Actor33: sbag + Location: 53,17 + Owner: Neutral + Actor34: sbag + Location: 52,17 + Owner: Neutral + Actor35: sbag + Location: 51,17 + Owner: Neutral + Actor36: sbag + Location: 50,17 + Owner: Neutral + Actor37: sbag + Location: 49,17 + Owner: Neutral + Actor38: sbag + Location: 48,17 + Owner: Neutral + Actor39: sbag + Location: 47,17 + Owner: Neutral + Actor40: t18 + Location: 47,50 + Owner: Neutral + Actor41: t18 + Location: 46,31 + Owner: Neutral + Actor42: t08 + Location: 39,26 + Owner: Neutral + Actor43: t18 + Location: 37,25 + Owner: Neutral + Actor44: t18 + Location: 27,28 + Owner: Neutral + Actor45: t18 + Location: 54,26 + Owner: Neutral + Actor46: t18 + Location: 49,18 + Owner: Neutral + Actor47: t18 + Location: 23,54 + Owner: Neutral + Actor48: t18 + Location: 34,40 + Owner: Neutral + Actor49: t08 + Location: 16,45 + Owner: Neutral + Actor50: t08 + Location: 14,53 + Owner: Neutral + Actor52: t18 + Location: 13,44 + Owner: Neutral + Actor57: t18 + Location: 36,49 + Owner: Neutral + Actor58: t18 + Location: 44,59 + Owner: Neutral + Actor59: t18 + Location: 11,37 + Owner: Neutral + Actor60: t18 + Location: 25,20 + Owner: Neutral + Actor61: gtwr + Location: 46,21 + Owner: GDI + Actor62: gtwr + Location: 46,24 + Owner: GDI + Actor63: hosp + Location: 48,19 + Owner: GDI + Actor64: pyle + Location: 50,20 + Owner: GDI + Actor65: nuke + Location: 53,21 + Owner: GDI + Actor66: nuke + Location: 52,23 + Owner: GDI + Actor67: silo + Location: 56,24 + Owner: GDI + Actor68: silo + Location: 55,22 + Owner: GDI + Actor69: fact + Location: 53,18 + Owner: GDI + Actor70: hq + Location: 56,19 + Owner: GDI + Actor72: v36 + Location: 12,54 + Owner: Neutral + Actor73: v35 + Location: 10,54 + Owner: Neutral + Actor74: v34 + Location: 11,53 + Owner: Neutral + Actor75: v33 + Location: 15,53 + Owner: Neutral + Actor76: v32 + Location: 12,53 + Owner: Neutral + Actor77: v31 + Location: 10,52 + Owner: Neutral + Actor87: v23 + Location: 9,59 + Owner: Neutral + Actor92: jeep + Location: 51,25 + Owner: GDI + Actor93: jeep + Location: 50,25 + Owner: GDI + Actor94: jeep + Location: 39,48 + Owner: GDI + Facing: 96 + Actor110: e1 + Location: 40,49 + Owner: GDI + Facing: 224 + SubCell: 0 + Actor111: e2 + Location: 38,50 + Owner: GDI + Facing: 224 + SubCell: 2 + Actor112: e2 + Location: 38,49 + Owner: GDI + Facing: 128 + SubCell: 0 + Actor113: e2 + Location: 35,40 + Owner: GDI + SubCell: 0 + Actor114: e2 + Location: 35,40 + Owner: GDI + SubCell: 1 + waypoint27: waypoint + Location: 31,36 + Owner: Neutral + waypoint25: waypoint + Location: 40,43 + Owner: Neutral + waypoint26: waypoint + Location: 28,27 + Owner: Neutral + waypoint11: waypoint + Location: 54,29 + Owner: Neutral + waypoint10: waypoint + Location: 45,28 + Owner: Neutral + waypoint9: waypoint + Location: 52,22 + Owner: Neutral + waypoint8: waypoint + Location: 43,22 + Owner: Neutral + waypoint7: waypoint + Location: 31,22 + Owner: Neutral + waypoint6: waypoint + Location: 21,25 + Owner: Neutral + waypoint5: waypoint + Location: 18,39 + Owner: Neutral + waypoint4: waypoint + Location: 10,48 + Owner: Neutral + waypoint3: waypoint + Location: 19,48 + Owner: Neutral + waypoint2: waypoint + Location: 27,55 + Owner: Neutral + waypoint1: waypoint + Location: 48,56 + Owner: Neutral + waypoint0: waypoint + Location: 54,42 + Owner: Neutral + Convoi: apc + Location: 24,53 + Owner: GDI + CivBuilding1: v26 + Location: 8,51 + Owner: GDI + CivBuilding2: v30 + Location: 17,46 + Owner: GDI + CivBuilding3: v29 + Location: 16,46 + Owner: GDI + CivBuilding4: v28 + Location: 15,45 + Owner: GDI + CivBuilding5: v27 + Location: 14,51 + Owner: GDI + CivBuilding6: v27 + Location: 13,51 + Owner: GDI + CivBuilding7: v27 + Location: 12,51 + Owner: GDI + CivBuilding8: v26 + Location: 14,46 + Owner: GDI + CivBuilding9: v25 + Location: 19,46 + Owner: GDI + CivBuilding10: v24 + Location: 8,47 + Owner: GDI + CivBuilding11: v22 + Location: 9,45 + Owner: GDI + CivBuilding12: v22 + Location: 18,52 + Owner: GDI + CivBuilding13: v21 + Location: 16,51 + Owner: GDI + CivBuilding14: v20 + Location: 8,45 + Owner: GDI + Civilian1: c2 + Location: 11,50 + Owner: GDI + Facing: 224 + SubCell: 0 + Civilian2: c9 + Location: 12,49 + Owner: GDI + Facing: 224 + SubCell: 2 + Civilian3: c8 + Location: 14,49 + Owner: GDI + Facing: 64 + SubCell: 3 + Civilian4: c7 + Location: 13,50 + Owner: GDI + Facing: 224 + SubCell: 0 + Civilian5: c6 + Location: 11,49 + Owner: GDI + Facing: 32 + SubCell: 0 + Civilian6: c5 + Location: 12,50 + Owner: GDI + Facing: 224 + SubCell: 2 + Civilian7: c4 + Location: 10,50 + Owner: GDI + Facing: 32 + SubCell: 1 + Civilian8: c3 + Location: 10,51 + Owner: GDI + Facing: 32 + SubCell: 1 + Actor56: t18 + Location: 19,51 + Owner: Neutral + Actor55: t18 + Location: 20,46 + Owner: Neutral + Actor51: t08 + Location: 13,46 + Owner: Neutral + Actor53: t18 + Location: 7,46 + Owner: Neutral + Actor54: t18 + Location: 11,51 + Owner: Neutral + NodGunner1: e1 + Location: 41,50 + Owner: GDI + Facing: 192 + SubCell: 2 + NodGunner2: e1 + Location: 39,50 + Owner: GDI + SubCell: 0 + NodGunner3: e1 + Location: 40,50 + Owner: GDI + Facing: 64 + SubCell: 0 + EntryPointVehicle: waypoint + Location: 33,13 + Owner: Neutral + RallyPointVehicle: waypoint + Location: 33,30 + Owner: Neutral + EntryPointRocket: waypoint + Location: 35,15 + Owner: Neutral + RallyPointRocket: waypoint + Location: 34,32 + Owner: Neutral + EntryPointGunner: waypoint + Location: 31,15 + Owner: Neutral + RallyPointGunner: waypoint + Location: 32,32 + Owner: Neutral + CameraPoint: waypoint + Location: 32,22 + Owner: Neutral + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + EnemyWatcher: + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + LuaScript: + Scripts: nod04b.lua + ^Vehicle: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + AnnounceOnSeen: + ^Tank: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + AnnounceOnSeen: + ^Helicopter: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Infantry: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Wall: + Tooltip: + ShowOwnerRow: false + ^CivBuilding: + Tooltip: + ShowOwnerRow: false + ^CivBuildingHusk: + Tooltip: + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + TRAN: + RejectsOrders: + Selectable: + Selectable: false + RevealsShroud: + Range: 5c0 + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/cnc/maps/nod04b/nod04b.lua b/mods/cnc/maps/nod04b/nod04b.lua new file mode 100644 index 0000000000..7b7556dd0c --- /dev/null +++ b/mods/cnc/maps/nod04b/nod04b.lua @@ -0,0 +1,163 @@ +NodUnitsBuggy = { 'bggy', 'bggy', 'bike', 'bike' } +NodUnitsRocket = { 'e3', 'e3', 'e3', 'e3', 'e3', 'e3' } +NodUnitsGunner = { 'e1', 'e1', 'e1', 'e1', 'e1', 'e1' } + +Apc3CellTriggerActivator = { CPos.New(28,58), CPos.New(27,58), CPos.New(28,57), CPos.New(27,57), CPos.New(28,56), CPos.New(27,56), CPos.New(28,55), CPos.New(27,55), CPos.New(28,54), CPos.New(27,54), CPos.New(28,53), CPos.New(27,53) } +Civ1CellTriggerActivator = { CPos.New(24,52), CPos.New(23,52), CPos.New(22,52), CPos.New(23,51), CPos.New(22,51), CPos.New(21,51) } +Civ2CellTriggerActivator = { CPos.New(26,54), CPos.New(25,54), CPos.New(24,54), CPos.New(25,53), CPos.New(24,53), CPos.New(23,53) } + +Apc1Units = { 'c2', 'c3', 'c4', 'c5' } + +WinActorTriggerActivator = { Civilian1, Civilian2, Civilian3, Civilian4, Civilian5, Civilian6, Civilian7, Civilian8, CivBuilding1, CivBuilding2, CivBuilding3, CivBuilding4, CivBuilding5, CivBuilding6, CivBuilding7, CivBuilding8, CivBuilding9, CivBuilding10, CivBuilding11, CivBuilding12, CivBuilding13, CivBuilding14 } +Apc2ActorTriggerActivator = { NodGunner1, NodGunner2, NodGunner3 } + +Apc1Waypoints = { waypoint0.Location, waypoint11.Location, waypoint10.Location, waypoint8.Location, waypoint9.Location } +Apc2Waypoints = { waypoint8, waypoint7, waypoint6, waypoint5, waypoint4 } +Apc3Waypoints = { waypoint3, waypoint2, waypoint1, waypoint0, waypoint11, waypoint10, waypoint8, waypoint9 } +Civ1Waypoints = { waypoint3, waypoint2, waypoint3, waypoint1, waypoint2, waypoint11, waypoint10, waypoint8, waypoint9 } +Civ2Waypoints = { waypoint3, waypoint2, waypoint1, waypoint11, waypoint10, waypoint8, waypoint9 } +Hummer1Waypoints = { waypoint8, waypoint7, waypoint6, waypoint5, waypoint4, waypoint3, waypoint2, waypoint1, waypoint0, waypoint11, waypoint10, waypoint8 } + +Apc1TriggerFunctionTime = DateTime.Seconds(3) + +Apc1TriggerFunction = function() + Reinforcements.ReinforceWithTransport(GDI, 'apc', Apc1Units, Apc1Waypoints, nil, + function(transport, cargo) + Utils.Do(cargo, function(actor) + IdleHunt(actor) + end) + end, + nil) +end + +Hum1TriggerFunction = function(actor, discoverer) + MyActors = Utils.Take(2, GDI.GetActorsByType('jeep')) + Utils.Do(MyActors, function(actor) + MoveAndHunt(actor, Hummer1Waypoints) + end) +end + +Movement = function(unit) + if unit ~= nil then + Utils.Do(Civ1Waypoints, function(waypoint) + unit.AttackMove(waypoint.Location) + end) + end +end + +MoveAndHunt = function(unit) + if unit ~= nil then + Utils.Do(Apc2Waypoints, function(waypoint) + unit.AttackMove(waypoint.Location) + end) + IdleHunt(unit) + end +end + +Apc2TriggerFunction = function() + MyActors = Utils.Take(1, GDI.GetActorsByType('apc')) + Utils.Do(MyActors, function(actor) + MoveAndHunt(actor, Apc2Waypoints) + end) +end + +WinTriggerFunction = function() + Nod.MarkCompletedObjective(NodObjective1) +end + +InsertNodUnits = function() + Camera.Position = CameraPoint.CenterPosition + + Media.PlaySpeechNotification(Nod, "Reinforce") + Reinforcements.ReinforceWithTransport(Nod, 'tran', NodUnitsBuggy, { EntryPointVehicle.Location, RallyPointVehicle.Location }, { EntryPointVehicle.Location }, nil, nil) + Reinforcements.ReinforceWithTransport(Nod, 'tran', NodUnitsRocket, { EntryPointRocket.Location, RallyPointRocket.Location }, { EntryPointRocket.Location }, nil, nil) + Reinforcements.ReinforceWithTransport(Nod, 'tran', NodUnitsGunner, { EntryPointGunner.Location, RallyPointGunner.Location }, { EntryPointGunner.Location }, nil, nil) +end + +WorldLoaded = function() + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + + Trigger.AfterDelay(Apc1TriggerFunctionTime, Apc1TriggerFunction) + + Trigger.OnEnteredFootprint(Civ2CellTriggerActivator, function(a, id) + if a.Owner == Nod then + for type, count in pairs({ ['c6'] = 1, ['c7'] = 1, ['c8'] = 1, ['c9'] = 1 }) do + MyActors = Utils.Take(count, GDI.GetActorsByType(type)) + Utils.Do(MyActors, function(actor) + Movement(actor, Civ2Waypoints) + end) + end + Trigger.RemoveFootprintTrigger(id) + end + end) + + Trigger.OnEnteredFootprint(Civ1CellTriggerActivator, function(a, id) + if a.Owner == Nod then + for type, count in pairs({ ['c2'] = 1, ['c3'] = 1, ['c4'] = 1, ['c5'] = 1 }) do + MyActors = Utils.Take(count, GDI.GetActorsByType(type)) + Utils.Do(MyActors, function(actor) + Movement(actor, Civ1Waypoints) + end) + end + Trigger.RemoveFootprintTrigger(id) + end + end) + + Trigger.OnDiscovered(Convoi, Hum1TriggerFunction) + + Trigger.OnAllRemovedFromWorld(Apc2ActorTriggerActivator, Apc2TriggerFunction) + + Trigger.OnEnteredFootprint(Apc3CellTriggerActivator, function(a, id) + if a.Owner == Nod then + MoveAndHunt(GDI.GetActorsByType('apc')[1], Apc3Waypoints) + Trigger.RemoveFootprintTrigger(id) + end + end) + + Trigger.OnAllRemovedFromWorld(WinActorTriggerActivator, WinTriggerFunction) + + Trigger.OnObjectiveAdded(Nod, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + Trigger.OnObjectiveCompleted(Nod, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + + Trigger.OnObjectiveFailed(Nod, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerWon(Nod, function() + Media.PlaySpeechNotification(Nod, "Win") + end) + + Trigger.OnPlayerLost(Nod, function() + Media.PlaySpeechNotification(Nod, "Lose") + end) + + GDIObjective = GDI.AddPrimaryObjective("Kill all enemies!") + NodObjective1 = Nod.AddPrimaryObjective("Destroy the village and kill all civilians!") + NodObjective2 = Nod.AddSecondaryObjective("Kill all GDI units in the area.") + + InsertNodUnits() +end + +Tick = function() + if Nod.HasNoRequiredUnits() then + if DateTime.GameTime > 2 then + GDI.MarkCompletedObjective(GDIObjective) + end + end + + if GDI.HasNoRequiredUnits() then + Nod.MarkCompletedObjective(NodObjective2) + end +end + +IdleHunt = function(unit) + if not unit.IsDead then + Trigger.OnIdle(unit, unit.Hunt) + end +end diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index 4478d1d085..fda4916595 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -15,3 +15,4 @@ Nod Campaign: ./mods/cnc/maps/nod03a ./mods/cnc/maps/nod03b ./mods/cnc/maps/nod04a + ./mods/cnc/maps/nod04b