diff --git a/OpenRA.sln b/OpenRA.sln index fde7d02055..2ca255db8c 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -30,6 +30,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts", mods\cnc\maps\gdi05b\gdi05b.lua = mods\cnc\maps\gdi05b\gdi05b.lua mods\cnc\maps\gdi06\gdi06.lua = mods\cnc\maps\gdi06\gdi06.lua mods\cnc\maps\gdi07\gdi07.lua = mods\cnc\maps\gdi07\gdi07.lua + mods\cnc\maps\gdi08a\gdi08a-AI.lua = mods\cnc\maps\gdi08a\gdi08a-AI.lua + mods\cnc\maps\gdi08a\gdi08a.lua = mods\cnc\maps\gdi08a\gdi08a.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/gdi08a/gdi08a-AI.lua b/mods/cnc/maps/gdi08a/gdi08a-AI.lua new file mode 100644 index 0000000000..a97f6d50b9 --- /dev/null +++ b/mods/cnc/maps/gdi08a/gdi08a-AI.lua @@ -0,0 +1,194 @@ +--[[ + 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 = { WaypointGroup3, WaypointGroup4, WaypointGroup5 } +NodBase = { handofnod, nodairfield, nodrefinery, NodYard, nodpower1, nodpower2, nodpower3, nodpower4, gun1, gun2, nodsilo1, nodsilo2, nodsilo3, nodsilo4} + +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", "bike", "ltnk", "ltnk" } + +StartingCash = 14000 + +BaseRefinery = { type = "proc", pos = CPos.New(24, 16), cost = 1500 } +BaseGun1 = { type = "gun", pos = CPos.New( 21, 19), cost = 600 } +BaseGun2 = { type = "gun", pos = CPos.New( 26, 21), cost = 600 } +BaseNuke1 = { type = "nuke", pos = CPos.New( 23, 14), cost = 500 } +BaseNuke2 = { type = "nuke", pos = CPos.New( 10, 9), cost = 500 } +BaseNuke3 = { type = "nuke", pos = CPos.New( 6, 8), cost = 500 } +BaseNuke4 = { type = "nuke", pos = CPos.New( 8, 8), cost = 500 } +InfantryProduction = { type = "hand", pos = CPos.New(27, 17), cost = 500 } +VehicleProduction = { type = "afld", pos = CPos.New(27, 14), cost = 2000 } + +NodGuards = { Actor154, Actor155, Actor218, Actor219 } + +BaseBuildings = { BaseRefinery, BaseNuke1, BaseNuke2, BaseNuke3, BaseNuke4, InfantryProduction, VehicleProduction, BaseGun1, BaseGun2 } + +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 + +GuardBase = function() + Utils.Do(NodBase, function(building) + Trigger.OnDamaged(building, function() + Utils.Do(NodGuards, function(guard) + if not guard.IsDead and not building.IsDead then + guard.Stop() + guard.Guard(building) + 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 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(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 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(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() + Nod.Cash = StartingCash + GuardBase() +end + +Trigger.OnAllKilledOrCaptured(NodBase, function() + Utils.Do(Nod.GetGroundAttackers(), IdleHunt) +end) + +Trigger.OnKilled(nodrefinery, function() + BuildBuilding(BaseRefinery, 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(gun1, function() + BuildBuilding(BaseGun1, NodYard) +end) + +Trigger.OnKilled(gun2, function() + BuildBuilding(BaseGun2, NodYard) +end) + +Trigger.OnKilled(handofnod, function() + BuildBuilding(InfantryProduction, NodYard) +end) + +Trigger.OnKilled(nodairfield, function() + BuildBuilding(VehicleProduction, NodYard) +end) diff --git a/mods/cnc/maps/gdi08a/gdi08a.lua b/mods/cnc/maps/gdi08a/gdi08a.lua new file mode 100644 index 0000000000..c048cd9b2d --- /dev/null +++ b/mods/cnc/maps/gdi08a/gdi08a.lua @@ -0,0 +1,152 @@ +--[[ + 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. +]] + +SamSites = { sam1, sam2, sam3 } + +WaypointGroup1 = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint10, waypoint11, waypoint12 } +WaypointGroup2 = { waypoint4, waypoint5, waypoint13, waypoint16 } +WaypointGroup3 = { waypoint4, waypoint5, waypoint6, waypoint8 } +WaypointGroup4 = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint9 } +WaypointGroup5 = { waypoint4, waypoint5, waypoint6 } +WaypointGroup6 = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint14, waypoint15 } +WaypointGroup7 = { waypoint4, waypoint5 } +WaypointGroupCiv = { waypoint0, waypoint1, waypoint2, waypoint3 } + +Atk1 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup1, delay = 0 } +Atk2 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup2, delay = 0 } +Civ1 = { units = { ['c3'] = 1 }, waypoints = WaypointGroupCiv, delay = 0 } +Nod1 = { units = { ['e1'] = 2, ['e2'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup3, delay = 90 } +Nod2 = { units = { ['e3'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup3, delay = 130 } +Nod3 = { units = { ['e1'] = 2, ['e3'] = 3 }, waypoints = WaypointGroup3, delay = 50 } +Nod4 = { units = { ['bggy'] = 2 }, waypoints = WaypointGroup3, delay = 200 } +Nod5 = { units = { ['e4'] = 2, ['ltnk'] = 1 }, waypoints = WaypointGroup1, delay = 250 } +Nod6 = { units = { ['arty'] = 1 }, waypoints = WaypointGroup4, delay = 40 } +Nod7 = { units = { ['e3'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup4, delay = 40 } +Nod8 = { units = { ['ltnk'] = 1, ['bggy'] = 1 }, waypoints = WaypointGroup3, delay = 170 } +Auto1 = { units = { ['e1'] = 2, ['e2'] = 2 }, waypoints = WaypointGroup5, delay = 50 } +Auto2 = { units = { ['e3'] = 3, ['e4'] = 2 }, waypoints = WaypointGroup3, delay = 50 } +Auto3 = { units = { ['ltnk'] = 1, ['bggy'] = 1 }, waypoints = WaypointGroup3, delay = 50 } +Auto4 = { units = { ['bggy'] = 2 }, waypoints = WaypointGroup7, delay = 50 } +Auto5 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup6, delay = 50 } +Auto6 = { units = { ['arty'] = 1 }, waypoints = WaypointGroup4, delay = 50 } +Auto7 = { units = { ['e3'] = 3, ['e4'] = 2 }, waypoints = WaypointGroup6, delay = 50 } + +AutoAttackWaves = { Atk1, Atk2, Nod1, Nod2, Nod3, Nod4, Nod5, Nod6, Nod7, Nod8, Auto1, Auto2, Auto3, Auto4, Auto5, Auto6, Auto7 } + +StationaryGuardUnits = { Actor181, Actor182, Actor183, Actor184, Actor198, Actor199, Actor157, Actor175, Actor176, Actor173, Actor174, Actor158, Actor200, Actor159, Actor179, Actor180, Actor184, Actor185, Actor216, Actor217, Actor153, Actor215, Actor214, Actor213} + +DamagedGDIAssets = { Actor126, Actor127, Actor128, Actor129, Actor130,Actor131, Actor132, Actor133, Actor134, Actor135, Actor136, Actor137, Actor138, Actor160, Actor161, Actor162, Actor163, Actor164, Actor165, Actor166, Actor168, Actor169, Actor170} + +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 + +SendAttackWave = function(team) + for type, amount in pairs(team.units) do + count = 0 + local actors = Nod.GetActorsByType(type) + Utils.Do(actors, function(actor) + if actor.IsIdle and count < amount then + SetAttackWaypoints(actor, team.waypoints) + IdleHunt(actor) + count = count + 1 + end + end) + end +end + +SetAttackWaypoints = function(actor, waypoints) + if not actor.IsDead then + Utils.Do(waypoints, function(waypoint) + actor.AttackMove(waypoint.Location) + end) + end +end + +CeckRepairGDIAssetsObjective = function() + local failed = false + local repaired = true + Utils.Do(DamagedGDIAssets, function(actor) + if actor.IsDead then + failed = true + elseif actor.Health < actor.MaxHealth then + repaired = false + end + end) + + if failed then + GDI.MarkFailedObjective(RepairAssets) + return + elseif repaired then + GDI.MarkCompletedObjective(RepairAssets) + return + end + Trigger.AfterDelay(DateTime.Seconds(3), function() CeckRepairGDIAssetsObjective() end) +end + +WorldLoaded = function() + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") + + Camera.Position = DefaultCameraPosition.CenterPosition + + StartStationaryGuards(StationaryGuardUnits) + + StartAI() + + InitObjectives(GDI) + + SecureArea = GDI.AddObjective("Destroy the Nod strike force.") + KillGDI = Nod.AddObjective("Kill all enemies!") + + RepairAssets = GDI.AddObjective("Repair GDI base and vehicles.", "Secondary", false) + Trigger.AfterDelay(DateTime.Seconds(5), function() CeckRepairGDIAssetsObjective() end) + + 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) + + local InitialArrivingUnits = { Actor166 } + Utils.Do(InitialArrivingUnits, function(unit) + unit.Move(unit.Location + CVec.New(1, 1), 0) + end) + + Trigger.AfterDelay(DateTime.Minutes(1), function() SendWaves(1, AutoAttackWaves) end) + Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceInfantry(handofnod) end) + Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceVehicle(nodairfield) 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/gdi08a/map.bin b/mods/cnc/maps/gdi08a/map.bin new file mode 100644 index 0000000000..359e8a7cf4 Binary files /dev/null and b/mods/cnc/maps/gdi08a/map.bin differ diff --git a/mods/cnc/maps/gdi08a/map.png b/mods/cnc/maps/gdi08a/map.png new file mode 100644 index 0000000000..395064cd8b Binary files /dev/null and b/mods/cnc/maps/gdi08a/map.png differ diff --git a/mods/cnc/maps/gdi08a/map.yaml b/mods/cnc/maps/gdi08a/map.yaml new file mode 100644 index 0000000000..c06a47244c --- /dev/null +++ b/mods/cnc/maps/gdi08a/map.yaml @@ -0,0 +1,886 @@ +MapFormat: 11 + +RequiresMod: cnc + +Title: 08a: Restore GDI Presence Near Salzburg + +Author: Westwood Studios + +Tileset: WINTER + +MapSize: 64,64 + +Bounds: 3,7,51,50 + +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: 53,56 + Owner: Neutral + Actor1: sbag + Location: 52,56 + Owner: Neutral + Actor2: sbag + Location: 51,56 + Owner: Neutral + Actor3: sbag + Location: 50,56 + Owner: Neutral + Actor4: sbag + Location: 49,56 + Owner: Neutral + Actor5: sbag + Location: 48,56 + Owner: Neutral + Actor6: sbag + Location: 47,56 + Owner: Neutral + Actor7: sbag + Location: 46,56 + Owner: Neutral + Actor8: sbag + Location: 45,56 + Owner: Neutral + Actor9: sbag + Location: 44,56 + Owner: Neutral + Actor10: sbag + Location: 43,56 + Owner: Neutral + Actor11: sbag + Location: 41,56 + Owner: Neutral + Actor12: sbag + Location: 40,56 + Owner: Neutral + Actor13: wood + Location: 5,56 + Owner: Neutral + Actor14: wood + Location: 4,56 + Owner: Neutral + Actor15: wood + Location: 3,56 + Owner: Neutral + Actor16: sbag + Location: 53,55 + Owner: Neutral + Actor17: sbag + Location: 40,55 + Owner: Neutral + Actor18: v18 + Location: 5,55 + Owner: Neutral + Actor19: v17 + Location: 4,55 + Owner: Neutral + Actor20: sbag + Location: 53,54 + Owner: Neutral + Actor21: sbag + Location: 40,54 + Owner: Neutral + Actor22: wood + Location: 17,54 + Owner: Neutral + Actor23: wood + Location: 16,54 + Owner: Neutral + Actor24: wood + Location: 15,54 + Owner: Neutral + Actor25: wood + Location: 14,54 + Owner: Neutral + Actor26: wood + Location: 11,54 + Owner: Neutral + Actor27: wood + Location: 10,54 + Owner: Neutral + Actor28: v14 + Location: 6,54 + Owner: Neutral + Actor29: v15 + Location: 5,54 + Owner: Neutral + Actor30: v16 + Location: 4,54 + Owner: Neutral + Actor31: sbag + Location: 53,53 + Owner: Neutral + Actor32: wood + Location: 6,53 + Owner: Neutral + Actor33: wood + Location: 17,52 + Owner: Neutral + Actor34: wood + Location: 16,52 + Owner: Neutral + Actor35: wood + Location: 15,52 + Owner: Neutral + Actor36: wood + Location: 14,52 + Owner: Neutral + Actor37: wood + Location: 11,52 + Owner: Neutral + Actor38: wood + Location: 10,52 + Owner: Neutral + Actor39: sbag + Location: 53,51 + Owner: Neutral + Actor40: sbag + Location: 53,50 + Owner: Neutral + Actor41: sbag + Location: 40,50 + Owner: Neutral + Actor42: sbag + Location: 53,49 + Owner: Neutral + Actor43: sbag + Location: 40,49 + Owner: Neutral + Actor44: sbag + Location: 53,48 + Owner: Neutral + Actor45: sbag + Location: 53,47 + Owner: Neutral + Actor46: sbag + Location: 40,47 + Owner: Neutral + Actor47: sbag + Location: 53,46 + Owner: Neutral + Actor48: sbag + Location: 52,46 + Owner: Neutral + Actor49: sbag + Location: 51,46 + Owner: Neutral + Actor50: sbag + Location: 50,46 + Owner: Neutral + Actor51: sbag + Location: 49,46 + Owner: Neutral + Actor52: sbag + Location: 48,46 + Owner: Neutral + Actor53: sbag + Location: 42,46 + Owner: Neutral + Actor54: sbag + Location: 41,46 + Owner: Neutral + Actor55: sbag + Location: 40,46 + Owner: Neutral + Actor56: t01 + Location: 33,32 + Owner: Neutral + Actor57: t01 + Location: 33,34 + Owner: Neutral + Actor58: tc01 + Location: 47,27 + Owner: Neutral + Actor59: t01 + Location: 42,18 + Owner: Neutral + Actor60: t01 + Location: 41,16 + Owner: Neutral + Actor61: t01 + Location: 36,18 + Owner: Neutral + Actor62: t01 + Location: 15,50 + Owner: Neutral + Actor63: t01 + Location: 6,54 + Owner: Neutral + Actor64: t01 + Location: 11,48 + Owner: Neutral + Actor65: tc01 + Location: 14,33 + Owner: Neutral + Actor66: tc04 + Location: 17,35 + Owner: Neutral + Actor67: tc01 + Location: 9,19 + Owner: Neutral + Actor68: tc04 + Location: 11,20 + Owner: Neutral + Actor69: t06 + Location: 37,8 + Owner: Neutral + Actor70: t03 + Location: 33,8 + Owner: Neutral + Actor71: t02 + Location: 36,9 + Owner: Neutral + Actor72: t01 + Location: 32,7 + Owner: Neutral + Actor73: tc04 + Location: 50,9 + Owner: Neutral + Actor74: tc01 + Location: 45,7 + Owner: Neutral + Actor75: tc01 + Location: 38,13 + Owner: Neutral + Actor76: tc02 + Location: 35,22 + Owner: Neutral + Actor77: tc05 + Location: 32,21 + Owner: Neutral + Actor78: t10 + Location: 17,47 + Owner: Neutral + Actor79: t13 + Location: 16,50 + Owner: Neutral + Actor80: tc01 + Location: 15,48 + Owner: Neutral + Actor81: tc02 + Location: 6,51 + Owner: Neutral + Actor82: tc02 + Location: 3,47 + Owner: Neutral + Actor83: tc04 + Location: 3,51 + Owner: Neutral + Actor84: tc04 + Location: 5,47 + Owner: Neutral + Actor85: tc04 + Location: 9,54 + Owner: Neutral + Actor86: tc04 + Location: 3,40 + Owner: Neutral + Actor87: t13 + Location: 4,42 + Owner: Neutral + Actor88: t11 + Location: 10,12 + Owner: Neutral + Actor89: t15 + Location: 4,10 + Owner: Neutral + Actor90: t16 + Location: 3,9 + Owner: Neutral + Actor91: tc02 + Location: 5,12 + Owner: Neutral + Actor92: tc01 + Location: 4,7 + Owner: Neutral + Actor93: tc04 + Location: 20,11 + Owner: Neutral + Actor94: tc04 + Location: 19,47 + Owner: Neutral + Actor95: tc05 + Location: 20,49 + Owner: Neutral + Actor96: tc04 + Location: 40,17 + Owner: Neutral + Actor97: tc01 + Location: 44,36 + Owner: Neutral + Actor98: tc04 + Location: 39,37 + Owner: Neutral + Actor99: tc02 + Location: 40,30 + Owner: Neutral + Actor100: tc02 + Location: 30,32 + Owner: Neutral + Actor101: t10 + Location: 32,33 + Owner: Neutral + Actor102: tc04 + Location: 37,54 + Owner: Neutral + Actor103: tc02 + Location: 34,53 + Owner: Neutral + Actor104: t01 + Location: 31,53 + Owner: Neutral + Actor105: t01 + Location: 16,54 + Owner: Neutral + Actor106: t02 + Location: 18,55 + Owner: Neutral + Actor107: t11 + Location: 25,32 + Owner: Neutral + Actor108: t11 + Location: 41,44 + Owner: Neutral + Actor109: tc01 + Location: 51,44 + Owner: Neutral + Actor110: tc04 + Location: 27,40 + Owner: Neutral + Actor111: tc05 + Location: 30,42 + Owner: Neutral + Actor112: t07 + Location: 31,39 + Owner: Neutral + Actor113: t06 + Location: 26,42 + Owner: Neutral + Actor114: t03 + Location: 28,43 + Owner: Neutral + sam1: sam + Location: 11,20 + Owner: Nod + sam2: sam + Location: 33,18 + Owner: Nod + sam3: sam + Location: 16,7 + Owner: Nod + Actor118: v05 + Location: 17,49 + Owner: Neutral + Actor119: v07 + Location: 9,49 + Owner: Neutral + Actor120: v06 + Location: 4,53 + Owner: Neutral + Actor121: v05 + Location: 6,49 + Owner: Neutral + Actor122: v04 + Location: 4,50 + Owner: Neutral + Actor123: v03 + Location: 10,50 + Owner: Neutral + Actor124: v01 + Location: 3,48 + Owner: Neutral + Actor125: v06 + Location: 20,49 + Owner: Neutral + Actor126: gtwr + Location: 41,54 + Owner: GDI + Health: 41 + Actor127: gtwr + Location: 41,50 + Owner: GDI + Health: 16 + Actor128: hq + Location: 51,47 + Owner: GDI + Health: 39 + Actor129: proc + Location: 44,46 + Owner: GDI + Health: 33 + FreeActor: False + Actor130: silo + Location: 49,54 + Owner: GDI + Health: 53 + Actor131: silo + Location: 47,47 + Owner: GDI + Health: 20 + Actor132: silo + Location: 47,53 + Owner: GDI + Health: 13 + Actor133: silo + Location: 51,54 + Owner: GDI + Health: 28 + Actor134: nuke + Location: 49,51 + Owner: GDI + Health: 14 + Actor135: nuke + Location: 49,48 + Owner: GDI + Health: 20 + Actor136: nuke + Location: 51,50 + Owner: GDI + Health: 35 + Actor137: pyle + Location: 47,49 + Owner: GDI + Health: 18 + Actor138: fix + Location: 44,52 + Owner: GDI + Health: 28 + gun1: gun + Location: 21,19 + Owner: Nod + NodYard: fact + Location: 7,11 + Owner: Nod + nodrefinery: proc + Location: 24,16 + Owner: Nod + FreeActor: False + nodsilo1: silo + Location: 29,17 + Owner: Nod + nodsilo2: silo + Location: 9,7 + Owner: Nod + nodsilo3: silo + Location: 12,9 + Owner: Nod + nodsilo4: silo + Location: 11,7 + Owner: Nod + nodairfield: afld + Location: 27,14 + Owner: Nod + nodpower1: nuke + Location: 23,14 + Owner: Nod + nodpower2: nuke + Location: 10,9 + Owner: Nod + nodpower3: nuke + Location: 6,8 + Owner: Nod + nodpower4: nuke + Location: 8,8 + Owner: Nod + handofnod: hand + Location: 27,17 + Owner: Nod + gun2: gun + Location: 26,21 + Owner: Nod + Actor153: arty + Location: 4,12 + Owner: Nod + Facing: 127 + Actor154: bggy + Location: 20,18 + Owner: Nod + Actor155: ltnk + Location: 19,18 + Owner: Nod + Actor156: bggy + Location: 10,21 + Owner: Nod + Facing: 95 + Actor157: ltnk + Location: 40,35 + Owner: Nod + Facing: 159 + Actor158: ltnk + Location: 45,23 + Owner: Nod + Facing: 95 + Actor159: ltnk + Location: 41,14 + Owner: Nod + Facing: 159 + Actor160: mtnk + Location: 42,55 + Owner: GDI + Health: 35 + Facing: 223 + Actor161: mtnk + Location: 33,52 + Owner: GDI + Health: 43 + Facing: 31 + Actor162: apc + Location: 37,50 + Owner: GDI + Health: 68 + Facing: 127 + Actor163: apc + Location: 39,48 + Owner: GDI + Health: 45 + Facing: 127 + Actor164: msam + Location: 42,49 + Owner: GDI + Health: 40 + Facing: 95 + Actor165: msam + Location: 41,51 + Owner: GDI + Health: 50 + Facing: 159 + Actor166: msam + Location: 33,48 + Owner: GDI + Health: 65 + Facing: 159 + Actor167: harv + Location: 23,23 + Owner: Nod + Facing: 95 + Actor168: harv + Location: 38,53 + Owner: GDI + Health: 51 + Facing: 31 + Actor169: jeep + Location: 36,52 + Owner: GDI + Health: 72 + Facing: 95 + Actor170: jeep + Location: 34,51 + Owner: GDI + Health: 31 + Facing: 159 + Actor171: arty + Location: 19,17 + Owner: Nod + Actor172: ltnk + Location: 22,11 + Owner: Nod + Facing: 159 + Actor173: e1 + Location: 45,36 + Owner: Nod + SubCell: 3 + Actor174: e1 + Location: 44,36 + Owner: Nod + SubCell: 4 + Actor175: e3 + Location: 41,36 + Owner: Nod + Facing: 159 + SubCell: 2 + Actor176: e3 + Location: 41,36 + Owner: Nod + Facing: 159 + SubCell: 3 + Actor177: e3 + Location: 42,17 + Owner: Nod + Facing: 159 + SubCell: 0 + Actor178: e3 + Location: 40,17 + Owner: Nod + Facing: 159 + SubCell: 4 + Actor179: e4 + Location: 42,15 + Owner: Nod + Facing: 159 + SubCell: 2 + Actor180: e4 + Location: 42,15 + Owner: Nod + Facing: 159 + SubCell: 3 + Actor181: e1 + Location: 16,53 + Owner: Nod + Facing: 191 + SubCell: 3 + Actor182: e1 + Location: 15,53 + Owner: Nod + Facing: 191 + SubCell: 2 + Actor183: e1 + Location: 17,53 + Owner: Nod + Facing: 191 + SubCell: 3 + Actor184: e1 + Location: 16,53 + Owner: Nod + Facing: 191 + SubCell: 2 + Actor185: c3 + Location: 18,50 + Owner: Neutral + Facing: 159 + SubCell: 1 + Actor186: e1 + Location: 46,51 + Owner: GDI + Facing: 159 + SubCell: 1 + Actor187: e1 + Location: 44,52 + Owner: GDI + Health: 87 + Facing: 223 + SubCell: 2 + Actor188: e1 + Location: 43,53 + Owner: GDI + Health: 31 + Facing: 31 + SubCell: 4 + Actor189: e1 + Location: 42,54 + Owner: GDI + Health: 75 + SubCell: 2 + Actor190: e1 + Location: 39,52 + Owner: GDI + Health: 77 + Facing: 159 + SubCell: 4 + Actor191: e1 + Location: 42,53 + Owner: GDI + Health: 69 + Facing: 159 + SubCell: 0 + Actor192: e2 + Location: 40,53 + Owner: GDI + Health: 75 + Facing: 31 + SubCell: 2 + Actor193: e2 + Location: 45,51 + Owner: GDI + Facing: 127 + SubCell: 1 + Actor194: e2 + Location: 38,50 + Owner: GDI + Health: 27 + Facing: 223 + SubCell: 0 + Actor195: e2 + Location: 46,52 + Owner: GDI + Facing: 31 + SubCell: 1 + Actor196: e2 + Location: 36,53 + Owner: GDI + Health: 57 + Facing: 159 + SubCell: 0 + Actor197: e2 + Location: 37,54 + Owner: GDI + Facing: 31 + SubCell: 1 + Actor198: e3 + Location: 27,40 + Owner: Nod + SubCell: 4 + Actor199: e3 + Location: 29,40 + Owner: Nod + SubCell: 3 + Actor200: e3 + Location: 48,27 + Owner: Nod + SubCell: 3 + Actor201: e1 + Location: 27,21 + Owner: Nod + SubCell: 3 + Actor202: e1 + Location: 27,21 + Owner: Nod + SubCell: 4 + Actor203: e1 + Location: 27,21 + Owner: Nod + SubCell: 2 + Actor204: e1 + Location: 27,21 + Owner: Nod + SubCell: 1 + Actor205: e3 + Location: 28,21 + Owner: Nod + SubCell: 4 + Actor206: e3 + Location: 28,21 + Owner: Nod + SubCell: 2 + Actor207: e3 + Location: 29,21 + Owner: Nod + SubCell: 1 + Actor208: e3 + Location: 29,21 + Owner: Nod + SubCell: 3 + Actor209: e4 + Location: 30,21 + Owner: Nod + SubCell: 1 + Actor210: e4 + Location: 30,21 + Owner: Nod + SubCell: 3 + Actor211: e4 + Location: 30,21 + Owner: Nod + SubCell: 2 + Actor212: e4 + Location: 30,21 + Owner: Nod + SubCell: 4 + Actor213: e1 + Location: 13,12 + Owner: Nod + SubCell: 3 + Actor214: e1 + Location: 14,12 + Owner: Nod + SubCell: 1 + Actor215: e1 + Location: 15,11 + Owner: Nod + SubCell: 0 + Actor216: e3 + Location: 5,7 + Owner: Nod + SubCell: 3 + Actor217: e3 + Location: 7,7 + Owner: Nod + SubCell: 3 + Actor218: e3 + Location: 19,15 + Owner: Nod + SubCell: 1 + Actor219: e3 + Location: 20,16 + Owner: Nod + SubCell: 1 + DefaultChinookTarget: waypoint + Location: 41,56 + Owner: Neutral + DefaultCameraPosition: waypoint + Location: 41,49 + Owner: Neutral + waypoint16: waypoint + Location: 10,22 + Owner: Neutral + waypoint15: waypoint + Location: 53,45 + Owner: Neutral + waypoint14: waypoint + Location: 53,40 + Owner: Neutral + waypoint13: waypoint + Location: 13,26 + Owner: Neutral + waypoint12: waypoint + Location: 52,25 + Owner: Neutral + waypoint11: waypoint + Location: 36,27 + Owner: Neutral + waypoint10: waypoint + Location: 38,32 + Owner: Neutral + waypoint9: waypoint + Location: 47,43 + Owner: Neutral + waypoint8: waypoint + Location: 24,55 + Owner: Neutral + waypoint7: waypoint + Location: 43,40 + Owner: Neutral + waypoint6: waypoint + Location: 24,38 + Owner: Neutral + waypoint5: waypoint + Location: 20,29 + Owner: Neutral + waypoint4: waypoint + Location: 23,24 + Owner: Neutral + waypoint3: waypoint + Location: 5,43 + Owner: Neutral + waypoint2: waypoint + Location: 8,47 + Owner: Neutral + waypoint1: waypoint + Location: 8,53 + Owner: Neutral + waypoint0: waypoint + Location: 19,53 + Owner: Neutral + +Rules: cnc|rules/campaign-maprules.yaml, cnc|rules/campaign-tooltips.yaml, cnc|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/cnc/maps/gdi08a/rules.yaml b/mods/cnc/maps/gdi08a/rules.yaml new file mode 100644 index 0000000000..8d0a5d1abf --- /dev/null +++ b/mods/cnc/maps/gdi08a/rules.yaml @@ -0,0 +1,154 @@ +World: + LuaScript: + Scripts: campaign-global.lua, gdi08a.lua, gdi08a-AI.lua + MusicPlaylist: + StartingMusic: march + VictoryMusic: gdi_win1 + MissionData: + Briefing: U.N. Sanction has cut funding to the Global Defense Initiative. Field Units are helpless.\n\nUse the repair facility to keep your units in the field long enough to destroy the Nod base in this region.\n\nAll Nod units and structures must be destroyed. + BriefingVideo: gdi8a.vqa + BackgroundVideo: tbrinfo1.vqa + WinVideo: paratrop.vqa + LossVideo: gameover.vqa + SmudgeLayer@SCORCH: + InitialSmudges: + 42,56: sc1,0 + 41,52: sc6,0 + 38,51: sc2,0 + 43,50: sc3,0 + 40,48: sc4,0 + 47,46: sc5,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 + +HELI: + Buildable: + Prerequisites: ~disabled + +LTNK: + Buildable: + Prerequisites: ~afld + +ARTY: + Buildable: + Prerequisites: ~disabled + +E4: + Buildable: + Prerequisites: barracks + +E5: + Buildable: + Prerequisites: ~disabled + +MLRS: + Buildable: + Prerequisites: ~disabled + +CYCL: + Buildable: + Prerequisites: ~disabled + +GTWR: + Buildable: + Prerequisites: ~disabled + +SBAG: + Buildable: + Queue: Defence.GDI, Defence.Nod + +GUN: + Buildable: + Queue: Defence.GDI, Defence.Nod + +C3: + Tooltip: + Name: Farmer Mike + +SAM: + Buildable: + Prerequisites: ~disabled + +^Bridge: + DamageMultiplier@INVULNERABLE: + Modifier: 0 + +BRIDGEHUT: + -Targetable: + +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. + +AFLD: + RallyPoint: + Offset: -5, 2 diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index 7234d483fa..6765f4b0cf 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -9,6 +9,7 @@ GDI Campaign: gdi05b gdi06 gdi07 + gdi08a Nod Campaign: nod01