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:
285
mods/ra/maps/allies-02/allies02.lua
Normal file
285
mods/ra/maps/allies-02/allies02.lua
Normal file
@@ -0,0 +1,285 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
ConstructionVehicleReinforcements = { "mcv" }
|
||||
ConstructionVehiclePath = { ReinforcementsEntryPoint.Location, DeployPoint.Location }
|
||||
|
||||
JeepReinforcements = { "e1", "e1", "e1", "jeep" }
|
||||
JeepPath = { ReinforcementsEntryPoint.Location, ReinforcementsRallyPoint.Location }
|
||||
|
||||
TruckReinforcements = { "truk", "truk", "truk" }
|
||||
TruckPath = { TruckEntryPoint.Location, TruckRallyPoint.Location }
|
||||
|
||||
PathGuards = { PathGuard1, PathGuard2, PathGuard3, PathGuard4, PathGuard5, PathGuard6, PathGuard7, PathGuard8, PathGuard9, PathGuard10, PathGuard11, PathGuard12, PathGuard13, PathGuard14, PathGuard15 }
|
||||
|
||||
SovietBase = { SovietConyard, SovietRefinery, SovietPower1, SovietPower2, SovietSilo, SovietKennel, SovietBarracks, SovietWarfactory }
|
||||
|
||||
IdlingUnits = { }
|
||||
|
||||
if Difficulty == "easy" then
|
||||
DateTime.TimeLimit = DateTime.Minutes(10) + DateTime.Seconds(3)
|
||||
|
||||
elseif Difficulty == "normal" then
|
||||
DateTime.TimeLimit = DateTime.Minutes(5) + DateTime.Seconds(3)
|
||||
InfantryTypes = { "e1", "e1", "e1", "e2", "e2", "e1" }
|
||||
InfantryDelay = DateTime.Seconds(18)
|
||||
AttackGroupSize = 5
|
||||
|
||||
elseif Difficulty == "hard" then
|
||||
DateTime.TimeLimit = DateTime.Minutes(3) + DateTime.Seconds(3)
|
||||
InfantryTypes = { "e1", "e1", "e1", "e2", "e2", "e1" }
|
||||
InfantryDelay = DateTime.Seconds(10)
|
||||
VehicleTypes = { "ftrk" }
|
||||
VehicleDelay = DateTime.Seconds(30)
|
||||
AttackGroupSize = 7
|
||||
|
||||
else
|
||||
DateTime.TimeLimit = DateTime.Minutes(1) + DateTime.Seconds(3)
|
||||
ConstructionVehicleReinforcements = { "jeep" }
|
||||
|
||||
InfantryTypes = { "e1", "e1", "e1", "e2", "e2", "dog", "dog" }
|
||||
InfantryDelay = DateTime.Seconds(10)
|
||||
VehicleTypes = { "ftrk" }
|
||||
VehicleDelay = DateTime.Minutes(1) + DateTime.Seconds(10)
|
||||
AttackGroupSize = 5
|
||||
end
|
||||
|
||||
SendJeepReinforcements = function()
|
||||
Media.PlaySpeechNotification(Greece, "ReinforcementsArrived")
|
||||
Reinforcements.Reinforce(Greece, JeepReinforcements, JeepPath, DateTime.Seconds(1))
|
||||
end
|
||||
|
||||
RunInitialActivities = function()
|
||||
Harvester.FindResources()
|
||||
Trigger.OnKilled(Harvester, function() HarvesterKilled = true end)
|
||||
|
||||
ScheduleEarlyAttackers()
|
||||
|
||||
Trigger.OnAllKilled(PathGuards, function()
|
||||
Greece.MarkCompletedObjective(SecureObjective)
|
||||
SendTrucks()
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilled(SovietBase, function()
|
||||
local livePathGuards = Utils.Where(PathGuards, function(pg) return not pg.IsDead end)
|
||||
|
||||
Utils.Do(USSR.GetGroundAttackers(), function(unit)
|
||||
if Utils.Any(livePathGuards, function(pg) return pg == unit end) then
|
||||
return
|
||||
end
|
||||
|
||||
Trigger.OnIdle(unit, unit.Hunt)
|
||||
end)
|
||||
end)
|
||||
|
||||
if InfantryTypes then
|
||||
Trigger.AfterDelay(InfantryDelay, ProduceInfantry)
|
||||
end
|
||||
|
||||
if VehicleTypes then
|
||||
Trigger.AfterDelay(VehicleDelay, ProduceVehicles)
|
||||
end
|
||||
end
|
||||
|
||||
ProduceInfantry = function()
|
||||
if SovietBarracks.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
local toBuild = { Utils.Random(InfantryTypes) }
|
||||
|
||||
if SovietKennel.IsDead and toBuild == "dog" then
|
||||
toBuild = { "e1" }
|
||||
end
|
||||
|
||||
USSR.Build(toBuild, function(unit)
|
||||
IdlingUnits[#IdlingUnits + 1] = unit[1]
|
||||
Trigger.AfterDelay(InfantryDelay, ProduceInfantry)
|
||||
|
||||
if #IdlingUnits >= (AttackGroupSize * 1.5) then
|
||||
SendAttack()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
ProduceVehicles = function()
|
||||
if SovietWarfactory.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
if HarvesterKilled then
|
||||
USSR.Build({ "harv" }, function(harv)
|
||||
harv[1].FindResources()
|
||||
Trigger.OnKilled(harv[1], function() HarvesterKilled = true end)
|
||||
|
||||
HarvesterKilled = false
|
||||
ProduceVehicles()
|
||||
end)
|
||||
return
|
||||
end
|
||||
|
||||
local toBuild = { Utils.Random(VehicleTypes) }
|
||||
USSR.Build(toBuild, function(unit)
|
||||
IdlingUnits[#IdlingUnits + 1] = unit[1]
|
||||
Trigger.AfterDelay(VehicleDelay, ProduceVehicles)
|
||||
|
||||
if #IdlingUnits >= (AttackGroupSize * 1.5) then
|
||||
SendAttack()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
SendAttack = function()
|
||||
local units = { }
|
||||
|
||||
for i = 0, AttackGroupSize, 1 do
|
||||
local number = Utils.RandomInteger(1, #IdlingUnits)
|
||||
|
||||
if IdlingUnits[number] and not IdlingUnits[number].IsDead then
|
||||
units[i] = IdlingUnits[number]
|
||||
table.remove(IdlingUnits, number)
|
||||
end
|
||||
end
|
||||
|
||||
Utils.Do(units, function(unit)
|
||||
if Difficulty ~= "tough" then
|
||||
unit.AttackMove(DeployPoint.Location)
|
||||
end
|
||||
Trigger.OnIdle(unit, unit.Hunt)
|
||||
end)
|
||||
end
|
||||
|
||||
Tick = function()
|
||||
USSR.Resources = USSR.Resources - (0.01 * USSR.ResourceCapacity / 25)
|
||||
|
||||
if USSR.HasNoRequiredUnits() then
|
||||
Greece.MarkCompletedObjective(ConquestObjective)
|
||||
end
|
||||
|
||||
if Greece.HasNoRequiredUnits() then
|
||||
USSR.MarkCompletedObjective(USSRobjective)
|
||||
end
|
||||
end
|
||||
|
||||
FinishTimer = function()
|
||||
DateTime.TimeLimit = 0
|
||||
for i = 0, 5, 1 do
|
||||
local c = TimerColor
|
||||
if i % 2 == 0 then
|
||||
c = HSLColor.White
|
||||
end
|
||||
|
||||
Trigger.AfterDelay(DateTime.Seconds(i), function()
|
||||
UserInterface.SetMissionText(UserInterface.GetFluentMessage("convoy-arrived"), c)
|
||||
end)
|
||||
end
|
||||
Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end)
|
||||
end
|
||||
|
||||
ConvoyOnSite = false
|
||||
SendTrucks = function()
|
||||
if not ConvoyOnSite then
|
||||
ConvoyOnSite = true
|
||||
|
||||
DateTime.TimeLimit = 0
|
||||
UserInterface.SetMissionText("")
|
||||
ConvoyObjective = AddPrimaryObjective(Greece, "escort-convoy")
|
||||
|
||||
Media.PlaySpeechNotification(Greece, "ConvoyApproaching")
|
||||
Trigger.AfterDelay(DateTime.Seconds(3), function()
|
||||
ConvoyUnharmed = true
|
||||
local trucks = Reinforcements.Reinforce(England, TruckReinforcements, TruckPath, DateTime.Seconds(1),
|
||||
function(truck)
|
||||
Trigger.OnIdle(truck, function() truck.Move(TruckExitPoint.Location) end)
|
||||
end)
|
||||
local count = 0
|
||||
Trigger.OnEnteredFootprint( { TruckExitPoint.Location }, function(a, id)
|
||||
if a.Owner == England then
|
||||
count = count + 1
|
||||
a.Destroy()
|
||||
if count == 3 then
|
||||
Greece.MarkCompletedObjective(ConvoyObjective)
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end
|
||||
end)
|
||||
Trigger.OnAnyKilled(trucks, ConvoyCasualties)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
ConvoyCasualties = function()
|
||||
Media.PlaySpeechNotification(Greece, "ConvoyUnitLost")
|
||||
if ConvoyUnharmed then
|
||||
ConvoyUnharmed = false
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), function() Greece.MarkFailedObjective(ConvoyObjective) end)
|
||||
end
|
||||
end
|
||||
|
||||
ScheduleEarlyAttackers = function()
|
||||
if Difficulty == "tough" then
|
||||
Trigger.AfterDelay(DateTime.Seconds(12), SendEarlyAttackers)
|
||||
return
|
||||
end
|
||||
|
||||
Trigger.AfterDelay(DateTime.Seconds(6), function()
|
||||
if not Greece.HasPrerequisites({ "anypower" }) then
|
||||
ScheduleEarlyAttackers()
|
||||
return
|
||||
end
|
||||
|
||||
SendEarlyAttackers()
|
||||
end)
|
||||
end
|
||||
|
||||
SendEarlyAttackers = function()
|
||||
local team = { EarlyAttacker1, EarlyAttacker2, EarlyAttacker3, EarlyAttacker4 }
|
||||
local dogTargets = Greece.GetActorsByType("e1")
|
||||
|
||||
Utils.Do(team, function(member)
|
||||
if member.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
-- Get attack dogs sprinting.
|
||||
if member.Type == "dog" and #dogTargets > 0 then
|
||||
member.Attack(Utils.Random(dogTargets))
|
||||
end
|
||||
|
||||
Trigger.OnIdle(member, member.Hunt)
|
||||
end)
|
||||
end
|
||||
|
||||
WorldLoaded = function()
|
||||
Greece = Player.GetPlayer("Greece")
|
||||
England = Player.GetPlayer("England")
|
||||
USSR = Player.GetPlayer("USSR")
|
||||
|
||||
InitObjectives(Greece)
|
||||
|
||||
USSRobjective = AddPrimaryObjective(USSR, "")
|
||||
|
||||
SecureObjective = AddPrimaryObjective(Greece, "secure-convoy")
|
||||
ConquestObjective = AddPrimaryObjective(Greece, "eliminate-soviets")
|
||||
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(Allies, "MissionTimerInitialised") end)
|
||||
|
||||
RunInitialActivities()
|
||||
|
||||
Reinforcements.Reinforce(Greece, ConstructionVehicleReinforcements, ConstructionVehiclePath)
|
||||
Trigger.AfterDelay(DateTime.Seconds(5), SendJeepReinforcements)
|
||||
Trigger.AfterDelay(DateTime.Seconds(10), SendJeepReinforcements)
|
||||
|
||||
Trigger.OnTimerExpired(function()
|
||||
FinishTimer()
|
||||
SendTrucks()
|
||||
end)
|
||||
|
||||
Camera.Position = ReinforcementsEntryPoint.CenterPosition
|
||||
TimerColor = Greece.Color
|
||||
end
|
||||
Reference in New Issue
Block a user