diff --git a/OpenRA.sln b/OpenRA.sln index d37dfd595f..40b3274303 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -82,6 +82,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dune 2000 Lua scripts", "Du mods\d2k\maps\atreides-01a\atreides01a.lua = mods\d2k\maps\atreides-01a\atreides01a.lua mods\d2k\maps\atreides-01b\atreides01b.lua = mods\d2k\maps\atreides-01b\atreides01b.lua mods\d2k\maps\atreides-02a\atreides02a.lua = mods\d2k\maps\atreides-02a\atreides02a.lua + mods\d2k\maps\atreides-02b\atreides02b.lua = mods\d2k\maps\atreides-02b\atreides02b.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/atreides-01a/map.yaml b/mods/d2k/maps/atreides-01a/map.yaml index 61df53e7ce..bf687a2639 100644 --- a/mods/d2k/maps/atreides-01a/map.yaml +++ b/mods/d2k/maps/atreides-01a/map.yaml @@ -4,7 +4,7 @@ RequiresMod: d2k Title: Atreides 01a -Description: Harvest Spice from the Imperial Basin. Construct a Spice Refinery and defend it against the Harkonnen troops scattered throughout the basin. You have been assigned only limited offensive forces - use them wisely.\n\nYou will have to learn the subtleties of mining as you go, but remember to build Silos to store the Spice. When you run out of storage space you can not gather more Spice. Also, any building without adequate concrete foundation will need immediate repair and be vulnerable to erosive damage from the harsh environment. Your greatest adversary may be the elements. Good luck.\n +Description: Harvest Spice from the Imperial Basin. Construct a Spice Refinery and defend it against the Harkonnen troops scattered throughout the basin. You have been assigned only limited offensive forces - use them wisely.\n\nYou will have to learn the subtleties of mining as you go, but remember to build Silos to store the Spice. When you run out of storage space you can not gather more Spice. Also, any building without adequate concrete foundation will need immediate repair and be vulnerable to erosive damage from the harsh environment. Your greatest adversary may be the elements.\n\nGood luck.\n Author: Westwood Studios @@ -44,6 +44,7 @@ Players: Name: Creeps NonCombatant: True Faction: Random + Enemies: Atreides, Harkonnen PlayerReference@Atreides: Name: Atreides Playable: true @@ -51,14 +52,14 @@ Players: LockFaction: true ColorRamp: 170,255,200 LockColor: true - Enemies: Harkonnen + Enemies: Harkonnen, Creeps PlayerReference@Harkonnen: Name: Harkonnen Faction: harkonnen LockFaction: true ColorRamp: 0,255,127 LockColor: true - Enemies: Atreides + Enemies: Atreides, Creeps Actors: Actor0: trike diff --git a/mods/d2k/maps/atreides-01b/map.yaml b/mods/d2k/maps/atreides-01b/map.yaml index c70996760b..320b164de4 100644 --- a/mods/d2k/maps/atreides-01b/map.yaml +++ b/mods/d2k/maps/atreides-01b/map.yaml @@ -4,7 +4,7 @@ RequiresMod: d2k Title: Atreides 01b -Description: Harvest Spice from the Imperial Basin. Construct a Spice Refinery and defend it against the Harkonnen troops scattered throughout the basin. You have been assigned only limited offensive forces - use them wisely.\n\nYou will have to learn the subtleties of mining as you go, but remember to build Silos to store the Spice. When you run out of storage space you can not gather more Spice. Also, any building without adequate concrete foundation will need immediate repair and be vulnerable to erosive damage from the harsh environment. Your greatest adversary may be the elements. Good luck.\n +Description: Harvest Spice from the Imperial Basin. Construct a Spice Refinery and defend it against the Harkonnen troops scattered throughout the basin. You have been assigned only limited offensive forces - use them wisely.\n\nYou will have to learn the subtleties of mining as you go, but remember to build Silos to store the Spice. When you run out of storage space you can not gather more Spice. Also, any building without adequate concrete foundation will need immediate repair and be vulnerable to erosive damage from the harsh environment. Your greatest adversary may be the elements.\n\nGood luck.\n Author: Westwood Studios @@ -44,6 +44,7 @@ Players: Name: Creeps NonCombatant: True Faction: Random + Enemies: Atreides, Harkonnen PlayerReference@Atreides: Name: Atreides Playable: true @@ -51,14 +52,14 @@ Players: LockFaction: true ColorRamp: 170,255,200 LockColor: true - Enemies: Harkonnen + Enemies: Harkonnen, Creeps PlayerReference@Harkonnen: Name: Harkonnen Faction: harkonnen LockFaction: true ColorRamp: 0,255,127 LockColor: true - Enemies: Atreides + Enemies: Atreides, Creeps Actors: Actor0: light_inf diff --git a/mods/d2k/maps/atreides-02a/map.bin b/mods/d2k/maps/atreides-02a/map.bin index 52ee7f10d8..08ad5fc821 100644 Binary files a/mods/d2k/maps/atreides-02a/map.bin and b/mods/d2k/maps/atreides-02a/map.bin differ diff --git a/mods/d2k/maps/atreides-02a/map.yaml b/mods/d2k/maps/atreides-02a/map.yaml index 9dabfe8649..aea0a8b2db 100644 --- a/mods/d2k/maps/atreides-02a/map.yaml +++ b/mods/d2k/maps/atreides-02a/map.yaml @@ -4,7 +4,7 @@ RequiresMod: d2k Title: Atreides 02a -Description: Infiltrate the Imperial Basin and build up our forces until they are strong enough to eradicate the local Harkonnen presence.\n\nThe Harkonnen are reinforcing their troops by air, so be on your guard. Use the Outpost's radar to detect attacks from unexpected quarters.\n\nBe careful when minig the Spice. Spice mounds grow out of the sand. While a vital source of Spice, Spice mounds can damage or destroy any unit that blunders into them.\n\nGood luck.\n +Description: Infiltrate the Imperial Basin and build up our forces until they are strong enough to eradicate the local Harkonnen presence.\n\nThe Harkonnen are reinforcing their troops by air, so be on your guard. Use the Outpost's radar to detect attacks from unexpected quarters.\n\nBe careful when mining the Spice. Spice mounds grow out of the sand. While a vital source of Spice, Spice mounds can damage or destroy any unit that blunders into them.\n\nGood luck.\n Author: Westwood Studios @@ -42,6 +42,7 @@ Players: PlayerReference@Creeps: Name: Creeps NonCombatant: True + Enemies: Atreides, Harkonnen PlayerReference@Atreides: Name: Atreides Playable: True @@ -49,14 +50,14 @@ Players: Faction: atreides LockColor: True ColorRamp: 170,255,200 - Enemies: Harkonnen + Enemies: Harkonnen, Creeps PlayerReference@Harkonnen: Name: Harkonnen LockFaction: True Faction: harkonnen LockColor: True ColorRamp: 0,255,127 - Enemies: Atreides + Enemies: Atreides, Creeps Actors: Actor0: spicebloom diff --git a/mods/d2k/maps/atreides-02b/atreides02b.lua b/mods/d2k/maps/atreides-02b/atreides02b.lua new file mode 100644 index 0000000000..ba997b75ab --- /dev/null +++ b/mods/d2k/maps/atreides-02b/atreides02b.lua @@ -0,0 +1,128 @@ + +HarkonnenBase = { HConyard, HOutpost, HBarracks } + +HarkonnenReinforcements = { } +HarkonnenReinforcements["Easy"] = +{ + { "light_inf", "trike" }, + { "light_inf", "trike" }, + { "light_inf", "light_inf", "light_inf", "trike", "trike" } +} + +HarkonnenReinforcements["Normal"] = +{ + { "light_inf", "trike" }, + { "light_inf", "trike" }, + { "light_inf", "light_inf", "light_inf", "trike", "trike" }, + { "light_inf", "light_inf" }, + { "light_inf", "light_inf", "light_inf" }, + { "light_inf", "trike" }, +} + +HarkonnenReinforcements["Hard"] = +{ + { "trike", "trike" }, + { "light_inf", "trike" }, + { "light_inf", "trike" }, + { "light_inf", "light_inf", "light_inf", "trike", "trike" }, + { "light_inf", "light_inf" }, + { "trike", "trike" }, + { "light_inf", "light_inf", "light_inf" }, + { "light_inf", "trike" }, + { "trike", "trike" } +} + +HarkonnenAttackPaths = +{ + { HarkonnenEntry1.Location, HarkonnenRally1.Location }, + { HarkonnenEntry1.Location, HarkonnenRally3.Location }, + { HarkonnenEntry2.Location, HarkonnenRally2.Location }, + { HarkonnenEntry2.Location, HarkonnenRally4.Location } +} + +HarkonnenAttackDelay = +{ + Easy = DateTime.Minutes(5), + Normal = DateTime.Minutes(2) + DateTime.Seconds(40), + Hard = DateTime.Minutes(1) + DateTime.Seconds(20) +} + +HarkonnenAttackWaves = +{ + Easy = 3, + Normal = 6, + Hard = 9 +} + +wave = 0 +SendHarkonnen = function() + Trigger.AfterDelay(HarkonnenAttackDelay[Map.Difficulty], function() + wave = wave + 1 + if wave > HarkonnenAttackWaves[Map.Difficulty] then + return + end + + local path = Utils.Random(HarkonnenAttackPaths) + local units = Reinforcements.ReinforceWithTransport(harkonnen, "carryall.reinforce", HarkonnenReinforcements[Map.Difficulty][wave], path, { path[1] })[2] + Utils.Do(units, IdleHunt) + + SendHarkonnen() + end) +end + +IdleHunt = function(unit) + Trigger.OnIdle(unit, unit.Hunt) +end + +Tick = function() + if player.HasNoRequiredUnits() then + harkonnen.MarkCompletedObjective(KillAtreides) + end + + if harkonnen.HasNoRequiredUnits() and not player.IsObjectiveCompleted(KillHarkonnen) then + Media.DisplayMessage("The Harkonnen have been anihilated!", "Mentat") + player.MarkCompletedObjective(KillHarkonnen) + end +end + +WorldLoaded = function() + harkonnen = Player.GetPlayer("Harkonnen") + player = Player.GetPlayer("Atreides") + + InitObjectives() + + Camera.Position = AConyard.CenterPosition + + Trigger.OnAllKilled(HarkonnenBase, function() + Utils.Do(harkonnen.GetGroundAttackers(), IdleHunt) + end) + + SendHarkonnen() +end + +InitObjectives = function() + Trigger.OnObjectiveAdded(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + KillAtreides = harkonnen.AddPrimaryObjective("Kill all Atreides units.") + KillHarkonnen = player.AddPrimaryObjective("Destroy all Harkonnen forces.") + + 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.OnPlayerLost(player, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "Lose") + end) + end) + Trigger.OnPlayerWon(player, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "Win") + end) + end) +end diff --git a/mods/d2k/maps/atreides-02b/map.bin b/mods/d2k/maps/atreides-02b/map.bin new file mode 100644 index 0000000000..0068202b5d Binary files /dev/null and b/mods/d2k/maps/atreides-02b/map.bin differ diff --git a/mods/d2k/maps/atreides-02b/map.png b/mods/d2k/maps/atreides-02b/map.png new file mode 100644 index 0000000000..687e7f87b3 Binary files /dev/null and b/mods/d2k/maps/atreides-02b/map.png differ diff --git a/mods/d2k/maps/atreides-02b/map.yaml b/mods/d2k/maps/atreides-02b/map.yaml new file mode 100644 index 0000000000..1debf9dcd3 --- /dev/null +++ b/mods/d2k/maps/atreides-02b/map.yaml @@ -0,0 +1,212 @@ +MapFormat: 7 + +RequiresMod: d2k + +Title: Atreides 02b + +Description: Infiltrate the Imperial Basin and build up our forces until they are strong enough to eradicate the local Harkonnen presence.\n\nThe Harkonnen are reinforcing their troops by air, so be on your guard. Use the Outpost's radar to detect attacks from unexpected quarters.\n\nBe careful when mining the Spice. Spice mounds grow out of the sand. While a vital source of Spice, Spice mounds can damage or destroy any unit that blunders into them.\n\nGood luck.\n + +Author: Westwood Studios + +Tileset: ARRAKIS + +MapSize: 52,52 + +Bounds: 2,2,48,48 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: a_br02_e.vqa + +Options: + Crates: False + Creeps: True + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 5000 + TechLevel: Low + ConfigurableStartingUnits: False + Difficulties: Easy, Normal, Hard + ShortGame: False + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Enemies: Atreides, Harkonnen + PlayerReference@Atreides: + Name: Atreides + Playable: True + LockFaction: True + Faction: atreides + LockColor: True + ColorRamp: 170,255,200 + Enemies: Harkonnen, Creeps + PlayerReference@Harkonnen: + Name: Harkonnen + LockFaction: True + Faction: harkonnen + LockColor: True + ColorRamp: 0,255,127 + Enemies: Atreides, Creeps + +Actors: + Actor0: light_inf + Location: 26,8 + Owner: Atreides + Actor1: trike + Location: 28,8 + Owner: Atreides + Actor2: trike + Location: 30,8 + Owner: Atreides + Actor3: light_inf + Location: 24,10 + Owner: Atreides + Actor5: trike + Location: 31,11 + Owner: Atreides + Actor6: light_inf + Location: 47,11 + Owner: Harkonnen + Actor7: light_inf + Location: 25,12 + Owner: Atreides + Actor8: light_inf + Location: 8,14 + Owner: Harkonnen + Actor9: light_inf + Location: 27,14 + Owner: Atreides + Actor10: wormspawner + Location: 40,17 + Owner: Creeps + Actor11: light_inf + Location: 40,33 + Owner: Harkonnen + Actor12: trike + Location: 14,39 + Owner: Harkonnen + Actor13: light_inf + Location: 16,39 + Owner: Harkonnen + Actor14: trike + Location: 18,39 + Owner: Harkonnen + Actor16: trike + Location: 16,41 + Owner: Harkonnen + Actor17: light_inf + Location: 9,42 + Owner: Harkonnen + Actor20: light_inf + Location: 11,44 + Owner: Harkonnen + Actor21: trike + Location: 12,46 + Owner: Harkonnen + Actor22: light_inf + Location: 18,46 + Owner: Harkonnen + Actor23: light_inf + Location: 21,46 + Owner: Harkonnen + Actor24: trike + Location: 16,48 + Owner: Harkonnen + HConyard: construction_yard + Location: 14,42 + Owner: Harkonnen + HOutpost: outpostnopower + Location: 11,40 + Owner: Harkonnen + HBarracks: barracks + Location: 18,42 + Owner: Harkonnen + AConyard: construction_yard + Location: 27,10 + Owner: Atreides + HarkonnenEntry1: waypoint + Owner: Neutral + Location: 2,22 + HarkonnenEntry2: waypoint + Owner: Neutral + Location: 49,33 + HarkonnenRally1: waypoint + Owner: Neutral + Location: 12,7 + HarkonnenRally2: waypoint + Owner: Neutral + Location: 36,15 + HarkonnenRally3: waypoint + Owner: Neutral + Location: 18,17 + HarkonnenRally4: waypoint + Owner: Neutral + Location: 30,28 + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: atreides02b.lua + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + WormManager: + Minimum: 1 + Maximum: 1 + carryall.reinforce: + Cargo: + MaxWeight: 10 + construction_yard: + Production: + Produces: Building + concreteb: + Buildable: + Prerequisites: ~disabled + heavy_factory: + Buildable: + Prerequisites: ~disabled + medium_gun_turret: + Buildable: + Prerequisites: ~disabled + wall: + Buildable: + Prerequisites: ~disabled + outpost: + Buildable: + Prerequisites: barracks + outpostnopower: + Inherits: outpost + Buildable: + Prerequisites: ~disabled + -RequiresPower: + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/d2k/missions.yaml b/mods/d2k/missions.yaml index 721fa147b2..b6bcdcb33e 100644 --- a/mods/d2k/missions.yaml +++ b/mods/d2k/missions.yaml @@ -2,3 +2,4 @@ Atreides Campaign: ./mods/d2k/maps/atreides-01a ./mods/d2k/maps/atreides-01b ./mods/d2k/maps/atreides-02a + ./mods/d2k/maps/atreides-02b