Add polish to Intervention

This commit is contained in:
JovialFeline
2024-04-11 18:17:49 -04:00
committed by Gustas
parent 64f35feb13
commit b48a74f065
3 changed files with 200 additions and 60 deletions

View File

@@ -18,7 +18,13 @@ BeachheadTrigger =
CPos.New(137, 104), CPos.New(137, 105), CPos.New(137, 106), CPos.New(136, 106), CPos.New(136, 107)
}
if Difficulty == "normal" then
if Difficulty == "easy" then
BaseRaidInterval = DateTime.Minutes(4)
BaseFrontAttackInterval = DateTime.Minutes(4) + DateTime.Seconds(30)
BaseRearAttackInterval = DateTime.Minutes(8)
UBoatPatrolDelay = DateTime.Minutes(3)
BaseFrontAttackWpts = { PatrolWpt1.Location, BaseRaidWpt1.Location }
elseif Difficulty == "normal" then
BaseRaidInterval = DateTime.Minutes(3)
BaseFrontAttackInterval = DateTime.Minutes(3) + DateTime.Seconds(30)
BaseRearAttackInterval = DateTime.Minutes(8)
@@ -63,9 +69,9 @@ GroundPatrolUnits =
ParadropSovietUnits = function()
local powerproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = Soviets })
local aircraft = powerproxy.TargetParatroopers(MCVDeployLocation.CenterPosition, Angle.New(812))
local aircraft = powerproxy.TargetParatroopers(MCVRally.CenterPosition, Angle.New(812))
Utils.Do(aircraft, function(a)
Trigger.OnPassengerExited(a, function(t, p)
Trigger.OnPassengerExited(a, function(_, p)
IdleHunt(p)
end)
end)
@@ -90,8 +96,8 @@ AirRaid = function(planeTypes, ingress, target)
end
BaseRaid = function()
local targets = Map.ActorsInBox(AlliedAreaTopLeft.CenterPosition, AlliedAreaBottomRight.CenterPosition, function(actor)
return actor.Owner == Allies and actor.HasProperty("StartBuildingRepairs")
local targets = Utils.Where(Allies.GetActors(), function(actor)
return actor.HasProperty("StartBuildingRepairs") and IsInAlliedBaseArea(actor.CenterPosition.X, actor.CenterPosition.Y)
end)
if #targets == 0 then
@@ -137,8 +143,8 @@ SendUboatPatrol = function(team)
end
SendGroundPatrol = function(team)
Utils.Do(team, function(unit) unit.Patrol(GroundPatrolWpts, true, DateTime.Seconds(3)) end)
Utils.Do(team, function(unit)
unit.Patrol(GroundPatrolWpts, true, DateTime.Seconds(3))
Trigger.OnIdle(unit, function(actor) actor.Hunt() end)
end)
Trigger.OnAllKilled(team, function()
@@ -147,16 +153,16 @@ SendGroundPatrol = function(team)
end
BaseFrontAttack = function(team)
Utils.Do(team, function(unit) unit.Patrol(BaseFrontAttackWpts, false) end)
Utils.Do(team, function(unit)
unit.Patrol(BaseFrontAttackWpts, false)
Trigger.OnIdle(unit, function(actor) actor.Hunt() end)
end)
Trigger.AfterDelay(BaseFrontAttackInterval, function() Build(BaseFrontAttackUnits, BaseFrontAttack) end)
end
BaseRearAttack = function(team)
Utils.Do(team, function(unit) unit.Patrol(BaseRearAttackWpts, false) end)
Utils.Do(team, function(unit)
unit.Patrol(BaseRearAttackWpts, false)
Trigger.OnIdle(unit, function(actor) actor.Hunt() end)
end)
Trigger.AfterDelay(BaseRearAttackInterval, function() Build(BaseRearAttackUnits, BaseRearAttack) end)
@@ -171,9 +177,8 @@ Build = function(units, action)
end
SetupWorld = function()
Utils.Do(SovietHarvesters, function(a) a.FindResources() end)
Utils.Do(SovietHarvesters, function(harvester)
harvester.FindResources()
Trigger.OnDamaged(harvester, function(h)
Utils.Do(HarvesterGuard, function(g)
if not g.IsDead then
@@ -258,63 +263,184 @@ WorldLoaded = function()
if not BeachheadTriggered and a.Owner == Allies and a.Type == "mcv" then
BeachheadTriggered = true
Trigger.RemoveFootprintTrigger(id)
Allies.MarkCompletedObjective(BeachheadObjective)
CaptureObjective = AddPrimaryObjective(Allies, "capture-air-force-hq")
if AirForceHQ.IsDead then
Allies.MarkFailedObjective(CaptureObjective)
return
end
if AirForceHQ.Owner == Allies then
Allies.MarkCompletedObjective(CaptureObjective)
Allies.MarkCompletedObjective(VillageObjective)
return
end
Trigger.OnCapture(AirForceHQ, function()
Trigger.AfterDelay(DateTime.Seconds(3), function()
Allies.MarkCompletedObjective(CaptureObjective)
Allies.MarkCompletedObjective(VillageObjective)
end)
end)
Trigger.OnKilled(AirForceHQ, function() Allies.MarkFailedObjective(CaptureObjective) end)
Actor.Create("mainland", true, { Owner = Allies })
Trigger.AfterDelay(BaseFrontAttackInterval, function()
Build(BaseFrontAttackUnits, BaseFrontAttack)
ParadropSovietUnits()
end)
Trigger.AfterDelay(BaseRearAttackInterval, function()
Build(BaseRearAttackUnits, BaseRearAttack)
end)
Trigger.AfterDelay(BaseRaidInterval, BaseRaid)
Trigger.AfterDelay(UBoatPatrolDelay, function()
Build(HunterSubs, function(subs)
Utils.Do(subs, function(sub)
Trigger.OnIdle(sub, function(s) s.Hunt() end)
end)
end)
end)
OnBeachheadReached()
end
end)
Trigger.OnAllKilled(Village, function() Allies.MarkFailedObjective(VillageObjective) end)
Trigger.OnAllKilled(Village, function()
-- There is a small time gap between the HQ capture and victory.
-- Ensure aircraft can't trigger defeat within that gap.
if not AirForceHQ.IsDead and AirForceHQ.Owner == Allies then
return
end
Allies.MarkFailedObjective(VillageObjective)
end)
SetupWorld()
SetupMissionText()
ReinforceBuilder()
Trigger.AfterDelay(VillageRaidInterval, VillageRaid)
Trigger.AfterDelay(1, function() Build(UBoatPatrolUnits, SendUboatPatrol) end)
Trigger.AfterDelay(1, function() Build(Utils.Random(GroundPatrolUnits), SendGroundPatrol) end)
Reinforcements.Reinforce(Allies, { "mcv" }, { MCVInsertLocation.Location, MCVDeployLocation.Location }, 0, function(mcv)
mcv.Deploy()
end)
Camera.Position = CameraSpot.CenterPosition
Trigger.AfterDelay(DateTime.Seconds(5), function() CameraSpot.Destroy() end)
end
ReinforceBuilder = function()
Reinforcements.Reinforce(Allies, { "mcv" }, { MCVEntry.Location, MCVRally.Location }, 0, function(mcv)
mcv.Deploy()
end)
Trigger.AfterDelay(1, function()
CheckBuilder(Allies)
if Difficulty ~= "easy" then
return
end
CheckNavalYard(Allies)
local cam = Actor.Create("camera.hq", true, { Owner = Allies, Location = AirForceHQ.Location + CVec.New(1, 1) })
Trigger.AfterDelay(1, cam.Destroy)
end)
end
CheckBuilder = function(player)
if BeachheadTriggered then
return
end
local builders = player.GetActorsByTypes( { "mcv", "fact" } )
Utils.Do(builders, function(builder)
Trigger.OnKilled(builder, OnBuilderLost)
Trigger.OnSold(builder, OnBuilderLost)
-- The MCV deploy/undeploy creates a new actor each time,
-- so add these triggers to the newer actor as needed.
Trigger.OnRemovedFromWorld(builder, function()
local transported = builder.Type == "mcv" and IsBuilderTransported(builder)
if transported then
-- Actors inside transports are temporarily removed from the world.
-- In that case, more triggers are not necessary.
return
end
CheckBuilder(player)
end)
end)
end
OnBuilderLost = function(builder)
if BeachheadTriggered then
return
end
local speechTime = 36
-- Let "Unit lost"/"Naval unit lost" play first.
Trigger.AfterDelay(DateTime.Seconds(2), function()
Media.PlaySpeechNotification(builder.Owner, "ObjectiveNotReached")
end)
Trigger.AfterDelay(DateTime.Seconds(2) + speechTime, function()
builder.Owner.MarkFailedObjective(BeachheadObjective)
end)
end
IsBuilderTransported = function(builder)
local found = false
local boats = builder.Owner.GetActorsByType("lst")
Utils.Do(boats, function(boat)
if found or not boat.HasPassengers then
return
end
Utils.Do(boat.Passengers, function(passenger)
if passenger == builder then
found = true
end
end)
end)
return found
end
CheckNavalYard = function(player)
if player.HasPrerequisites({ "syrd" }) then
OnNavalYardBuilt()
return
end
Trigger.AfterDelay(DateTime.Seconds(1), function()
CheckNavalYard(player)
end)
end
OnNavalYardBuilt = function()
local flare = Actor.Create("flare", true, { Owner = Allies, Location = BeachheadFlare.Location })
Trigger.AfterDelay(DateTime.Seconds(2), function()
Media.PlaySpeechNotification(Allies, "SignalFlareEast")
end)
Trigger.OnObjectiveCompleted(Allies, function(_, objective)
if objective ~= BeachheadObjective then
return
end
Trigger.AfterDelay(DateTime.Minutes(2), function()
if flare.IsInWorld then
flare.Destroy()
end
end)
end)
end
IsInAlliedBaseArea = function(x, y)
local top, bottom = AlliedAreaTopLeft.CenterPosition, AlliedAreaBottomRight.CenterPosition
-- Skip bottom.X since it is on the east edge.
return x > top.X and y > top.Y and y < bottom.Y
end
OnBeachheadReached = function()
Media.PlaySpeechNotification(Allies, "ObjectiveReached")
Allies.MarkCompletedObjective(BeachheadObjective)
CaptureObjective = AddPrimaryObjective(Allies, "capture-air-force-hq")
Actor.Create("mainland", true, { Owner = Allies })
if AirForceHQ.IsDead then
Allies.MarkFailedObjective(CaptureObjective)
return
end
if AirForceHQ.Owner == Allies then
Allies.MarkCompletedObjective(CaptureObjective)
Allies.MarkCompletedObjective(VillageObjective)
return
end
Trigger.OnCapture(AirForceHQ, function()
Trigger.AfterDelay(DateTime.Seconds(3), function()
Allies.MarkCompletedObjective(CaptureObjective)
Allies.MarkCompletedObjective(VillageObjective)
end)
end)
Trigger.OnKilled(AirForceHQ, function() Allies.MarkFailedObjective(CaptureObjective) end)
Trigger.AfterDelay(BaseFrontAttackInterval, function()
Build(BaseFrontAttackUnits, BaseFrontAttack)
ParadropSovietUnits()
end)
Trigger.AfterDelay(BaseRearAttackInterval, function()
Build(BaseRearAttackUnits, BaseRearAttack)
end)
Trigger.AfterDelay(BaseRaidInterval, BaseRaid)
Trigger.AfterDelay(UBoatPatrolDelay, function()
Build(HunterSubs, function(subs)
Utils.Do(subs, IdleHunt)
end)
end)
end

View File

@@ -2130,10 +2130,10 @@ Actors:
GroundAttackWpt1: waypoint
Location: 29,64
Owner: Soviets
MCVInsertLocation: waypoint
MCVEntry: waypoint
Location: 71,143
Owner: Allies
MCVDeployLocation: waypoint
MCVRally: waypoint
Location: 73,133
Owner: Allies
AlliedAreaTopLeft: waypoint
@@ -2199,6 +2199,9 @@ Actors:
BaseRearAttackWpt3: waypoint
Location: 129,57
Owner: Soviets
BeachheadFlare: waypoint
Owner: Neutral
Location: 130,89
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml

View File

@@ -1,6 +1,6 @@
Player:
PlayerResources:
DefaultCash: 2000
DefaultCash: 2400
World:
LuaScript:
@@ -12,6 +12,7 @@ World:
Label: dropdown-difficulty.label
Description: dropdown-difficulty.description
Values:
easy: options-difficulty.easy
normal: options-difficulty.normal
hard: options-difficulty.hard
Default: normal
@@ -20,6 +21,15 @@ CAMERA:
RevealsShroud:
Range: 18c0
CAMERA.hq:
Inherits: CAMERA
RevealsShroud:
Range: 8c0
FLARE:
RevealsShroud:
Range: 5c0
MISS:
Tooltip:
Name: actor-air-force-hq-name
@@ -73,6 +83,7 @@ MIG.SCRIPTED:
Ammo: 2
Aircraft:
IdleBehavior: LeaveMapAtClosestEdge
NumberOfTicksToVerifyAvailableAirport: 25
HELI:
Buildable: