From e9195d3a368aeec445f326ea598c291e0a161bf5 Mon Sep 17 00:00:00 2001 From: Biofreak1987 Date: Sat, 14 May 2016 18:01:42 +0200 Subject: [PATCH] Add nod08a --- OpenRA.sln | 2 + mods/cnc/maps/nod08a/map.bin | Bin 0 -> 20497 bytes mods/cnc/maps/nod08a/map.png | Bin 0 -> 38115 bytes mods/cnc/maps/nod08a/map.yaml | 611 +++++++++++++++++++++++++++++ mods/cnc/maps/nod08a/nod08a-AI.lua | 220 +++++++++++ mods/cnc/maps/nod08a/nod08a.lua | 225 +++++++++++ mods/cnc/maps/nod08a/rules.yaml | 214 ++++++++++ mods/cnc/maps/nod08a/weapons.yaml | 7 + mods/cnc/missions.yaml | 1 + 9 files changed, 1280 insertions(+) create mode 100644 mods/cnc/maps/nod08a/map.bin create mode 100644 mods/cnc/maps/nod08a/map.png create mode 100644 mods/cnc/maps/nod08a/map.yaml create mode 100644 mods/cnc/maps/nod08a/nod08a-AI.lua create mode 100644 mods/cnc/maps/nod08a/nod08a.lua create mode 100644 mods/cnc/maps/nod08a/rules.yaml create mode 100644 mods/cnc/maps/nod08a/weapons.yaml diff --git a/OpenRA.sln b/OpenRA.sln index 695125147e..e8b24077ef 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -48,6 +48,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts", mods\cnc\maps\nod07a\nod07a.lua = mods\cnc\maps\nod07a\nod07a.lua mods\cnc\maps\nod07b\nod07b-AI.lua = mods\cnc\maps\nod07b\nod07b-AI.lua mods\cnc\maps\nod07b\nod07b.lua = mods\cnc\maps\nod07b\nod07b.lua + mods\cnc\maps\nod08a\nod08a-AI.lua = mods\cnc\maps\nod08a\nod08a-AI.lua + mods\cnc\maps\nod08a\nod08a.lua = mods\cnc\maps\nod08a\nod08a.lua mods\cnc\maps\funpark01\scj01ea.lua = mods\cnc\maps\funpark01\scj01ea.lua mods\cnc\maps\shellmap\shellmap.lua = mods\cnc\maps\shellmap\shellmap.lua EndProjectSection diff --git a/mods/cnc/maps/nod08a/map.bin b/mods/cnc/maps/nod08a/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..9e8a7cfc2bc8d60e4adbe021606d44a7a1702e64 GIT binary patch literal 20497 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 QXqf>j@OfkhlD!%D4++j+4gdfE literal 0 HcmV?d00001 diff --git a/mods/cnc/maps/nod08a/map.png b/mods/cnc/maps/nod08a/map.png new file mode 100644 index 0000000000000000000000000000000000000000..79a18411c13ca1b54172cf7456d416a269c76cb5 GIT binary patch literal 38115 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

