diff --git a/OpenRA.sln b/OpenRA.sln index e182cdc6b9..7190f90f0a 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -133,6 +133,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dune 2000 Lua scripts", "Du mods\d2k\maps\harkonnen-06a\harkonnen06a.lua = mods\d2k\maps\harkonnen-06a\harkonnen06a.lua mods\d2k\maps\harkonnen-06b\harkonnen06b-AI.lua = mods\d2k\maps\harkonnen-06b\harkonnen06b-AI.lua mods\d2k\maps\harkonnen-06b\harkonnen06b.lua = mods\d2k\maps\harkonnen-06b\harkonnen06b.lua + mods\d2k\maps\harkonnen-07\harkonnen07-AI.lua = mods\d2k\maps\harkonnen-07\harkonnen07-AI.lua + mods\d2k\maps\harkonnen-07\harkonnen07.lua = mods\d2k\maps\harkonnen-07\harkonnen07.lua mods\d2k\maps\ordos-01a\ordos01a.lua = mods\d2k\maps\ordos-01a\ordos01a.lua mods\d2k\maps\ordos-01b\ordos01b.lua = mods\d2k\maps\ordos-01b\ordos01b.lua mods\d2k\maps\ordos-02a\ordos02a-AI.lua = mods\d2k\maps\ordos-02a\ordos02a-AI.lua diff --git a/mods/d2k/maps/harkonnen-07/harkonnen07-AI.lua b/mods/d2k/maps/harkonnen-07/harkonnen07-AI.lua new file mode 100644 index 0000000000..2fb6eae9bf --- /dev/null +++ b/mods/d2k/maps/harkonnen-07/harkonnen07-AI.lua @@ -0,0 +1,67 @@ +--[[ + Copyright 2007-2017 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. +]] + +AttackGroupSize = +{ + easy = 6, + normal = 8, + hard = 10 +} + +AttackDelays = +{ + easy = { DateTime.Seconds(4), DateTime.Seconds(7) }, + normal = { DateTime.Seconds(2), DateTime.Seconds(5) }, + hard = { DateTime.Seconds(1), DateTime.Seconds(3) } +} + +InitialProductionDelay = +{ + easy = DateTime.Seconds(30), + normal = DateTime.Seconds(15), + hard = 0 +} + +AtreidesInfantryTypes = { "light_inf", "light_inf", "light_inf", "trooper", "trooper" } +AtreidesVehicleTypes = { "trike", "trike", "quad" } +AtreidesMainTankTypes = { "combat_tank_a", "combat_tank_a", "siege_tank", "missile_tank", "sonic_tank" } +AtreidesSmallTankTypes = { "combat_tank_a", "combat_tank_a", "siege_tank" } +AtreidesStarportTypes = { "trike.starport", "trike.starport", "quad.starport", "combat_tank_a.starport", "combat_tank_a.starport", "siege_tank.starport", "missile_tank.starport" } + +CorrinoInfantryTypes = { "light_inf", "trooper", "sardaukar" } + +ActivateAI = function() + IdlingUnits[atreides_main] = Reinforcements.Reinforce(atreides_main, InitialAtreidesReinforcements[Difficulty][1], InitialAtreidesPaths[1]), Reinforcements.Reinforce(atreides_main, InitialAtreidesReinforcements[Difficulty][2], InitialAtreidesPaths[2]) + IdlingUnits[atreides_small] = Reinforcements.Reinforce(atreides_small, InitialAtreidesReinforcements[Difficulty][1], InitialAtreidesPaths[3]) + IdlingUnits[corrino] = Reinforcements.Reinforce(corrino, InitialCorrinoReinforcements, InitialCorrinoPath) + + DefendAndRepairBase(atreides_main, AtreidesMainBase, 0.75, AttackGroupSize[Difficulty]) + DefendAndRepairBase(atreides_small, AtreidesSmallBase, 0.75, AttackGroupSize[Difficulty]) + DefendAndRepairBase(corrino, CorrinoBase, 0.75, AttackGroupSize[Difficulty]) + + local delay = function() return Utils.RandomInteger(AttackDelays[Difficulty][1], AttackDelays[Difficulty][2] + 1) end + local infantryToBuildAtreides = function() return { Utils.Random(AtreidesInfantryTypes) } end + local infantryToBuildCorrino = function() return { Utils.Random(CorrinoInfantryTypes) } end + local vehilcesToBuild = function() return { Utils.Random(AtreidesVehicleTypes) } end + local tanksToBuildMain = function() return { Utils.Random(AtreidesMainTankTypes) } end + local tanksToBuildSmall = function() return { Utils.Random(AtreidesSmallTankTypes) } end + local unitsToBuy = function() return { Utils.Random(AtreidesStarportTypes) } end + local attackThresholdSize = AttackGroupSize[Difficulty] * 2.5 + + Trigger.AfterDelay(InitialProductionDelay[Difficulty], function() + ProduceUnits(atreides_main, ALightFactory1, delay, vehilcesToBuild, AttackGroupSize[Difficulty], attackThresholdSize) + ProduceUnits(atreides_main, AHeavyFactory1, delay, tanksToBuildMain, AttackGroupSize[Difficulty], attackThresholdSize) + ProduceUnits(atreides_main, AStarport, delay, unitsToBuy, AttackGroupSize[Difficulty], attackThresholdSize) + + ProduceUnits(atreides_small, ABarracks, delay, infantryToBuildAtreides, AttackGroupSize[Difficulty], attackThresholdSize) + ProduceUnits(atreides_small, AHeavyFactory2, delay, tanksToBuildSmall, AttackGroupSize[Difficulty], attackThresholdSize) + + ProduceUnits(corrino, CBarracks, delay, infantryToBuildCorrino, AttackGroupSize[Difficulty], attackThresholdSize) + end) +end diff --git a/mods/d2k/maps/harkonnen-07/harkonnen07.lua b/mods/d2k/maps/harkonnen-07/harkonnen07.lua new file mode 100644 index 0000000000..9371e0554b --- /dev/null +++ b/mods/d2k/maps/harkonnen-07/harkonnen07.lua @@ -0,0 +1,275 @@ +--[[ + Copyright 2007-2017 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. +]] + +AtreidesMainBase = { AConYard1, AOutpost1, ARefinery1, ARefinery2, AHeavyFactory1, ALightFactory1, ALightFactory2, AHiTechFactory, AResearch, ARepair, AStarport, AGunt1, AGunt2, AGunt3, AGunt4, AGunt5, AGunt6, ARock1, ARock2, ARock3, ARock4, ARock5, ARock6, APower1, APower2, APower3, APower4, APower5, APower6, APower7, APower8, APower9, APower10, APower11, APower12, APower13, APower14, APower15, APower16, APower17, APower18, APower19, APower20, APower21, APower22, ASilo1, ASilo2, ASilo3 } +AtreidesSmallBase = { AOutpost2, ARefinery3, ABarracks, AHeavyFactory2, AGunt7, AGunt8, APower23, APower24, APower25, APower26, ASilo4, ASilo5, ASilo6, ASilo7 } +CorrinoBase = { CBarracks, COutpost, CPower1, CPower2, CPower3, CRock1, CRock2 } + +AtreidesReinforcements = +{ + easy = { "sonic_tank" }, + normal = { "sonic_tank", "trooper" }, + hard = { "sonic_tank", "quad" } +} + +CorrinoReinforcements = +{ + easy = + { + { "sardaukar", "sardaukar", "sardaukar", "quad", "quad", "trike" }, + { "sardaukar", "sardaukar", "combat_tank_h", "trike" } + }, + + normal = + { + { "sardaukar", "sardaukar", "sardaukar", "combat_tank_h", "quad", "trike" }, + { "sardaukar", "sardaukar", "combat_tank_h", "siege_tank" } + }, + + hard = + { + { "sardaukar", "sardaukar", "sardaukar", "combat_tank_h", "quad", "quad", "trike" }, + { "sardaukar", "sardaukar", "sardaukar", "combat_tank_h", "siege_tank" } + } +} + +EnemyAttackDelay = +{ + easy = DateTime.Minutes(3) + DateTime.Seconds(30), + normal = DateTime.Minutes(2) + DateTime.Seconds(30), + hard = DateTime.Minutes(1) + DateTime.Seconds(30) +} + +CorrinoInitialAttackDelay = +{ + easy = DateTime.Seconds(45), + normal = DateTime.Seconds(30), + hard = DateTime.Seconds(15) +} + +InitialAtreidesReinforcements = +{ + easy = + { + { "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "combat_tank_a", "quad", "quad", "trike", "trike" }, + { "trooper", "trooper", "quad", "quad" } + }, + + normal = + { + { "trooper", "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "combat_tank_a", "combat_tank_a", "quad", "trike", "trike" }, + { "trooper", "trooper", "trooper", "quad", "quad" } + }, + + hard = + { + { "trooper", "trooper", "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "combat_tank_a", "combat_tank_a", "quad", "quad", "trike", "trike" }, + { "trooper", "trooper", "trooper", "trooper", "quad", "quad" } + } +} + +InitialCorrinoReinforcements = { "trooper", "trooper", "trooper", "trooper", "trooper" } + +AtreidesPath = { AtreidesEntry1.Location, AtreidesRally1.Location } + +CorrinoPaths = +{ + { CorrinoEntry1.Location, CorrinoRally1.Location }, + { CorrinoEntry1.Location, CorrinoRally2.Location } +} + +InitialAtreidesPaths = +{ + { AtreidesEntry2.Location, AtreidesRally2.Location }, + { AtreidesEntry3.Location, AtreidesRally3.Location }, + { AtreidesEntry4.Location, AtreidesRally4.Location } +} + +InitialCorrinoPath = { CorrinoEntry2.Location, CorrinoRally3.Location } + +HarkonnenReinforcements = +{ + easy = + { + { "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "quad", "trike", "trike", "siege_tank", "combat_tank_h", "combat_tank_h" } + }, + + normal = + { + { "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "quad", "trike", "siege_tank", "combat_tank_h", "combat_tank_h" } + }, + + hard = + { + { "trooper", "trooper", "light_inf", "light_inf", "light_inf" }, + { "quad", "trike", "trike", "combat_tank_h", "combat_tank_h" } + }, +} + +HarkonnenPaths = +{ + { HarkonnenEntry1.Location, HarkonnenRally1.Location }, + { HarkonnenEntry2.Location, HarkonnenRally2.Location } +} + +SendHarkonnenReinforcements = function(number) + Reinforcements.ReinforceWithTransport(player, "carryall.reinforce", HarkonnenReinforcements[Difficulty][number], HarkonnenPaths[number], { HarkonnenPaths[number][1] }) + Trigger.AfterDelay(DateTime.Seconds(9), function() + Media.PlaySpeechNotification(player, "Reinforce") + end) +end + +SendEnemyReinforcements = function(player, delay, path, unitTypes, customCondition, customHuntFunction) + Trigger.AfterDelay(delay, function() + if customCondition and customCondition() then + return + end + + local units = Reinforcements.ReinforceWithTransport(player, "carryall.reinforce", unitTypes, path, { path[1] })[2] + + if not customHuntFunction then + customHuntFunction = IdleHunt + end + Utils.Do(units, customHuntFunction) + + SendEnemyReinforcements(player, delay, path, unitTypes, customCondition, customHuntFunction) + end) +end + +SendAirStrike = function() + if HiTechIsDead then + return + end + + local targets = Utils.Where(player.GetActors(), function(actor) + return + actor.HasProperty("Sell") and + actor.Type ~= "wall" and + actor.Type ~= "medium_gun_turret" and + actor.Type ~= "large_gun_turret" and + actor.Type ~= "wind_trap" + end) + + if #targets > 0 then + AHiTechFactory.SendAirstrike(Utils.Random(targets).CenterPosition, true, 0) + end + + Trigger.AfterDelay(DateTime.Minutes(5), SendAirStrike) +end + +Tick = function() + if player.HasNoRequiredUnits() then + atreides_main.MarkCompletedObjective(KillHarkonnen1) + atreides_small.MarkCompletedObjective(KillHarkonnen2) + corrino.MarkCompletedObjective(KillHarkonnen3) + end + + if atreides_main.HasNoRequiredUnits() and atreides_small.HasNoRequiredUnits() and not player.IsObjectiveCompleted(KillAtreides) then + Media.DisplayMessage("The Atreides have been annihilated!", "Mentat") + player.MarkCompletedObjective(KillAtreides) + end + + if corrino.HasNoRequiredUnits() and not player.IsObjectiveCompleted(KillCorrino) then + Media.DisplayMessage("The Emperor have been annihilated!", "Mentat") + player.MarkCompletedObjective(KillCorrino) + end + + if (HEngineer.IsDead or AConYard2.IsDead) and not player.IsObjectiveCompleted(CaptureAtreidesConYard) then + player.MarkFailedObjective(CaptureAtreidesConYard) + end + + if (AHiTechFactory.IsDead or AHiTechFactory.Owner ~= atreides_main) and not HiTechIsDead then + Media.DisplayMessage("High Tech Factory neutralized! Atreides cut off from Imperial reinforcement!", "Mentat") + HiTechIsDead = true + end + + if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[ordos_main] then + local units = ordos_main.GetActorsByType("harvester") + + if #units > 0 then + LastHarvesterEaten[ordos_main] = false + ProtectHarvester(units[1], ordos_main, AttackGroupSize[Difficulty]) + end + end + + if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[ordos_small] then + local units = ordos_small.GetActorsByType("harvester") + + if #units > 0 then + LastHarvesterEaten[ordos_small] = false + ProtectHarvester(units[1], ordos_small, AttackGroupSize[Difficulty]) + end + end +end + +WorldLoaded = function() + atreides_main = Player.GetPlayer("Atreides Main Base") + atreides_small = Player.GetPlayer("Atreides Small Base") + corrino = Player.GetPlayer("Corrino") + player = Player.GetPlayer("Harkonnen") + + InitObjectives(player) + CaptureAtreidesConYard = player.AddPrimaryObjective("Capture the Atreides Construction Yard at the South.") + KillAtreides = player.AddPrimaryObjective("Destroy the Atreides.") + KillCorrino = player.AddPrimaryObjective("Destroy the Corrino.") + KillHarkonnen1 = atreides_main.AddPrimaryObjective("Kill all Harkonnen units.") + KillHarkonnen2 = atreides_small.AddPrimaryObjective("Kill all Harkonnen units.") + KillHarkonnen3 = corrino.AddPrimaryObjective("Kill all Harkonnen units.") + + Media.DisplayMessage("Destroy Atreides High Tech Factory to cut off Atreides from Imperial reinforcements.", "Mentat") + + Camera.Position = HEngineer.CenterPosition + AtreidesAttackLocation = AConYard2.Location + + Trigger.AfterDelay(DateTime.Minutes(5), SendAirStrike) + + Trigger.OnCapture(AConYard2, function() + player.MarkCompletedObjective(CaptureAtreidesConYard) + end) + + Trigger.OnAllKilledOrCaptured(AtreidesMainBase, function() + Utils.Do(atreides_main.GetGroundAttackers(), IdleHunt) + end) + + Trigger.OnAllKilledOrCaptured(AtreidesSmallBase, function() + Utils.Do(atreides_small.GetGroundAttackers(), IdleHunt) + end) + + Trigger.OnAllKilledOrCaptured(CorrinoBase, function() + Utils.Do(corrino.GetGroundAttackers(), IdleHunt) + end) + + local atreidesWaveCondition = function() return player.IsObjectiveCompleted(KillAtreides) or HiTechIsDead end + local corrinoWaveCondition = function() return player.IsObjectiveCompleted(KillCorrino) or HiTechIsDead end + local huntFunction = function(unit) + unit.AttackMove(AtreidesAttackLocation) + IdleHunt(unit) + end + SendEnemyReinforcements(atreides_main, EnemyAttackDelay[Difficulty], AtreidesPath, AtreidesReinforcements[Difficulty], atreidesWaveCondition, huntFunction) + Trigger.AfterDelay(CorrinoInitialAttackDelay[Difficulty], function() + SendEnemyReinforcements(corrino, EnemyAttackDelay[Difficulty], CorrinoPaths[1], CorrinoReinforcements[Difficulty][1], corrinoWaveCondition, huntFunction) + SendEnemyReinforcements(corrino, EnemyAttackDelay[Difficulty], CorrinoPaths[2], CorrinoReinforcements[Difficulty][2], corrinoWaveCondition, huntFunction) + end) + + Actor.Create("upgrade.light", true, { Owner = atreides_main }) + Actor.Create("upgrade.heavy", true, { Owner = atreides_main }) + Actor.Create("upgrade.hightech", true, { Owner = atreides_main }) + Actor.Create("upgrade.barracks", true, { Owner = atreides_small }) + Actor.Create("upgrade.heavy", true, { Owner = atreides_small }) + Actor.Create("upgrade.barracks", true, { Owner = corrino }) + Trigger.AfterDelay(0, ActivateAI) + + SendHarkonnenReinforcements(1) + SendHarkonnenReinforcements(2) +end diff --git a/mods/d2k/maps/harkonnen-07/map.bin b/mods/d2k/maps/harkonnen-07/map.bin new file mode 100644 index 0000000000..482423a0e3 Binary files /dev/null and b/mods/d2k/maps/harkonnen-07/map.bin differ diff --git a/mods/d2k/maps/harkonnen-07/map.png b/mods/d2k/maps/harkonnen-07/map.png new file mode 100644 index 0000000000..082749faf1 Binary files /dev/null and b/mods/d2k/maps/harkonnen-07/map.png differ diff --git a/mods/d2k/maps/harkonnen-07/map.yaml b/mods/d2k/maps/harkonnen-07/map.yaml new file mode 100644 index 0000000000..3d1cfd969d --- /dev/null +++ b/mods/d2k/maps/harkonnen-07/map.yaml @@ -0,0 +1,770 @@ +MapFormat: 11 + +RequiresMod: d2k + +Title: Harkonnen 07 + +Author: Westwood Studios + +Tileset: ARRAKIS + +MapSize: 104,74 + +Bounds: 2,2,100,70 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Enemies: Harkonnen, Atreides Main Base, Atreides Small Base, Corrino + PlayerReference@Harkonnen: + Name: Harkonnen + Playable: True + LockFaction: True + Faction: harkonnen + LockColor: True + Color: FE0000 + Enemies: Atreides Main Base, Atreides Small Base, Corrino, Creeps + PlayerReference@Atreides Main Base: + Name: Atreides Main Base + LockFaction: True + Faction: atreides + LockColor: True + Color: 9191FF + Allies: Atreides Small Base, Corrino + Enemies: Harkonnen + PlayerReference@Atreides Small Base: + Name: Atreides Small Base + LockFaction: True + Faction: atreides + LockColor: True + Color: 9191FF + Allies: Atreides Main Base, Corrino + Enemies: Harkonnen + PlayerReference@Corrino: + Name: Corrino + LockFaction: True + Faction: corrino + LockColor: True + Color: 7D00FE + Allies: Atreides Main Base, Atreides Small Base + Enemies: Harkonnen + +Actors: + Actor0: wormspawner + Location: 75,3 + Owner: Creeps + Actor1: wormspawner + Location: 49,4 + Owner: Creeps + Actor2: wormspawner + Location: 64,6 + Owner: Creeps + Actor3: wormspawner + Location: 57,8 + Owner: Creeps + Actor4: wall + Location: 70,9 + Owner: Atreides Main Base + Actor5: wall + Location: 71,9 + Owner: Atreides Main Base + Actor6: wall + Location: 70,10 + Owner: Atreides Main Base + ARock1: large_gun_turret + Location: 71,10 + Owner: Atreides Main Base + APower1: wind_trap + Location: 74,10 + Owner: Atreides Main Base + APower2: wind_trap + Location: 76,10 + Owner: Atreides Main Base + Actor10: spicebloom.spawnpoint + Location: 29,15 + Owner: Neutral + Actor11: spicebloom.spawnpoint + Location: 100,16 + Owner: Neutral + Actor12: wall + Location: 74,17 + Owner: Atreides Main Base + Actor13: wall + Location: 75,17 + Owner: Atreides Main Base + Actor14: wall + Location: 76,17 + Owner: Atreides Main Base + Actor15: wall + Location: 77,17 + Owner: Atreides Main Base + Actor16: wall + Location: 78,17 + Owner: Atreides Main Base + Actor17: wall + Location: 79,17 + Owner: Atreides Main Base + Actor18: wall + Location: 80,17 + Owner: Atreides Main Base + Actor19: wall + Location: 74,18 + Owner: Atreides Main Base + ASilo1: silo + Location: 75,18 + Owner: Atreides Main Base + ASilo2: silo + Location: 77,18 + Owner: Atreides Main Base + ASilo3: silo + Location: 79,18 + Owner: Atreides Main Base + Actor23: wall + Location: 80,18 + Owner: Atreides Main Base + ARefinery3: refinery + Location: 5,19 + Owner: Atreides Small Base + Actor25: harvester + Location: 10,19 + Owner: Atreides Small Base + HEngineer: engineer + Location: 51,19 + Owner: Harkonnen + Facing: 128 + Actor27: wall + Location: 74,19 + Owner: Atreides Main Base + Actor28: wall + Location: 75,19 + Owner: Atreides Main Base + Actor29: wall + Location: 76,19 + Owner: Atreides Main Base + Actor30: wall + Location: 77,19 + Owner: Atreides Main Base + Actor31: wall + Location: 78,19 + Owner: Atreides Main Base + Actor32: wall + Location: 79,19 + Owner: Atreides Main Base + Actor33: wall + Location: 80,19 + Owner: Atreides Main Base + AHeavyFactory2: heavy_factory + Location: 9,20 + Owner: Atreides Small Base + Actor35: trike + Location: 50,20 + Owner: Harkonnen + Facing: 128 + Actor36: quad + Location: 52,20 + Owner: Harkonnen + Facing: 128 + Actor37: carryall + Location: 8,21 + Owner: Atreides Small Base + ASilo4: silo + Location: 4,23 + Owner: Atreides Small Base + ASilo5: silo + Location: 5,23 + Owner: Atreides Small Base + ASilo6: silo + Location: 6,23 + Owner: Atreides Small Base + ASilo7: silo + Location: 7,23 + Owner: Atreides Small Base + Actor42: wall + Location: 75,23 + Owner: Atreides Main Base + Actor43: wall + Location: 76,23 + Owner: Atreides Main Base + Actor44: wall + Location: 77,23 + Owner: Atreides Main Base + Actor45: wall + Location: 78,23 + Owner: Atreides Main Base + ARock2: large_gun_turret + Location: 79,23 + Owner: Atreides Main Base + ARock3: large_gun_turret + Location: 85,23 + Owner: Atreides Main Base + Actor48: wall + Location: 86,23 + Owner: Atreides Main Base + Actor49: wall + Location: 87,23 + Owner: Atreides Main Base + Actor50: wall + Location: 88,23 + Owner: Atreides Main Base + Actor51: wall + Location: 89,23 + Owner: Atreides Main Base + Actor52: wall + Location: 96,23 + Owner: Corrino + Actor53: wall + Location: 97,23 + Owner: Corrino + Actor54: wall + Location: 98,23 + Owner: Corrino + Actor55: wall + Location: 99,23 + Owner: Corrino + Actor56: wall + Location: 100,23 + Owner: Corrino + Actor57: wall + Location: 101,23 + Owner: Corrino + APower23: wind_trap + Location: 4,24 + Owner: Atreides Small Base + ABarracks: barracks + Location: 6,24 + Owner: Atreides Small Base + APower24: wind_trap + Location: 11,24 + Owner: Atreides Small Base + APower25: wind_trap + Location: 13,24 + Owner: Atreides Small Base + Actor62: spicebloom.spawnpoint + Location: 21,24 + Owner: Neutral + Actor63: wall + Location: 75,24 + Owner: Atreides Main Base + Actor64: light_inf + Location: 78,24 + Owner: Atreides Main Base + Actor65: light_inf + Location: 86,24 + Owner: Atreides Main Base + Actor66: wall + Location: 93,24 + Owner: Corrino + Actor67: wall + Location: 94,24 + Owner: Corrino + Actor68: wall + Location: 95,24 + Owner: Corrino + Actor69: wall + Location: 96,24 + Owner: Corrino + APower26: wind_trap + Location: 2,25 + Owner: Atreides Small Base + Actor71: wall + Location: 75,25 + Owner: Atreides Main Base + Actor72: wall + Location: 93,25 + Owner: Corrino + COutpost: outpost + Location: 98,25 + Owner: Corrino + Actor74: wall + Location: 93,26 + Owner: Corrino + Actor75: wall + Location: 12,27 + Owner: Atreides Small Base + AGunt1: medium_gun_turret + Location: 80,27 + Owner: Atreides Main Base + Actor77: wall + Location: 81,27 + Owner: Atreides Main Base + Actor78: wall + Location: 82,27 + Owner: Atreides Main Base + Actor79: wall + Location: 83,27 + Owner: Atreides Main Base + AGunt2: medium_gun_turret + Location: 84,27 + Owner: Atreides Main Base + CRock1: large_gun_turret + Location: 93,27 + Owner: Corrino + Actor82: wall + Location: 94,27 + Owner: Corrino + CBarracks: barracks + Location: 96,27 + Owner: Corrino + AGunt7: medium_gun_turret + Location: 12,28 + Owner: Atreides Small Base + Actor85: wall + Location: 13,28 + Owner: Atreides Small Base + Actor86: wall + Location: 14,28 + Owner: Atreides Small Base + Actor87: wall + Location: 15,28 + Owner: Atreides Small Base + ALightFactory1: light_factory + Location: 74,28 + Owner: Atreides Main Base + Actor89: wall + Location: 80,28 + Owner: Atreides Main Base + Actor90: wall + Location: 84,28 + Owner: Atreides Main Base + Actor91: wall + Location: 6,29 + Owner: Atreides Small Base + Actor92: light_inf + Location: 47,29 + Owner: Atreides Small Base + Actor93: wall + Location: 2,30 + Owner: Atreides Small Base + Actor94: wall + Location: 3,30 + Owner: Atreides Small Base + Actor95: wall + Location: 4,30 + Owner: Atreides Small Base + Actor96: wall + Location: 5,30 + Owner: Atreides Small Base + AGunt8: medium_gun_turret + Location: 6,30 + Owner: Atreides Small Base + Actor98: light_inf + Location: 44,30 + Owner: Atreides Small Base + Actor99: light_inf + Location: 49,30 + Owner: Atreides Small Base + AResearch: research_centre + Location: 78,30 + Owner: Atreides Main Base + APower3: wind_trap + Location: 82,30 + Owner: Atreides Main Base + APower4: wind_trap + Location: 84,30 + Owner: Atreides Main Base + Actor103: quad + Location: 46,31 + Owner: Atreides Small Base + APower27: wind_trap + Location: 47,31 + Owner: Atreides Small Base + Actor105: light_inf + Location: 52,31 + Owner: Atreides Small Base + AOutpost1: outpost + Location: 89,31 + Owner: Atreides Main Base + Actor107: light_inf + Location: 49,32 + Owner: Atreides Small Base + Actor108: trooper + Location: 75,32 + Owner: Atreides Main Base + CRock2: large_gun_turret + Location: 93,32 + Owner: Corrino + Actor110: wall + Location: 94,32 + Owner: Corrino + CPower1: wind_trap + Location: 100,32 + Owner: Corrino + AHeavyFactory1: heavy_factory + Location: 76,33 + Owner: Atreides Main Base + APower5: wind_trap + Location: 82,33 + Owner: Atreides Main Base + APower6: wind_trap + Location: 85,33 + Owner: Atreides Main Base + Actor115: wall + Location: 93,33 + Owner: Corrino + CPower2: wind_trap + Location: 96,33 + Owner: Corrino + CPower3: wind_trap + Location: 98,33 + Owner: Corrino + AConYard2: construction_yard + Location: 49,34 + Owner: Atreides Small Base + Actor119: wall + Location: 93,34 + Owner: Corrino + Actor120: spicebloom.spawnpoint + Location: 27,35 + Owner: Neutral + Actor121: light_inf + Location: 47,35 + Owner: Atreides Small Base + Actor122: wall + Location: 93,35 + Owner: Corrino + APower7: wind_trap + Location: 90,36 + Owner: Atreides Main Base + Actor124: wall + Location: 93,36 + Owner: Corrino + AStarport: starport + Location: 83,37 + Owner: Atreides Main Base + APower8: wind_trap + Location: 88,37 + Owner: Atreides Main Base + Actor127: wall + Location: 93,37 + Owner: Corrino + Actor128: wall + Location: 94,37 + Owner: Corrino + Actor129: wall + Location: 95,37 + Owner: Corrino + Actor130: wall + Location: 96,37 + Owner: Corrino + Actor131: wall + Location: 97,37 + Owner: Corrino + Actor132: wall + Location: 98,37 + Owner: Corrino + Actor133: wall + Location: 99,37 + Owner: Corrino + Actor134: wall + Location: 100,37 + Owner: Corrino + Actor135: wall + Location: 101,37 + Owner: Corrino + ARepair: repair_pad + Location: 78,38 + Owner: Atreides Main Base + APower9: wind_trap + Location: 90,39 + Owner: Atreides Main Base + APower10: wind_trap + Location: 92,39 + Owner: Atreides Main Base + APower11: wind_trap + Location: 88,40 + Owner: Atreides Main Base + APower12: wind_trap + Location: 98,40 + Owner: Atreides Main Base + APower13: wind_trap + Location: 100,40 + Owner: Atreides Main Base + Actor142: wall + Location: 81,42 + Owner: Atreides Main Base + Actor143: wall + Location: 82,42 + Owner: Atreides Main Base + Actor144: wall + Location: 83,42 + Owner: Atreides Main Base + ALightFactory2: light_factory + Location: 90,42 + Owner: Atreides Main Base + Actor146: wall + Location: 81,43 + Owner: Atreides Main Base + AGunt3: medium_gun_turret + Location: 82,43 + Owner: Atreides Main Base + Actor148: wall + Location: 83,43 + Owner: Atreides Main Base + APower14: wind_trap + Location: 96,43 + Owner: Atreides Main Base + APower15: wind_trap + Location: 100,43 + Owner: Atreides Main Base + Actor151: wall + Location: 81,44 + Owner: Atreides Main Base + Actor152: wall + Location: 82,44 + Owner: Atreides Main Base + Actor153: wall + Location: 83,44 + Owner: Atreides Main Base + APower16: wind_trap + Location: 98,44 + Owner: Atreides Main Base + Actor155: spicebloom.spawnpoint + Location: 26,45 + Owner: Neutral + AConYard1: construction_yard + Location: 78,45 + Owner: Atreides Main Base + Actor157: wall + Location: 86,45 + Owner: Atreides Main Base + Actor158: wall + Location: 87,45 + Owner: Atreides Main Base + Actor159: wall + Location: 88,45 + Owner: Atreides Main Base + Actor160: wall + Location: 71,46 + Owner: Atreides Main Base + Actor161: wall + Location: 86,46 + Owner: Atreides Main Base + AGunt4: medium_gun_turret + Location: 87,46 + Owner: Atreides Main Base + Actor163: wall + Location: 88,46 + Owner: Atreides Main Base + Actor164: spicebloom.spawnpoint + Location: 37,47 + Owner: Neutral + Actor165: wall + Location: 71,47 + Owner: Atreides Main Base + Actor166: wall + Location: 86,47 + Owner: Atreides Main Base + Actor167: wall + Location: 87,47 + Owner: Atreides Main Base + Actor168: wall + Location: 88,47 + Owner: Atreides Main Base + ARock4: large_gun_turret + Location: 71,48 + Owner: Atreides Main Base + Actor170: wall + Location: 72,48 + Owner: Atreides Main Base + Actor171: wall + Location: 73,48 + Owner: Atreides Main Base + Actor172: wall + Location: 74,48 + Owner: Atreides Main Base + ARefinery1: refinery + Location: 85,48 + Owner: Atreides Main Base + Actor174: harvester + Location: 76,49 + Owner: Atreides Main Base + Actor175: harvester + Location: 84,49 + Owner: Atreides Main Base + Actor176: carryall + Location: 88,49 + Owner: Atreides Main Base + Actor177: spicebloom.spawnpoint + Location: 62,51 + Owner: Neutral + ARefinery2: refinery + Location: 74,51 + Owner: Atreides Main Base + Actor179: wall + Location: 79,51 + Owner: Atreides Main Base + AGunt5: medium_gun_turret + Location: 79,52 + Owner: Atreides Main Base + Actor181: light_inf + Location: 53,53 + Owner: Atreides Main Base + Actor182: wall + Location: 79,53 + Owner: Atreides Main Base + Actor183: light_inf + Location: 49,54 + Owner: Atreides Main Base + Actor184: carryall + Location: 77,54 + Owner: Atreides Main Base + Actor185: wall + Location: 79,54 + Owner: Atreides Main Base + Actor186: wall + Location: 80,54 + Owner: Atreides Main Base + Actor187: wall + Location: 81,54 + Owner: Atreides Main Base + Actor188: wall + Location: 82,54 + Owner: Atreides Main Base + Actor189: wall + Location: 83,54 + Owner: Atreides Main Base + Actor190: wall + Location: 50,55 + Owner: Atreides Main Base + ARock5: large_gun_turret + Location: 51,55 + Owner: Atreides Main Base + Actor192: wall + Location: 52,55 + Owner: Atreides Main Base + Actor193: spicebloom.spawnpoint + Location: 32,56 + Owner: Neutral + Actor194: wall + Location: 69,56 + Owner: Atreides Main Base + Actor195: wall + Location: 73,56 + Owner: Atreides Main Base + Actor196: wall + Location: 69,57 + Owner: Atreides Main Base + Actor197: wall + Location: 73,57 + Owner: Atreides Main Base + Actor198: wall + Location: 67,58 + Owner: Atreides Main Base + ARock6: large_gun_turret + Location: 68,58 + Owner: Atreides Main Base + Actor200: wall + Location: 69,58 + Owner: Atreides Main Base + AGunt6: medium_gun_turret + Location: 73,58 + Owner: Atreides Main Base + Actor202: wall + Location: 74,58 + Owner: Atreides Main Base + Actor203: spicebloom.spawnpoint + Location: 4,61 + Owner: Neutral + Actor204: spicebloom.spawnpoint + Location: 81,61 + Owner: Neutral + AHiTechFactory: high_tech_factory + Location: 69,62 + Owner: Atreides Main Base + APower17: wind_trap + Location: 74,62 + Owner: Atreides Main Base + APower18: wind_trap + Location: 72,63 + Owner: Atreides Main Base + APower19: wind_trap + Location: 68,66 + Owner: Atreides Main Base + APower20: wind_trap + Location: 72,66 + Owner: Atreides Main Base + APower21: wind_trap + Location: 74,66 + Owner: Atreides Main Base + APower22: wind_trap + Location: 70,67 + Owner: Atreides Main Base + Actor212: spicebloom.spawnpoint + Location: 21,68 + Owner: Neutral + Actor213: spicebloom.spawnpoint + Location: 42,69 + Owner: Neutral + Actor214: spicebloom.spawnpoint + Location: 54,70 + Owner: Neutral + Actor215: spicebloom.spawnpoint + Location: 101,70 + Owner: Neutral + AOutpost2: outpost + Owner: Atreides Small Base + Location: 13,20 + HarkonnenRally1: waypoint + Owner: Neutral + Location: 46,19 + HarkonnenEntry1: waypoint + Owner: Neutral + Location: 46,2 + HarkonnenRally2: waypoint + Owner: Neutral + Location: 49,21 + HarkonnenEntry2: waypoint + Owner: Neutral + Location: 49,2 + AtreidesRally1: waypoint + Owner: Neutral + Location: 7,22 + AtreidesEntry1: waypoint + Owner: Neutral + Location: 2,22 + CorrinoRally1: waypoint + Owner: Neutral + Location: 97,31 + CorrinoEntry1: waypoint + Owner: Neutral + Location: 101,31 + CorrinoRally2: waypoint + Owner: Neutral + Location: 98,31 + CorrinoRally3: waypoint + Owner: Neutral + Location: 93,30 + CorrinoEntry2: waypoint + Owner: Neutral + Location: 101,30 + AtreidesRally4: waypoint + Owner: Neutral + Location: 72,53 + AtreidesEntry4: waypoint + Owner: Neutral + Location: 68,71 + AtreidesRally3: waypoint + Owner: Neutral + Location: 72,50 + AtreidesEntry3: waypoint + Owner: Neutral + Location: 72,71 + AtreidesRally2: waypoint + Owner: Neutral + Location: 9,27 + AtreidesEntry2: waypoint + Owner: Neutral + Location: 2,27 + +Rules: d2k|rules/campaign-rules.yaml, d2k|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/d2k/maps/harkonnen-07/rules.yaml b/mods/d2k/maps/harkonnen-07/rules.yaml new file mode 100644 index 0000000000..88878893ae --- /dev/null +++ b/mods/d2k/maps/harkonnen-07/rules.yaml @@ -0,0 +1,78 @@ +Player: + PlayerResources: + DefaultCash: 6000 + +World: + LuaScript: + Scripts: campaign-global.lua, harkonnen07.lua, harkonnen07-AI.lua + MissionData: + Briefing: Your target is the Atreides High Tech Factory, the weak link of the Duke's plan to combine with the Imperial Troops. Without it, the Imperial Carryalls will soon fall into disrepair and not be able to ferry further reinforcements to the battle.\n\nThe Atreides force is large and well-fortified - a frontal assault will fail. However, one Construction Yard to the West of their position is isolated and lightly defended. A small strike force has been airlifted deep into enemy territory. Capture the Construction Yard and use it against the Atreides. + BriefingVideo: H_BR07_E.VQA + MapOptions: + TechLevel: nopowers + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +^Palettes: + IndexedPlayerPalette: + PlayerIndex: + Atreides Main Base: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128 + Atreides Small Base: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128 + +carryall.reinforce: + Cargo: + MaxWeight: 10 + +combat_tank_a: + Buildable: + Prerequisites: ~heavy_factory, ~player.atreides + +combat_tank_h: + Buildable: + Prerequisites: ~heavy_factory, ~player.harkonnen + +combat_tank_a.starport: + Buildable: + Prerequisites: ~starport, ~player.atreides + +combat_tank_h.starport: + Buildable: + Prerequisites: ~starport, ~player.harkonnen + +sonic_tank: + Buildable: + Prerequisites: ~heavy_factory, research_centre, ~techlevel.high, ~player.atreides + +devastator: + Buildable: + Prerequisites: ~heavy_factory, research_centre, ~techlevel.high, ~player.harkonnen + +high_tech_factory: + AirstrikePower: + Prerequisites: upgrade.hightech + +upgrade.hightech: + Buildable: + Prerequisites: ~hightech.atreides + +palace: + Buildable: + Prerequisites: ~disabled + +sardaukar: + Buildable: + Prerequisites: ~barracks, ~player.corrino + +grenadier: + Buildable: + Prerequisites: ~disabled + +thumper: + Buildable: + Prerequisites: ~disabled diff --git a/mods/d2k/missions.yaml b/mods/d2k/missions.yaml index 06cceb5e80..547f5a954e 100644 --- a/mods/d2k/missions.yaml +++ b/mods/d2k/missions.yaml @@ -28,3 +28,4 @@ Harkonnen Campaign: ./mods/d2k/maps/harkonnen-05 ./mods/d2k/maps/harkonnen-06a ./mods/d2k/maps/harkonnen-06b + ./mods/d2k/maps/harkonnen-07 diff --git a/mods/d2k/rules/player.yaml b/mods/d2k/rules/player.yaml index b9ae27c7c1..bcf3dcb9d4 100644 --- a/mods/d2k/rules/player.yaml +++ b/mods/d2k/rules/player.yaml @@ -71,6 +71,27 @@ Player: HarvesterAttackNotifier: PlayerStatistics: PlaceBeacon: + ProvidesPrerequisite@atreides: + Prerequisite: player.atreides + Factions: atreides + ProvidesPrerequisite@harkonnen: + Prerequisite: player.harkonnen + Factions: harkonnen + ProvidesPrerequisite@ordos: + Prerequisite: player.ordos + Factions: ordos + ProvidesPrerequisite@corrino: + Prerequisite: player.corrino + Factions: corrino + ProvidesPrerequisite@fremen: + Prerequisite: player.fremen + Factions: fremen + ProvidesPrerequisite@mercenary: + Prerequisite: player.mercenary + Factions: mercenary + ProvidesPrerequisite@smuggler: + Prerequisite: player.smuggler + Factions: smuggler ProvidesTechPrerequisite@low: Name: Low Prerequisites: techlevel.low