diff --git a/OpenRA.sln b/OpenRA.sln index 41c2f0e55b..efe87ab1f0 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -155,6 +155,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dune 2000 Lua scripts", "Du mods\d2k\maps\ordos-03b\ordos03b.lua = mods\d2k\maps\ordos-03b\ordos03b.lua mods\d2k\maps\ordos-04\ordos04-AI.lua = mods\d2k\maps\ordos-04\ordos04-AI.lua mods\d2k\maps\ordos-04\ordos04.lua = mods\d2k\maps\ordos-04\ordos04.lua + mods\d2k\maps\ordos-05\ordos05-AI.lua = mods\d2k\maps\ordos-05\ordos05-AI.lua + mods\d2k\maps\ordos-05\ordos05.lua = mods\d2k\maps\ordos-05\ordos05.lua EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System Lua scripts", "System Lua scripts", "{A4D6AEA4-8009-4256-903B-8D227E50452B}" diff --git a/mods/d2k/maps/ordos-05/map.bin b/mods/d2k/maps/ordos-05/map.bin new file mode 100644 index 0000000000..629515fcf4 Binary files /dev/null and b/mods/d2k/maps/ordos-05/map.bin differ diff --git a/mods/d2k/maps/ordos-05/map.png b/mods/d2k/maps/ordos-05/map.png new file mode 100644 index 0000000000..58f9195c5c Binary files /dev/null and b/mods/d2k/maps/ordos-05/map.png differ diff --git a/mods/d2k/maps/ordos-05/map.yaml b/mods/d2k/maps/ordos-05/map.yaml new file mode 100644 index 0000000000..5b8974562f --- /dev/null +++ b/mods/d2k/maps/ordos-05/map.yaml @@ -0,0 +1,572 @@ +MapFormat: 11 + +RequiresMod: d2k + +Title: Ordos 05 + +Author: Westwood Studios + +Tileset: ARRAKIS + +MapSize: 84,84 + +Bounds: 2,2,80,80 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: Random + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: Random + Enemies: Ordos, AtreidesMainBase, AtreidesSmallBase1, AtreidesSmallBase2, AtreidesSmallBase3 + PlayerReference@Ordos: + Name: Ordos + Playable: True + LockFaction: True + Faction: ordos + LockColor: True + Color: B3EAA5 + Enemies: AtreidesMainBase, AtreidesSmallBase1, AtreidesSmallBase2, AtreidesSmallBase3, Creeps + PlayerReference@AtreidesMainBase: + Name: AtreidesMainBase + LockFaction: True + Faction: atreides + LockColor: True + Color: 9191FF + Allies: AtreidesSmallBase1, AtreidesSmallBase2 + Enemies: Ordos + PlayerReference@AtreidesSmallBase1: + Name: AtreidesSmallBase1 + LockFaction: True + Faction: atreides + LockColor: True + Color: 9191FF + Allies: AtreidesMainBase, AtreidesSmallBase2, AtreidesSmallBase3 + Enemies: Ordos + PlayerReference@AtreidesSmallBase2: + Name: AtreidesSmallBase2 + LockFaction: True + Faction: atreides + LockColor: True + Color: 9191FF + Allies: AtreidesMainBase, AtreidesSmallBase1, AtreidesSmallBase3 + Enemies: Ordos + PlayerReference@AtreidesSmallBase3: + Name: AtreidesSmallBase3 + LockFaction: True + Faction: atreides + LockColor: True + Color: 9191FF + Allies: AtreidesMainBase, AtreidesSmallBase1, AtreidesSmallBase2 + Enemies: Ordos + +Actors: + Actor0: wall + Location: 13,2 + Owner: AtreidesMainBase + ALightFactory: light_factory + Location: 6,3 + Owner: AtreidesMainBase + AHeavyFactory: heavy_factory + Location: 10,3 + Owner: AtreidesMainBase + Actor3: wall + Location: 13,3 + Owner: AtreidesMainBase + Actor4: wall + Location: 13,4 + Owner: AtreidesMainBase + Actor5: wall + Location: 13,5 + Owner: AtreidesMainBase + AGunt1: medium_gun_turret + Location: 14,5 + Owner: AtreidesMainBase + TurretFacing: 192 + APower1: wind_trap + Location: 3,6 + Owner: AtreidesMainBase + ABarracks1: barracks + Location: 9,6 + Owner: AtreidesMainBase + Actor9: spicebloom.spawnpoint + Location: 71,6 + Owner: Neutral + Actor10: trooper + Location: 14,7 + Owner: AtreidesMainBase + Actor11: spicebloom.spawnpoint + Location: 22,7 + Owner: Neutral + Actor12: wall + Location: 16,8 + Owner: AtreidesMainBase + AGunt2: medium_gun_turret + Location: 17,8 + Owner: AtreidesMainBase + TurretFacing: 224 + APower2: wind_trap + Location: 5,9 + Owner: AtreidesMainBase + Actor15: trooper + Location: 11,9 + Owner: AtreidesMainBase + Actor16: wall + Location: 17,9 + Owner: AtreidesMainBase + Actor17: wall + Location: 17,10 + Owner: AtreidesMainBase + APower3: wind_trap + Location: 10,11 + Owner: AtreidesMainBase + Actor19: trooper + Location: 14,11 + Owner: AtreidesMainBase + Actor20: wall + Location: 17,11 + Owner: AtreidesMainBase + Actor21: wormspawner + Location: 70,11 + Owner: Creeps + Actor22: combat_tank_a + Location: 9,12 + Owner: AtreidesMainBase + Actor23: wall + Location: 17,12 + Owner: AtreidesMainBase + Actor24: wall + Location: 17,13 + Owner: AtreidesMainBase + Actor25: light_inf + Location: 4,14 + Owner: AtreidesMainBase + Actor26: light_inf + Location: 6,14 + Owner: AtreidesMainBase + Actor27: trooper + Location: 13,14 + Owner: AtreidesMainBase + Actor28: spicebloom.spawnpoint + Location: 49,14 + Owner: Neutral + Actor29: spicebloom.spawnpoint + Location: 25,15 + Owner: Neutral + ARefinery1: refinery + Location: 2,16 + Owner: AtreidesMainBase + AConyard: construction_yard + Location: 8,16 + Owner: AtreidesMainBase + Actor32: light_inf + Location: 6,17 + Owner: AtreidesMainBase + AGunt3: medium_gun_turret + Location: 15,17 + Owner: AtreidesMainBase + TurretFacing: 160 + Actor34: light_inf + Location: 11,18 + Owner: AtreidesMainBase + Actor35: wall + Location: 33,18 + Owner: AtreidesSmallBase1 + Actor36: wall + Location: 34,18 + Owner: AtreidesSmallBase1 + Actor37: wall + Location: 35,18 + Owner: AtreidesSmallBase1 + APower4: wind_trap + Location: 27,19 + Owner: AtreidesSmallBase1 + APower5: wind_trap + Location: 29,19 + Owner: AtreidesSmallBase1 + Actor40: wall + Location: 35,19 + Owner: AtreidesSmallBase1 + Actor41: harvester + Location: 3,20 + Owner: AtreidesMainBase + Actor42: carryall + Location: 5,20 + Owner: AtreidesMainBase + Actor43: trike + Location: 34,20 + Owner: AtreidesSmallBase1 + Facing: 192 + AGunt6: medium_gun_turret + Location: 35,20 + Owner: AtreidesSmallBase1 + TurretFacing: 192 + Actor45: spicebloom.spawnpoint + Location: 60,20 + Owner: Neutral + Actor46: wall + Location: 2,23 + Owner: AtreidesMainBase + Actor47: wall + Location: 5,23 + Owner: AtreidesMainBase + ARefinery2: refinery + Location: 27,23 + Owner: AtreidesSmallBase1 + ABarracks2: barracks + Location: 30,23 + Owner: AtreidesSmallBase1 + Actor50: trike + Location: 34,23 + Owner: AtreidesSmallBase1 + Facing: 192 + AGunt7: medium_gun_turret + Location: 35,23 + Owner: AtreidesSmallBase1 + TurretFacing: 192 + Actor52: spicebloom.spawnpoint + Location: 78,23 + Owner: Neutral + Actor53: wall + Location: 2,24 + Owner: AtreidesMainBase + Actor54: wall + Location: 5,24 + Owner: AtreidesMainBase + Actor55: wall + Location: 33,24 + Owner: AtreidesSmallBase1 + Actor56: wall + Location: 34,24 + Owner: AtreidesSmallBase1 + Actor57: wall + Location: 35,24 + Owner: AtreidesSmallBase1 + AGunt4: medium_gun_turret + Location: 2,25 + Owner: AtreidesMainBase + TurretFacing: 128 + AGunt5: medium_gun_turret + Location: 5,25 + Owner: AtreidesMainBase + TurretFacing: 128 + Actor60: harvester + Location: 26,25 + Owner: AtreidesSmallBase1 + Actor61: wall + Location: 33,25 + Owner: AtreidesSmallBase1 + Actor62: carryall + Location: 27,26 + Owner: AtreidesSmallBase1 + Actor63: wall + Location: 33,26 + Owner: AtreidesSmallBase1 + Actor64: wall + Location: 33,27 + Owner: AtreidesSmallBase1 + Actor65: quad + Location: 30,28 + Owner: AtreidesMainBase + Actor66: wall + Location: 33,28 + Owner: AtreidesSmallBase1 + Actor67: spicebloom.spawnpoint + Location: 21,29 + Owner: Neutral + Actor68: wall + Location: 33,29 + Owner: AtreidesSmallBase1 + Actor69: spicebloom.spawnpoint + Location: 8,32 + Owner: Neutral + Actor70: spicebloom.spawnpoint + Location: 53,48 + Owner: Neutral + Actor71: light_inf + Location: 42,49 + Owner: AtreidesSmallBase2 + AGunt8: medium_gun_turret + Location: 44,49 + Owner: AtreidesSmallBase2 + TurretFacing: 0 + Actor73: wall + Location: 44,50 + Owner: AtreidesSmallBase2 + Actor74: wall + Location: 45,50 + Owner: AtreidesSmallBase2 + AGunt9: medium_gun_turret + Location: 38,51 + Owner: AtreidesSmallBase2 + TurretFacing: 32 + Actor76: wall + Location: 39,51 + Owner: AtreidesSmallBase2 + ABarracks3: barracks + Location: 42,51 + Owner: AtreidesSmallBase2 + Actor78: wall + Location: 45,51 + Owner: AtreidesSmallBase2 + Actor79: wall + Location: 38,52 + Owner: AtreidesSmallBase2 + Actor80: wall + Location: 45,52 + Owner: AtreidesSmallBase2 + Actor81: wall + Location: 38,53 + Owner: AtreidesSmallBase2 + Actor82: wall + Location: 45,53 + Owner: AtreidesSmallBase2 + AGunt10: medium_gun_turret + Location: 46,53 + Owner: AtreidesSmallBase2 + TurretFacing: 224 + Actor84: wall + Location: 38,54 + Owner: AtreidesSmallBase2 + APower6: wind_trap + Location: 40,54 + Owner: AtreidesSmallBase2 + APower7: wind_trap + Location: 42,54 + Owner: AtreidesSmallBase2 + Actor87: wall + Location: 46,54 + Owner: AtreidesSmallBase2 + Actor88: wall + Location: 46,55 + Owner: AtreidesSmallBase2 + Actor89: wall + Location: 47,55 + Owner: AtreidesSmallBase2 + Actor90: light_inf + Location: 45,56 + Owner: AtreidesSmallBase2 + Actor91: wall + Location: 47,56 + Owner: AtreidesSmallBase2 + Actor92: wall + Location: 63,56 + Owner: AtreidesSmallBase3 + Actor93: wall + Location: 64,56 + Owner: AtreidesSmallBase3 + Actor94: wall + Location: 65,56 + Owner: AtreidesSmallBase3 + Actor95: wall + Location: 47,57 + Owner: AtreidesSmallBase2 + Actor96: wall + Location: 63,57 + Owner: AtreidesSmallBase3 + AGunt11: medium_gun_turret + Location: 64,57 + Owner: AtreidesSmallBase3 + TurretFacing: 0 + Actor98: wall + Location: 65,57 + Owner: AtreidesSmallBase3 + Actor99: wall + Location: 47,58 + Owner: AtreidesSmallBase2 + Actor100: wall + Location: 63,58 + Owner: AtreidesSmallBase3 + Actor101: wall + Location: 64,58 + Owner: AtreidesSmallBase3 + Actor102: wall + Location: 65,58 + Owner: AtreidesSmallBase3 + Actor103: spicebloom.spawnpoint + Location: 9,59 + Owner: Neutral + Actor104: spicebloom.spawnpoint + Location: 20,60 + Owner: Neutral + Actor105: spicebloom.spawnpoint + Location: 76,61 + Owner: Neutral + Actor106: spicebloom.spawnpoint + Location: 79,62 + Owner: Neutral + Actor107: spicebloom.spawnpoint + Location: 57,66 + Owner: Neutral + AStarport: starport + Location: 70,68 + Owner: AtreidesSmallBase3 + Actor109: wall + Location: 76,70 + Owner: AtreidesSmallBase3 + Actor110: light_inf + Location: 74,71 + Owner: AtreidesSmallBase3 + Actor111: trike + Location: 75,71 + Owner: AtreidesSmallBase3 + Actor112: wall + Location: 76,71 + Owner: AtreidesSmallBase3 + Actor113: spicebloom.spawnpoint + Location: 59,72 + Owner: Neutral + APower8: wind_trap + Location: 69,72 + Owner: AtreidesSmallBase3 + APower9: wind_trap + Location: 71,72 + Owner: AtreidesSmallBase3 + AGunt12: medium_gun_turret + Location: 74,72 + Owner: AtreidesSmallBase3 + TurretFacing: 160 + Actor117: wall + Location: 75,72 + Owner: AtreidesSmallBase3 + Actor118: wall + Location: 76,72 + Owner: AtreidesSmallBase3 + Actor119: light_inf + Location: 67,73 + Owner: AtreidesSmallBase3 + Actor120: wall + Location: 74,73 + Owner: AtreidesSmallBase3 + Actor121: light_inf + Location: 73,74 + Owner: AtreidesSmallBase3 + Actor122: wall + Location: 74,74 + Owner: AtreidesSmallBase3 + Actor123: wall + Location: 69,75 + Owner: AtreidesSmallBase3 + Actor124: wall + Location: 70,75 + Owner: AtreidesSmallBase3 + Actor125: wall + Location: 71,75 + Owner: AtreidesSmallBase3 + Actor126: wall + Location: 72,75 + Owner: AtreidesSmallBase3 + Actor127: wall + Location: 73,75 + Owner: AtreidesSmallBase3 + Actor128: wall + Location: 74,75 + Owner: AtreidesSmallBase3 + Actor129: light_inf + Location: 81,76 + Owner: Ordos + Actor130: spicebloom.spawnpoint + Location: 22,77 + Owner: Neutral + OTrooper1: trooper + Location: 80,77 + Owner: Ordos + ORaider1: raider + Location: 78,78 + Owner: Ordos + ORaider2: raider + Location: 79,78 + Owner: Ordos + OCombat1: combat_tank_o + Location: 81,78 + Owner: Ordos + OTrooper2: trooper + Location: 78,79 + Owner: Ordos + OEngi1: engineer + Location: 79,79 + Owner: Ordos + OEngi2: engineer + Location: 80,79 + Owner: Ordos + Actor138: spicebloom.spawnpoint + Location: 58,80 + Owner: Neutral + OLInf1: light_inf + Location: 77,80 + Owner: Ordos + OCombat2: combat_tank_o + Location: 78,80 + Owner: Ordos + OCombat3: combat_tank_o + Location: 79,80 + Owner: Ordos + OEngi3: engineer + Location: 80,80 + Owner: Ordos + OTrooper3: trooper + Location: 76,81 + Owner: Ordos + OTrooper4: trooper + Location: 78,81 + Owner: Ordos + OrdosStarportEntry: waypoint + Owner: Neutral + Location: 81,69 + OrdosStarportExit: waypoint + Owner: Neutral + Location: 2,69 + AtreidesRally3: waypoint + Owner: Neutral + Location: 40,53 + AtreidesRally2: waypoint + Owner: Neutral + Location: 32,21 + AtreidesRally1: waypoint + Owner: Neutral + Location: 13,9 + AtreidesEntry1: waypoint + Owner: Neutral + Location: 2,9 + AtreidesRally4: waypoint + Owner: Neutral + Location: 49,78 + AtreidesEntry4: waypoint + Owner: Neutral + Location: 49,81 + AtreidesRally5: waypoint + Owner: Neutral + Location: 62,47 + AtreidesEntry5: waypoint + Owner: Neutral + Location: 81,47 + AtreidesRally6: waypoint + Owner: Neutral + Location: 78,45 + AtreidesEntry6: waypoint + Owner: Neutral + Location: 81,45 + AtreidesRally7: waypoint + Owner: Neutral + Location: 71,28 + AtreidesEntry7: waypoint + Owner: Neutral + Location: 81,28 + AtreidesRally8: waypoint + Owner: Neutral + Location: 27,58 + AtreidesEntry8: waypoint + Owner: Neutral + Location: 2,58 + +Rules: d2k|rules/campaign-rules.yaml, d2k|rules/campaign-tooltips.yaml, d2k|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/d2k/maps/ordos-05/ordos05-AI.lua b/mods/d2k/maps/ordos-05/ordos05-AI.lua new file mode 100644 index 0000000000..8d29b634f5 --- /dev/null +++ b/mods/d2k/maps/ordos-05/ordos05-AI.lua @@ -0,0 +1,62 @@ +--[[ + Copyright 2007-2018 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) } +} + +EnemyInfantryTypes = { "light_inf", "light_inf", "light_inf", "trooper", "trooper" } +EnemyVehicleTypes = { "trike", "trike", "quad" } +EnemyTankType = { "combat_tank_a" } + +InitAIUnits = function(house) + LastHarvesterEaten[house] = true + if house ~= atreides_small_3 then + IdlingUnits[house] = Reinforcements.Reinforce(house, InitialReinforcements[house.InternalName], InitialReinforcementsPaths[house.InternalName]) + else + IdlingUnits[house] = { } + end + + DefendAndRepairBase(house, Base[house.InternalName], 0.75, AttackGroupSize[Difficulty]) +end + +ActivateAIProduction = function() + local delay = function() return Utils.RandomInteger(AttackDelays[Difficulty][1], AttackDelays[Difficulty][2] + 1) end + local infantryToBuild = function() return { Utils.Random(EnemyInfantryTypes) } end + local vehiclesToBuild = function() return { Utils.Random(EnemyVehicleTypes) } end + local tanksToBuild = function() return EnemyTankType end + local attackTresholdSize = AttackGroupSize[Difficulty] * 2.5 + + ProduceUnits(atreides_main, ABarracks1, delay, infantryToBuild, AttackGroupSize[Difficulty], attackTresholdSize) + ProduceUnits(atreides_main, ALightFactory, delay, vehiclesToBuild, AttackGroupSize[Difficulty], attackTresholdSize) + ProduceUnits(atreides_main, AHeavyFactory, delay, tanksToBuild, AttackGroupSize[Difficulty], attackTresholdSize) + + ProduceUnits(atreides_small_1, ABarracks2, delay, infantryToBuild, AttackGroupSize[Difficulty], attackTresholdSize) + + ProduceUnits(atreides_small_2, ABarracks3, delay, infantryToBuild, AttackGroupSize[Difficulty], attackTresholdSize) + + AIProductionActivated = true +end + +ActivateAI = function() + InitAIUnits(atreides_main) + InitAIUnits(atreides_small_1) + InitAIUnits(atreides_small_2) + InitAIUnits(atreides_small_3) +end diff --git a/mods/d2k/maps/ordos-05/ordos05.lua b/mods/d2k/maps/ordos-05/ordos05.lua new file mode 100644 index 0000000000..83e1237dd2 --- /dev/null +++ b/mods/d2k/maps/ordos-05/ordos05.lua @@ -0,0 +1,221 @@ +--[[ + Copyright 2007-2018 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. +]] + +Base = +{ + AtreidesMainBase = { AConyard, APower1, APower2, APower3, ABarracks1, ARefinery1, ALightFactory, AHeavyFactory, AGunt1, AGunt2, AGunt3, AGunt4, AGunt5 }, + AtreidesSmallBase1 = { APower4, APower5, ABarracks2, ARefinery2, AGunt6, AGunt7 }, + AtreidesSmallBase2 = { APower6, APower7, ABarracks3, AGunt8, AGunt9, AGunt10 }, + AtreidesSmallBase3 = { APower8, APower9, AStarport, AGunt11, AGunt12 } +} + +AtreidesReinforcements = +{ + easy = + { + { "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "quad", "trike", "combat_tank_a"}, + { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper" }, + { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper" }, + { "combat_tank_a", "combat_tank_a", "quad" }, + { "quad", "quad", "trooper", "quad", "quad", "trooper" }, + { "combat_tank_a", "combat_tank_a", "combat_tank_a", "quad", "siege_tank", "missile_tank" }, + { "quad", "quad", "quad", "trooper", "trooper", "trooper", "trooper" } + }, + + normal = + { + { "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "quad", "trike", "trike", "combat_tank_a"}, + { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper", "trooper" }, + { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper", "trooper" }, + { "combat_tank_a", "combat_tank_a", "combat_tank_a" }, + { "quad", "quad", "quad", "quad", "quad", "quad" }, + { "combat_tank_a", "combat_tank_a", "combat_tank_a", "combat_tank_a", "quad", "siege_tank", "missile_tank" }, + { "quad", "quad", "quad", "trooper", "trooper", "trooper", "trooper", "trooper" } + }, + + hard = + { + { "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }, + { "quad", "quad", "trike", "trike", "combat_tank_a"}, + { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper", "trooper", "trooper" }, + { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper", "trooper", "trooper" }, + { "combat_tank_a", "combat_tank_a", "combat_tank_a", "quad" }, + { "quad", "quad", "quad", "trooper", "quad", "quad", "quad", "trooper" }, + { "combat_tank_a", "combat_tank_a", "combat_tank_a", "combat_tank_a", "quad", "siege_tank", "siege_tank", "missile_tank" }, + { "quad", "quad", "quad", "trooper", "trooper", "trooper", "trooper", "trooper", "trooper" } + } +} + +AtreidesAttackDelay = +{ + easy = DateTime.Minutes(3) + DateTime.Seconds(15), + normal = DateTime.Minutes(2) + DateTime.Seconds(15), + hard = DateTime.Minutes(1) + DateTime.Seconds(15) +} + +AtreidesPaths = +{ + { AtreidesEntry4.Location, AtreidesRally4.Location }, + { AtreidesEntry5.Location, AtreidesRally5.Location }, + { AtreidesEntry6.Location, AtreidesRally6.Location }, + { AtreidesEntry7.Location, AtreidesRally7.Location }, + { AtreidesEntry8.Location, AtreidesRally8.Location } +} + +InitialReinforcements = +{ + AtreidesMainBase = { "combat_tank_a", "combat_tank_a", "quad", "quad", "trike", "light_inf", "light_inf", "light_inf", "light_inf" }, + AtreidesSmallBase1 = { "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf" }, + AtreidesSmallBase2 = { "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf" } +} + +InitialReinforcementsPaths = +{ + AtreidesMainBase = { AtreidesEntry1.Location, AtreidesRally1.Location }, + AtreidesSmallBase1 = { ABarracks2.Location, AtreidesRally2.Location }, + AtreidesSmallBase2 = { ABarracks3.Location, AtreidesRally3.Location } +} + +ToHarvest = +{ + easy = 12500, + normal = 15000, + hard = 20000 +} + +Hunt = function(house) + Trigger.OnAllKilledOrCaptured(Base[house.InternalName], function() + Utils.Do(house.GetGroundAttackers(), IdleHunt) + end) +end + +CheckHarvester = function(house) + if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[house] then + local units = house.GetActorsByType("harvester") + + if #units > 0 then + LastHarvesterEaten[house] = false + ProtectHarvester(units[1], house, AttackGroupSize[Difficulty]) + end + end +end + +Tick = function() + if player.Resources > SpiceToHarvest - 1 then + player.MarkCompletedObjective(GatherSpice) + end + + if player.HasNoRequiredUnits() then + atreides_main.MarkCompletedObjective(KillOrdos1) + atreides_small_1.MarkCompletedObjective(KillOrdos2) + atreides_small_2.MarkCompletedObjective(KillOrdos3) + atreides_small_3.MarkCompletedObjective(KillOrdos4) + end + + if atreides_main.HasNoRequiredUnits() and atreides_small_1.HasNoRequiredUnits() and atreides_small_2.HasNoRequiredUnits() and atreides_small_3.HasNoRequiredUnits() and not player.IsObjectiveCompleted(KillAtreides) then + Media.DisplayMessage("The Atreides have been annihilated!", "Mentat") + player.MarkCompletedObjective(KillAtreides) + end + + if #player.GetActorsByType("engineer") == 0 and not player.IsObjectiveCompleted(CaptureStarport) then + player.MarkFailedObjective(CaptureStarport) + end + + if player.IsObjectiveCompleted(CaptureStarport) then + UserInterface.SetMissionText("Harvested resources: " .. player.Resources .. "/" .. SpiceToHarvest, player.Color) + end + + CheckHarvester(atreides_main) + CheckHarvester(atreides_small_1) +end + +WorldLoaded = function() + atreides_main = Player.GetPlayer("AtreidesMainBase") + atreides_small_1 = Player.GetPlayer("AtreidesSmallBase1") + atreides_small_2 = Player.GetPlayer("AtreidesSmallBase2") + atreides_small_3 = Player.GetPlayer("AtreidesSmallBase3") + player = Player.GetPlayer("Ordos") + + SpiceToHarvest = ToHarvest[Difficulty] + + InitObjectives(player) + KillOrdos1 = atreides_main.AddPrimaryObjective("Kill all Ordos units.") + KillOrdos2 = atreides_small_1.AddPrimaryObjective("Kill all Ordos units.") + KillOrdos3 = atreides_small_2.AddPrimaryObjective("Kill all Ordos units.") + KillOrdos4 = atreides_small_3.AddPrimaryObjective("Kill all Ordos units.") + CaptureStarport = player.AddPrimaryObjective("Capture the Atreides Starport and establish a base.") + GatherSpice = player.AddPrimaryObjective("Harvest " .. tostring(SpiceToHarvest) .. " Solaris worth of Spice.") + KillAtreides = player.AddSecondaryObjective("Destroy the Atreides.") + + Camera.Position = OEngi1.CenterPosition + AtreidesAttackLocation = OEngi1.Location + + if Difficulty ~= "easy" then + OTrooper3.Destroy() + end + if Difficulty == "hard" then + OTrooper4.Destroy() + OCombat2.Destroy() + end + + Hunt(atreides_main) + Hunt(atreides_small_1) + Hunt(atreides_small_2) + Hunt(atreides_small_3) + + local path = function() return Utils.Random(AtreidesPaths) end + local waveCondition = function() return player.IsObjectiveCompleted(KillAtreides) end + local huntFunction = function(unit) + unit.AttackMove(AtreidesAttackLocation) + IdleHunt(unit) + end + SendCarryallReinforcements(atreides_main, 0, 8, AtreidesAttackDelay[Difficulty], path, AtreidesReinforcements[Difficulty], waveCondition, huntFunction) + + Actor.Create("upgrade.barracks", true, { Owner = atreides_main }) + Actor.Create("upgrade.light", true, { Owner = atreides_main }) + Actor.Create("upgrade.heavy", true, { Owner = atreides_main }) + Actor.Create("upgrade.barracks", true, { Owner = atreides_small_1 }) + Actor.Create("upgrade.barracks", true, { Owner = atreides_small_2 }) + Trigger.AfterDelay(0, ActivateAI) + + Trigger.OnKilled(AStarport, function() + if not player.IsObjectiveCompleted(CaptureStarport) then + player.MarkFailedObjective(CaptureStarport) + end + end) + + Trigger.OnCapture(AStarport, function() + player.MarkCompletedObjective(CaptureStarport) + + if not AIProductionActivated then + ActivateAIProduction() + end + + Reinforcements.ReinforceWithTransport(player, "frigate", { "mcv" }, { OrdosStarportEntry.Location, AStarport.Location + CVec.New(1, 1) }, { OrdosStarportExit.Location }) + + if APower8.Owner ~= player then + APower8.Sell() + end + if APower9.Owner ~= player then + APower9.Sell() + end + end) + Trigger.OnKilledOrCaptured(APower8, function() + if not AIProductionActivated then + ActivateAIProduction() + end + end) + Trigger.OnKilledOrCaptured(APower9, function() + if not AIProductionActivated then + ActivateAIProduction() + end + end) +end diff --git a/mods/d2k/maps/ordos-05/rules.yaml b/mods/d2k/maps/ordos-05/rules.yaml new file mode 100644 index 0000000000..a0418fc70e --- /dev/null +++ b/mods/d2k/maps/ordos-05/rules.yaml @@ -0,0 +1,61 @@ +Player: + PlayerResources: + DefaultCash: 6000 + +World: + LuaScript: + Scripts: campaign-global.lua, ordos05.lua, ordos05-AI.lua + MissionData: + Briefing: Spice is paramount. The Atreides possess the Spice. We must capture their Starport and bring in an MCV to harvest the Spice.\n\nCombat is costly. Fight only if the Atreides obstruct the flow of Spice. Use the minimum amount of funds for defense.\n\nMine and store what is needed to pay our debt to the Ixians. Once that amount has been collected, Ordos forces will withdraw. + BriefingVideo: O_BR05_E.VQA + MapOptions: + TechLevel: medium + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +^Palettes: + IndexedPlayerPalette: + PlayerIndex: + AtreidesMainBase: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128 + AtreidesSmallBase1: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128 + AtreidesSmallBase2: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128 + AtreidesSmallBase3: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128 + +carryall.reinforce: + Cargo: + MaxWeight: 10 + +frigate: + Aircraft: + LandableTerrainTypes: Sand, Rock, Transition, Spice, SpiceSand, Dune, Concrete + VTOL: true # The frigate would teleport to land otherwise + +concreteb: + Buildable: + Prerequisites: ~disabled + +upgrade.conyard: + Buildable: + Prerequisites: ~disabled + +grenadier: + Buildable: + Prerequisites: ~disabled + +stealth_raider: + Buildable: + Prerequisites: ~disabled + +large_gun_turret: + Buildable: + Prerequisites: ~disabled + +siege_tank: + Buildable: + Prerequisites: ~disabled diff --git a/mods/d2k/missions.yaml b/mods/d2k/missions.yaml index fe32352165..2b7622daa6 100644 --- a/mods/d2k/missions.yaml +++ b/mods/d2k/missions.yaml @@ -16,6 +16,7 @@ Ordos Campaign: ./mods/d2k/maps/ordos-03a ./mods/d2k/maps/ordos-03b ./mods/d2k/maps/ordos-04 + ./mods/d2k/maps/ordos-05 Harkonnen Campaign: ./mods/d2k/maps/harkonnen-01a