diff --git a/mods/cnc/maps/gdi09/gdi09-AI.lua b/mods/cnc/maps/gdi09/gdi09-AI.lua new file mode 100644 index 0000000000..cd1a62c7f7 --- /dev/null +++ b/mods/cnc/maps/gdi09/gdi09-AI.lua @@ -0,0 +1,204 @@ +--[[ + Copyright 2007-2020 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. +]] + +AttackPaths = { { waypoint7 }, { waypoint8 } } +NodBase = { handofnod, nodairfield, nodrefinery, NodCYard, nodpower1, nodpower2, nodpower3, nodpower4, nodpower5, gun5, gun6, gun7, gun8, nodsilo1, nodsilo2, nodsilo3, nodsilo4, nodobelisk } + +PatrolProductionQueue = { } +InfantryAttackGroup = { } +InfantryGroupSize = 5 +InfantryProductionCooldown = DateTime.Minutes(3) +InfantryProductionTypes = { "e1", "e1", "e1", "e3", "e3", "e4" } +HarvesterProductionType = { "harv" } +VehicleAttackGroup = { } +VehicleGroupSize = 5 +VehicleProductionCooldown = DateTime.Minutes(3) +VehicleProductionTypes = { "bggy", "bggy", "bggy", "ltnk", "ltnk", "arty" } +StartingCash = 14000 + +BaseRefinery = { type = "proc", pos = CPos.New(12, 25) } +BaseNuke1 = { type = "nuke", pos = CPos.New(5, 24) } +BaseNuke2 = { type = "nuke", pos = CPos.New(3, 24) } +BaseNuke3 = { type = "nuke", pos = CPos.New(16, 30) } +BaseNuke4 = { type = "nuke", pos = CPos.New(14, 30) } +BaseNuke5 = { type = "nuke", pos = CPos.New(12, 30) } +InfantryProduction = { type = "hand", pos = CPos.New(15, 24) } +VehicleProduction = { type = "afld", pos = CPos.New(3, 27) } + +NodGuards = { Actor168, Actor169, Actor170, Actor171, Actor172, Actor181, Actor177, Actor188, Actor189, Actor190 } + +BaseBuildings = { BaseRefinery, BaseNuke1, BaseNuke2, BaseNuke3, BaseNuke4, InfantryProduction, VehicleProduction } + +BuildBuilding = function(building, cyard) + local buildingCost = Actor.Cost(building.type) + if CyardIsBuilding or Nod.Cash < buildingCost then + Trigger.AfterDelay(DateTime.Seconds(10), function() BuildBuilding(building, cyard) end) + return + end + + CyardIsBuilding = true + + Nod.Cash = Nod.Cash - buildingCost + Trigger.AfterDelay(Actor.BuildTime(building.type), function() + CyardIsBuilding = false + + if cyard.IsDead or cyard.Owner ~= Nod then + Nod.Cash = Nod.Cash + buildingCost + 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(Nod, actor, 0.75) + end) +end + +HasHarvester = function() + local harv = Nod.GetActorsByType("harv") + return #harv > 0 +end + +GuardBase = function() + Utils.Do(NodBase, function(building) + Trigger.OnDamaged(building, function() + if not building.IsDead then + Utils.Do(NodGuards, function(guard) + if not guard.IsDead then + guard.Stop() + guard.Guard(building) + end + end) + end + end) + end) +end + +ProduceHarvester = function(building) + 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 HasHarvester() then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(building) end) + return + end + + if #PatrolProductionQueue >= 1 then + local inQueue = PatrolProductionQueue[1] + local toBuild = { inQueue.unit[1] } + local patrolPath = inQueue.waypoints + building.Build(toBuild, function(unit) + ReplenishPatrolUnit(unit[1], handofnod, patrolPath, 40) + table.remove(PatrolProductionQueue, 1) + end) + 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(AttackPaths) + building.Build(toBuild, function(unit) + InfantryAttackGroup[#InfantryAttackGroup + 1] = unit[1] + + if #InfantryAttackGroup >= InfantryGroupSize then + MoveAndHunt(InfantryAttackGroup, Path) + InfantryAttackGroup = { } + Trigger.AfterDelay(InfantryProductionCooldown, function() ProduceInfantry(building) end) + else + Trigger.AfterDelay(delay, function() ProduceInfantry(building) end) + end + end) + +end + +ProduceVehicle = function(building) + if building.IsDead or building.Owner ~= Nod then + return + elseif not HasHarvester() 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(AttackPaths) + building.Build(toBuild, function(unit) + VehicleAttackGroup[#VehicleAttackGroup + 1] = unit[1] + + if #VehicleAttackGroup >= VehicleGroupSize then + MoveAndHunt(VehicleAttackGroup, Path) + VehicleAttackGroup = { } + Trigger.AfterDelay(VehicleProductionCooldown, function() ProduceVehicle(building) end) + else + Trigger.AfterDelay(delay, function() ProduceVehicle(building) end) + end + end) +end + +StartAI = function() + RepairNamedActors(Nod, 0.75) + + Nod.Cash = StartingCash + GuardBase() +end + +Trigger.OnAllKilledOrCaptured(NodBase, function() + Utils.Do(Nod.GetGroundAttackers(), IdleHunt) +end) + +Trigger.OnKilled(nodrefinery, function(building) + BuildBuilding(BaseRefinery, NodCYard) +end) + +Trigger.OnKilled(nodpower1, function(building) + BuildBuilding(BaseNuke1, NodCYard) +end) + +Trigger.OnKilled(nodpower2, function(building) + BuildBuilding(BaseNuke2, NodCYard) +end) + +Trigger.OnKilled(nodpower3, function(building) + BuildBuilding(BaseNuke3, NodCYard) +end) + +Trigger.OnKilled(nodpower4, function(building) + BuildBuilding(BaseNuke4, NodCYard) +end) + +Trigger.OnKilled(nodpower5, function(building) + BuildBuilding(BaseNuke5, NodCYard) +end) + +Trigger.OnKilled(handofnod, function(building) + BuildBuilding(InfantryProduction, NodCYard) +end) + +Trigger.OnKilled(nodairfield, function(building) + BuildBuilding(VehicleProduction, NodCYard) +end) diff --git a/mods/cnc/maps/gdi09/gdi09.lua b/mods/cnc/maps/gdi09/gdi09.lua new file mode 100644 index 0000000000..767c3fbd3e --- /dev/null +++ b/mods/cnc/maps/gdi09/gdi09.lua @@ -0,0 +1,170 @@ +--[[ + Copyright 2007-2020 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. +]] + +InsertionHelicopterType = "tran.insertion" +GDIHeliReinfUnits = { "e2", "e2", "e2", "e3", "e3" } + +SamSites = { sam1, sam2, sam3, sam4 } +NodBunkersNorth = { gun3, gun4 } +NodBunkersSouth = { gun1, gun2 } + +BoatEscapeTrigger = { CPos.New(2,37) } + +WaypointGroup1 = { waypoint1, waypoint2, waypoint8 } +WaypointGroup2 = { waypoint1, waypoint2, waypoint3, waypoint9 } +WaypointGroup3 = { waypoint1, waypoint2, waypoint3, waypoint10, waypoint11, waypoint12, waypoint6, waypoint13 } +WaypointGroup4 = { waypoint1, waypoint2, waypoint3, waypoint4 } +Patrol1Waypoints = { waypoint11.Location, waypoint10.Location } +Patrol2Waypoints = { waypoint1.Location, waypoint2.Location, waypoint3.Location, waypoint4.Location, waypoint5.Location, waypoint4.Location, waypoint3.Location, waypoint2.Location, waypoint1.Location, waypoint6.Location } + +Nod1 = { units = { ['e1'] = 2, ['e3'] = 2 }, waypoints = WaypointGroup1, delay = 40 } +Nod2 = { units = { ['e3'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup2, delay = 50 } +Nod3 = { units = { ['e1'] = 2, ['e3'] = 3, ['e4'] = 2 }, waypoints = WaypointGroup1, delay = 50 } +Nod4 = { units = { ['bggy'] = 2 }, waypoints = WaypointGroup2, delay = 50 } +Nod5 = { units = { ['e4'] = 2, ['ltnk'] = 1 }, waypoints = WaypointGroup1, delay = 50 } +Auto1 = { units = { ['e4'] = 2, ['arty'] = 1 }, waypoints = WaypointGroup1, delay = 50 } +Auto2 = { units = { ['e1'] = 2, ['e3'] = 2 }, waypoints = WaypointGroup2, delay = 50 } +Auto3 = { units = { ['e3'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup1, delay = 50 } +Auto4 = { units = { ['e1'] = 3, ['e4'] = 1 }, waypoints = WaypointGroup1, delay = 50 } +Auto5 = { units = { ['ltnk'] = 1, ['bggy'] = 1 }, waypoints = WaypointGroup1, delay = 60 } +Auto6 = { units = { ['bggy'] = 1 }, waypoints = WaypointGroup2, delay = 50 } +Auto7 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup2, delay = 50 } +Auto8 = { units = { ['e4'] = 2, ['bggy'] = 1 }, waypoints = WaypointGroup4, delay = 0 } + +Patrols = { + grd1 = { units = { ['e3'] = 3 }, waypoints = Patrol1Waypoints, wait = 40, initialWaypointPlacement = { 1 } }, + grd2 = { units = { ['e1'] = 2, ['e3'] = 2, ['e4'] = 2 }, waypoints = Patrol2Waypoints, wait = 20, initialWaypointPlacement = { 4, 10, 1 } } +} + +AutoAttackWaves = { Nod1, Nod2, Nod3, Nod4, Nod5, Auto1, Auto2, Auto3, Auto4, Auto5, Auto6, Auto7, Auto8 } + +StationaryGuards = { Actor174, Actor173, Actor182, Actor183, Actor184, Actor185, Actor186, Actor187 , Actor199, Actor200, Actor201, Actor202, Actor203, Actor204 } + +StartStationaryGuards = function() + 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 + +StartPatrols = function() + for k, team in pairs(Patrols) do + local group = 1 + for type, amount in pairs(team.units) do + for i = 1, amount do + Reinforcements.Reinforce(Nod, { type }, { team.waypoints[team.initialWaypointPlacement[group]] }, 0, function(unit) + ReplenishPatrolUnit(unit, handofnod, team.waypoints, team.wait) + end) + end + group = group + 1 + end + end + Patrols = nil +end + +ReplenishPatrolUnit = function(unit, building, waypoints, waitatwaypoint) + unit.Patrol(waypoints, true, waitatwaypoint) + Trigger.OnKilled(unit, function() + local queueUnit = { unit = { unit.Type }, atbuilding = { building }, waypoints = waypoints } + PatrolProductionQueue[#PatrolProductionQueue + 1] = queueUnit + end) +end + +SendGDIReinforcements = function() + Media.PlaySpeechNotification(GDI, "Reinforce") + Reinforcements.ReinforceWithTransport(GDI, InsertionHelicopterType, GDIHeliReinfUnits, { GDIHeliEntryNorth.Location, GDIHeliLZ.Location }, { GDIHeliLZ.Location + CVec.New(20, 0) }) +end + +SendGDIReinforcementChinook = function() + Reinforcements.ReinforceWithTransport(GDI, 'tran', nil, { GDIHeliEntryNorth.Location, GDIHeliLZ.Location }) +end + +SpawnGunboat = function() + Media.PlaySpeechNotification(GDI, "Reinforce") + Actor.Create("boat", true, { Owner = GDI, Facing = 0, Location = CPos.New(62,37) }) +end + +WorldLoaded = function() + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + + Camera.Position = DefaultCameraPosition.CenterPosition + + DestroyBunkers = GDI.AddObjective("Destroy the Nod bunkers to allow Carter's\nconvoy to pass through safely.") + Trigger.OnAllKilled(NodBunkersNorth, function() + GDI.MarkCompletedObjective(DestroyBunkers) + Trigger.AfterDelay(DateTime.Seconds(1), SpawnGunboat) + end) + Trigger.OnAllKilled(NodBunkersSouth, function() + GDI.MarkCompletedObjective(DestroyBunkers) + SendGDIReinforcementChinook() + Trigger.AfterDelay(DateTime.Seconds(1), SpawnGunboat) + end) + Trigger.OnEnteredFootprint(BoatEscapeTrigger, function(a, id) + if a.Type == "boat" then + a.Destroy() + Media.DisplayMessage("Part of Carter's convoy passed through!") + Media.PlaySoundNotification(GDI, "AlertBleep") + end + end) + + SecureArea = GDI.AddObjective("Destroy the Nod strike force.") + KillGDI = Nod.AddObjective("Kill all enemies!") + + Trigger.AfterDelay(DateTime.Seconds(5), SendGDIReinforcements) + + 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 }) + + StartStationaryGuards() + + StartAI() + + StartPatrols() + + InitObjectives(GDI) + + Trigger.AfterDelay(DateTime.Minutes(1), function() SendWaves(1, AutoAttackWaves) end) + Trigger.AfterDelay(DateTime.Minutes(3), function() ProduceInfantry(handofnod) end) + Trigger.AfterDelay(DateTime.Minutes(3), function() ProduceVehicle(nodairfield) end) + + local initialArrivingUnits = { Actor175, Actor191, Actor192, Actor193, Actor194, Actor195, Actor196, Actor197, Actor198 } + Utils.Do(initialArrivingUnits, function(unit) + unit.Move(unit.Location + CVec.New(0, 1), 0) + 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) + end + end +end diff --git a/mods/cnc/maps/gdi09/map.bin b/mods/cnc/maps/gdi09/map.bin new file mode 100644 index 0000000000..4ed3b18d4d Binary files /dev/null and b/mods/cnc/maps/gdi09/map.bin differ diff --git a/mods/cnc/maps/gdi09/map.png b/mods/cnc/maps/gdi09/map.png new file mode 100644 index 0000000000..ee5572f590 Binary files /dev/null and b/mods/cnc/maps/gdi09/map.png differ diff --git a/mods/cnc/maps/gdi09/map.yaml b/mods/cnc/maps/gdi09/map.yaml new file mode 100644 index 0000000000..3828460138 --- /dev/null +++ b/mods/cnc/maps/gdi09/map.yaml @@ -0,0 +1,782 @@ +MapFormat: 11 + +RequiresMod: cnc + +Title: 09: Secure the Danube + +Author: Westwood Studios + +Tileset: WINTER + +MapSize: 64,64 + +Bounds: 2,3,60,48 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: gdi + PlayerReference@Nod: + Name: Nod + Faction: nod + Color: FF1400 + Allies: Nod + Enemies: GDI + Bot: campaign + PlayerReference@GDI: + Name: GDI + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: F5D378 + LockSpawn: True + LockTeam: True + Allies: GDI + Enemies: Nod + +Actors: + Actor0: sbag + Location: 30,43 + Owner: Neutral + Actor1: sbag + Location: 29,43 + Owner: Neutral + Actor2: sbag + Location: 28,43 + Owner: Neutral + Actor3: sbag + Location: 27,43 + Owner: Neutral + Actor4: sbag + Location: 26,43 + Owner: Neutral + Actor5: sbag + Location: 30,42 + Owner: Neutral + Actor6: sbag + Location: 28,42 + Owner: Neutral + Actor7: sbag + Location: 26,42 + Owner: Neutral + Actor8: sbag + Location: 35,33 + Owner: Neutral + Actor9: sbag + Location: 33,33 + Owner: Neutral + Actor10: sbag + Location: 31,33 + Owner: Neutral + Actor11: brik + Location: 21,33 + Owner: Neutral + Actor12: brik + Location: 20,33 + Owner: Neutral + Actor13: brik + Location: 19,33 + Owner: Neutral + Actor14: brik + Location: 18,33 + Owner: Neutral + Actor15: brik + Location: 17,33 + Owner: Neutral + Actor16: brik + Location: 16,33 + Owner: Neutral + Actor17: brik + Location: 15,33 + Owner: Neutral + Actor18: brik + Location: 14,33 + Owner: Neutral + Actor19: brik + Location: 13,33 + Owner: Neutral + Actor20: brik + Location: 12,33 + Owner: Neutral + Actor21: brik + Location: 11,33 + Owner: Neutral + Actor22: brik + Location: 10,33 + Owner: Neutral + Actor23: brik + Location: 9,33 + Owner: Neutral + Actor24: brik + Location: 8,33 + Owner: Neutral + Actor25: brik + Location: 7,33 + Owner: Neutral + Actor26: brik + Location: 6,33 + Owner: Neutral + Actor27: brik + Location: 5,33 + Owner: Neutral + Actor28: brik + Location: 4,33 + Owner: Neutral + Actor29: brik + Location: 3,33 + Owner: Neutral + Actor30: brik + Location: 2,33 + Owner: Neutral + Actor31: sbag + Location: 35,32 + Owner: Neutral + Actor32: sbag + Location: 34,32 + Owner: Neutral + Actor33: sbag + Location: 33,32 + Owner: Neutral + Actor34: sbag + Location: 32,32 + Owner: Neutral + Actor35: sbag + Location: 31,32 + Owner: Neutral + Actor36: brik + Location: 21,32 + Owner: Neutral + Actor37: brik + Location: 2,32 + Owner: Neutral + Actor38: brik + Location: 21,31 + Owner: Neutral + Actor39: brik + Location: 20,31 + Owner: Neutral + Actor40: brik + Location: 2,31 + Owner: Neutral + Actor41: brik + Location: 21,30 + Owner: Neutral + Actor42: brik + Location: 20,30 + Owner: Neutral + Actor43: brik + Location: 2,30 + Owner: Neutral + Actor44: wood + Location: 31,29 + Owner: Neutral + Actor45: brik + Location: 2,29 + Owner: Neutral + Actor46: wood + Location: 31,28 + Owner: Neutral + Actor47: brik + Location: 2,28 + Owner: Neutral + Actor48: wood + Location: 42,27 + Owner: Neutral + Actor49: wood + Location: 41,27 + Owner: Neutral + Actor50: wood + Location: 40,27 + Owner: Neutral + Actor51: wood + Location: 39,27 + Owner: Neutral + Actor52: brik + Location: 2,27 + Owner: Neutral + Actor53: wood + Location: 42,26 + Owner: Neutral + Actor54: v16 + Location: 41,26 + Owner: Neutral + Actor55: v18 + Location: 40,26 + Owner: Neutral + Actor56: wood + Location: 39,26 + Owner: Neutral + Actor57: brik + Location: 21,26 + Owner: Neutral + Actor58: brik + Location: 20,26 + Owner: Neutral + Actor59: brik + Location: 2,26 + Owner: Neutral + Actor60: wood + Location: 42,25 + Owner: Neutral + Actor61: v14 + Location: 41,25 + Owner: Neutral + Actor62: v15 + Location: 40,25 + Owner: Neutral + Actor63: wood + Location: 39,25 + Owner: Neutral + Actor64: brik + Location: 21,25 + Owner: Neutral + Actor65: brik + Location: 20,25 + Owner: Neutral + Actor66: brik + Location: 2,25 + Owner: Neutral + Actor67: wood + Location: 42,24 + Owner: Neutral + Actor68: wood + Location: 39,24 + Owner: Neutral + Actor69: brik + Location: 21,24 + Owner: Neutral + Actor70: brik + Location: 14,24 + Owner: Neutral + Actor71: brik + Location: 13,24 + Owner: Neutral + Actor72: brik + Location: 8,24 + Owner: Neutral + Actor73: brik + Location: 7,24 + Owner: Neutral + Actor74: brik + Location: 2,24 + Owner: Neutral + Actor75: brik + Location: 21,23 + Owner: Neutral + Actor76: brik + Location: 20,23 + Owner: Neutral + Actor77: brik + Location: 19,23 + Owner: Neutral + Actor78: brik + Location: 18,23 + Owner: Neutral + Actor79: brik + Location: 17,23 + Owner: Neutral + Actor80: brik + Location: 16,23 + Owner: Neutral + Actor81: brik + Location: 15,23 + Owner: Neutral + Actor82: brik + Location: 14,23 + Owner: Neutral + Actor83: brik + Location: 13,23 + Owner: Neutral + Actor84: brik + Location: 8,23 + Owner: Neutral + Actor85: brik + Location: 7,23 + Owner: Neutral + Actor86: brik + Location: 6,23 + Owner: Neutral + Actor87: brik + Location: 5,23 + Owner: Neutral + Actor88: brik + Location: 4,23 + Owner: Neutral + Actor89: brik + Location: 3,23 + Owner: Neutral + Actor90: brik + Location: 2,23 + Owner: Neutral + Actor91: t02 + Location: 46,27 + Owner: Neutral + Actor92: t02 + Location: 14,19 + Owner: Neutral + Actor93: t01 + Location: 18,19 + Owner: Neutral + Actor94: t14 + Location: 44,27 + Owner: Neutral + Actor95: tc01 + Location: 43,24 + Owner: Neutral + Actor96: tc02 + Location: 42,27 + Owner: Neutral + Actor97: tc04 + Location: 45,24 + Owner: Neutral + Actor98: split2 + Location: 55,23 + Owner: Neutral + Actor99: split2 + Location: 60,28 + Owner: Neutral + Actor100: tc04 + Location: 34,26 + Owner: Neutral + Actor101: tc02 + Location: 37,25 + Owner: Neutral + Actor102: t10 + Location: 32,27 + Owner: Neutral + Actor103: t01 + Location: 34,25 + Owner: Neutral + Actor104: t17 + Location: 35,24 + Owner: Neutral + Actor105: tc01 + Location: 31,26 + Owner: Neutral + Actor106: tc04 + Location: 51,15 + Owner: Neutral + Actor107: tc04 + Location: 37,5 + Owner: Neutral + Actor108: tc04 + Location: 39,14 + Owner: Neutral + Actor109: tc04 + Location: 30,6 + Owner: Neutral + Actor110: tc02 + Location: 29,14 + Owner: Neutral + Actor111: tc01 + Location: 44,12 + Owner: Neutral + Actor112: tc01 + Location: 32,9 + Owner: Neutral + Actor113: t03 + Location: 34,17 + Owner: Neutral + Actor114: t02 + Location: 44,20 + Owner: Neutral + Actor115: t01 + Location: 42,19 + Owner: Neutral + Actor116: t01 + Location: 43,10 + Owner: Neutral + Actor117: t01 + Location: 35,15 + Owner: Neutral + Actor118: t01 + Location: 31,10 + Owner: Neutral + Actor119: tc02 + Location: 22,42 + Owner: Neutral + Actor120: tc04 + Location: 2,47 + Owner: Neutral + Actor121: tc05 + Location: 15,52 + Owner: Neutral + Actor122: tc02 + Location: 27,53 + Owner: Neutral + Actor123: t01 + Location: 30,50 + Owner: Neutral + Actor124: t02 + Location: 23,52 + Owner: Neutral + Actor125: t03 + Location: 33,45 + Owner: Neutral + Actor126: tc01 + Location: 22,22 + Owner: Neutral + Actor127: t07 + Location: 5,5 + Owner: Neutral + Actor128: tc04 + Location: 8,4 + Owner: Neutral + Actor129: tc01 + Location: 3,4 + Owner: Neutral + Actor130: t07 + Location: 38,23 + Owner: Neutral + Actor131: t11 + Location: 30,43 + Owner: Neutral + Actor132: tc04 + Location: 24,43 + Owner: Neutral + Actor133: tc04 + Location: 25,29 + Owner: Neutral + Actor134: tc05 + Location: 52,22 + Owner: Neutral + gun1: gun + Location: 27,42 + Owner: Nod + gun2: gun + Location: 29,42 + Owner: Nod + gun3: gun + Location: 34,33 + Owner: Nod + Facing: 159 + gun4: gun + Location: 32,33 + Owner: Nod + Facing: 159 + Actor139: v04 + Location: 45,26 + Owner: Neutral + Actor140: v07 + Location: 51,24 + Owner: Neutral + Actor141: v06 + Location: 40,24 + Owner: Neutral + Actor142: v05 + Location: 43,26 + Owner: Neutral + Actor143: v03 + Location: 35,25 + Owner: Neutral + Actor144: v01 + Location: 37,26 + Owner: Neutral + sam1: sam + Location: 3,4 + Owner: Nod + sam2: sam + Location: 19,24 + Owner: Nod + sam3: sam + Location: 2,22 + Owner: Nod + sam4: sam + Location: 19,32 + Owner: Nod + nodpower1: nuke + Location: 5,24 + Owner: Nod + nodpower2: nuke + Location: 3,24 + Owner: Nod + gun5: gun + Location: 13,22 + Owner: Nod + gun6: gun + Location: 8,22 + Owner: Nod + NodCYard: fact + Location: 7,30 + Owner: Nod + nodobelisk: obli + Location: 18,32 + Owner: Nod + nodpower3: nuke + Location: 16,30 + Owner: Nod + nodpower4: nuke + Location: 14,30 + Owner: Nod + nodsilo1: silo + Location: 5,31 + Owner: Nod + nodsilo2: silo + Location: 10,31 + Owner: Nod + nodsilo3: silo + Location: 3,31 + Owner: Nod + nodrefinery: proc + Location: 12,25 + Owner: Nod + FreeActor: False + nodairfield: afld + Location: 3,27 + Owner: Nod + handofnod: hand + Location: 15,25 + Owner: Nod + nodsilo4: silo + Location: 17,24 + Owner: Nod + nodpower5: nuke + Location: 12,30 + Owner: Nod + gun7: gun + Location: 22,25 + Owner: Nod + Facing: 191 + gun8: gun + Location: 22,31 + Owner: Nod + Facing: 191 + Actor167: harv + Location: 20,28 + Owner: Nod + Facing: 191 + Actor168: ltnk + Location: 19,26 + Owner: Nod + Facing: 127 + Actor169: ltnk + Location: 18,26 + Owner: Nod + Facing: 127 + Actor170: ltnk + Location: 8,28 + Owner: Nod + Facing: 127 + Actor171: bggy + Location: 18,31 + Owner: Nod + Actor172: bggy + Location: 19,31 + Owner: Nod + Actor173: bggy + Location: 40,14 + Owner: Nod + Actor174: arty + Location: 8,15 + Owner: Nod + Facing: 31 + Actor175: mcv + Location: 54,4 + Owner: GDI + Facing: 127 + Actor176: e3 + Location: 19,25 + Owner: Nod + SubCell: 1 + Actor177: e3 + Location: 17,26 + Owner: Nod + SubCell: 3 + Actor178: e3 + Location: 8,25 + Owner: Nod + SubCell: 1 + Actor179: e3 + Location: 10,29 + Owner: Nod + SubCell: 0 + Actor180: e1 + Location: 5,30 + Owner: Nod + SubCell: 0 + Actor181: e1 + Location: 8,26 + Owner: Nod + SubCell: 4 + Actor182: e4 + Location: 7,14 + Owner: Nod + Facing: 31 + SubCell: 3 + Actor183: e4 + Location: 7,14 + Owner: Nod + Facing: 31 + SubCell: 2 + Actor184: e4 + Location: 25,6 + Owner: Nod + Facing: 191 + SubCell: 1 + Actor185: e4 + Location: 25,4 + Owner: Nod + Facing: 191 + SubCell: 3 + Actor186: e3 + Location: 33,9 + Owner: Nod + SubCell: 0 + Actor187: e3 + Location: 31,6 + Owner: Nod + SubCell: 3 + Actor188: e3 + Location: 17,27 + Owner: Nod + SubCell: 2 + Actor189: e3 + Location: 17,26 + Owner: Nod + SubCell: 2 + Actor190: e3 + Location: 17,27 + Owner: Nod + SubCell: 0 + Actor191: e2 + Location: 53,6 + Owner: GDI + Facing: 127 + SubCell: 4 + Actor192: e2 + Location: 54,6 + Owner: GDI + Facing: 127 + SubCell: 3 + Actor193: e2 + Location: 53,7 + Owner: GDI + Facing: 127 + SubCell: 2 + Actor194: e3 + Location: 54,6 + Owner: GDI + Facing: 127 + SubCell: 4 + Actor195: e3 + Location: 55,6 + Owner: GDI + Facing: 127 + SubCell: 3 + Actor196: e3 + Location: 55,7 + Owner: GDI + Facing: 127 + SubCell: 1 + Actor197: e3 + Location: 54,7 + Owner: GDI + Facing: 127 + SubCell: 2 + Actor198: e2 + Location: 54,7 + Owner: GDI + Facing: 127 + SubCell: 1 + Actor199: e3 + Location: 25,34 + Owner: Nod + Facing: 127 + SubCell: 4 + Actor200: e3 + Location: 25,34 + Owner: Nod + Facing: 127 + SubCell: 3 + Actor201: e3 + Location: 24,34 + Owner: Nod + Facing: 127 + SubCell: 4 + Actor202: e3 + Location: 25,34 + Owner: Nod + Facing: 127 + SubCell: 1 + Actor203: e3 + Location: 24,34 + Owner: Nod + Facing: 127 + SubCell: 2 + Actor204: e3 + Location: 25,34 + Owner: Nod + Facing: 127 + SubCell: 2 + GDIHeliEntryNorth: waypoint + Location: 57,6 + Owner: Neutral + DefaultCameraPosition: waypoint + Location: 48,3 + Owner: Neutral + DefaultFlareLocation: waypoint + Location: 33,31 + Owner: Neutral + waypoint23: waypoint + Location: 53,37 + Owner: Neutral + waypoint19: waypoint + Location: 52,42 + Owner: Neutral + waypoint18: waypoint + Location: 52,19 + Owner: Neutral + waypoint17: waypoint + Location: 9,30 + Owner: Neutral + waypoint11: waypoint + Location: 23,24 + Owner: Neutral + waypoint10: waypoint + Location: 23,32 + Owner: Neutral + waypoint9: waypoint + Location: 43,5 + Owner: Neutral + waypoint8: waypoint + Location: 60,18 + Owner: Neutral + waypoint7: waypoint + Location: 52,6 + Owner: Neutral + waypoint6: waypoint + Location: 9,16 + Owner: Neutral + waypoint5: waypoint + Location: 4,10 + Owner: Neutral + waypoint4: waypoint + Location: 12,5 + Owner: Neutral + waypoint3: waypoint + Location: 28,5 + Owner: Neutral + waypoint2: waypoint + Location: 30,20 + Owner: Neutral + waypoint1: waypoint + Location: 23,28 + Owner: Neutral + GDIHeliLZ: waypoint + Location: 41,44 + Owner: Neutral + +Rules: cnc|rules/campaign-maprules.yaml, cnc|rules/campaign-tooltips.yaml, cnc|rules/campaign-palettes.yaml, rules.yaml + +Weapons: weapons.yaml diff --git a/mods/cnc/maps/gdi09/rules.yaml b/mods/cnc/maps/gdi09/rules.yaml new file mode 100644 index 0000000000..037cb8c964 --- /dev/null +++ b/mods/cnc/maps/gdi09/rules.yaml @@ -0,0 +1,146 @@ +World: + LuaScript: + Scripts: campaign-global.lua, gdi09.lua, gdi09-AI.lua + MusicPlaylist: + StartingMusic: march + VictoryMusic: gdi_win1 + MissionData: + Briefing: Take out Nod turrets along shore so Gunboats can move in safely on the Nod base.\n\nThe Nod base must be destroyed.\n\nIf gunboats can get in, they should be able to destroy the base with no difficulty.\n\nKeep an eye out for the new weapon Nod is rumored to be working on. + BriefingVideo: gdi9.vqa + WinVideo: gunboat.vqa + LossVideo: gameover.vqa + +ATWR: + Buildable: + Prerequisites: ~disabled + +NUK2: + 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 + +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 + +HELI: + Buildable: + Prerequisites: ~disabled + +LTNK: + Buildable: + Prerequisites: ~afld + +ARTY: + Buildable: + Prerequisites: ~afld + +E4: + Buildable: + Prerequisites: barracks + +E5: + Buildable: + Prerequisites: ~disabled + +MLRS: + Buildable: + Prerequisites: ~disabled + +SAM: + Buildable: + Prerequisites: ~disabled + +^Bridge: + DamageMultiplier@INVULNERABLE: + Modifier: 0 + +BRIDGEHUT: + -Targetable: + +TRAN.Extraction: + Inherits: TRAN + RevealsShroud: + Range: 0c0 + RejectsOrders: + -Selectable: + RenderSprites: + Image: tran + Interactable: + +TRAN.Insertion: + Inherits: TRAN.Extraction + Cargo: + MaxWeight: 0 + +HQ: + Tooltip: + -AirstrikePower: + Buildable: + Description: Provides an overview of the battlefield.\n Requires power to operate. + +airstrike.proxy: + AirstrikePower: + SquadSize: 2 + SquadOffset: -1536, 1024, 0 + +BOAT: + AutoTarget: + InitialStance: AttackAnything + RejectsOrders: + Except: Attack diff --git a/mods/cnc/maps/gdi09/weapons.yaml b/mods/cnc/maps/gdi09/weapons.yaml new file mode 100644 index 0000000000..06cd22c9c6 --- /dev/null +++ b/mods/cnc/maps/gdi09/weapons.yaml @@ -0,0 +1,13 @@ +BoatMissile: + Warhead@Bonus: SpreadDamage + Spread: 128 + Damage: 2000 + Versus: + None: 50 + Wood: 100 + Light: 100 + Heavy: 100 + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath + +TurretGun: + ReloadDelay: 40 diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index 6765f4b0cf..73c9d0ef9e 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -10,6 +10,7 @@ GDI Campaign: gdi06 gdi07 gdi08a + gdi09 Nod Campaign: nod01