From 158263c92216334965959fccab4aae1e1fa2a21f Mon Sep 17 00:00:00 2001 From: Biofreak1987 Date: Sun, 10 Apr 2016 18:28:04 +0200 Subject: [PATCH] Add nod07a Add nod07a - "Sick And Dying (a)" --- OpenRA.sln | 2 + mods/cnc/maps/nod07a/map.bin | Bin 0 -> 20497 bytes mods/cnc/maps/nod07a/map.png | Bin 0 -> 39215 bytes mods/cnc/maps/nod07a/map.yaml | 597 +++++++++++++++++++++++++++++ mods/cnc/maps/nod07a/nod07a-AI.lua | 193 ++++++++++ mods/cnc/maps/nod07a/nod07a.lua | 270 +++++++++++++ mods/cnc/maps/nod07a/rules.yaml | 141 +++++++ mods/cnc/maps/nod07a/weapons.yaml | 3 + mods/cnc/missions.yaml | 1 + 9 files changed, 1207 insertions(+) create mode 100644 mods/cnc/maps/nod07a/map.bin create mode 100644 mods/cnc/maps/nod07a/map.png create mode 100644 mods/cnc/maps/nod07a/map.yaml create mode 100644 mods/cnc/maps/nod07a/nod07a-AI.lua create mode 100644 mods/cnc/maps/nod07a/nod07a.lua create mode 100644 mods/cnc/maps/nod07a/rules.yaml create mode 100644 mods/cnc/maps/nod07a/weapons.yaml diff --git a/OpenRA.sln b/OpenRA.sln index a1e627ecd7..0fce049403 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -44,6 +44,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tiberian Dawn Lua scripts", mods\cnc\maps\nod06a\nod06a.lua = mods\cnc\maps\nod06a\nod06a.lua mods\cnc\maps\nod06b\nod06b.lua = mods\cnc\maps\nod06b\nod06b.lua mods\cnc\maps\nod06c\nod06c.lua = mods\cnc\maps\nod06c\nod06c.lua + mods\cnc\maps\nod07a\nod07a-AI.lua = mods\cnc\maps\nod07a\nod07a-AI.lua + mods\cnc\maps\nod07a\nod07a.lua = mods\cnc\maps\nod07a\nod07a.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/nod07a/map.bin b/mods/cnc/maps/nod07a/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..ffe3a14213d73b4a88cd2e3b8012f3350116fd65 GIT binary patch literal 20497 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 literal 0 HcmV?d00001 diff --git a/mods/cnc/maps/nod07a/map.png b/mods/cnc/maps/nod07a/map.png new file mode 100644 index 0000000000000000000000000000000000000000..8d64e8c574b08f01db4d92f5f8944e0009810fb2 GIT binary patch literal 39215 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 literal 0 HcmV?d00001 diff --git a/mods/cnc/maps/nod07a/map.yaml b/mods/cnc/maps/nod07a/map.yaml new file mode 100644 index 0000000000..0201464f40 --- /dev/null +++ b/mods/cnc/maps/nod07a/map.yaml @@ -0,0 +1,597 @@ +MapFormat: 11 + +RequiresMod: cnc + +Title: Sick And Dying (a) + +Author: Westwood Studios + +Tileset: DESERT + +MapSize: 64,64 + +Bounds: 2,6,58,55 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@GDI: + Name: GDI + Faction: gdi + Color: F5D378 + Allies: Civilians + Enemies: Nod + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: gdi + PlayerReference@Civilians: + Name: Civilians + NonCombatant: True + Faction: gdi + Allies: GDI + Enemies: Nod + PlayerReference@Nod: + Name: Nod + Faction: nod + AllowBots: False + Playable: True + Required: True + LockFaction: True + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Enemies: GDI, Civilians + PlayerReference@NodBase: + Name: NodBase + Faction: nod + Color: FE1100 + +Actors: + Actor0: cycl + Location: 30,60 + Owner: GDI + Actor1: cycl + Location: 29,60 + Owner: GDI + Actor2: cycl + Location: 28,60 + Owner: GDI + Actor3: cycl + Location: 27,60 + Owner: GDI + Actor4: cycl + Location: 26,60 + Owner: GDI + Actor5: cycl + Location: 25,60 + Owner: GDI + Actor6: cycl + Location: 24,60 + Owner: GDI + Actor7: cycl + Location: 23,60 + Owner: GDI + Actor8: cycl + Location: 22,60 + Owner: GDI + Actor9: cycl + Location: 21,60 + Owner: GDI + Actor10: cycl + Location: 20,60 + Owner: GDI + Actor11: cycl + Location: 19,60 + Owner: GDI + Actor12: cycl + Location: 18,60 + Owner: GDI + Actor13: cycl + Location: 17,60 + Owner: GDI + Actor14: cycl + Location: 16,60 + Owner: GDI + Actor15: cycl + Location: 15,60 + Owner: GDI + Actor16: cycl + Location: 14,60 + Owner: GDI + Actor17: cycl + Location: 13,60 + Owner: GDI + Actor18: cycl + Location: 12,60 + Owner: GDI + Actor19: cycl + Location: 11,60 + Owner: GDI + Actor20: cycl + Location: 30,59 + Owner: GDI + Actor21: cycl + Location: 11,59 + Owner: GDI + Actor22: cycl + Location: 30,58 + Owner: GDI + Actor23: cycl + Location: 11,58 + Owner: GDI + Actor24: cycl + Location: 30,57 + Owner: GDI + Actor25: cycl + Location: 11,57 + Owner: GDI + Actor26: cycl + Location: 30,56 + Owner: GDI + Actor27: cycl + Location: 30,55 + Owner: GDI + Actor28: cycl + Location: 30,54 + Owner: GDI + Actor29: cycl + Location: 30,53 + Owner: GDI + Actor30: cycl + Location: 11,53 + Owner: GDI + Actor31: cycl + Location: 30,52 + Owner: GDI + Actor32: cycl + Location: 11,52 + Owner: GDI + Actor33: cycl + Location: 30,51 + Owner: GDI + Actor34: cycl + Location: 11,51 + Owner: GDI + Actor35: cycl + Location: 30,50 + Owner: GDI + Actor36: cycl + Location: 29,50 + Owner: GDI + Actor37: cycl + Location: 28,50 + Owner: GDI + Actor38: cycl + Location: 27,50 + Owner: GDI + Actor39: cycl + Location: 26,50 + Owner: GDI + Actor40: cycl + Location: 25,50 + Owner: GDI + Actor41: cycl + Location: 24,50 + Owner: GDI + Actor42: cycl + Location: 23,50 + Owner: GDI + Actor43: cycl + Location: 22,50 + Owner: GDI + Actor44: cycl + Location: 21,50 + Owner: GDI + Actor45: cycl + Location: 20,50 + Owner: GDI + Actor46: cycl + Location: 19,50 + Owner: GDI + Actor47: cycl + Location: 18,50 + Owner: GDI + Actor48: cycl + Location: 12,50 + Owner: GDI + Actor49: cycl + Location: 11,50 + Owner: GDI + Actor50: t18 + Location: 44,41 + Owner: Neutral + Actor51: t08 + Location: 16,47 + Owner: Neutral + Actor52: t08 + Location: 3,47 + Owner: Neutral + Actor53: t08 + Location: 49,42 + Owner: Neutral + Actor54: t08 + Location: 44,54 + Owner: Neutral + Actor55: t08 + Location: 46,55 + Owner: Neutral + Actor56: t08 + Location: 29,19 + Owner: Neutral + Actor57: t18 + Location: 15,20 + Owner: Neutral + Actor58: t18 + Location: 13,43 + Owner: Neutral + Actor59: t18 + Location: 8,46 + Owner: Neutral + Actor60: t18 + Location: 16,48 + Owner: Neutral + Actor61: t08 + Location: 3,23 + Owner: Neutral + Actor62: t08 + Location: 6,22 + Owner: Neutral + Actor63: t08 + Location: 17,28 + Owner: Neutral + Actor64: t08 + Location: 22,16 + Owner: Neutral + Actor80: hosp + Location: 4,49 + Owner: GDI + Actor82: v20 + Location: 17,42 + Owner: Civilians + Actor83: v21 + Location: 19,43 + Owner: Civilians + Actor84: v22 + Location: 16,46 + Owner: Civilians + Actor85: v23 + Location: 17,47 + Owner: Civilians + Actor86: v24 + Location: 12,43 + Owner: Civilians + Actor87: v27 + Location: 11,47 + Owner: Civilians + Actor88: v27 + Location: 9,48 + Owner: Civilians + Actor89: v28 + Location: 8,48 + Owner: Civilians + Actor90: v29 + Location: 14,43 + Owner: Civilians + Actor91: v30 + Location: 16,48 + Owner: Civilians + Actor92: v28 + Location: 9,46 + Owner: Civilians + Actor93: v29 + Location: 10,47 + Owner: Civilians + Actor94: v33 + Location: 54,53 + Owner: Civilians + Actor95: v35 + Location: 53,53 + Owner: Civilians + Actor96: v36 + Location: 43,53 + Owner: Civilians + Actor97: v32 + Location: 42,54 + Owner: Civilians + Actor98: v31 + Location: 45,54 + Owner: Civilians + Actor99: v30 + Location: 44,55 + Owner: Civilians + Actor100: v29 + Location: 42,53 + Owner: Civilians + Actor101: v28 + Location: 47,55 + Owner: Civilians + Actor102: v26 + Location: 47,54 + Owner: Civilians + Actor106: v25 + Location: 14,47 + Owner: Civilians + Actor107: jeep + Location: 17,59 + Owner: GDI + Actor108: jeep + Location: 29,53 + Owner: GDI + Actor109: mtnk + Location: 28,59 + Owner: GDI + Actor110: mtnk + Location: 12,59 + Owner: GDI + Actor111: mtnk + Location: 13,59 + Owner: GDI + Actor115: mtnk + Location: 18,28 + Owner: GDI + Facing: 32 + Actor116: mtnk + Location: 17,21 + Owner: GDI + Facing: 96 + Actor117: e2 + Location: 20,52 + Owner: GDI + SubCell: 1 + Actor118: e2 + Location: 13,53 + Owner: GDI + SubCell: 2 + Actor119: e2 + Location: 12,52 + Owner: GDI + SubCell: 3 + Actor120: e1 + Location: 21,52 + Owner: GDI + SubCell: 2 + Actor121: e1 + Location: 13,52 + Owner: GDI + SubCell: 1 + Actor122: e1 + Location: 20,51 + Owner: GDI + SubCell: 3 + Actor123: e2 + Location: 8,45 + Owner: GDI + SubCell: 2 + Actor124: e2 + Location: 9,50 + Owner: GDI + SubCell: 1 + Actor125: e2 + Location: 9,45 + Owner: GDI + SubCell: 3 + Actor126: c6 + Location: 18,51 + Owner: Civilians + Facing: 32 + SubCell: 4 + Actor127: c5 + Location: 10,48 + Owner: Civilians + Facing: 224 + SubCell: 0 + Actor142: c8 + Location: 48,52 + Owner: Civilians + Facing: 224 + SubCell: 4 + Actor143: c4 + Location: 52,57 + Owner: Civilians + Facing: 32 + SubCell: 1 + Actor144: c3 + Location: 11,46 + Owner: Civilians + SubCell: 4 + Actor145: c9 + Location: 15,44 + Owner: Civilians + Facing: 64 + SubCell: 0 + Actor146: e2 + Location: 12,57 + Owner: GDI + SubCell: 2 + Actor147: e2 + Location: 13,57 + Owner: GDI + SubCell: 1 + Actor148: e2 + Location: 12,57 + Owner: GDI + SubCell: 4 + Actor149: e2 + Location: 13,57 + Owner: GDI + SubCell: 3 + waypoint27: waypoint + Location: 32,35 + Owner: Neutral + waypoint26: waypoint + Location: 47,35 + Owner: Neutral + waypoint24: waypoint + Location: 52,15 + Owner: Neutral + waypoint25: waypoint + Location: 54,14 + Owner: Neutral + waypoint14: waypoint + Location: 13,47 + Owner: Neutral + waypoint13: waypoint + Location: 52,8 + Owner: Neutral + waypoint12: waypoint + Location: 14,8 + Owner: Neutral + waypoint11: waypoint + Location: 9,24 + Owner: Neutral + waypoint10: waypoint + Location: 22,25 + Owner: Neutral + waypoint9: waypoint + Location: 31,19 + Owner: Neutral + waypoint8: waypoint + Location: 53,21 + Owner: Neutral + waypoint7: waypoint + Location: 58,27 + Owner: Neutral + waypoint6: waypoint + Location: 39,25 + Owner: Neutral + waypoint5: waypoint + Location: 35,40 + Owner: Neutral + waypoint4: waypoint + Location: 22,32 + Owner: Neutral + waypoint3: waypoint + Location: 9,44 + Owner: Neutral + waypoint2: waypoint + Location: 7,50 + Owner: Neutral + waypoint1: waypoint + Location: 9,54 + Owner: Neutral + waypoint0: waypoint + Location: 15,54 + Owner: Neutral + AttackPath1: waypoint + Owner: Neutral + Location: 26,25 + AttackPath2: waypoint + Owner: Neutral + Location: 37,33 + GDIBuilding1: gtwr + Location: 10,53 + Owner: GDI + GDIBuilding2: gtwr + Location: 13,50 + Owner: GDI + GDIBuilding3: gtwr + Location: 17,50 + Owner: GDI + GDIBuilding4: gtwr + Location: 10,57 + Owner: GDI + GDIBuilding5: nuke + Location: 2,48 + Owner: GDI + GDIBuilding6: silo + Location: 25,51 + Owner: GDI + GDIBuilding7: silo + Location: 14,58 + Owner: GDI + GDIBuilding8: silo + Location: 25,53 + Owner: GDI + GDICYard: fact + Location: 22,57 + Owner: GDI + GDIHarvester: harv + Location: 13,55 + Owner: GDI + Facing: 192 + GDIHQ: hq + Location: 20,57 + Owner: GDI + GDINuke1: nuke + Location: 16,56 + Owner: GDI + GDINuke2: nuke + Location: 18,57 + Owner: GDI + GDINuke3: nuke + Location: 27,51 + Owner: GDI + GDIPyle: pyle + Location: 18,54 + Owner: GDI + GDIProc: proc + Location: 22,51 + Owner: GDI + FreeActor: False + GDISearchTopLeft: waypoint + Owner: Neutral + Location: 11,50 + GDISearchBottomRight: waypoint + Owner: Neutral + Location: 30,60 + GDIWeap: weap + Location: 27,54 + Owner: GDI + NodBuilding1: fact + Location: 54,11 + Owner: NodBase + Health: 46 + NodBuilding2: proc + Location: 51,11 + Owner: NodBase + Health: 45 + FreeActor: False + NodBuilding3: nuke + Location: 55,14 + Owner: NodBase + Health: 47 + NodHarvester: harv + Owner: NodBase + Location: 46,31 + Facing: 92 + ReinforcementsBottomSpawn: waypoint + Owner: Neutral + Location: 59,41 + ReinforcementsEngineersRally: waypoint + Owner: Neutral + Location: 52,40 + ReinforcementsFlamersRally: waypoint + Owner: Neutral + Location: 54,39 + ReinforcementsGDISpawn: waypoint + Owner: Neutral + Location: 8,6 + ReinforcementsGunnersRally: waypoint + Owner: Neutral + Location: 54,41 + ReinforcementsHelicopterSpawn: waypoint + Owner: Neutral + Location: 59,16 + ReinforcementsRocketsRally: waypoint + Owner: Neutral + Location: 52,41 + ReinforcementsTank1Rally: waypoint + Owner: Neutral + Location: 51,40 + ReinforcementsTank2Rally: waypoint + Owner: Neutral + Location: 56,40 + ReinforcementsTopSpawn: waypoint + Owner: Neutral + Location: 59,38 + +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/nod07a/nod07a-AI.lua b/mods/cnc/maps/nod07a/nod07a-AI.lua new file mode 100644 index 0000000000..1e5574b3ab --- /dev/null +++ b/mods/cnc/maps/nod07a/nod07a-AI.lua @@ -0,0 +1,193 @@ +AttackPaths = { { AttackPath1 }, { AttackPath2 } } +GDIBase = { GDICYard, GDIPyle, GDIWeap, GDIHQ, GDIProc, GDINuke1, GDINuke2, GDINuke3, GDIBuilding1, GDIBuilding2, GDIBuilding3, GDIBuilding4, GDIBuilding5, GDIBuilding6, GDIBuilding7, GDIBuilding8 } +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(22, 51), cost = 1500, exists = true } +BaseNuke1 = { type = "nuke", pos = CPos.New(16, 56), cost = 500, exists = true } +BaseNuke2 = { type = "nuke", pos = CPos.New(18, 57), cost = 500, exists = true } +BaseNuke3 = { type = "nuke", pos = CPos.New(27, 51), cost = 500, exists = true } +InfantryProduction = { type = "pyle", pos = CPos.New(18, 54), cost = 500, exists = true } +VehicleProduction = { type = "weap", pos = CPos.New(27, 54), cost = 2000, exists = true } + +BaseBuildings = { BaseProc, BaseNuke1, BaseNuke2, BaseNuke3, InfantryProduction, VehicleProduction } + +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 + +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) +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(GDIPyle, function(building) + InfantryProduction.exists = false +end) + +Trigger.OnKilled(GDIWeap, function(building) + VehicleProduction.exists = false +end) diff --git a/mods/cnc/maps/nod07a/nod07a.lua b/mods/cnc/maps/nod07a/nod07a.lua new file mode 100644 index 0000000000..f72a07b6f8 --- /dev/null +++ b/mods/cnc/maps/nod07a/nod07a.lua @@ -0,0 +1,270 @@ +GDI1 = { teamType = "atk", units = { ['e2'] = 3 }, waypoints = { waypoint0, waypoint1, waypoint2, waypoint14 }, delay = 40 } +GDI2 = { teamType = "atk", units = { ['mtnk'] = 2 }, waypoints = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint4, waypoint9 }, delay = 30 } +GDI3 = { teamType = "atk", units = { ['e2'] = 4 }, waypoints = { waypoint0, waypoint4, waypoint5, waypoint6, waypoint7, waypoint8 }, delay = 40 } +GDI4 = { teamType = "atk", units = { ['e1'] = 1, ['e2'] = 2 }, waypoints = { waypoint0, waypoint4, waypoint9 }, delay = 30 } +GDI5 = { teamType = "atk", units = { ['mtnk'] = 1 }, waypoints = { waypoint0, waypoint4, waypoint10, waypoint11, waypoint12, waypoint13 }, delay = 80 } +GDI6 = { teamType = "atk", units = { ['mtnk'] = 1 }, waypoints = { waypoint0, waypoint4, waypoint9 }, delay = 50 } +GDI7 = { teamType = "atk", units = { ['jeep'] = 1 }, waypoints = { waypoint0, waypoint4, waypoint5, waypoint6, waypoint7, waypoint8 }, delay = 40 } +GDI8 = { teamType = "rei", units = { ['e2'] = 3, ['e6'] = 2 }, waypoints = { waypoint12, waypoint11, waypoint10, waypoint4, waypoint5, waypoint8 }, delay = 8 } +GDI9 = { teamType = "atk", units = { ['e2'] = 4 }, waypoints = { waypoint8 }, delay = 80 } +GDI10 = { teamType = "atk", units = { ['e2'] = 4 }, waypoints = { waypoint14 }, delay = 0 } + +AirstrikeDelay = DateTime.Minutes(2) + DateTime.Seconds(20) + +AutoAttackWaves = { GDI3, GDI4, GDI5, GDI6, GDI7, GDI8, GDI9, GDI10 } +IntroAttackWaves = { GDI1, GDI2 } +WhitelistedStructures = { 'afld', 'hand', 'hq', 'nuke', 'silo', 'proc', 'sam' } + +NodUnitsBikes = { 'bike', 'bike', 'bike' } +NodUnitsEngineers = { 'e6', 'e6' } +NodUnitsRockets = { 'e3', 'e3', 'e3', 'e3' } +NodUnitsGunners = { 'e1', 'e1', 'e1', 'e1' } +NodUnitsFlamers = { 'e4', 'e4', 'e4', 'e4' } +ReinforcementsRockets = { 'e3', 'e3', 'e3', 'e3', 'e3' } + +NodBase = { NodBuilding1, NodBuilding2, NodBuilding3, NodHarvester } + +AbandonedBaseTrigger = { CPos.New(12, 42), CPos.New(11, 42), CPos.New(10, 42), CPos.New(13, 41), CPos.New(12, 41), CPos.New(11, 41), CPos.New(14, 40), CPos.New(13, 40), CPos.New(12, 40), CPos.New(6, 40), CPos.New(5, 40), CPos.New(4, 40), CPos.New(6, 39), CPos.New(5, 39), CPos.New(4, 39), CPos.New(6, 38), CPos.New(5, 38), CPos.New(4, 38) } +ReinforcementsTrigger = { CPos.New(35, 23), CPos.New(34, 23), CPos.New(35, 22), CPos.New(34, 22), CPos.New(35, 21), CPos.New(34, 21), CPos.New(35, 20), CPos.New(34, 20), CPos.New(35, 19), CPos.New(34, 19), CPos.New(35, 18), CPos.New(34, 18), CPos.New(35, 17), CPos.New(34, 17), CPos.New(35, 16), CPos.New(34, 16), CPos.New(35, 15), CPos.New(34, 15), CPos.New(35, 14), CPos.New(34, 14), CPos.New(35, 13), CPos.New(34, 13), CPos.New(35, 12), CPos.New(34, 12), CPos.New(47, 11), CPos.New(46, 11), CPos.New(57, 19), CPos.New(56, 19), CPos.New(55, 19), CPos.New(54, 19), CPos.New(53, 19), CPos.New(52, 19), CPos.New(51, 19), CPos.New(50, 19), CPos.New(49, 19), CPos.New(48, 19), CPos.New(47, 19), CPos.New(46, 19), CPos.New(57, 18), CPos.New(56, 18), CPos.New(55, 18), CPos.New(54, 18), CPos.New(53, 18), CPos.New(52, 18), CPos.New(51, 18), CPos.New(50, 18), CPos.New(49, 18), CPos.New(48, 18), CPos.New(47, 18), CPos.New(46, 18), CPos.New(47, 17), CPos.New(46, 17), CPos.New(47, 16), CPos.New(46, 16), CPos.New(47, 15), CPos.New(46, 15), CPos.New(47, 14), CPos.New(46, 14), CPos.New(47, 13), CPos.New(46, 13), CPos.New(47, 12), CPos.New(46, 12) } + +CaptureStructures = function(actor) + for i = 1, #WhitelistedStructures do + structures = player.GetActorsByType(WhitelistedStructures[i]) + if #structures > 0 then + if not actor.IsDead and not structures[1].IsDead then + actor.Capture(structures[1]) + return + end + end + end +end + +CheckForSams = function() + local sams = player.GetActorsByType("sam") + return #sams >= 3 +end + +searches = 0 +getAirstrikeTarget = function() + local list = player.GetGroundAttackers() + + if #list == 0 then + return + end + + local target = list[DateTime.GameTime % #list + 1].CenterPosition + + local sams = Map.ActorsInCircle(target, WDist.New(8 * 1024), function(actor) + return actor.Type == "sam" end) + + if #sams == 0 then + searches = 0 + return target + elseif searches < 6 then + searches = searches + 1 + return getAirstrikeTarget() + else + searches = 0 + return nil + end +end + +GetCargo = function(team) + cargo = { } + for type, count in pairs(team.units) do + for i = 1, count, 1 do + cargo[#cargo + 1] = type + end + end + return cargo +end + +InsertNodUnits = function() + Media.PlaySpeechNotification(player, "Reinforce") + Reinforcements.Reinforce(player, { 'ltnk'}, { ReinforcementsTopSpawn.Location, ReinforcementsTank1Rally.Location }, 1) + Reinforcements.Reinforce(player, NodUnitsEngineers, { ReinforcementsTopSpawn.Location, ReinforcementsEngineersRally.Location }, 10) + Reinforcements.Reinforce(player, NodUnitsRockets, { ReinforcementsTopSpawn.Location, ReinforcementsRocketsRally.Location }, 10) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Reinforcements.Reinforce(player, NodUnitsGunners, { ReinforcementsBottomSpawn.Location, ReinforcementsGunnersRally.Location }, 10) + Reinforcements.Reinforce(player, NodUnitsFlamers, { ReinforcementsTopSpawn.Location, ReinforcementsFlamersRally.Location }, 10) + Reinforcements.Reinforce(player, { 'ltnk'}, { ReinforcementsBottomSpawn.Location, ReinforcementsTank2Rally.Location }, 10) + 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) + if actor.Type == "e6" then + CaptureStructures(actor) + else + IdleHunt(actor) + end + 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 + team = Waves[counter] + if team.teamType == "atk" then + SendAttackWave(team) + elseif team.teamType == "rei" then + SendReinforcementsWave(team) + end + Trigger.AfterDelay(DateTime.Seconds(team.delay), function() SendWaves(counter + 1, Waves) end) + end +end + +SendReinforcementsWave = function(team) + Reinforcements.ReinforceWithTransport(enemy, "apc", GetCargo(team), { ReinforcementsGDISpawn.Location, waypoint12.Location}, nil, function(transport, passengers) + SetReinforcementsWaypoints(transport, team.waypoints) + transport.UnloadPassengers() + Trigger.OnPassengerExited(transport, function(_, passenger) + Utils.Do(passengers, function(actor) + if actor.Type == "e6" then + CaptureStructures(actor) + else + IdleHunt(actor) + end + end) + if not transport.HasPassengers then + IdleHunt(transport) + end + end) + end) +end + +SetReinforcementsWaypoints = function(actor, waypoints) + if not actor.IsDead then + Utils.Do(waypoints, function(waypoint) + actor.Move(waypoint.Location) + end) + end +end + +StartWaves = function(Waves) + SendWaves(1, Waves) +end + +Trigger.OnEnteredFootprint(AbandonedBaseTrigger, function(a, id) + if not abandonedBaseTrigger and a.Owner == player then + abandonedBaseTrigger = true + + FlareCamera = Actor.Create("camera", true, { Owner = player, Location = waypoint25.Location }) + Flare = Actor.Create("flare", true, { Owner = player, Location = waypoint25.Location }) + + Utils.Do(NodBase, function(actor) + if not actor.IsDead then + actor.Owner = player + end + end) + + player.MarkCompletedObjective(NodObjective1) + + Trigger.AfterDelay(DateTime.Seconds(3), function() + Media.PlaySpeechNotification(player, "NewOptions") + end) + end +end) + +Trigger.OnEnteredFootprint(ReinforcementsTrigger, function(a, id) + if not reinforcementsTrigger and a.Owner == player and a.Type ~= 'harv' then + reinforcementsTrigger = true + + Trigger.AfterDelay(DateTime.Seconds(5), function() + Media.PlaySpeechNotification(player, "Reinforce") + Reinforcements.ReinforceWithTransport(player, 'tran.in', ReinforcementsRockets, { ReinforcementsHelicopterSpawn.Location, waypoint24.Location }, { ReinforcementsHelicopterSpawn.Location }, nil, nil) + end) + + StartWaves(IntroAttackWaves) + + 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) + + Trigger.AfterDelay(DateTime.Minutes(3), function()StartWaves(AutoAttackWaves) end) + + Trigger.AfterDelay(DateTime.Minutes(2), function() + Flare.Destroy() + FlareCamera.Kill() + end) + end +end) + +WorldLoaded = function() + player = Player.GetPlayer("Nod") + enemy = Player.GetPlayer("GDI") + Camera.Position = waypoint26.CenterPosition + + InsertNodUnits() + StartAI(GDICYard) + + 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("Find the Nod base.") + NodObjective2 = player.AddPrimaryObjective("Eliminate all GDI forces in the area.") + NodObjective3 = player.AddSecondaryObjective("Build 3 SAMs to fend off the GDI bombers.") + 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(NodObjective2) + end + + if not player.IsObjectiveCompleted(NodObjective3) and CheckForSams() then + player.MarkCompletedObjective(NodObjective3) + end +end diff --git a/mods/cnc/maps/nod07a/rules.yaml b/mods/cnc/maps/nod07a/rules.yaml new file mode 100644 index 0000000000..e605388948 --- /dev/null +++ b/mods/cnc/maps/nod07a/rules.yaml @@ -0,0 +1,141 @@ +World: + LuaScript: + Scripts: nod07a.lua, nod07a-AI.lua + MusicPlaylist: + StartingMusic: linefire + VictoryMusic: nod_win1 + MissionData: + Briefing: The Brotherhood has located a huge field of Tiberium in the area.\n\nThe nearby village has laid claim to the field.\n\nEliminate the villagers, as to prevent any infection of our own workers.\n\nGDI forces are reported to be minimal, so elimination of them is of secondary importance. + BriefingVideo: nod7a.vqa + StartVideo: tankgo.vqa + LossVideo: visor.vqa + +Player: + PlayerResources: + DefaultCash: 1000 + +^Bridge: + DamageMultiplier@INVULNERABLE: + Modifier: 0 + +^CivBuilding: + AutoTargetIgnore: + +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 + +E5: + Buildable: + Prerequisites: ~disabled + +E6: + -RepairsBridges: + +HARV: + Harvester: + SearchFromOrderRadius: 45 + +HTNK: + Buildable: + Prerequisites: ~disabled + +RMBO: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +MTNK: + Buildable: + Prerequisites: ~weap + +FTNK: + Buildable: + Prerequisites: ~disabled + +MLRS: + Buildable: + Prerequisites: ~disabled + +MSAM: + Buildable: + Prerequisites: ~disabled + +ATWR: + Buildable: + Prerequisites: ~disabled + +HELI: + Buildable: + Prerequisites: ~disabled + +STNK: + Buildable: + Prerequisites: ~disabled + +ARTY: + Buildable: + Prerequisites: ~disabled + +FIX: + Buildable: + Prerequisites: ~disabled + +SBAG: + Buildable: + Queue: Defence.GDI, Defence.Nod + +GTWR: + Buildable: + Queue: Defence.GDI + Armament: + Weapon: HighV.in + +HQ: + AirstrikePower: + Prerequisites: gdi + SquadSize: 1 + +TRAN.IN: + Inherits: TRAN + RejectsOrders: + -Selectable: + RenderSprites: + Image: TRAN + Buildable: + Prerequisites: ~disabled diff --git a/mods/cnc/maps/nod07a/weapons.yaml b/mods/cnc/maps/nod07a/weapons.yaml new file mode 100644 index 0000000000..d2a64156ab --- /dev/null +++ b/mods/cnc/maps/nod07a/weapons.yaml @@ -0,0 +1,3 @@ +HighV.IN: + Inherits: HighV + Range: 4c0 diff --git a/mods/cnc/missions.yaml b/mods/cnc/missions.yaml index 6441dc6b19..0512dc9117 100644 --- a/mods/cnc/missions.yaml +++ b/mods/cnc/missions.yaml @@ -21,6 +21,7 @@ Nod Campaign: ./mods/cnc/maps/nod06a ./mods/cnc/maps/nod06b ./mods/cnc/maps/nod06c + ./mods/cnc/maps/nod07a Funpark Campaign: ./mods/cnc/maps/funpark01