Initial commit: OpenRA game engine
Fork from OpenRA/OpenRA with one-click launch script (start-ra.cmd) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
80
mods/d2k/maps/harkonnen-09a/harkonnen09a-AI.lua
Normal file
80
mods/d2k/maps/harkonnen-09a/harkonnen09a-AI.lua
Normal file
@@ -0,0 +1,80 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
|
||||
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" }
|
||||
|
||||
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" }
|
||||
|
||||
CorrinoMainInfantryTypes = { "light_inf", "light_inf", "trooper", "sardaukar" }
|
||||
CorrinoMainTankTypes = { "combat_tank_h", "combat_tank_h", "siege_tank", "missile_tank" }
|
||||
CorrinoSmallTankTypes = { "combat_tank_h", "combat_tank_h", "siege_tank" }
|
||||
CorrinoStarportTypes = { "trike.starport", "trike.starport", "quad.starport", "combat_tank_h.starport", "combat_tank_h.starport", "siege_tank.starport", "missile_tank.starport" }
|
||||
|
||||
ActivateAI = function()
|
||||
IdlingUnits[AtreidesMain] = Utils.Concat(Reinforcements.Reinforce(AtreidesMain, InitialAtreidesReinforcements[1], InitialAtreidesPaths[1]), Utils.Concat(Reinforcements.Reinforce(AtreidesMain, InitialAtreidesReinforcements[2], InitialAtreidesPaths[2]), Reinforcements.Reinforce(AtreidesMain, InitialAtreidesReinforcements[3], InitialAtreidesPaths[3])))
|
||||
IdlingUnits[AtreidesSmall1] = Utils.Concat(Reinforcements.Reinforce(AtreidesSmall1, InitialAtreidesReinforcements[4], InitialAtreidesPaths[4]), Reinforcements.Reinforce(AtreidesSmall1, InitialAtreidesReinforcements[5], InitialAtreidesPaths[5]))
|
||||
IdlingUnits[AtreidesSmall2] = Reinforcements.Reinforce(AtreidesSmall2, InitialAtreidesReinforcements[6], InitialAtreidesPaths[6])
|
||||
IdlingUnits[CorrinoMain] = Reinforcements.Reinforce(CorrinoMain, InitialCorrinoReinforcements, InitialCorrinoPaths[1])
|
||||
IdlingUnits[CorrinoSmall] = Reinforcements.Reinforce(CorrinoMain, InitialCorrinoReinforcements, InitialCorrinoPaths[2])
|
||||
|
||||
DefendAndRepairBase(AtreidesMain, AtreidesMainBase, 0.75, AttackGroupSize[Difficulty])
|
||||
DefendAndRepairBase(AtreidesSmall1, AtreidesSmall1Base, 0.75, AttackGroupSize[Difficulty])
|
||||
DefendAndRepairBase(AtreidesSmall2, AtreidesSmall2Base, 0.75, AttackGroupSize[Difficulty])
|
||||
DefendAndRepairBase(CorrinoMain, CorrinoMainBase, 0.75, AttackGroupSize[Difficulty])
|
||||
DefendAndRepairBase(CorrinoSmall, CorrinoSmallBase, 0.75, AttackGroupSize[Difficulty])
|
||||
|
||||
local delay = function() return Utils.RandomInteger(AttackDelays[Difficulty][1], AttackDelays[Difficulty][2] + 1) end
|
||||
local infantryToBuild = function() return { Utils.Random(EnemyInfantryTypes) } end
|
||||
local infantryToBuildCorrinoMain = function() return { Utils.Random(CorrinoMainInfantryTypes) } end
|
||||
local vehilcesToBuild = function() return { Utils.Random(EnemyVehicleTypes) } end
|
||||
local tanksToBuildAtreidesMain = function() return { Utils.Random(AtreidesMainTankTypes) } end
|
||||
local tanksToBuildAtreidesSmall = function() return { Utils.Random(AtreidesSmallTankTypes) } end
|
||||
local tanksToBuildCorrinoMain = function() return { Utils.Random(CorrinoMainTankTypes) } end
|
||||
local tanksToBuildCorrinoSmall = function() return { Utils.Random(CorrinoSmallTankTypes) } end
|
||||
local unitsToBuyAtreides = function() return { Utils.Random(AtreidesStarportTypes) } end
|
||||
local unitsToBuyCorrino = function() return { Utils.Random(CorrinoStarportTypes) } end
|
||||
local attackThresholdSize = AttackGroupSize[Difficulty] * 2.5
|
||||
|
||||
ProduceUnits(AtreidesMain, ABarracks1, delay, infantryToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(AtreidesMain, ALightFactory1, delay, vehilcesToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(AtreidesMain, AHeavyFactory1, delay, tanksToBuildAtreidesMain, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(AtreidesMain, AStarport, delay, unitsToBuyAtreides, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
|
||||
ProduceUnits(AtreidesSmall1, ABarracks3, delay, infantryToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(AtreidesSmall1, ALightFactory2, delay, vehilcesToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(AtreidesSmall1, AHeavyFactory2, delay, tanksToBuildAtreidesSmall, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
|
||||
ProduceUnits(AtreidesSmall2, ABarracks4, delay, infantryToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
|
||||
ProduceUnits(CorrinoMain, CBarracks1, delay, infantryToBuildCorrinoMain, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(CorrinoMain, CLightFactory1, delay, vehilcesToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(CorrinoMain, CHeavyFactory1, delay, tanksToBuildCorrinoMain, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(CorrinoMain, CStarport, delay, unitsToBuyCorrino, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
|
||||
ProduceUnits(CorrinoSmall, CBarracks2, delay, infantryToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(CorrinoSmall, CLightFactory2, delay, vehilcesToBuild, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
ProduceUnits(CorrinoSmall, CHeavyFactory2, delay, tanksToBuildCorrinoSmall, AttackGroupSize[Difficulty], attackThresholdSize)
|
||||
end
|
||||
339
mods/d2k/maps/harkonnen-09a/harkonnen09a.lua
Normal file
339
mods/d2k/maps/harkonnen-09a/harkonnen09a.lua
Normal file
@@ -0,0 +1,339 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
|
||||
AtreidesMainBase = { AConYard1, AOutpost1, APalace, ARefinery1, ARefinery2, ARefinery3, AHeavyFactory1, ALightFactory1, AStarport, AHiTechFactory, AResearch, AGunt1, AGunt2, AGunt3, AGunt4, AGunt5, ARock1, ARock2, ARock3, ARock4, ABarracks1, ABarracks2, APower1, APower2, APower3, APower4, APower5, APower6, APower7, APower8, APower9, APower10, APower11, APower12, APower13, APower14 }
|
||||
AtreidesSmall1Base = { AConYard2, ARefinery4, ABarracks3, AHeavyFactory2, ALightFactory2, ARepair, ARock5, ARock6, ARock7, ARock8, ARock9, APower15, APower16, APower17, APower18, APower19, APower20, APower21 }
|
||||
AtreidesSmall2Base = { AOutpost2, ABarracks4, AGunt6, AGunt7, AGunt8, ARock10, APower22, APower23 }
|
||||
CorrinoMainBase = { COutpost, CPalace, CRefinery1, CHeavyFactory1, CLightFactory1, CStarport, CResearch, CGunt1, CGunt2, CRock1, CRock2, CBarracks1, CPower1, CPower2, CPower3, CPower4, CPower5, CPower6, CPower7 }
|
||||
CorrinoSmallBase = { CConYard, CRefinery2, CHeavyFactory2, CLightFactory2, CRock3, CRock4, CBarracks2, CPower8, CPower9, CPower10, CPower11 }
|
||||
|
||||
AtreidesReinforcements =
|
||||
{
|
||||
easy =
|
||||
{
|
||||
{ "missile_tank", "trooper", "light_inf", "light_inf" },
|
||||
{ "quad", "light_inf", "combat_tank_a"},
|
||||
{ "light_inf", "trooper", "missile_tank" },
|
||||
{ "light_inf", "light_inf", "siege_tank" }
|
||||
},
|
||||
|
||||
normal =
|
||||
{
|
||||
{ "missile_tank", "trooper", "trooper", "light_inf", "light_inf" },
|
||||
{ "quad", "trike", "combat_tank_a"},
|
||||
{ "trooper", "trooper", "missile_tank" },
|
||||
{ "light_inf", "light_inf", "light_inf", "siege_tank" },
|
||||
{ "combat_tank_a", "trike", "trike", "fremen" }
|
||||
},
|
||||
|
||||
hard =
|
||||
{
|
||||
{ "missile_tank", "trooper", "trooper", "trooper", "light_inf", "light_inf" },
|
||||
{ "quad", "trike", "light_inf", "combat_tank_a"},
|
||||
{ "light_inf", "trooper", "trooper", "missile_tank" },
|
||||
{ "light_inf", "light_inf", "light_inf", "light_inf", "siege_tank" },
|
||||
{ "combat_tank_a", "trike", "trike", "fremen", "fremen" },
|
||||
{ "sonic_tank", "combat_tank_a", "combat_tank_a", "quad" }
|
||||
}
|
||||
}
|
||||
|
||||
CorrinoStarportReinforcements =
|
||||
{
|
||||
easy =
|
||||
{
|
||||
{ "sardaukar", "sardaukar", "missile_tank" },
|
||||
{ "trooper", "trooper", "siege_tank" },
|
||||
{ "sardaukar", "sardaukar", "sardaukar", "trooper", "trooper", "light_inf", "light_inf" }
|
||||
},
|
||||
|
||||
normal =
|
||||
{
|
||||
{ "sardaukar", "sardaukar", "sardaukar", "missile_tank" },
|
||||
{ "trooper", "trooper", "trooper", "siege_tank" },
|
||||
{ "sardaukar", "sardaukar", "sardaukar", "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf" }
|
||||
},
|
||||
|
||||
hard =
|
||||
{
|
||||
{ "sardaukar", "sardaukar", "sardaukar", "sardaukar", "missile_tank" },
|
||||
{ "trooper", "trooper", "trooper", "trooper", "siege_tank" },
|
||||
{ "sardaukar", "sardaukar", "sardaukar", "trooper", "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf" }
|
||||
}
|
||||
}
|
||||
|
||||
AtreidesAttackDelay =
|
||||
{
|
||||
easy = DateTime.Minutes(3) + DateTime.Seconds(30),
|
||||
normal = DateTime.Minutes(2) + DateTime.Seconds(30),
|
||||
hard = DateTime.Minutes(1) + DateTime.Seconds(30)
|
||||
}
|
||||
|
||||
CorrinoStarportDelay =
|
||||
{
|
||||
easy = DateTime.Minutes(10),
|
||||
normal = DateTime.Minutes(8),
|
||||
hard = DateTime.Minutes(6)
|
||||
}
|
||||
|
||||
AtreidesAttackWaves =
|
||||
{
|
||||
easy = 4,
|
||||
normal = 5,
|
||||
hard = 6
|
||||
}
|
||||
|
||||
FremenGroupSize =
|
||||
{
|
||||
easy = 2,
|
||||
normal = 4,
|
||||
hard = 6
|
||||
}
|
||||
|
||||
InitialAtreidesReinforcements =
|
||||
{
|
||||
{ "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" },
|
||||
{ "trooper", "trooper", "trooper", "combat_tank_a", "combat_tank_a" },
|
||||
{ "combat_tank_a", "combat_tank_a", "quad", "quad", "trike" },
|
||||
{ "trooper", "trooper", "trooper", "trooper", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" },
|
||||
{ "trooper", "trooper", "trooper", "trooper", "trooper", "trooper", "combat_tank_a", "combat_tank_a" },
|
||||
{ "combat_tank_a", "quad", "quad", "trike", "trike", "trike" }
|
||||
}
|
||||
|
||||
InitialCorrinoReinforcements = { "trooper", "trooper", "trooper", "trooper", "quad", "quad" }
|
||||
|
||||
AtreidesPaths =
|
||||
{
|
||||
{ AtreidesEntry1.Location, AtreidesRally1.Location },
|
||||
{ AtreidesEntry2.Location, AtreidesRally2.Location },
|
||||
{ AtreidesEntry3.Location, AtreidesRally3.Location },
|
||||
{ AtreidesEntry4.Location, AtreidesRally4.Location }
|
||||
}
|
||||
|
||||
InitialAtreidesPaths =
|
||||
{
|
||||
{ AtreidesEntry5.Location, AtreidesRally5.Location },
|
||||
{ AtreidesEntry6.Location, AtreidesRally6.Location },
|
||||
{ AtreidesEntry7.Location, AtreidesRally7.Location },
|
||||
{ AtreidesEntry8.Location, AtreidesRally8.Location },
|
||||
{ AtreidesEntry9.Location, AtreidesRally9.Location },
|
||||
{ AtreidesEntry10.Location, AtreidesRally10.Location }
|
||||
}
|
||||
|
||||
InitialCorrinoPaths =
|
||||
{
|
||||
{ CorrinoEntry1.Location, CorrinoRally1.Location },
|
||||
{ CorrinoEntry2.Location, CorrinoRally2.Location }
|
||||
}
|
||||
|
||||
HarkonnenReinforcements = { "combat_tank_h", "combat_tank_h", "siege_tank", "siege_tank", "missile_tank" }
|
||||
|
||||
HarkonnenPath = { HarkonnenEntry.Location, HarkonnenRally.Location }
|
||||
|
||||
SendStarportReinforcements = function()
|
||||
Trigger.AfterDelay(CorrinoStarportDelay[Difficulty], function()
|
||||
if CStarport.IsDead or CStarport.Owner ~= CorrinoMain then
|
||||
return
|
||||
end
|
||||
|
||||
local reinforcements = Utils.Random(CorrinoStarportReinforcements[Difficulty])
|
||||
|
||||
local units = Reinforcements.ReinforceWithTransport(CorrinoMain, "frigate", reinforcements, { CorrinoStarportEntry.Location, CStarport.Location + CVec.New(1, 1) }, { CorrinoStarportExit.Location })[2]
|
||||
Utils.Do(units, function(unit)
|
||||
unit.AttackMove(AtreidesAttackLocation)
|
||||
IdleHunt(unit)
|
||||
end)
|
||||
|
||||
SendStarportReinforcements()
|
||||
end)
|
||||
end
|
||||
|
||||
SendHarkonnenReinforcements = function(delay)
|
||||
Trigger.AfterDelay(delay, function()
|
||||
Reinforcements.ReinforceWithTransport(Harkonnen, "carryall.reinforce", HarkonnenReinforcements, HarkonnenPath, { HarkonnenPath[1] })
|
||||
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
||||
Media.PlaySpeechNotification(Harkonnen, "Reinforce")
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
SendAirStrike = function()
|
||||
if AHiTechFactory.IsDead or AHiTechFactory.Owner ~= AtreidesMain then
|
||||
return
|
||||
end
|
||||
|
||||
local targets = Utils.Where(Harkonnen.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 ~= "silo" and
|
||||
actor.Type ~= "wind_trap"
|
||||
end)
|
||||
|
||||
if #targets > 0 then
|
||||
AHiTechFactory.TargetAirstrike(Utils.Random(targets).CenterPosition)
|
||||
end
|
||||
|
||||
Trigger.AfterDelay(DateTime.Minutes(5), SendAirStrike)
|
||||
end
|
||||
|
||||
BuildFremen = function()
|
||||
if APalace.IsDead or APalace.Owner ~= AtreidesMain then
|
||||
return
|
||||
end
|
||||
|
||||
APalace.Produce("fremen")
|
||||
APalace.Produce("fremen")
|
||||
|
||||
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
||||
IdleFremen = Utils.Where(AtreidesMain.GetActorsByType('fremen'), function(actor) return actor.IsIdle end)
|
||||
|
||||
if #IdleFremen >= FremenGroupSize[Difficulty] then
|
||||
SendFremen()
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds (30), BuildFremen)
|
||||
end
|
||||
|
||||
SendFremen = function()
|
||||
Utils.Do(IdleFremen, function(freman)
|
||||
freman.AttackMove(AtreidesAttackLocation)
|
||||
IdleHunt(freman)
|
||||
end)
|
||||
end
|
||||
|
||||
Tick = function()
|
||||
if Harkonnen.HasNoRequiredUnits() then
|
||||
AtreidesMain.MarkCompletedObjective(KillHarkonnen1)
|
||||
AtreidesSmall1.MarkCompletedObjective(KillHarkonnen2)
|
||||
AtreidesSmall2.MarkCompletedObjective(KillHarkonnen3)
|
||||
CorrinoMain.MarkCompletedObjective(KillHarkonnen4)
|
||||
CorrinoSmall.MarkCompletedObjective(KillHarkonnen5)
|
||||
end
|
||||
|
||||
if AtreidesMain.HasNoRequiredUnits() and AtreidesSmall1.HasNoRequiredUnits() and AtreidesSmall2.HasNoRequiredUnits() and not Harkonnen.IsObjectiveCompleted(KillAtreides) then
|
||||
Media.DisplayMessage(UserInterface.GetFluentMessage("atreides-annihilated"), Mentat)
|
||||
Harkonnen.MarkCompletedObjective(KillAtreides)
|
||||
end
|
||||
|
||||
if CorrinoMain.HasNoRequiredUnits() and CorrinoSmall.HasNoRequiredUnits() and not Harkonnen.IsObjectiveCompleted(KillCorrino) then
|
||||
Media.DisplayMessage(UserInterface.GetFluentMessage("emperor-annihilated"), Mentat)
|
||||
Harkonnen.MarkCompletedObjective(KillCorrino)
|
||||
end
|
||||
|
||||
if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[AtreidesMain] then
|
||||
local units = AtreidesMain.GetActorsByType("harvester")
|
||||
|
||||
if #units > 0 then
|
||||
LastHarvesterEaten[AtreidesMain] = false
|
||||
ProtectHarvester(units[1], AtreidesMain, AttackGroupSize[Difficulty])
|
||||
end
|
||||
end
|
||||
|
||||
if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[AtreidesSmall1] then
|
||||
local units = AtreidesSmall1.GetActorsByType("harvester")
|
||||
|
||||
if #units > 0 then
|
||||
LastHarvesterEaten[AtreidesSmall1] = false
|
||||
ProtectHarvester(units[1], AtreidesSmall1, AttackGroupSize[Difficulty])
|
||||
end
|
||||
end
|
||||
|
||||
if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[CorrinoMain] then
|
||||
local units = CorrinoMain.GetActorsByType("harvester")
|
||||
|
||||
if #units > 0 then
|
||||
LastHarvesterEaten[CorrinoMain] = false
|
||||
ProtectHarvester(units[1], CorrinoMain, AttackGroupSize[Difficulty])
|
||||
end
|
||||
end
|
||||
|
||||
if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[CorrinoSmall] then
|
||||
local units = CorrinoSmall.GetActorsByType("harvester")
|
||||
|
||||
if #units > 0 then
|
||||
LastHarvesterEaten[CorrinoSmall] = false
|
||||
ProtectHarvester(units[1], CorrinoSmall, AttackGroupSize[Difficulty])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
WorldLoaded = function()
|
||||
AtreidesMain = Player.GetPlayer("Atreides Main Base")
|
||||
AtreidesSmall1 = Player.GetPlayer("Atreides Small Base 1")
|
||||
AtreidesSmall2 = Player.GetPlayer("Atreides Small Base 2")
|
||||
CorrinoMain = Player.GetPlayer("Corrino Main Base")
|
||||
CorrinoSmall = Player.GetPlayer("Corrino Small Base")
|
||||
Harkonnen = Player.GetPlayer("Harkonnen")
|
||||
|
||||
InitObjectives(Harkonnen)
|
||||
KillAtreides = AddPrimaryObjective(Harkonnen, "destroy-atreides")
|
||||
KillCorrino = AddPrimaryObjective(Harkonnen, "destroy-imperial-forces")
|
||||
KillHarkonnen1 = AddPrimaryObjective(AtreidesMain, "")
|
||||
KillHarkonnen2 = AddPrimaryObjective(AtreidesSmall1, "")
|
||||
KillHarkonnen3 = AddPrimaryObjective(AtreidesSmall2, "")
|
||||
KillHarkonnen4 = AddPrimaryObjective(CorrinoMain, "")
|
||||
KillHarkonnen5 = AddPrimaryObjective(CorrinoSmall, "")
|
||||
|
||||
Camera.Position = HMCV.CenterPosition
|
||||
AtreidesAttackLocation = HarkonnenRally.Location
|
||||
|
||||
Trigger.AfterDelay(DateTime.Minutes(5), SendAirStrike)
|
||||
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds (30), BuildFremen)
|
||||
|
||||
Trigger.OnAllKilledOrCaptured(AtreidesMainBase, function()
|
||||
Utils.Do(AtreidesMain.GetGroundAttackers(), IdleHunt)
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilledOrCaptured(AtreidesSmall1Base, function()
|
||||
Utils.Do(AtreidesSmall1.GetGroundAttackers(), IdleHunt)
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilledOrCaptured(AtreidesSmall2Base, function()
|
||||
Utils.Do(AtreidesSmall2.GetGroundAttackers(), IdleHunt)
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilledOrCaptured(CorrinoMainBase, function()
|
||||
Utils.Do(CorrinoMain.GetGroundAttackers(), IdleHunt)
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilledOrCaptured(CorrinoSmallBase, function()
|
||||
Utils.Do(CorrinoSmall.GetGroundAttackers(), IdleHunt)
|
||||
end)
|
||||
|
||||
local path = function() return Utils.Random(AtreidesPaths) end
|
||||
local waveCondition = function() return Harkonnen.IsObjectiveCompleted(KillAtreides) end
|
||||
local huntFunction = function(unit)
|
||||
unit.AttackMove(AtreidesAttackLocation)
|
||||
IdleHunt(unit)
|
||||
end
|
||||
SendCarryallReinforcements(AtreidesMain, 0, AtreidesAttackWaves[Difficulty], AtreidesAttackDelay[Difficulty], path, AtreidesReinforcements[Difficulty], waveCondition, huntFunction)
|
||||
|
||||
SendStarportReinforcements()
|
||||
|
||||
Actor.Create("upgrade.barracks", true, { Owner = AtreidesMain })
|
||||
Actor.Create("upgrade.light", true, { Owner = AtreidesMain })
|
||||
Actor.Create("upgrade.heavy", true, { Owner = AtreidesMain })
|
||||
Actor.Create("upgrade.hightech", true, { Owner = AtreidesMain })
|
||||
Actor.Create("upgrade.barracks", true, { Owner = AtreidesSmall1 })
|
||||
Actor.Create("upgrade.light", true, { Owner = AtreidesSmall1 })
|
||||
Actor.Create("upgrade.heavy", true, { Owner = AtreidesSmall1 })
|
||||
Actor.Create("upgrade.barracks", true, { Owner = AtreidesSmall2 })
|
||||
Actor.Create("upgrade.barracks", true, { Owner = CorrinoMain })
|
||||
Actor.Create("upgrade.light", true, { Owner = CorrinoMain })
|
||||
Actor.Create("upgrade.heavy", true, { Owner = CorrinoMain })
|
||||
Actor.Create("upgrade.barracks", true, { Owner = CorrinoSmall })
|
||||
Actor.Create("upgrade.light", true, { Owner = CorrinoSmall })
|
||||
Actor.Create("upgrade.heavy", true, { Owner = CorrinoSmall })
|
||||
Trigger.AfterDelay(0, ActivateAI)
|
||||
|
||||
SendHarkonnenReinforcements(DateTime.Minutes(2) + DateTime.Seconds(30))
|
||||
end
|
||||
BIN
mods/d2k/maps/harkonnen-09a/map.bin
Normal file
BIN
mods/d2k/maps/harkonnen-09a/map.bin
Normal file
Binary file not shown.
5
mods/d2k/maps/harkonnen-09a/map.ftl
Normal file
5
mods/d2k/maps/harkonnen-09a/map.ftl
Normal file
@@ -0,0 +1,5 @@
|
||||
## rules.yaml
|
||||
briefing =
|
||||
Only the Atreides and Imperial forces now remain. The Sardaukar, still scattered from their long march from the North, cannot amass their forces to attack. Only the destruction of the Emperor's base encampment will stop the flow of Imperial forces.
|
||||
|
||||
Once this has been accomplished, turn on the Atreides and annihilate them. Claim Arrakis for House Harkonnen!
|
||||
BIN
mods/d2k/maps/harkonnen-09a/map.png
Normal file
BIN
mods/d2k/maps/harkonnen-09a/map.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 149 KiB |
1048
mods/d2k/maps/harkonnen-09a/map.yaml
Normal file
1048
mods/d2k/maps/harkonnen-09a/map.yaml
Normal file
File diff suppressed because it is too large
Load Diff
58
mods/d2k/maps/harkonnen-09a/rules.yaml
Normal file
58
mods/d2k/maps/harkonnen-09a/rules.yaml
Normal file
@@ -0,0 +1,58 @@
|
||||
Player:
|
||||
PlayerResources:
|
||||
DefaultCash: 7000
|
||||
|
||||
World:
|
||||
LuaScript:
|
||||
Scripts: campaign.lua, utils.lua, harkonnen09a.lua, harkonnen09a-AI.lua
|
||||
MissionData:
|
||||
Briefing: briefing
|
||||
BriefingVideo: H_BR09_E.VQA
|
||||
MapOptions:
|
||||
TechLevel: unrestricted
|
||||
ScriptLobbyDropdown@difficulty:
|
||||
ID: difficulty
|
||||
Label: dropdown-difficulty.label
|
||||
Description: dropdown-difficulty.description
|
||||
Values:
|
||||
easy: options-difficulty.easy
|
||||
normal: options-difficulty.normal
|
||||
hard: options-difficulty.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 1: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128
|
||||
Atreides Small Base 2: 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128
|
||||
Corrino Main Base: 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176
|
||||
Corrino Small Base: 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176
|
||||
FixedPlayerColorShift:
|
||||
BasePalette: player
|
||||
PlayerIndex:
|
||||
Atreides Main Base: 0.274, -0.275, 1, 0.32, 0.34
|
||||
Atreides Small Base 1: 0.274, -0.275, 1, 0.32, 0.34
|
||||
Atreides Small Base 2: 0.274, -0.275, 1, 0.32, 0.34
|
||||
Corrino Main Base: 0.477, 0.075, 1, 0.32, 0.34
|
||||
Corrino Small Base: 0.477, 0.075, 1, 0.32, 0.34
|
||||
|
||||
carryall.reinforce:
|
||||
Cargo:
|
||||
MaxWeight: 10
|
||||
|
||||
frigate:
|
||||
Aircraft:
|
||||
LandableTerrainTypes: Sand, Rock, Transition, Spice, SpiceSand, Dune, Concrete
|
||||
|
||||
mpsardaukar:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
grenadier:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
thumper:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
Reference in New Issue
Block a user