Files
OpenRA/mods/d2k/maps/ordos-05/ordos05.lua
2023-02-19 23:46:41 +01:00

229 lines
8.5 KiB
Lua

--[[
Copyright (c) The OpenRA Developers and Contributors
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
CachedResources = -1
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(UserInterface.Translate("atreides-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
if player.Resources ~= CachedResources then
local parameters = { ["harvested"] = player.Resources, ["goal"] = SpiceToHarvest }
local harvestedResources = UserInterface.Translate("harvested-resources", parameters)
UserInterface.SetMissionText(harvestedResources)
CachedResources = player.Resources
end
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 = AddPrimaryObjective(atreides_main, "")
KillOrdos2 = AddPrimaryObjective(atreides_small_1, "")
KillOrdos3 = AddPrimaryObjective(atreides_small_2, "")
KillOrdos4 = AddPrimaryObjective(atreides_small_3, "")
CaptureStarport = AddPrimaryObjective(player, "capture-atreides-starport-establish-base")
local harvestSpice = UserInterface.Translate("harvest-spice", { ["spice"] = SpiceToHarvest })
GatherSpice = AddPrimaryObjective(player, harvestSpice)
KillAtreides = AddSecondaryObjective(player, "destroy-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 and not APower8.IsDead then
APower8.Sell()
end
if APower9.Owner ~= player and not APower9.IsDead 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