KP4)uK~B0hB~)fj!9 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 literal 0 HcmV?d00001 diff --git a/mods/cnc/maps/nod08a/map.yaml b/mods/cnc/maps/nod08a/map.yaml new file mode 100644 index 0000000000..0a7cd37e0b --- /dev/null +++ b/mods/cnc/maps/nod08a/map.yaml @@ -0,0 +1,611 @@ +MapFormat: 11 + +RequiresMod: cnc + +Title: Battle for Zaire (a) + +Author: Westwood Studios + +Tileset: DESERT + +MapSize: 64,64 + +Bounds: 8,12,55,49 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F5D378 + Allies: Outpost + Enemies: Nod + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: gdi + PlayerReference@Civilians: + Name: Civilians + NonCombatant: True + Faction: gdi + Enemies: Nod + PlayerReference@Outpost: + Name: Outpost + Faction: gdi + Color: F5D378 + Allies: GDI + Enemies: Nod + PlayerReference@Nod: + Name: Nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: GDI, Civilians + PlayerReference@NodBase: + Name: NodBase + NonCombatant: True + Faction: nod + Color: FE1100 + Enemies: Nod + +Actors: + Actor0: brik + Location: 62,22 + Owner: GDI + Actor1: brik + Location: 61,22 + Owner: GDI + Actor2: brik + Location: 60,22 + Owner: GDI + Actor3: brik + Location: 59,22 + Owner: GDI + Actor4: brik + Location: 58,22 + Owner: GDI + Actor5: brik + Location: 57,22 + Owner: GDI + Actor6: brik + Location: 56,22 + Owner: GDI + Actor7: brik + Location: 55,22 + Owner: GDI + Actor8: brik + Location: 54,22 + Owner: GDI + Actor9: brik + Location: 53,22 + Owner: GDI + Actor10: brik + Location: 52,22 + Owner: GDI + Actor11: brik + Location: 47,22 + Owner: GDI + Actor12: brik + Location: 46,22 + Owner: GDI + Actor13: brik + Location: 62,21 + Owner: GDI + Actor14: brik + Location: 53,21 + Owner: GDI + Actor15: brik + Location: 52,21 + Owner: GDI + Actor16: brik + Location: 47,21 + Owner: GDI + Actor17: brik + Location: 46,21 + Owner: GDI + Actor18: brik + Location: 62,20 + Owner: GDI + Actor19: brik + Location: 46,20 + Owner: GDI + Actor20: brik + Location: 62,19 + Owner: GDI + Actor21: brik + Location: 46,19 + Owner: GDI + Actor22: brik + Location: 62,18 + Owner: GDI + Actor23: brik + Location: 47,18 + Owner: GDI + Actor24: brik + Location: 46,18 + Owner: GDI + Actor25: brik + Location: 62,17 + Owner: GDI + Actor26: brik + Location: 47,17 + Owner: GDI + Actor27: brik + Location: 46,17 + Owner: GDI + Actor28: brik + Location: 62,16 + Owner: GDI + Actor29: brik + Location: 62,15 + Owner: GDI + Actor30: brik + Location: 62,14 + Owner: GDI + Actor31: brik + Location: 62,13 + Owner: GDI + Actor32: brik + Location: 47,13 + Owner: GDI + Actor33: brik + Location: 46,13 + Owner: GDI + Actor34: cycl + Location: 40,13 + Owner: GDI + Actor35: cycl + Location: 39,13 + Owner: GDI + Actor36: brik + Location: 62,12 + Owner: GDI + Actor37: brik + Location: 61,12 + Owner: GDI + Actor38: brik + Location: 60,12 + Owner: GDI + Actor39: brik + Location: 59,12 + Owner: GDI + Actor40: brik + Location: 58,12 + Owner: GDI + Actor41: brik + Location: 57,12 + Owner: GDI + Actor42: brik + Location: 56,12 + Owner: GDI + Actor43: brik + Location: 55,12 + Owner: GDI + Actor44: brik + Location: 54,12 + Owner: GDI + Actor45: brik + Location: 53,12 + Owner: GDI + Actor46: brik + Location: 52,12 + Owner: GDI + Actor47: brik + Location: 51,12 + Owner: GDI + Actor48: brik + Location: 50,12 + Owner: GDI + Actor49: brik + Location: 49,12 + Owner: GDI + Actor50: brik + Location: 48,12 + Owner: GDI + Actor51: brik + Location: 47,12 + Owner: GDI + Actor52: brik + Location: 46,12 + Owner: GDI + Actor53: cycl + Location: 40,12 + Owner: GDI + Actor54: rock1 + Location: 19,17 + Owner: Neutral + Actor55: t08 + Location: 8,29 + Owner: Neutral + Actor56: t08 + Location: 35,50 + Owner: Neutral + Actor57: t08 + Location: 10,26 + Owner: Neutral + Actor58: t08 + Location: 17,48 + Owner: Neutral + Actor59: t08 + Location: 34,25 + Owner: Neutral + Actor60: t18 + Location: 51,54 + Owner: Neutral + Actor61: t18 + Location: 45,56 + Owner: Neutral + Actor62: t08 + Location: 23,36 + Owner: Neutral + Actor63: t08 + Location: 21,24 + Owner: Neutral + Actor64: t08 + Location: 62,25 + Owner: Neutral + Actor88: mtnk + Location: 45,20 + Owner: GDI + Facing: 160 + Actor89: mtnk + Location: 50,58 + Owner: GDI + Facing: 192 + Actor90: mtnk + Location: 57,28 + Owner: GDI + Facing: 160 + Actor91: e2 + Location: 27,60 + Owner: GDI + SubCell: 2 + Actor92: e3 + Location: 57,21 + Owner: GDI + SubCell: 3 + Actor93: e3 + Location: 56,21 + Owner: GDI + SubCell: 2 + Actor94: e3 + Location: 57,21 + Owner: GDI + SubCell: 1 + Actor95: e3 + Location: 56,21 + Owner: GDI + SubCell: 4 + Actor96: e2 + Location: 55,19 + Owner: GDI + SubCell: 3 + Actor97: e2 + Location: 55,20 + Owner: GDI + SubCell: 1 + Actor98: e2 + Location: 54,19 + Owner: GDI + SubCell: 3 + Actor99: e2 + Location: 54,19 + Owner: GDI + SubCell: 4 + Actor100: e2 + Location: 54,20 + Owner: GDI + SubCell: 2 + Actor101: e2 + Location: 54,20 + Owner: GDI + SubCell: 1 + Actor102: e1 + Location: 55,21 + Owner: GDI + SubCell: 1 + Actor103: e1 + Location: 54,21 + Owner: GDI + SubCell: 1 + Actor104: e1 + Location: 55,21 + Owner: GDI + SubCell: 3 + Actor105: e1 + Location: 54,21 + Owner: GDI + SubCell: 2 + Actor106: e1 + Location: 54,21 + Owner: GDI + SubCell: 4 + Actor107: e1 + Location: 54,21 + Owner: GDI + SubCell: 3 + Actor108: e3 + Location: 13,56 + Owner: GDI + SubCell: 0 + Actor109: e3 + Location: 13,54 + Owner: GDI + SubCell: 3 + Actor110: e2 + Location: 23,49 + Owner: GDI + SubCell: 0 + Actor111: e2 + Location: 21,49 + Owner: GDI + SubCell: 3 + Actor112: e1 + Location: 29,56 + Owner: GDI + SubCell: 0 + Actor113: e1 + Location: 28,56 + Owner: GDI + SubCell: 0 + Actor114: e3 + Location: 56,21 + Owner: GDI + SubCell: 3 + Actor115: e3 + Location: 56,21 + Owner: GDI + SubCell: 1 + Actor116: e3 + Location: 55,23 + Owner: GDI + Facing: 160 + SubCell: 1 + Actor117: e1 + Location: 56,23 + Owner: GDI + Facing: 160 + SubCell: 1 + Actor118: e1 + Location: 54,28 + Owner: GDI + Facing: 160 + SubCell: 1 + Actor119: e2 + Location: 53,28 + Owner: GDI + Facing: 96 + SubCell: 0 + Actor120: e2 + Location: 56,24 + Owner: GDI + Facing: 160 + SubCell: 2 + Actor121: e1 + Location: 35,25 + Owner: GDI + Facing: 160 + SubCell: 0 + Actor122: e2 + Location: 36,50 + Owner: GDI + Facing: 160 + SubCell: 4 + Actor123: e1 + Location: 44,58 + Owner: GDI + Facing: 224 + SubCell: 4 + Actor124: e1 + Location: 47,55 + Owner: GDI + Facing: 64 + SubCell: 0 + Actor135: e1 + Location: 46,58 + Owner: GDI + Facing: 32 + SubCell: 2 + Actor136: e2 + Location: 47,59 + Owner: GDI + Facing: 224 + SubCell: 0 + Actor137: e2 + Location: 43,57 + Owner: GDI + Facing: 160 + SubCell: 1 + waypoint27: waypoint + Location: 33,53 + Owner: Neutral + waypoint26: waypoint + Location: 33,53 + Owner: Neutral + waypoint25: waypoint + Location: 23,55 + Owner: Neutral + waypoint15: waypoint + Location: 55,54 + Owner: Neutral + waypoint14: waypoint + Location: 13,27 + Owner: Neutral + waypoint13: waypoint + Location: 15,13 + Owner: Neutral + waypoint12: waypoint + Location: 31,15 + Owner: Neutral + waypoint11: waypoint + Location: 13,56 + Owner: Neutral + waypoint10: waypoint + Location: 23,44 + Owner: Neutral + waypoint9: waypoint + Location: 9,44 + Owner: Neutral + waypoint8: waypoint + Location: 9,33 + Owner: Neutral + Actor138: waypoint + Location: 22,26 + Owner: Neutral + Actor139: waypoint + Location: 35,30 + Owner: Neutral + Actor140: waypoint + Location: 32,52 + Owner: Neutral + Actor141: waypoint + Location: 46,49 + Owner: Neutral + Actor142: waypoint + Location: 47,39 + Owner: Neutral + Actor143: waypoint + Location: 51,33 + Owner: Neutral + Actor144: waypoint + Location: 49,26 + Owner: Neutral + Actor145: waypoint + Location: 49,22 + Owner: Neutral + Actor156: split3 + Owner: Neutral + Location: 40,22 + Actor157: split3 + Owner: Neutral + Location: 57,42 + AirstrikeTarget: waypoint + Owner: Neutral + Location: 60,57 + AttackPath1: waypoint + Owner: Neutral + Location: 27,36 + AttackPath2: waypoint + Owner: Neutral + Location: 12,31 + AttackPath3: waypoint + Owner: Neutral + Location: 49,46 + GDIBuilding1: hpad + Location: 41,14 + Owner: GDI + GDIBuilding2: hpad + Location: 39,14 + Owner: GDI + GDIBuilding3: silo + Location: 57,14 + Owner: GDI + GDIBuilding4: silo + Location: 55,13 + Owner: GDI + GDIBuilding5: gtwr + Location: 52,23 + Owner: GDI + GDIBuilding6: gtwr + Location: 47,23 + Owner: GDI + GDIBuilding7: silo + Location: 55,17 + Owner: GDI + GDIBuilding8: silo + Location: 55,15 + Owner: GDI + GDIBuilding9: atwr + Owner: GDI + Location: 47,19 + TurretFacing: 92 + GDICYard: fact + Location: 59,13 + Owner: GDI + GDIHarvester: harv + Owner: GDI + Location: 50,18 + Facing: 92 + GDIHQ: hq + Location: 51,13 + Owner: GDI + GDINuke1: nuke + Location: 60,17 + Owner: GDI + GDINuke2: nuke + Location: 59,19 + Owner: GDI + GDINuke3: nuke + Location: 57,18 + Owner: GDI + GDINuke4: nuke + Location: 58,16 + Owner: GDI + GDIOrca1: orca + Owner: GDI + Location: 41,12 + Facing: 92 + GDIOrca2: orca + Owner: GDI + Location: 41,13 + Facing: 92 + GDIProc: proc + Owner: GDI + Location: 50,16 + FreeActor: False + GDIPyle: pyle + Location: 53,14 + Owner: GDI + GDIWeap: weap + Location: 48,12 + Owner: GDI + MoneyCrate: MoneyCrate + Owner: Neutral + Location: 39,12 + NodCYard: fact.in + Location: 60,53 + Owner: NodBase + Health: 37 + NodHand: hand + Location: 59,55 + Owner: NodBase + Health: 45 + NodNuke: nuke + Location: 61,56 + Owner: NodBase + Health: 47 + OutpostCYard: factout.in + Location: 17,54 + Owner: Outpost + OutpostHarvester: harv + Location: 10,58 + Owner: Outpost + OutpostNuke: nukeout.in + Location: 20,52 + Owner: Outpost + OutpostProc: procout.in + Location: 20,55 + Owner: Outpost + FreeActor: False + ReinforcementsHelicopterRally: waypoint + Owner: Neutral + Location: 37,58 + ReinforcementsHelicopterSpawn: waypoint + Owner: Neutral + Location: 25,60 + +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/nod08a/nod08a-AI.lua b/mods/cnc/maps/nod08a/nod08a-AI.lua new file mode 100644 index 0000000000..05be4c7e3e --- /dev/null +++ b/mods/cnc/maps/nod08a/nod08a-AI.lua @@ -0,0 +1,220 @@ +AttackPaths = { { AttackPath1 }, { AttackPath2 }, { AttackPath3 } } +GDIBase = { GDICYard, GDIPyle, GDIWeap, GDIHQ, GDIProc, GDINuke1, GDINuke2, GDINuke3, GDIBuilding1, GDIBuilding2, GDIBuilding3, GDIBuilding4, GDIBuilding5, GDIBuilding6, GDIBuilding7, GDIBuilding8, GDIBuilding9 } +GDIOrcas = { GDIOrca1, GDIOrca2 } +InfantryAttackGroup = { } +InfantryGroupSize = 4 +InfantryProductionCooldown = DateTime.Minutes(3) +InfantryProductionTypes = { "e1", "e1", "e2" } +HarvesterProductionType = { "harv" } +VehicleAttackGroup = { } +VehicleGroupSize = 4 +VehicleProductionCooldown = DateTime.Minutes(4) +VehicleProductionTypes = { "jeep", "jeep", "mtnk", "mtnk", "mtnk" } +StartingCash = 4000 + +BaseProc = { type = "proc", pos = CPos.New(50, 16), cost = 1500, exists = true } +BaseNuke1 = { type = "nuke", pos = CPos.New(60, 17), cost = 500, exists = true } +BaseNuke2 = { type = "nuke", pos = CPos.New(59, 19), cost = 500, exists = true } +BaseNuke3 = { type = "nuke", pos = CPos.New(57, 18), cost = 500, exists = true } +BaseNuke4 = { type = "nuke", pos = CPos.New(58, 16), cost = 500, exists = true } +InfantryProduction = { type = "pyle", pos = CPos.New(53, 14), cost = 500, exists = true } +VehicleProduction = { type = "weap", pos = CPos.New(48, 12), cost = 2000, exists = true } + +BaseBuildings = { BaseProc, BaseNuke1, BaseNuke2, BaseNuke3, BaseNuke4, InfantryProduction, VehicleProduction } + +AutoGuard = function(guards) + Utils.Do(guards, function(guard) + Trigger.OnDamaged(guard, function(guard) + IdleHunt(guard) + end) + end) +end + +BuildBase = function(cyard) + Utils.Do(BaseBuildings, function(building) + if not building.exists and not cyardIsBuilding then + BuildBuilding(building, cyard) + return + end + end) + Trigger.AfterDelay(DateTime.Seconds(10), function() BuildBase(cyard) end) +end + +BuildBuilding = function(building, cyard) + cyardIsBuilding = true + + Trigger.AfterDelay(Actor.BuildTime(building.type), function() + cyardIsBuilding = false + + if cyard.IsDead or cyard.Owner ~= enemy then + return + end + + local actor = Actor.Create(building.type, true, { Owner = enemy, Location = building.pos }) + enemy.Cash = enemy.Cash - building.cost + + building.exists = true + + if actor.Type == 'pyle' or actor.Type == 'hand' then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(actor) end) + elseif actor.Type == 'weap' or actor.Type == 'afld' then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(actor) end) + end + + Trigger.OnKilled(actor, function() building.exists = false end) + + Trigger.OnDamaged(actor, function(building) + if building.Owner == enemy and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), function() BuildBase(cyard) end) + end) +end + +CheckForHarvester = function() + local harv = enemy.GetActorsByType("harv") + return #harv > 0 +end + +GuardBase = function() + Utils.Do(GDIBase, function(building) + Trigger.OnDamaged(building, function(guard) + Utils.Do(GDIOrcas, function(guard) + if not guard.IsDead and not building.IsDead then + guard.Guard(building) + end + end) + end) + end) +end + +IdleHunt = function(unit) + if not unit.IsDead then + Trigger.OnIdle(unit, unit.Hunt) + end +end + +IdlingUnits = function(enemy) + local lazyUnits = enemy.GetGroundAttackers() + + Utils.Do(lazyUnits, function(unit) + IdleHunt(unit) + 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 then + return + elseif not CheckForHarvester() then + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(building) end) + 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 + SendUnits(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 then + return + elseif not CheckForHarvester() then + ProduceHarvester(building) + Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(building) end) + 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 + SendUnits(VehicleAttackGroup, Path) + VehicleAttackGroup = { } + Trigger.AfterDelay(VehicleProductionCooldown, function() ProduceVehicle(building) end) + else + Trigger.AfterDelay(delay, function() ProduceVehicle(building) end) + end + end) +end + +SendUnits = function(units, waypoints) + Utils.Do(units, function(unit) + if not unit.IsDead then + Utils.Do(waypoints, function(waypoint) + unit.AttackMove(waypoint.Location) + end) + IdleHunt(unit) + end + end) +end + +StartAI = function(cyard) + Utils.Do(Map.NamedActors, function(actor) + if actor.Owner == enemy and actor.HasProperty("StartBuildingRepairs") then + Trigger.OnDamaged(actor, function(building) + if building.Owner == enemy and building.Health < 3/4 * building.MaxHealth then + building.StartBuildingRepairs() + end + end) + end + end) + enemy.Cash = StartingCash + BuildBase(cyard) + GuardBase() +end + +Trigger.OnAllKilledOrCaptured(GDIBase, function() + IdlingUnits(enemy) +end) + +Trigger.OnKilled(GDIProc, function(building) + BaseProc.exists = false +end) + +Trigger.OnKilled(GDINuke1, function(building) + BaseNuke1.exists = false +end) + +Trigger.OnKilled(GDINuke2, function(building) + BaseNuke2.exists = false +end) + +Trigger.OnKilled(GDINuke3, function(building) + BaseNuke3.exists = false +end) + +Trigger.OnKilled(GDINuke4, function(building) + BaseNuke4.exists = false +end) + +Trigger.OnKilled(GDIPyle, function(building) + InfantryProduction.exists = false +end) + +Trigger.OnKilled(GDIWeap, function(building) + VehicleProduction.exists = false +end) diff --git a/mods/cnc/maps/nod08a/nod08a.lua b/mods/cnc/maps/nod08a/nod08a.lua new file mode 100644 index 0000000000..569e80a0b9 --- /dev/null +++ b/mods/cnc/maps/nod08a/nod08a.lua @@ -0,0 +1,225 @@ +WaypointGroup1 = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint6, waypoint10 } +WaypointGroup2 = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint6, waypoint7, waypoint8, waypoint9, waypoint10 } +WaypointGroup3 = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint4, waypoint5 } +WaypointGroup4 = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint4 } +WaypointGroup5 = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint6, waypoint7, waypoint8, waypoint9, waypoint11 } + +GDI1 = { units = { ['e1'] = 2, ['e2'] = 2 }, waypoints = WaypointGroup3, delay = 80 } +GDI2 = { units = { ['e2'] = 3, ['e3'] = 2 }, waypoints = WaypointGroup1, delay = 10 } +GDI3 = { units = { ['e1'] = 2, ['e3'] = 3 }, waypoints = WaypointGroup1, delay = 30 } +GDI4 = { units = { ['jeep'] = 2 }, waypoints = WaypointGroup3, delay = 45 } +GDI5 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup3, delay = 10 } +Auto1 = { units = { ['e1'] = 2, ['e2'] = 2, ['e3'] = 2 }, waypoints = WaypointGroup4, delay = 25 } +Auto2 = { units = { ['e2'] = 2, ['jeep'] = 1 }, waypoints = WaypointGroup3, delay = 40 } +Auto3 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup1, delay = 30 } +Auto4 = { units = { ['e1'] = 2, ['mtnk'] = 1 }, waypoints = WaypointGroup2, delay = 30 } +Auto5 = { units = { ['e3'] = 2, ['jeep'] = 1 }, waypoints = WaypointGroup1, delay = 30 } + +AutoAttackWaves = { GDI1, GDI2, GDI3, GDI4, GDI5, Auto1, Auto2, Auto3, Auto4, Auto5 } + +NodBase = { NodCYard, NodNuke, NodHand } +Outpost = { OutpostCYard, OutpostProc } + +IntroReinforcements = { "e1", "e1", "e1", "e1", "e1", "e1", "e3", "e3", "e3", "e3" } + +IntroGuards = { Actor89, Actor137, Actor123, Actor124, Actor135, Actor136 } +OutpostGuards = { Actor91, Actor108, Actor109, Actor110, Actor111, Actor112, Actor113, Actor122 } + +NodBaseTrigger = { CPos.New(52, 52), CPos.New(52, 53), CPos.New(52, 54), CPos.New(52, 55), CPos.New(52, 56), CPos.New(52, 57), CPos.New(52, 58), CPos.New(52, 59), CPos.New(52, 60), CPos.New(55, 54) } + +AirstrikeDelay = DateTime.Minutes(2) + DateTime.Seconds(20) + +NodBaseCapture = function() + nodBaseTrigger = true + player.MarkCompletedObjective(NodObjective1) + Utils.Do(NodBase, function(actor) + actor.Owner = player + end) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "NewOptions") + end) +end + +searches = 0 +getAirstrikeTarget = function() + local list = player.GetGroundAttackers() + + if #list == 0 then + return + end + + local target = list[DateTime.GameTime % #list + 1].CenterPosition + + if searches < 6 then + searches = searches + 1 + return getAirstrikeTarget() + else + searches = 0 + return target + end +end + +--Provide the player with a helicopter until the outpost got captured +SendHelicopter = function() + Trigger.AfterDelay(DateTime.Seconds(5), function() + if not outpostCaptured then + Media.PlaySpeechNotification(player, "Reinforce") + TransportHelicopter = Reinforcements.ReinforceWithTransport(player, 'tran', nil, { ReinforcementsHelicopterSpawn.Location, waypoint15.Location })[1] + Trigger.OnKilled(TransportHelicopter, function() + SendHelicopter() + end) + end + end) +end + +SendAttackWave = function(team) + for type, amount in pairs(team.units) do + count = 0 + actors = enemy.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 + +SendGDIAirstrike = function(hq, delay) + if not hq.IsDead and hq.Owner == enemy then + local target = getAirstrikeTarget() + + if target then + hq.SendAirstrike(target, false, Facing.NorthEast + 4) + Trigger.AfterDelay(delay, function() SendGDIAirstrike(hq, delay) end) + else + Trigger.AfterDelay(delay/4, function() SendGDIAirstrike(hq, delay) end) + end + end +end + +SendWaves = function(counter, Waves) + if counter <= #Waves then + local team = Waves[counter] + SendAttackWave(team) + Trigger.AfterDelay(DateTime.Seconds(team.delay), function() SendWaves(counter + 1, Waves) end) + end +end + +StartWaves = function() + SendWaves(1, AutoAttackWaves) +end + +Trigger.OnAllKilled(IntroGuards, function() + FlareCamera = Actor.Create("camera", true, { Owner = player, Location = waypoint25.Location }) + Flare = Actor.Create("flare", true, { Owner = player, Location = waypoint25.Location }) + SendHelicopter() + player.MarkCompletedObjective(NodObjective1) + NodBaseCapture() +end) + +Trigger.OnAllKilledOrCaptured(Outpost, function() + if not outpostCaptured then + outpostCaptured = true + + Trigger.AfterDelay(DateTime.Minutes(1), function() + + if not GDIHQ.IsDead and (not NodHand.IsDead or not NodNuke.IsDead) then + local airstrikeproxy = Actor.Create("airstrike.proxy", false, { Owner = enemy }) + airstrikeproxy.SendAirstrike(AirstrikeTarget.CenterPosition, false, Facing.NorthEast + 4) + airstrikeproxy.Destroy() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(15), function() + Utils.Do(OutpostGuards, function(unit) + IdleHunt(unit) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(1), function() + FlareCamera.Kill() + Flare.Destroy() + end) + + player.MarkCompletedObjective(NodObjective2) + Trigger.AfterDelay(DateTime.Minutes(1), function() StartWaves() end) + Trigger.AfterDelay(AirstrikeDelay, function() SendGDIAirstrike(GDIHQ, AirstrikeDelay) end) + Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceInfantry(GDIPyle) end) + Trigger.AfterDelay(DateTime.Minutes(3), function() ProduceVehicle(GDIWeap) end) + end +end) + +Trigger.OnCapture(OutpostCYard, function() + Trigger.AfterDelay(DateTime.Seconds(4), function() + Media.PlaySpeechNotification(player, "NewOptions") + end) +end) + +Trigger.OnAnyKilled(Outpost, function() + if not outpostCaptured then + player.MarkFailedObjective(NodObjective2) + end +end) + +Trigger.OnEnteredFootprint(NodBaseTrigger, function(a, id) + if not nodBaseTrigger and a.Owner == player then + NodBaseCapture() + end +end) + +WorldLoaded = function() + player = Player.GetPlayer("Nod") + enemy = Player.GetPlayer("GDI") + Camera.Position = waypoint26.CenterPosition + Media.PlaySpeechNotification(player, "Reinforce") + Reinforcements.ReinforceWithTransport(player, 'tran.in', IntroReinforcements, { ReinforcementsHelicopterSpawn.Location, ReinforcementsHelicopterRally.Location }, { ReinforcementsHelicopterSpawn.Location }, nil, nil) + + StartAI(GDICYard) + AutoGuard(IntroGuards) + AutoGuard(OutpostGuards) + + Trigger.OnObjectiveAdded(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + Trigger.OnObjectiveCompleted(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + + Trigger.OnObjectiveFailed(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "Win") + end) + + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "Lose") + end) + + NodObjective1 = player.AddPrimaryObjective("Locate the Nod base.") + NodObjective2 = player.AddPrimaryObjective("Capture the GDI outpost.") + NodObjective3 = player.AddPrimaryObjective("Eliminate all GDI forces in the area.") + GDIObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area.") +end + +Tick = function() + if DateTime.GameTime > 2 and player.HasNoRequiredUnits() then + enemy.MarkCompletedObjective(GDIObjective) + end + + if DateTime.GameTime > 2 and enemy.HasNoRequiredUnits() then + player.MarkCompletedObjective(NodObjective3) + end +end diff --git a/mods/cnc/maps/nod08a/rules.yaml b/mods/cnc/maps/nod08a/rules.yaml new file mode 100644 index 0000000000..ae9b90bc54 --- /dev/null +++ b/mods/cnc/maps/nod08a/rules.yaml @@ -0,0 +1,214 @@ +World: + LuaScript: + Scripts: nod08a.lua, nod08a-AI.lua + MusicPlaylist: + StartingMusic: linefire + VictoryMusic: nod_win1 + MissionData: + Briefing: Since we are low on troops, you will have to make use of all available resources.\n\n Locate the abandoned GDI base in the area and restore it to operational status. Once that is done, use GDI's own weapons against them.\n\nBe sure that no GDI forces remain alive. + BackgroundVideo: tiberfx.vqa + BriefingVideo: nod8.vqa + LossVideo: nodlose.vqa + SmudgeLayer@SCORCH: + InitialSmudges: + sc1 40,59 0 + sc3 39,59 0 + sc5 55,53 0 + sc2 23,53 0 + sc2 23,52 0 + sc3 59,51 0 + sc5 58,51 0 + sc2 23,51 0 + sc5 23,50 0 + sc3 23,49 0 + SmudgeLayer@CRATER: + InitialSmudges: + cr1 47,58 0 + cr1 56,54 0 + cr1 55,54 0 + +Player: + PlayerResources: + DefaultCash: 0 + +CYCL: + 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 + +E2: + Buildable: + Prerequisites: ~pyle + +E4: + Buildable: + Prerequisites: ~hand + +E5: + Buildable: + Prerequisites: ~disabled + +E6: + -RepairsBridges: + +HARV: + Harvester: + SearchFromOrderRadius: 30 + +MTNK: + Buildable: + Prerequisites: ~weap + +HTNK: + Buildable: + Prerequisites: ~disabled + +HQ: + AirstrikePower: + Prerequisites: gdi + SquadSize: 1 + +RMBO: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +FTNK: + Buildable: + Prerequisites: ~disabled + +MLRS: + Buildable: + Prerequisites: ~disabled + +MSAM: + Buildable: + Prerequisites: ~disabled + +ATWR: + Buildable: + Prerequisites: ~disabled + +HELI: + Buildable: + Prerequisites: ~disabled + +SBAG: + Buildable: + Queue: Defence.GDI, Defence.Nod + +GTWR: + Buildable: + Queue: Defence.GDI + +A10.IN: + Inherits: A10 + RenderSprites: + Image: A10 + Armament@BOMBS: + Weapon: Napalm.in + +airstrike.proxy: + AlwaysVisible: + AirstrikePower: + Icon: airstrike + StartFullyCharged: True + ChargeTime: 120 + SquadSize: 3 + QuantizedFacings: 8 + Description: Air Strike + LongDesc: Deploy an aerial napalm strike.\nBurns buildings and infantry along a line. + EndChargeSound: airredy1.aud + SelectTargetSound: select1.aud + InsufficientPowerSound: nopower1.aud + IncomingSound: enemya.aud + UnitType: a10.in + DisplayBeacon: True + BeaconPoster: airstrike + DisplayRadarPing: True + CameraActor: camera + +FACT.IN: + Inherits: FACT + RenderSprites: + Image: FACT + ProvidesPrerequisite: + Prerequisite: fact + CustomSellValue: + Value: 13515 + +FACTOUT.IN: + Inherits: FACT + RenderSprites: + Image: fact + ProvidesPrerequisite: + Prerequisite: fact + Capturable: + CaptureThreshold: 100 + +MoneyCrate: + Inherits: ^Crate + GiveCashCrateAction: + Amount: 2000 + UseCashTick: yes + +NUKEOUT.IN: + Inherits: NUKE + RenderSprites: + Image: nuke + Buildable: + Prerequisites: ~disabled + ProvidesPrerequisite: + Prerequisite: anypower + Capturable: + CaptureThreshold: 100 + +PROCOUT.IN: + Inherits: PROC + RenderSprites: + Image: proc + Buildable: + Prerequisites: ~disabled + ProvidesPrerequisite: + Prerequisite: proc + Capturable: + CaptureThreshold: 100 + +TRAN.IN: + Inherits: TRAN + RejectsOrders: + -Selectable: + RenderSprites: + Image: TRAN + Buildable: + Prerequisites: ~disabled diff --git a/mods/cnc/maps/nod08a/weapons.yaml b/mods/cnc/maps/nod08a/weapons.yaml new file mode 100644 index 0000000000..5850590565 --- /dev/null +++ b/mods/cnc/maps/nod08a/weapons.yaml @@ -0,0 +1,7 @@ +Napalm.IN: + Inherits: Napalm + Projectile: GravityBomb + Image: BOMBLET + Warhead@1Dam: SpreadDamage + Spread: 1000 + Damage: 1500 diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index a285280e22..b987e860e1 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -23,6 +23,7 @@ Nod Campaign: ./mods/cnc/maps/nod06c ./mods/cnc/maps/nod07a ./mods/cnc/maps/nod07b + ./mods/cnc/maps/nod08a Funpark Campaign: ./mods/cnc/maps/funpark01