diff --git a/mods/cnc/bits/scripts/campaign-global.lua b/mods/cnc/bits/scripts/campaign-global.lua index 095aad1ec3..28f8c3c50a 100644 --- a/mods/cnc/bits/scripts/campaign-global.lua +++ b/mods/cnc/bits/scripts/campaign-global.lua @@ -129,6 +129,18 @@ MoveAndHunt = function(actors, path) end) end +MoveAndIdle = function(actors, path) + Utils.Do(actors, function(actor) + if not actor or actor.IsDead then + return + end + + Utils.Do(path, function(point) + actor.Move(point.Location, 0) + end) + end) +end + Searches = 0 GetAirstrikeTarget = function(player) local list = player.GetGroundAttackers() diff --git a/mods/cnc/maps/gdi08b/gdi08b-AI.lua b/mods/cnc/maps/gdi08b/gdi08b-AI.lua new file mode 100644 index 0000000000..393920f098 --- /dev/null +++ b/mods/cnc/maps/gdi08b/gdi08b-AI.lua @@ -0,0 +1,283 @@ +--[[ + Copyright 2007-2021 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, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] + +StartingCash = 15000 + +InfantryAttackPaths = { WaypointGroupBaseFrontal, WaypointGroupRightFlankInf, WaypointGroupVillageRight } +VehicleAttackPaths = { WaypointGroupBaseFrontal, WaypointGroupRightFlank, WaypointGroupVillageRight } +ArtyAttackPaths = { WaypointGroupBaseFrontal, ArtyWaypoints1, ArtyWaypoints2 } + +InfantryProductionTypes = { "e1", "e3", "e3", "e3", "e4", "e4", "e4" } +VehicleProductionTypes = { "bggy", "ltnk" } +ArtyProductionType = { "arty" } +VehicleAutoProductionTypes = { "bggy", "bggy", "ltnk", "ltnk", "arty" } +HarvesterProductionType = { "harv" } + +InfantryGroupSize = { hard = 8, normal = 6, easy = 4 } +InfantryAttackGroup = { } +InfantryProductionCooldown = { hard = DateTime.Seconds(40), normal = DateTime.Seconds(60), easy = DateTime.Seconds(80) } + +VehicleGroupSize = { hard = 4, normal = 3, easy = 2 } +VehicleAttackGroup = { } +VehicleProductionCooldown = { hard = DateTime.Seconds(60), normal = DateTime.Seconds(90), easy = DateTime.Seconds(120) } + +ArtyGroupSize = { hard = 2, normal = 1, easy = 1 } +ArtyAttackGroup = { } +ArtyProductionCooldown = { hard = DateTime.Seconds(60), normal = DateTime.Seconds(75), easy = DateTime.Seconds(100) } + +NodBase = { handofnod, nodairfield, nodrefinery, nodradar, NodYard, nodpower1, nodpower2, nodpower3, nodpower4, nodpower5, gun1, gun2, gun3, gun4, nodsilo1, nodsilo2, nodsilo3} + +BaseRadar = { type = "hq", pos = CPos.New(5, 6), cost = 1000 } +BaseRefinery = { type = "proc", pos = CPos.New(8, 7), cost = 1500 } +BaseSilo1 = { type = "silo", pos = CPos.New(6, 5), cost = 100 } +BaseSilo2 = { type = "silo", pos = CPos.New(8, 5), cost = 100 } +BaseSilo3 = { type = "silo", pos = CPos.New(10, 5), cost = 100 } +BaseGun1 = { type = "gun", pos = CPos.New( 7, 18), cost = 600 } +BaseGun2 = { type = "gun", pos = CPos.New( 11, 18), cost = 600 } +BaseGun3 = { type = "gun", pos = CPos.New( 45, 16), cost = 600 } +BaseGun4 = { type = "gun", pos = CPos.New( 50, 16), cost = 600 } +BaseNuke1 = { type = "nuke", pos = CPos.New( 13, 13), cost = 500 } +BaseNuke2 = { type = "nuke", pos = CPos.New( 50, 5), cost = 500 } +BaseNuke3 = { type = "nuke", pos = CPos.New( 5, 9), cost = 500 } +BaseNuke4 = { type = "nuke", pos = CPos.New( 52, 5), cost = 500 } +BaseNuke5 = { type = "nuke", pos = CPos.New( 48, 5), cost = 500 } +InfantryProduction = { type = "hand", pos = CPos.New(5, 12), cost = 500 } +VehicleProduction = { type = "afld", pos = CPos.New(52, 8), cost = 2000 } + +BaseBuildings = { BaseRadar, BaseRefinery, BaseNuke1, BaseNuke2, BaseNuke3, BaseNuke4, BaseNuke5, InfantryProduction, VehicleProduction, BaseGun1, BaseGun2, BaseGun3, BaseGun4, BaseSilo1, BaseSilo2, BaseSilo3 } + +BuildBuilding = function(building, cyard) + if CyardIsBuilding or Nod.Cash < building.cost then + Trigger.AfterDelay(DateTime.Seconds(10), function() BuildBuilding(building, cyard) end) + return + end + + CyardIsBuilding = true + + Nod.Cash = Nod.Cash - building.cost + Trigger.AfterDelay(Actor.BuildTime(building.type), function() + CyardIsBuilding = false + + if cyard.IsDead or cyard.Owner ~= Nod then + Nod.Cash = Nod.Cash + building.cost + return + end + + local actor = Actor.Create(building.type, true, { Owner = Nod, Location = building.pos }) + + if actor.Type == 'hand' or actor.Type == 'pyle' then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(actor) end) + elseif actor.Type == 'afld' or actor.Type == 'weap' then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(actor) end) + end + + Trigger.OnKilled(actor, function() + BuildBuilding(building, cyard) + end) + + RepairBuilding(GDI, actor, 0.75) + end) +end + +CheckForHarvester = function() + local harv = Nod.GetActorsByType("harv") + return #harv > 0 +end + +ProduceHarvester = function(building) + if building.IsDead or building.Owner ~= Nod then + return + end + if not buildingHarvester then + buildingHarvester = true + building.Build(HarvesterProductionType, function() + buildingHarvester = false + end) + end +end + +ProduceInfantry = function(building) + if building.IsDead or building.Owner ~= Nod then + return + elseif not CheckForHarvester() then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(building) end) + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9)) + local toBuild = { Utils.Random(InfantryProductionTypes) } + local Path = Utils.Random(InfantryAttackPaths) + building.Build(toBuild, function(unit) + InfantryAttackGroup[#InfantryAttackGroup + 1] = unit[1] + + if #InfantryAttackGroup >= InfantryGroupSize[Difficulty] then + MoveAndHunt(InfantryAttackGroup, Path) + InfantryAttackGroup = { } + Trigger.AfterDelay(InfantryProductionCooldown[Difficulty], function() ProduceInfantry(building) end) + else + Trigger.AfterDelay(delay, function() ProduceAutocreateInfantry(building) end) + end + end) +end + +-- We want every 2nd produced infantry to be free for the Auto attack teams +ProduceAutocreateInfantry = function(building) + if building.IsDead or building.Owner ~= Nod then + return + elseif not CheckForHarvester() then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(building) end) + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9)) + local toBuild = { Utils.Random(InfantryProductionTypes) } + building.Build(toBuild, function(unit) + Trigger.AfterDelay(delay, function() ProduceInfantry(building) end) + end) +end + +ProduceVehicle = function(building) + if building.IsDead or building.Owner ~= Nod then + return + elseif not CheckForHarvester() then + ProduceHarvester(building) + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(building) end) + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17)) + local toBuild = { Utils.Random(VehicleProductionTypes) } + local Path = Utils.Random(VehicleAttackPaths) + building.Build(toBuild, function(unit) + VehicleAttackGroup[#VehicleAttackGroup + 1] = unit[1] + + if #VehicleAttackGroup >= VehicleGroupSize[Difficulty] then + + MoveAndHunt(VehicleAttackGroup, Path) + VehicleAttackGroup = { } + Trigger.AfterDelay(VehicleProductionCooldown[Difficulty], function() ProduceArty(building) end) + else + Trigger.AfterDelay(delay, function() ProduceAutocreateVehicle(building) end) + end + end) +end + +-- We want every 2nd produced vehicle to be free for the Auto attack teams +ProduceAutocreateVehicle = function(building) + if building.IsDead or building.Owner ~= Nod then + return + elseif not CheckForHarvester() then + ProduceHarvester(building) + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(building) end) + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17)) + local toBuild = { Utils.Random(VehicleProductionTypes) } + building.Build(toBuild, function(unit) + Trigger.AfterDelay(delay, function() ProduceVehicle(building) end) + end) +end + +ProduceArty = function(building) + if building.IsDead or building.Owner ~= Nod then + return + elseif not CheckForHarvester() then + ProduceHarvester(building) + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceArty(building) end) + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17)) + local toBuild = { Utils.Random(ArtyProductionType) } + local Path = Utils.Random(ArtyAttackPaths) + building.Build(toBuild, function(unit) + ArtyAttackGroup[#ArtyAttackGroup + 1] = unit[1] + + if #ArtyAttackGroup >= ArtyGroupSize[Difficulty] then + MoveAndHunt(ArtyAttackGroup, Path) + ArtyAttackGroup = { } + Trigger.AfterDelay(ArtyProductionCooldown[Difficulty], function() ProduceVehicle(building) end) + else + Trigger.AfterDelay(delay, function() ProduceArty(building) end) + end + end) +end + +StartAI = function() + Nod.Cash = StartingCash +end + +Trigger.OnAllKilledOrCaptured(NodBase, function() + Utils.Do(Nod.GetGroundAttackers(), IdleHunt) +end) + +Trigger.OnKilled(nodrefinery, function() + BuildBuilding(BaseRefinery, NodYard) +end) + +Trigger.OnKilled(nodradar, function() + BuildBuilding(BaseRadar, NodYard) +end) + +Trigger.OnKilled(nodpower1, function() + BuildBuilding(BaseNuke1, NodYard) +end) + +Trigger.OnKilled(nodpower2, function() + BuildBuilding(BaseNuke2, NodYard) +end) + +Trigger.OnKilled(nodpower3, function() + BuildBuilding(BaseNuke3, NodYard) +end) + +Trigger.OnKilled(nodpower4, function() + BuildBuilding(BaseNuke4, NodYard) +end) + +Trigger.OnKilled(nodpower5, function() + BuildBuilding(BaseNuke5, NodYard) +end) + +Trigger.OnKilled(gun1, function() + BuildBuilding(BaseGun1, NodYard) +end) + +Trigger.OnKilled(gun2, function() + BuildBuilding(BaseGun2, NodYard) +end) + +Trigger.OnKilled(gun3, function() + BuildBuilding(BaseGun3, NodYard) +end) + +Trigger.OnKilled(gun4, function() + BuildBuilding(BaseGun4, NodYard) +end) + +Trigger.OnKilled(nodsilo1, function() + BuildBuilding(BaseSilo1, NodYard) +end) + +Trigger.OnKilled(nodsilo2, function() + BuildBuilding(BaseSilo2, NodYard) +end) + +Trigger.OnKilled(nodsilo3, function() + BuildBuilding(BaseSilo3, NodYard) +end) + +Trigger.OnKilled(handofnod, function() + BuildBuilding(InfantryProduction, NodYard) +end) + +Trigger.OnKilled(nodairfield, function() + BuildBuilding(VehicleProduction, NodYard) +end) diff --git a/mods/cnc/maps/gdi08b/gdi08b.lua b/mods/cnc/maps/gdi08b/gdi08b.lua new file mode 100644 index 0000000000..f27e432c02 --- /dev/null +++ b/mods/cnc/maps/gdi08b/gdi08b.lua @@ -0,0 +1,209 @@ +--[[ + Copyright 2007-2021 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, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] + +Difficulty = Map.LobbyOption("difficulty") + +SamSites = { sam1, sam2, sam3, sam4, sam5 } + +NodRetaliateIfDestroyedUnits = { harv1, bggy, ltnk1, ltnk2, ltnk3, arty1, arty2, arty3} + +Arty1Delay = { hard = 0, normal = 8, easy = 20 } +Arty2Delay = { hard = 10, normal = 20, easy = 40 } +TerrorTankDelay = { hard = 40, normal = 50, easy = 75 } +TerrorHeliDelay = { hard = 130, normal = 170, easy = 210 } +BaseHeliDelay = { hard = 100, normal = 130, easy = 160 } +NodHelis = +{ + { delay = DateTime.Seconds(TerrorHeliDelay[Difficulty]), entry = { DefaultChinookTarget.Location, waypoint14.Location }, types = { "e1", "e1", "e4", "e4", "e4" } }, --TERROR, wp14, attack civilians - all 170 timeunits + { delay = DateTime.Seconds(0), entry = { DefaultChinookTarget.Location, waypoint13.Location }, types = { "e3", "e3", "e3", "e4", "e4" } }, --Air1, wp13, attack base - triggered on killed units, Harv, some tanks and some buggys... + { delay = DateTime.Seconds(BaseHeliDelay[Difficulty]), entry = { DefaultChinookTarget.Location, waypoint0.Location }, types = { "e1", "e3", "e3", "e4", "e4" } } --Air2, wp0, attack base - all 130 timeunits +} + +CivilianCasualties = 0 +CiviliansKilledThreshold = { hard = 5, normal = 9, easy = 13 } --total 14 +Civilians = { civ1, civ2, civ3, civ4, civ5, civ6, civ7, civ8, civ9, civ10, civ11, civ12, civ13, civ14 } + +WaypointGroupVillageRight = { waypoint17, waypoint3, waypoint0 } +WaypointGroupVillageLeft = { waypoint17, waypoint14 } +WaypointGroupBaseFrontal = { waypoint7, waypoint11, waypoint31 } +WaypointGroupRightFlankInf = { waypoint7, waypoint8, waypoint10, waypoint8, waypoint9, waypoint31 } +WaypointGroupRightFlank = { waypoint7, waypoint8, waypoint13, waypoint31 } +ArtyWaypoints1 = { waypoint1 } +ArtyWaypoints2 = { waypoint2 } +ArtyWaypoints3 = { waypoint6, waypoint2 } + +AutocreateDelay = { hard = 60, normal = 80, easy = 100 } + +Auto2 = { units = { ['e4'] = 3, ['e3'] = 4 }, waypoints = WaypointGroupVillageLeft, delay = AutocreateDelay[Difficulty] } +Auto3 = { units = { ['ltnk'] = 1, ['arty'] = 2 }, waypoints = WaypointGroupBaseFrontal, delay = AutocreateDelay[Difficulty] } +Auto4 = { units = { ['arty'] = 2 }, waypoints = ArtyWaypoints1, delay = AutocreateDelay[Difficulty] } +Auto1 = { units = { ['e4'] = 3, ['e3'] = 4 }, waypoints = WaypointGroupBaseFrontal, delay = AutocreateDelay[Difficulty] } +Auto5 = { units = { ['arty'] = 1 }, waypoints = ArtyWaypoints2, delay = AutocreateDelay[Difficulty] } +Auto6 = { units = { ['ltnk'] = 1, ['e4'] = 2 }, waypoints = WaypointGroupBaseFrontal, delay = AutocreateDelay[Difficulty] } +Auto7 = { units = { ['ltnk'] = 1, ['bggy'] = 3 }, waypoints = WaypointGroupBaseFrontal, delay = AutocreateDelay[Difficulty] } +Auto8 = { units = { ['e4'] = 3, ['e3'] = 5 }, waypoints = WaypointGroupRightFlankInf, delay = AutocreateDelay[Difficulty] } + +AutoAttackWaves = { Auto2, Auto3, Auto4, Auto1, Auto5, Auto6, Auto7, Auto8 } + +StationaryGuardUnits = { Actor237, Actor238, Actor231, ltnk1, ltnk2, Actor233, ltnk3, arty1, arty2, arty3, bggy, Actor240, Actor242, Actor243, Actor227, Actor228, Actor229 } + +StartStationaryGuards = function(StationaryGuards) + Utils.Do(StationaryGuards, function(unit) + if not unit.IsDead then + unit.Patrol( { unit.Location } , true, 20) + end + end) +end + +SendWaves = function(counter, Waves) + if counter <= #Waves then + local team = Waves[counter] + + for type, amount in pairs(team.units) do + MoveAndHunt(Utils.Take(amount, Nod.GetActorsByType(type)), team.waypoints) + end + + Trigger.AfterDelay(DateTime.Seconds(team.delay), function() SendWaves(counter + 1, Waves) end) + end +end + +SendHeli = function(heli) + units = Reinforcements.ReinforceWithTransport(Nod, "tran", heli.types, heli.entry, { heli.entry[1] }) + Utils.Do(units[2], function(actor) + actor.Hunt() + Trigger.OnIdle(actor, actor.Hunt) + end) + if heli.delay == DateTime.Seconds(0) then + return + end + Trigger.AfterDelay(heli.delay, function() SendHeli(heli) end) +end + +MoveInitialArty = function(arty, waypoints) + units = { arty } + MoveAndIdle(units, waypoints) +end + +TankTerror = function(tank) + units = { tank } + MoveAndHunt(units, WaypointGroupVillageLeft) +end + +WorldLoaded = function() + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + + Camera.Position = DefaultCameraPosition.CenterPosition + + StartStationaryGuards(StationaryGuardUnits) + + StartAI() + + 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) + + ProtectMoebius = GDI.AddObjective("Protect Dr. Mobius.") + Trigger.OnKilled(DrMoebius, function() + GDI.MarkFailedObjective(ProtectMoebius) + end) + + ProtectHospital = GDI.AddObjective("Protect the Hospital.") + Trigger.OnKilled(Hospital, function() + GDI.MarkFailedObjective(ProtectHospital) + end) + + CiviliansKilledThreshold = CiviliansKilledThreshold[Difficulty] + ProtectCivilians = GDI.AddObjective("Keep at least " .. 14 - CiviliansKilledThreshold .. " out of 14 Civilians alive.") + Utils.Do(Civilians, function(civilian) + Trigger.OnKilled(civilian, function() + CivilianCasualties = CivilianCasualties + 1 + if CiviliansKilledThreshold < CivilianCasualties then + GDI.MarkFailedObjective(ProtectCivilians) + end + end) + end) + + SecureArea = GDI.AddObjective("Destroy the Nod bases.") + + KillGDI = Nod.AddObjective("Kill all enemies!") + + AirSupport = GDI.AddObjective("Destroy the SAM sites to receive air support.", "Secondary", false) + Trigger.OnAllKilled(SamSites, function() + GDI.MarkCompletedObjective(AirSupport) + Actor.Create("airstrike.proxy", true, { Owner = GDI }) + end) + + Actor.Create("flare", true, { Owner = GDI, Location = DefaultFlareLocation.Location }) + + Trigger.AfterDelay(DateTime.Minutes(1), function() SendWaves(1, AutoAttackWaves) end) + Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceInfantry(handofnod) end) + Trigger.AfterDelay(DateTime.Minutes(3), function() ProduceVehicle(nodairfield) end) + + local InitialArrivingUnits = + { + { units = { Actor252, Actor253, Actor223, Actor225, Actor222, Actor258, Actor259, Actor260, Actor261, Actor254, Actor255, Actor256, Actor257 }, distance = -1 }, + { units = { Actor218, Actor220, Actor224, Actor226 }, distance = -2 }, + { units = { gdiAPC1 }, distance = -3 } + } + + Utils.Do(InitialArrivingUnits, function(group) + Utils.Do(group.units, function(unit) + unit.Move(unit.Location + CVec.New(0, group.distance), 0) + end) + end) + + Utils.Do(NodHelis, function(heli) + if heli.delay == DateTime.Seconds(0) then -- heli1 comes only when specific units are killed, see below + return + end + Trigger.AfterDelay(heli.delay, function() SendHeli(heli) end) + end) + + -- units destroyed, send heli, eg. harv, tnk, bggy,... + Utils.Do(NodRetaliateIfDestroyedUnits, function(unit) + Trigger.OnKilled(unit, function() + SendHeli(NodHelis[2]) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(Arty1Delay[Difficulty]), function() MoveInitialArty(earlyarty1, ArtyWaypoints1) end) + Trigger.AfterDelay(DateTime.Seconds(Arty2Delay[Difficulty]), function() MoveInitialArty(earlyarty2, ArtyWaypoints2) end) + Trigger.AfterDelay(DateTime.Seconds(TerrorTankDelay[Difficulty]), function() TankTerror(terrortank) end) +end + +Tick = function() + if DateTime.GameTime > DateTime.Seconds(5) then + if GDI.HasNoRequiredUnits() then + Nod.MarkCompletedObjective(KillGDI) + end + if Nod.HasNoRequiredUnits() then + GDI.MarkCompletedObjective(SecureArea) + GDI.MarkCompletedObjective(ProtectMoebius) + GDI.MarkCompletedObjective(ProtectHospital) + GDI.MarkCompletedObjective(ProtectCivilians) + end + end +end diff --git a/mods/cnc/maps/gdi08b/map.bin b/mods/cnc/maps/gdi08b/map.bin new file mode 100644 index 0000000000..9de221daa1 Binary files /dev/null and b/mods/cnc/maps/gdi08b/map.bin differ diff --git a/mods/cnc/maps/gdi08b/map.png b/mods/cnc/maps/gdi08b/map.png new file mode 100644 index 0000000000..334753f0f1 Binary files /dev/null and b/mods/cnc/maps/gdi08b/map.png differ diff --git a/mods/cnc/maps/gdi08b/map.yaml b/mods/cnc/maps/gdi08b/map.yaml new file mode 100644 index 0000000000..f211a5afe1 --- /dev/null +++ b/mods/cnc/maps/gdi08b/map.yaml @@ -0,0 +1,1064 @@ +MapFormat: 11 + +RequiresMod: cnc + +Title: 08b: Protect Mobius In Bratislava + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 64,64 + +Bounds: 2,4,56,59 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: gdi + PlayerReference@Civilians: + Name: Civilians + NonCombatant: True + Faction: gdi + Color: C0C0C0 + Allies: GDI, Village + PlayerReference@Village: + Name: Village + NonCombatant: True + Faction: gdi + Color: C0C0C0 + Allies: GDI, Civilians + PlayerReference@Nod: + Name: Nod + Bot: campaign + Faction: nod + Color: FF1400 + Enemies: Civilians, GDI + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F5D378 + LockSpawn: True + LockTeam: True + Allies: Civilians, Village + Enemies: Nod + +Actors: + Actor0: wood + Location: 10,62 + Owner: Village + Actor1: wood + Location: 9,62 + Owner: Village + Actor2: wood + Location: 8,62 + Owner: Village + Actor3: wood + Location: 7,62 + Owner: Village + Actor4: wood + Location: 6,62 + Owner: Village + Actor5: wood + Location: 10,61 + Owner: Village + Actor6: v16 + Location: 9,61 + Owner: Village + Actor7: v15 + Location: 8,61 + Owner: Village + Actor8: v14 + Location: 7,61 + Owner: Village + Actor9: wood + Location: 6,61 + Owner: Village + Actor10: wood + Location: 10,60 + Owner: Village + Actor11: wood + Location: 7,60 + Owner: Village + Actor12: wood + Location: 6,60 + Owner: Village + Actor13: sbag + Location: 15,17 + Owner: Nod + Actor14: sbag + Location: 14,17 + Owner: Nod + Actor15: sbag + Location: 13,17 + Owner: Nod + Actor16: sbag + Location: 12,17 + Owner: Nod + Actor17: sbag + Location: 11,17 + Owner: Nod + Actor18: sbag + Location: 7,17 + Owner: Nod + Actor19: sbag + Location: 6,17 + Owner: Nod + Actor20: sbag + Location: 5,17 + Owner: Nod + Actor21: sbag + Location: 4,17 + Owner: Nod + Actor22: sbag + Location: 15,16 + Owner: Nod + Actor23: sbag + Location: 12,16 + Owner: Nod + Actor24: sbag + Location: 11,16 + Owner: Nod + Actor25: sbag + Location: 7,16 + Owner: Nod + Actor26: sbag + Location: 6,16 + Owner: Nod + Actor27: sbag + Location: 4,16 + Owner: Nod + Actor28: sbag + Location: 57,15 + Owner: Nod + Actor29: sbag + Location: 56,15 + Owner: Nod + Actor30: sbag + Location: 55,15 + Owner: Nod + Actor31: sbag + Location: 54,15 + Owner: Nod + Actor32: sbag + Location: 53,15 + Owner: Nod + Actor33: sbag + Location: 52,15 + Owner: Nod + Actor34: sbag + Location: 51,15 + Owner: Nod + Actor35: sbag + Location: 50,15 + Owner: Nod + Actor36: sbag + Location: 46,15 + Owner: Nod + Actor37: sbag + Location: 45,15 + Owner: Nod + Actor38: sbag + Location: 44,15 + Owner: Nod + Actor39: sbag + Location: 43,15 + Owner: Nod + Actor40: sbag + Location: 42,15 + Owner: Nod + Actor41: sbag + Location: 15,15 + Owner: Nod + Actor42: sbag + Location: 4,15 + Owner: Nod + Actor43: sbag + Location: 57,14 + Owner: Nod + Actor44: sbag + Location: 51,14 + Owner: Nod + Actor45: sbag + Location: 50,14 + Owner: Nod + Actor46: sbag + Location: 46,14 + Owner: Nod + Actor47: sbag + Location: 45,14 + Owner: Nod + Actor48: sbag + Location: 42,14 + Owner: Nod + Actor49: sbag + Location: 15,14 + Owner: Nod + Actor50: sbag + Location: 4,14 + Owner: Nod + Actor51: sbag + Location: 57,13 + Owner: Nod + Actor52: sbag + Location: 42,13 + Owner: Nod + Actor53: sbag + Location: 15,13 + Owner: Nod + Actor54: sbag + Location: 4,13 + Owner: Nod + Actor55: sbag + Location: 57,12 + Owner: Nod + Actor56: sbag + Location: 42,12 + Owner: Nod + Actor57: sbag + Location: 15,12 + Owner: Nod + Actor58: sbag + Location: 4,12 + Owner: Nod + Actor59: sbag + Location: 57,11 + Owner: Nod + Actor60: sbag + Location: 42,11 + Owner: Nod + Actor61: sbag + Location: 15,11 + Owner: Nod + Actor62: sbag + Location: 4,11 + Owner: Nod + Actor63: sbag + Location: 57,10 + Owner: Nod + Actor64: sbag + Location: 42,10 + Owner: Nod + Actor65: sbag + Location: 15,10 + Owner: Nod + Actor66: sbag + Location: 4,10 + Owner: Nod + Actor67: sbag + Location: 57,9 + Owner: Nod + Actor68: sbag + Location: 43,9 + Owner: Nod + Actor69: sbag + Location: 42,9 + Owner: Nod + Actor70: sbag + Location: 15,9 + Owner: Nod + Actor71: sbag + Location: 14,9 + Owner: Nod + Actor72: sbag + Location: 4,9 + Owner: Nod + Actor73: sbag + Location: 57,8 + Owner: Nod + Actor74: sbag + Location: 43,8 + Owner: Nod + Actor75: sbag + Location: 42,8 + Owner: Nod + Actor76: sbag + Location: 15,8 + Owner: Nod + Actor77: sbag + Location: 14,8 + Owner: Nod + Actor78: sbag + Location: 4,8 + Owner: Nod + Actor79: sbag + Location: 57,7 + Owner: Nod + Actor80: sbag + Location: 4,7 + Owner: Nod + Actor81: sbag + Location: 57,6 + Owner: Nod + Actor82: sbag + Location: 4,6 + Owner: Nod + Actor83: sbag + Location: 57,5 + Owner: Nod + Actor84: sbag + Location: 44,5 + Owner: Nod + Actor85: sbag + Location: 43,5 + Owner: Nod + Actor86: sbag + Location: 15,5 + Owner: Nod + Actor87: sbag + Location: 14,5 + Owner: Nod + Actor88: sbag + Location: 4,5 + Owner: Nod + Actor89: sbag + Location: 57,4 + Owner: Nod + Actor90: sbag + Location: 56,4 + Owner: Nod + Actor91: sbag + Location: 55,4 + Owner: Nod + Actor92: sbag + Location: 54,4 + Owner: Nod + Actor93: sbag + Location: 53,4 + Owner: Nod + Actor94: sbag + Location: 52,4 + Owner: Nod + Actor95: sbag + Location: 51,4 + Owner: Nod + Actor96: sbag + Location: 50,4 + Owner: Nod + Actor97: sbag + Location: 49,4 + Owner: Nod + Actor98: sbag + Location: 48,4 + Owner: Nod + Actor99: sbag + Location: 47,4 + Owner: Nod + Actor100: sbag + Location: 46,4 + Owner: Nod + Actor101: sbag + Location: 45,4 + Owner: Nod + Actor102: sbag + Location: 44,4 + Owner: Nod + Actor103: sbag + Location: 43,4 + Owner: Nod + Actor104: sbag + Location: 15,4 + Owner: Nod + Actor105: sbag + Location: 14,4 + Owner: Nod + Actor106: sbag + Location: 13,4 + Owner: Nod + Actor107: sbag + Location: 12,4 + Owner: Nod + Actor108: sbag + Location: 11,4 + Owner: Nod + Actor109: sbag + Location: 10,4 + Owner: Nod + Actor110: sbag + Location: 9,4 + Owner: Nod + Actor111: sbag + Location: 8,4 + Owner: Nod + Actor112: sbag + Location: 7,4 + Owner: Nod + Actor113: sbag + Location: 6,4 + Owner: Nod + Actor114: sbag + Location: 5,4 + Owner: Nod + Actor115: sbag + Location: 4,4 + Owner: Nod + Actor116: t01 + Location: 40,31 + Owner: Neutral + Actor117: t06 + Location: 37,39 + Owner: Neutral + Actor118: t08 + Location: 38,40 + Owner: Neutral + Actor119: t11 + Location: 39,39 + Owner: Neutral + Actor120: t12 + Location: 3,7 + Owner: Neutral + Actor121: t10 + Location: 2,4 + Owner: Neutral + Actor122: t08 + Location: 2,12 + Owner: Neutral + Actor123: t08 + Location: 4,19 + Owner: Neutral + Actor124: t08 + Location: 4,20 + Owner: Neutral + Actor125: t16 + Location: 4,17 + Owner: Neutral + Actor126: tc02 + Location: 2,18 + Owner: Neutral + Actor127: t15 + Location: 12,19 + Owner: Neutral + Actor128: tc04 + Location: 12,17 + Owner: Neutral + Actor129: t17 + Location: 53,27 + Owner: Neutral + Actor130: tc02 + Location: 54,26 + Owner: Neutral + Actor131: tc03 + Location: 56,22 + Owner: Neutral + Actor132: tc05 + Location: 55,24 + Owner: Neutral + Actor133: t11 + Location: 56,17 + Owner: Neutral + Actor134: t11 + Location: 30,14 + Owner: Neutral + Actor135: t08 + Location: 36,15 + Owner: Neutral + Actor136: t08 + Location: 34,17 + Owner: Neutral + Actor137: tc03 + Location: 35,16 + Owner: Neutral + Actor138: tc02 + Location: 26,20 + Owner: Neutral + Actor139: t16 + Location: 25,20 + Owner: Neutral + Actor140: t15 + Location: 4,26 + Owner: Neutral + Actor141: tc03 + Location: 23,24 + Owner: Neutral + Actor142: tc05 + Location: 20,23 + Owner: Neutral + Actor143: tc04 + Location: 4,24 + Owner: Neutral + Actor144: t16 + Location: 11,49 + Owner: Neutral + Actor145: tc03 + Location: 9,48 + Owner: Neutral + Actor146: split2 + Location: 3,55 + Owner: Neutral + Actor147: t08 + Location: 15,39 + Owner: Neutral + Actor148: t08 + Location: 14,39 + Owner: Neutral + Actor149: t16 + Location: 13,37 + Owner: Neutral + Actor150: tc02 + Location: 6,41 + Owner: Neutral + Actor151: t11 + Location: 5,42 + Owner: Neutral + Actor152: t08 + Location: 15,41 + Owner: Neutral + Actor153: t16 + Location: 14,40 + Owner: Neutral + Actor154: tc04 + Location: 13,39 + Owner: Neutral + Actor155: tc01 + Location: 12,38 + Owner: Neutral + Actor156: tc02 + Location: 14,37 + Owner: Neutral + Actor157: tc03 + Location: 15,34 + Owner: Neutral + Actor158: tc05 + Location: 17,33 + Owner: Neutral + Actor159: t16 + Location: 54,42 + Owner: Neutral + Actor160: tc04 + Location: 54,43 + Owner: Neutral + Actor161: tc03 + Location: 56,45 + Owner: Neutral + Actor162: tc02 + Location: 54,45 + Owner: Neutral + Actor163: tc01 + Location: 56,48 + Owner: Neutral + Actor164: split3 + Location: 54,51 + Owner: Neutral + Actor165: split2 + Location: 49,56 + Owner: Neutral + Actor166: tc01 + Location: 54,41 + Owner: Neutral + Actor167: tc04 + Location: 53,40 + Owner: Neutral + Actor168: tc05 + Location: 55,39 + Owner: Neutral + Actor169: t08 + Location: 2,58 + Owner: Neutral + Actor170: t17 + Location: 9,54 + Owner: Neutral + Actor171: t03 + Location: 5,57 + Owner: Neutral + Actor172: t08 + Location: 5,62 + Owner: Neutral + Actor173: t10 + Location: 6,54 + Owner: Neutral + Actor174: tc05 + Location: 22,54 + Owner: Neutral + Actor175: tc01 + Location: 27,54 + Owner: Neutral + Actor176: tc05 + Location: 24,38 + Owner: Neutral + Actor177: tc03 + Location: 24,42 + Owner: Neutral + Actor178: t08 + Location: 24,40 + Owner: Neutral + Actor179: t08 + Location: 24,44 + Owner: Neutral + nodrefinery: proc + Location: 8,7 + Owner: Nod + FreeActor: False + nodsilo1: silo + Location: 6,5 + Owner: Nod + gun4: gun + Location: 50,16 + Owner: Nod + gun3: gun + Location: 45,16 + Owner: Nod + gun2: gun + Location: 11,18 + Owner: Nod + nodpower1: nuke + Location: 13,13 + Owner: Nod + nodpower2: nuke + Location: 50,5 + Owner: Nod + nodpower3: nuke + Location: 5,9 + Owner: Nod + handofnod: hand + Location: 5,12 + Owner: Nod + nodpower4: nuke + Location: 52,5 + Owner: Nod + nodpower5: nuke + Location: 48,5 + Owner: Nod + nodairfield: afld + Location: 52,8 + Owner: Nod + nodsilo2: silo + Location: 8,5 + Owner: Nod + nodsilo3: silo + Location: 10,5 + Owner: Nod + NodYard: fact + Location: 12,10 + Owner: Nod + nodradar: hq + Location: 5,6 + Owner: Nod + gun1: gun + Location: 7,18 + Owner: Nod + Actor197: gun + Location: 16,9 + Owner: Nod + Actor198: gun + Location: 16,5 + Owner: Nod + Actor199: gun + Location: 41,8 + Owner: Nod + Facing: 384 + Actor200: gun + Location: 42,5 + Owner: Nod + Facing: 256 + sam1: sam + Location: 13,16 + Owner: Nod + sam2: sam + Location: 12,5 + Owner: Nod + sam3: sam + Location: 54,5 + Owner: Nod + sam4: sam + Location: 43,14 + Owner: Nod + sam5: sam + Location: 52,14 + Owner: Nod + Hospital: hosp + Location: 3,60 + Owner: GDI + Actor207: v03 + Location: 8,56 + Owner: Civilians + Actor208: v06 + Location: 8,60 + Owner: Civilians + Actor209: v07 + Location: 5,56 + Owner: Civilians + Actor210: v08 + Location: 14,58 + Owner: Civilians + Actor211: v09 + Location: 3,58 + Owner: Civilians + Actor212: v11 + Location: 12,56 + Owner: Civilians + Actor213: v11 + Location: 15,62 + Owner: Civilians + Actor214: v04 + Location: 12,61 + Owner: Civilians + Actor215: v02 + Location: 12,56 + Owner: Civilians + Church: v01 + Location: 3,55 + Owner: Civilians + Actor217: proc + Location: 45,8 + Owner: Nod + FreeActor: False + Actor218: mcv + Location: 34,52 + Owner: GDI + gdiAPC1: apc + Location: 36,52 + Owner: GDI + terrortank: ltnk + Location: 13,29 + Owner: Nod + Facing: 512 + Actor220: msam + Location: 35,50 + Owner: GDI + harv1: harv + Location: 9,11 + Owner: Nod + Facing: 512 + Actor222: mtnk + Location: 35,48 + Owner: GDI + Actor223: mtnk + Location: 33,48 + Owner: GDI + Actor224: mtnk + Location: 34,50 + Owner: GDI + Actor225: jeep + Location: 34,48 + Owner: GDI + Actor226: msam + Location: 33,50 + Owner: GDI + Actor227: ltnk + Location: 7,15 + Owner: Nod + Facing: 512 + Actor228: ltnk + Location: 11,15 + Owner: Nod + Facing: 512 + Actor229: ltnk + Location: 12,6 + Owner: Nod + Facing: 768 + ltnk1: ltnk + Location: 12,9 + Owner: Nod + Facing: 768 + Actor231: ltnk + Location: 45,5 + Owner: Nod + Facing: 256 + ltnk2: ltnk + Location: 44,8 + Owner: Nod + Facing: 256 + Actor233: ltnk + Location: 48,10 + Owner: Nod + Facing: 512 + ltnk3: ltnk + Location: 50,12 + Owner: Nod + Facing: 512 + arty1: arty + Location: 5,16 + Owner: Nod + Facing: 640 + arty2: arty + Location: 14,13 + Owner: Nod + Facing: 768 + Actor237: arty + Location: 56,5 + Owner: Nod + Facing: 384 + Actor238: arty + Location: 55,14 + Owner: Nod + Facing: 512 + arty3: arty + Location: 44,9 + Owner: Nod + Facing: 256 + Actor240: bggy + Location: 11,7 + Owner: Nod + Facing: 768 + bggy: bggy + Location: 10,13 + Owner: Nod + Facing: 512 + Actor242: bggy + Location: 46,6 + Owner: Nod + Facing: 256 + Actor243: bggy + Location: 50,13 + Owner: Nod + Facing: 512 + earlyarty1: arty + Location: 51,13 + Owner: Nod + Facing: 512 + earlyarty2: arty + Location: 12,45 + Owner: Nod + Facing: 512 + Actor246: harv + Location: 46,12 + Owner: Nod + Facing: 640 + Actor252: e3 + Location: 34,46 + Owner: GDI + SubCell: 4 + Actor253: e3 + Location: 34,46 + Owner: GDI + SubCell: 3 + Actor254: e2 + Location: 36,49 + Owner: GDI + SubCell: 2 + Actor255: e2 + Location: 36,48 + Owner: GDI + SubCell: 3 + Actor256: e2 + Location: 36,49 + Owner: GDI + SubCell: 1 + Actor257: e2 + Location: 36,48 + Owner: GDI + SubCell: 4 + Actor258: e1 + Location: 32,49 + Owner: GDI + SubCell: 2 + Actor259: e1 + Location: 32,48 + Owner: GDI + SubCell: 4 + Actor260: e1 + Location: 32,49 + Owner: GDI + SubCell: 1 + Actor261: e1 + Location: 32,48 + Owner: GDI + SubCell: 3 + DrMoebius: moebius + Location: 6,60 + Owner: GDI + SubCell: 3 + civ1: c4 + Location: 13,60 + Owner: Civilians + SubCell: 1 + civ2: c3 + Location: 11,60 + Owner: Civilians + SubCell: 3 + civ3: c2 + Location: 7,58 + Owner: Civilians + SubCell: 3 + civ4: c2 + Location: 4,57 + Owner: Civilians + SubCell: 3 + civ5: c6 + Location: 5,60 + Owner: Civilians + SubCell: 0 + civ6: c8 + Location: 12,58 + Owner: Civilians + SubCell: 2 + civ7: c9 + Location: 10,56 + Owner: Civilians + SubCell: 4 + civ8: c9 + Location: 16,60 + Owner: Civilians + SubCell: 1 + civ9: c3 + Location: 7,59 + Owner: Civilians + SubCell: 2 + civ10: c4 + Location: 13,56 + Owner: Civilians + SubCell: 2 + civ11: c2 + Location: 11,62 + Owner: Civilians + SubCell: 0 + civ12: c7 + Location: 6,57 + Owner: Civilians + SubCell: 0 + civ13: c6 + Location: 10,59 + Owner: Civilians + SubCell: 2 + civ14: c5 + Location: 4,59 + Owner: Civilians + Facing: 768 + SubCell: 1 + Actor272: e3 + Location: 56,11 + Owner: Nod + Facing: 256 + SubCell: 4 + Actor273: e3 + Location: 52,12 + Owner: Nod + Facing: 512 + SubCell: 1 + Actor274: e3 + Location: 56,6 + Owner: Nod + Facing: 512 + SubCell: 4 + Actor275: e3 + Location: 54,6 + Owner: Nod + Facing: 512 + SubCell: 0 + Actor276: e3 + Location: 47,5 + Owner: Nod + Facing: 256 + SubCell: 1 + Actor277: e3 + Location: 7,7 + Owner: Nod + Facing: 768 + SubCell: 1 + Actor278: e3 + Location: 7,7 + Owner: Nod + Facing: 512 + SubCell: 3 + Actor279: e3 + Location: 7,8 + Owner: Nod + Facing: 512 + SubCell: 1 + Actor280: e1 + Location: 44,12 + Owner: Nod + Facing: 512 + SubCell: 0 + Actor281: e1 + Location: 43,12 + Owner: Nod + Facing: 512 + SubCell: 2 + Actor282: e1 + Location: 45,12 + Owner: Nod + Facing: 512 + SubCell: 3 + Actor283: e1 + Location: 47,5 + Owner: Nod + Facing: 256 + SubCell: 3 + Actor284: e1 + Location: 12,14 + Owner: Nod + Facing: 512 + SubCell: 0 + Actor285: e1 + Location: 12,14 + Owner: Nod + Facing: 512 + SubCell: 3 + Actor286: e1 + Location: 12,14 + Owner: Nod + Facing: 512 + SubCell: 1 + DefaultCameraPosition: waypoint + Location: 28,45 + Owner: Neutral + DefaultFlareLocation: waypoint + Location: 5,61 + Owner: Neutral + waypoint17: waypoint + Location: 8,39 + Owner: Neutral + waypoint14: waypoint + Location: 3,53 + Owner: Neutral + waypoint13: waypoint + Location: 43,60 + Owner: Neutral + waypoint11: waypoint + Location: 33,36 + Owner: Neutral + waypoint10: waypoint + Location: 46,54 + Owner: Neutral + waypoint9: waypoint + Location: 36,35 + Owner: Neutral + waypoint8: waypoint + Location: 52,53 + Owner: Neutral + waypoint7: waypoint + Location: 49,27 + Owner: Neutral + waypoint6: waypoint + Location: 13,32 + Owner: Neutral + waypoint3: waypoint + Location: 12,50 + Owner: Neutral + waypoint2: waypoint + Location: 25,48 + Owner: Neutral + waypoint1: waypoint + Location: 45,47 + Owner: Neutral + waypoint0: waypoint + Location: 21,60 + Owner: Neutral + Actor304: camera + Owner: Nod + Location: 34,47 + Actor305: camera.small + Owner: Nod + Location: 3,62 + waypoint31: waypoint + Owner: Neutral + Location: 32,43 + DefaultChinookTarget: waypoint + Owner: Neutral + Location: 57,24 + +Rules: cnc|rules/campaign-maprules.yaml, cnc|rules/campaign-tooltips.yaml, cnc|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/cnc/maps/gdi08b/rules.yaml b/mods/cnc/maps/gdi08b/rules.yaml new file mode 100644 index 0000000000..6fc69a76c5 --- /dev/null +++ b/mods/cnc/maps/gdi08b/rules.yaml @@ -0,0 +1,180 @@ +World: + LuaScript: + Scripts: campaign-global.lua, gdi08b.lua, gdi08b-AI.lua + MusicPlaylist: + StartingMusic: march + VictoryMusic: gdi_win1 + MissionData: + Briefing: Dr. Mobius is establishing a Hospital to treat the civilians in the region who are falling ill due to exposure to Tiberium.\n\nProtect Mobius and the civilians.\n\nEliminate Nod presence in the area. + BackgroundVideo: tbrinfo1.vqa + StartVideo: desolat.vqa + LossVideo: gdilose.vqa + WinVideo: hellvaly.vqa + BriefingVideo: gdi8b.vqa + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: normal + Locked: false + MapOptions: + ShortGameCheckboxLocked: True + ShortGameCheckboxEnabled: True + SmudgeLayer@SCORCH: + InitialSmudges: + 30,43: sc3,0 + 10,21: sc5,0 + 7,20: sc5,0 + 9,19: sc1,0 + 6,19: sc3,0 + 5,18: sc4,0 + 40,8: sc4,0 + 19,8: sc4,0 + 36,7: sc6,0 + 35,7: sc6,0 + 34,7: sc5,0 + 19,7: sc3,0 + 18,7: sc2,0 + 15,7: sc1,0 + 37,6: sc2,0 + 17,6: sc2,0 + 34,5: sc3,0 + 20,5: sc6,0 + 19,5: sc4,0 + 38,4: sc1,0 + 37,4: sc6,0 + 18,4: sc5,0 + SmudgeLayer@CRATER: + InitialSmudges: + 36,6: cr1,0 + +ATWR: + Buildable: + Prerequisites: ~disabled + +NUK2: + Buildable: + Prerequisites: ~disabled + +HPAD: + Buildable: + Prerequisites: ~disabled + +BRIK: + Buildable: + Prerequisites: ~disabled + +EYE: + Buildable: + Prerequisites: ~disabled + +OBLI: + Buildable: + Prerequisites: ~disabled + +TMPL: + Buildable: + Prerequisites: ~disabled + +HTNK: + Buildable: + Prerequisites: ~disabled + +TRAN: + Buildable: + Prerequisites: ~disabled + +ORCA: + Buildable: + Prerequisites: ~disabled + +RMBO: + Buildable: + Prerequisites: ~disabled + +MSAM: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +BOAT: + Buildable: + Prerequisites: ~disabled + +FTNK: + Buildable: + Prerequisites: ~disabled + +STNK: + Buildable: + Prerequisites: ~disabled + +ARTY: + RevealsShroud: + Range: 10c0 + +HARV: + Harvester: + SearchFromProcRadius: 64 + +HELI: + Buildable: + Prerequisites: ~disabled + +E5: + Buildable: + Prerequisites: ~disabled + +MLRS: + Buildable: + Prerequisites: ~disabled + +SAM: + Buildable: + Prerequisites: ~disabled + +^Bridge: + DamageMultiplier@INVULNERABLE: + Modifier: 0 + +BRIDGEHUT: + -Targetable: + +CYCL: + Buildable: + Prerequisites: ~disabled + +SBAG: + Buildable: + Queue: Defence.GDI, Defence.Nod + +GUN: + Buildable: + Queue: Defence.GDI, Defence.Nod + +airstrike.proxy: + AirstrikePower: + SquadSize: 2 + SquadOffset: -1536, 1024, 0 + +HQ: + Tooltip: + -AirstrikePower: + Buildable: + Description: Provides an overview of the battlefield.\n Requires power to operate. + +^CivInfantry: + Health: + HP: 3500 + Wanders: + MinMoveDelay: 500 + MaxMoveDelay: 1000 + ActorLostNotification: + Notification: CivilianKilled + NotifyAll: true diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index 73c9d0ef9e..5e30851612 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -10,6 +10,7 @@ GDI Campaign: gdi06 gdi07 gdi08a + gdi08b gdi09 Nod Campaign: