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:
221
mods/ra/maps/soviet-06b/soviet06b.lua
Normal file
221
mods/ra/maps/soviet-06b/soviet06b.lua
Normal file
@@ -0,0 +1,221 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
|
||||
Trigger.OnRemovedFromWorld(Mcv, function()
|
||||
if McvDeployed or Mcv.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
McvDeployed = true
|
||||
BuildBase()
|
||||
SendReinforcements()
|
||||
|
||||
Trigger.AfterDelay(DateTime.Minutes(1), function()
|
||||
ProduceInfantry(Tent)
|
||||
end)
|
||||
|
||||
Trigger.AfterDelay(DateTime.Minutes(2), function()
|
||||
ProduceArmor(Weap)
|
||||
end)
|
||||
end)
|
||||
|
||||
PrepareResponseCruiser = function()
|
||||
local responseBuildings = { Apwr, Tent, Weap }
|
||||
local responseOrdered = false
|
||||
|
||||
Utils.Do(responseBuildings, function(building)
|
||||
Trigger.OnDamaged(building, function()
|
||||
if responseOrdered or USSR.IsObjectiveCompleted(DisruptDome) then
|
||||
return
|
||||
end
|
||||
|
||||
responseOrdered = true
|
||||
OrderResponseCruiser()
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
OrderResponseCruiser = function()
|
||||
if ResponseCruiser.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
ResponseCruiser.AttackMove(waypoint94.Location, 2)
|
||||
ResponseCruiser.Wait(DateTime.Seconds(90))
|
||||
|
||||
Trigger.OnIdle(ResponseCruiser, function()
|
||||
ResponseCruiser.AttackMove(waypoint69.Location, 2)
|
||||
end)
|
||||
|
||||
Trigger.OnDamaged(ResponseCruiser, function(_, attacker)
|
||||
if attacker.IsDead or not ResponseCruiser.CanTarget(attacker) then
|
||||
return
|
||||
end
|
||||
|
||||
ResponseCruiser.Attack(attacker)
|
||||
ResponseCruiser.Scatter()
|
||||
end)
|
||||
end
|
||||
|
||||
PrepareBridgeBreakers = function()
|
||||
local target = Map.ActorsInCircle(waypoint78.CenterPosition, WDist.New(1536), function(actor)
|
||||
return actor.Type == "br3"
|
||||
end)[1]
|
||||
|
||||
if not target then
|
||||
Media.Debug("No bridge segment found.")
|
||||
return
|
||||
end
|
||||
|
||||
local orderSent = false
|
||||
Trigger.AfterDelay(DateTime.Seconds(30), function()
|
||||
orderSent = true
|
||||
OrderBridgeBreakers(target)
|
||||
end)
|
||||
|
||||
local bridgeEntryCells = { CPos.New(75, 30), CPos.New(76, 30), CPos.New(77, 30) }
|
||||
Trigger.OnEnteredFootprint(bridgeEntryCells, function(a, id)
|
||||
if a.Owner ~= USSR then
|
||||
return
|
||||
end
|
||||
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
|
||||
if not orderSent then
|
||||
OrderBridgeBreakers(target, "with bridge reveal")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
OrderBridgeBreakers = function(target, reveal)
|
||||
if target.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
local breakers = { BridgeBreaker, BridgeBreaker2 }
|
||||
Utils.Do(breakers, function(breaker)
|
||||
if breaker.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
breaker.Stop()
|
||||
breaker.Attack(target, true, true)
|
||||
end)
|
||||
|
||||
if not reveal then
|
||||
return
|
||||
end
|
||||
|
||||
local camera = Actor.Create("camera", true, { Owner = USSR, Location = target.Location })
|
||||
Trigger.OnKilled(target, function()
|
||||
Trigger.AfterDelay(DateTime.Seconds(2), camera.Destroy)
|
||||
end)
|
||||
end
|
||||
|
||||
PrepareObjectives = function()
|
||||
InitObjectives(USSR)
|
||||
KillTrucks = AddPrimaryObjective(Greece, "")
|
||||
EscortConvoy = AddPrimaryObjective(USSR, "escort-convoy")
|
||||
DisruptDome = AddSecondaryObjective(USSR, "destroy-capture-radar-dome-reinforcements")
|
||||
SaveAllTrucks = AddSecondaryObjective(USSR, "keep-trucks-alive")
|
||||
|
||||
Trigger.OnKilledOrCaptured(Dome, function()
|
||||
-- Let the capture notification play first.
|
||||
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||
USSR.MarkCompletedObjective(DisruptDome)
|
||||
Media.PlaySpeechNotification(USSR, "ObjectiveMet")
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
PrepareTrucks = function()
|
||||
local trucks = { Truck1, Truck2 }
|
||||
local goalCells = { CPos.New(85, 10), CPos.New(85, 11), CPos.New(85, 12), CPos.New(86, 13), CPos.New(87, 13), CPos.New(88, 13), CPos.New(88, 14), CPos.New(89, 14), CPos.New(90, 14), CPos.New(90, 15), CPos.New(91, 15), CPos.New(91, 16), CPos.New(91, 17), CPos.New(92, 17), CPos.New(93, 17), CPos.New(94, 17), CPos.New(94, 18), CPos.New(95, 18), CPos.New(96, 18), CPos.New(96, 19), CPos.New(97, 19), CPos.New(98, 19)}
|
||||
|
||||
local goalTriggered = false
|
||||
Trigger.OnEnteredFootprint(goalCells, function(a)
|
||||
if not goalTriggered and a.Owner == USSR and a.Type == "truk" then
|
||||
goalTriggered = true
|
||||
USSR.MarkCompletedObjective(EscortConvoy)
|
||||
USSR.MarkCompletedObjective(SaveAllTrucks)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilled(trucks, function()
|
||||
Greece.MarkCompletedObjective(KillTrucks)
|
||||
end)
|
||||
|
||||
Trigger.OnAnyKilled(trucks, function()
|
||||
USSR.MarkFailedObjective(SaveAllTrucks)
|
||||
end)
|
||||
end
|
||||
|
||||
BeginIntro = function()
|
||||
local introAttackers = { IntroEnemy1, IntroEnemy2, IntroEnemy3 }
|
||||
local sovietReinforcements1 = { "e6", "e6", "e6", "e6", "e6" }
|
||||
local sovietReinforcements2 = { "e4", "e4", "e2", "e2", "e2" }
|
||||
local sovietReinforcements1Path = { McvWaypoint.Location, APCWaypoint1.Location }
|
||||
local sovietReinforcements2Path = { McvWaypoint.Location, APCWaypoint2.Location }
|
||||
|
||||
Mcv.Move(McvWaypoint.Location)
|
||||
Utils.Do(introAttackers, IdleHunt)
|
||||
Reinforcements.ReinforceWithTransport(USSR, "apc", sovietReinforcements1, sovietReinforcements1Path)
|
||||
Reinforcements.ReinforceWithTransport(USSR, "apc", sovietReinforcements2, sovietReinforcements2Path)
|
||||
end
|
||||
|
||||
PrepareIdleGuards = function()
|
||||
local lazyUnits = Utils.Where(Greece.GetGroundAttackers(), function(unit)
|
||||
return unit.Type ~= "ca" and unit.Type ~= "arty"
|
||||
end)
|
||||
|
||||
Utils.Do(lazyUnits, function(unit)
|
||||
local triggered = false
|
||||
|
||||
Trigger.OnDamaged(unit, function()
|
||||
if triggered then
|
||||
return
|
||||
end
|
||||
|
||||
triggered = true
|
||||
IdleHunt(unit)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
WorldLoaded = function()
|
||||
USSR = Player.GetPlayer("USSR")
|
||||
Greece = Player.GetPlayer("Greece")
|
||||
Neutral = Player.GetPlayer("Neutral")
|
||||
|
||||
PrepareObjectives()
|
||||
Camera.Position = CameraStart.CenterPosition
|
||||
Harvester.FindResources()
|
||||
BeginBaseMaintenance()
|
||||
|
||||
if Difficulty ~= "easy" then
|
||||
PrepareResponseCruiser()
|
||||
Trigger.AfterDelay(1, PrepareBridgeBreakers)
|
||||
end
|
||||
|
||||
PrepareTrucks()
|
||||
BeginIntro()
|
||||
PrepareIdleGuards()
|
||||
end
|
||||
|
||||
Tick = function()
|
||||
if USSR.HasNoRequiredUnits() then
|
||||
Greece.MarkCompletedObjective(KillTrucks)
|
||||
end
|
||||
|
||||
if Greece.Resources >= Greece.ResourceCapacity * 0.75 then
|
||||
Greece.Cash = Greece.Cash + Greece.Resources - Greece.ResourceCapacity * 0.25
|
||||
Greece.Resources = Greece.ResourceCapacity * 0.25
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user