diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index e167aa4d4c..802ee80308 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -20,8 +20,9 @@ namespace OpenRA.Mods.RA { class CrateInfo : ITraitInfo, IOccupySpaceInfo, Requires { - [Desc("Seconds")] - public readonly int Lifetime = 5; + [Desc("Length of time (in seconds) until the crate gets removed automatically. " + + "A value of zero disables auto-removal.")] + public readonly int Lifetime = 0; [Desc("Allowed to land on.")] public readonly string[] TerrainTypes = { }; @@ -57,24 +58,27 @@ namespace OpenRA.Mods.RA if (collected) return; - var shares = self.TraitsImplementing() - .Select(a => Pair.New(a, a.GetSelectionSharesOuter(crusher))); - - var totalShares = shares.Sum(a => a.Second); - var n = self.World.SharedRandom.Next(totalShares); + var crateActions = self.TraitsImplementing(); self.Destroy(); collected = true; - foreach (var s in shares) + if (crateActions.Any()) { - if (n < s.Second) + var shares = crateActions.Select(a => Pair.New(a, a.GetSelectionSharesOuter(crusher))); + + var totalShares = shares.Sum(a => a.Second); + var n = self.World.SharedRandom.Next(totalShares); + + foreach (var s in shares) { - s.First.Activate(crusher); - return; + if (n < s.Second) + { + s.First.Activate(crusher); + return; + } else + n -= s.Second; } - else - n -= s.Second; } } @@ -107,7 +111,7 @@ namespace OpenRA.Mods.RA public void Tick(Actor self) { - if (++ticks >= info.Lifetime * 25) + if (info.Lifetime != 0 && ++ticks >= info.Lifetime * 25) self.Destroy(); } diff --git a/OpenRA.Mods.RA/Scripting/Properties/ProductionProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/ProductionProperties.cs index 6d51c362be..8e13f83772 100644 --- a/OpenRA.Mods.RA/Scripting/Properties/ProductionProperties.cs +++ b/OpenRA.Mods.RA/Scripting/Properties/ProductionProperties.cs @@ -202,7 +202,8 @@ namespace OpenRA.Mods.RA.Scripting "The function will return true if production could be started, false otherwise. " + "If an actionFunc is given, it will be called as actionFunc(Actor[] actors) once " + "production of all actors has been completed. The actors array is guaranteed to " + - "only contain alive actors.")] + "only contain alive actors. Note: This function will fail to work when called " + + "during the first tick")] public bool Build(string[] actorTypes, LuaFunction actionFunc = null) { var typeToQueueMap = new Dictionary(); diff --git a/mods/cnc/maps/gdi01/map.yaml b/mods/cnc/maps/gdi01/map.yaml index b6d18695f1..5dcf266b5c 100644 --- a/mods/cnc/maps/gdi01/map.yaml +++ b/mods/cnc/maps/gdi01/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -483,6 +483,8 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Infantry: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy diff --git a/mods/cnc/maps/gdi02/map.yaml b/mods/cnc/maps/gdi02/map.yaml index bfc132e38d..ddd554fdbd 100644 --- a/mods/cnc/maps/gdi02/map.yaml +++ b/mods/cnc/maps/gdi02/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -765,6 +765,8 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Infantry: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy diff --git a/mods/cnc/maps/gdi04a/gdi04a.lua b/mods/cnc/maps/gdi04a/gdi04a.lua index 8de8688be0..637150af1a 100644 --- a/mods/cnc/maps/gdi04a/gdi04a.lua +++ b/mods/cnc/maps/gdi04a/gdi04a.lua @@ -133,9 +133,14 @@ WorldLoaded = function() end) end) - gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.") - reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.") - nod.AddPrimaryObjective("Defend against the GDI forces.") + + Media.PlayMovieFullscreen("bkground.vqa", function() + Media.PlayMovieFullscreen("nitejump.vqa", function() + gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.") + reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.") + nod.AddPrimaryObjective("Defend against the GDI forces.") + end) + end) BuildNod1() Utils.Do(NodHelis, function(heli) @@ -161,6 +166,4 @@ WorldLoaded = function() end) Camera.Position = Actor56.CenterPosition - - Media.PlayMovieFullscreen("bkground.vqa", function() Media.PlayMovieFullscreen("nitejump.vqa") end) end diff --git a/mods/cnc/maps/gdi04a/map.yaml b/mods/cnc/maps/gdi04a/map.yaml index b428def1a7..205059de81 100644 --- a/mods/cnc/maps/gdi04a/map.yaml +++ b/mods/cnc/maps/gdi04a/map.yaml @@ -25,7 +25,7 @@ Type: Campaign Options: Cheats: False Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -545,7 +545,7 @@ Actors: GDIHeliLZ: waypoint Location: 27,58 Owner: Neutral - crate: CRATE + crate: CRATE.plain Location: 25,58 Owner: Neutral @@ -575,11 +575,12 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Helicopter: - MustBeDestroyed: Tooltip: GenericVisibility: Enemy ShowOwnerRow: false ^Infantry: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy @@ -604,17 +605,6 @@ Rules: GenericVisibility: Enemy, Ally, Neutral GenericStancePrefix: false ShowOwnerRow: false - CRATE: - Crate: - Lifetime: 9999 - HealUnitsCrateAction: - -RevealMapCrateAction: - -GiveMcvCrateAction: - -GiveCashCrateAction: - -ExplodeCrateAction@fire: - -GrantUpgradeCrateAction@cloak: - -DuplicateUnitCrateAction: - ScriptTriggers: Sequences: diff --git a/mods/cnc/maps/gdi04b/gdi04b.lua b/mods/cnc/maps/gdi04b/gdi04b.lua index 86f6d67458..96501f0d5e 100644 --- a/mods/cnc/maps/gdi04b/gdi04b.lua +++ b/mods/cnc/maps/gdi04b/gdi04b.lua @@ -138,9 +138,13 @@ WorldLoaded = function() end) end) - gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.") - reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.") - nod.AddPrimaryObjective("Defend against the GDI forces.") + Media.PlayMovieFullscreen("bkground.vqa", function() + Media.PlayMovieFullscreen("nitejump.vqa", function() + gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.") + reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.") + nod.AddPrimaryObjective("Defend against the GDI forces.") + end) + end) SetupWorld() @@ -193,6 +197,4 @@ WorldLoaded = function() end) Camera.Position = GDIReinforcementsWP1.CenterPosition - - Media.PlayMovieFullscreen("bkground.vqa", function() Media.PlayMovieFullscreen("nitejump.vqa") end) end diff --git a/mods/cnc/maps/gdi04b/map.yaml b/mods/cnc/maps/gdi04b/map.yaml index 3c712d87ca..770e70ee99 100644 --- a/mods/cnc/maps/gdi04b/map.yaml +++ b/mods/cnc/maps/gdi04b/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -594,7 +594,7 @@ Actors: GDIReinforcementsWP1: waypoint Location: 50,45 Owner: Neutral - crate: CRATE + crate: CRATE.plain Location: 14,13 Owner: Neutral HeliEntry: waypoint @@ -630,11 +630,12 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Helicopter: - MustBeDestroyed: Tooltip: GenericVisibility: Enemy ShowOwnerRow: false ^Infantry: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy @@ -662,17 +663,6 @@ Rules: E3: AutoTarget: ScanRadius: 5 - CRATE: - Crate: - Lifetime: 9999 - HealUnitsCrateAction: - -RevealMapCrateAction: - -GiveMcvCrateAction: - -GiveCashCrateAction: - -ExplodeCrateAction@fire: - -GrantUpgradeCrateAction@cloak: - -DuplicateUnitCrateAction: - ScriptTriggers: Sequences: diff --git a/mods/cnc/maps/gdi04c/gdi04c.lua b/mods/cnc/maps/gdi04c/gdi04c.lua index df7692bed7..32f098899a 100644 --- a/mods/cnc/maps/gdi04c/gdi04c.lua +++ b/mods/cnc/maps/gdi04c/gdi04c.lua @@ -93,9 +93,13 @@ WorldLoaded = function() end) end) - nodObjective = nod.AddPrimaryObjective("Destroy all GDI troops") - gdiObjective1 = player.AddPrimaryObjective("Defend the town of Bialystok") - gdiObjective2 = player.AddPrimaryObjective("Eliminate all Nod forces in the area") + Media.PlayMovieFullscreen("bkground.vqa", function() + Media.PlayMovieFullscreen("nodsweep.vqa", function() + nodObjective = nod.AddPrimaryObjective("Destroy all GDI troops") + gdiObjective1 = player.AddPrimaryObjective("Defend the town of Bialystok") + gdiObjective2 = player.AddPrimaryObjective("Eliminate all Nod forces in the area") + end) + end) townAttackTrigger = false Trigger.OnExitedFootprint(TownAttackTrigger, function(a, id) @@ -125,8 +129,6 @@ WorldLoaded = function() end) Camera.Position = Actor141.CenterPosition - - Media.PlayMovieFullscreen("bkground.vqa", function() Media.PlayMovieFullscreen("nodsweep.vqa") end) end Tick = function() diff --git a/mods/cnc/maps/gdi04c/map.yaml b/mods/cnc/maps/gdi04c/map.yaml index a2e1878826..9aee35cbfd 100644 --- a/mods/cnc/maps/gdi04c/map.yaml +++ b/mods/cnc/maps/gdi04c/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -899,6 +899,8 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Infantry: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy diff --git a/mods/cnc/maps/nod01/map.yaml b/mods/cnc/maps/nod01/map.yaml index 996ad5f339..f400ea530b 100644 --- a/mods/cnc/maps/nod01/map.yaml +++ b/mods/cnc/maps/nod01/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False diff --git a/mods/cnc/maps/nod03a/map.yaml b/mods/cnc/maps/nod03a/map.yaml index 7aa1e12145..d6541ae6ec 100644 --- a/mods/cnc/maps/nod03a/map.yaml +++ b/mods/cnc/maps/nod03a/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -555,6 +555,8 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Infantry: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy diff --git a/mods/cnc/maps/nod03a/nod03a.lua b/mods/cnc/maps/nod03a/nod03a.lua index f0fa1f1d93..d1c1bb9909 100644 --- a/mods/cnc/maps/nod03a/nod03a.lua +++ b/mods/cnc/maps/nod03a/nod03a.lua @@ -43,9 +43,11 @@ WorldLoaded = function() end) end) - gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area") - nodObjective1 = player.AddPrimaryObjective("Capture the prison") - nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces") + Media.PlayMovieFullscreen("dessweep.vqa", function() + gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area") + nodObjective1 = player.AddPrimaryObjective("Capture the prison") + nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces") + end) Trigger.OnCapture(TechCenter, function() Trigger.AfterDelay(DateTime.Seconds(2), function() diff --git a/mods/cnc/maps/nod03b/map.yaml b/mods/cnc/maps/nod03b/map.yaml index 14d01b130e..f704be7a0b 100644 --- a/mods/cnc/maps/nod03b/map.yaml +++ b/mods/cnc/maps/nod03b/map.yaml @@ -24,7 +24,7 @@ Type: Campaign Options: Crates: False - Fog: False + Fog: True Shroud: True AllyBuildRadius: False FragileAlliances: False @@ -595,6 +595,8 @@ Rules: GenericVisibility: Enemy ShowOwnerRow: false ^Helicopter: + SpawnViceroid: + Probability: 0 MustBeDestroyed: Tooltip: GenericVisibility: Enemy diff --git a/mods/cnc/maps/nod03b/nod03b.lua b/mods/cnc/maps/nod03b/nod03b.lua index 3a92617799..a8c5609ab9 100644 --- a/mods/cnc/maps/nod03b/nod03b.lua +++ b/mods/cnc/maps/nod03b/nod03b.lua @@ -59,9 +59,11 @@ WorldLoaded = function() end) end) - gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area") - nodObjective1 = player.AddPrimaryObjective("Capture the prison") - nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces") + Media.PlayMovieFullscreen("dessweep.vqa", function() + gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area") + nodObjective1 = player.AddPrimaryObjective("Capture the prison") + nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces") + end) Trigger.OnKilled(TechCenter, function() player.MarkFailedObjective(nodObjective1) end) Trigger.OnCapture(TechCenter, function() @@ -74,7 +76,6 @@ WorldLoaded = function() Trigger.AfterDelay(DateTime.Seconds(40), function() SendAttackWave(FirstAttackWaveUnits, FirstAttackWave) end) Trigger.AfterDelay(DateTime.Seconds(80), function() SendAttackWave(SecondAttackWaveUnits, SecondAttackWave) end) Trigger.AfterDelay(DateTime.Seconds(140), function() SendAttackWave(ThirdAttackWaveUnits, FirstAttackWave) end) - end Tick = function() diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index d08506f1d4..bbc3f3ccee 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -646,4 +646,18 @@ DestroyedSound: xplobig4.aud BodyOrientation: ScriptTriggers: +^Crate: + Tooltip: + Name: Crate + GenericName: Crate + Crate: + TerrainTypes: Clear, Rough, Road, Tiberium, BlueTiberium, Beach + RenderSprites: + Palette: effect + WithCrateBody: + XmasImages: xcratea, xcrateb, xcratec, xcrated + Selectable: + Selectable: false + Bounds: 15,15,-1,-1 + BodyOrientation: diff --git a/mods/cnc/rules/misc.yaml b/mods/cnc/rules/misc.yaml index decde903ac..6982a8be0d 100644 --- a/mods/cnc/rules/misc.yaml +++ b/mods/cnc/rules/misc.yaml @@ -1,9 +1,11 @@ +CRATE.plain: + Inherits: ^Crate + ScriptTriggers: + CRATE: - Tooltip: - Name: Crate + Inherits: ^Crate Crate: Lifetime: 240 - TerrainTypes: Clear, Rough, Road, Tiberium, BlueTiberium, Beach GiveCashCrateAction: Amount: 1000 SelectionShares: 20 @@ -27,14 +29,6 @@ CRATE: SelectionShares: 0 NoBaseSelectionShares: 120 Units: mcv - RenderSprites: - Palette: effect - WithCrateBody: - XmasImages: xcratea, xcrateb, xcratec, xcrated - Selectable: - Selectable: false - Bounds: 15,15,-1,-1 - BodyOrientation: mpspawn: Immobile: diff --git a/mods/ra/maps/allies-01/allies01.lua b/mods/ra/maps/allies-01/allies01.lua index 9a1317f814..230d436c4b 100644 --- a/mods/ra/maps/allies-01/allies01.lua +++ b/mods/ra/maps/allies-01/allies01.lua @@ -175,11 +175,15 @@ WorldLoaded = function() Trigger.OnPlayerLost(player, MissionFailed) Trigger.OnPlayerWon(player, MissionAccomplished) - FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.") - SurviveObjective = player.AddPrimaryObjective("Tanya and Einstein must survive.") - england.AddPrimaryObjective("Destroy the soviet base after a successful rescue.") - CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.") - DefendObjective = ussr.AddPrimaryObjective("Kill Tanya and keep Einstein hostage.") + Media.PlayMovieFullscreen("landing.vqa", function() + FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.") + SurviveObjective = player.AddPrimaryObjective("Tanya and Einstein must survive.") + england.AddPrimaryObjective("Destroy the soviet base after a successful rescue.") + CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.") + DefendObjective = ussr.AddPrimaryObjective("Kill Tanya and keep Einstein hostage.") + + RunInitialActivities() + end) Trigger.OnKilled(Lab, LabDestroyed) Trigger.OnKilled(OilPump, OilPumpDestroyed) @@ -193,13 +197,9 @@ WorldLoaded = function() civilianTeam = { Civilian1, Civilian2 } Trigger.OnAnyKilled(civilianTeam, CiviliansKilled) - RunInitialActivities() - SetUnitStances() Trigger.AfterDelay(DateTime.Seconds(5), function() Actor.Create("camera", true, { Owner = player, Location = BaseCameraPoint.Location }) end) Camera.Position = InsertionLZ.CenterPosition - - Media.PlayMovieFullscreen("landing.vqa") end diff --git a/mods/ra/maps/allies-02/allies02.lua b/mods/ra/maps/allies-02/allies02.lua index 2dbb12ff0d..ab0808283e 100644 --- a/mods/ra/maps/allies-02/allies02.lua +++ b/mods/ra/maps/allies-02/allies02.lua @@ -109,9 +109,11 @@ WorldLoaded = function() Trigger.OnPlayerLost(player, MissionFailed) Trigger.OnPlayerWon(player, MissionAccomplished) - ConquestObjective = player.AddPrimaryObjective("Secure the area.") - ussr.AddPrimaryObjective("Defend your base.") - ukraine.AddPrimaryObjective("Destroy the convoy.") + Media.PlayMovieFullscreen("mcv.vqa", function() + ConquestObjective = player.AddPrimaryObjective("Secure the area.") + ussr.AddPrimaryObjective("Defend your base.") + ukraine.AddPrimaryObjective("Destroy the convoy.") + end) RunInitialActivities() @@ -123,8 +125,6 @@ WorldLoaded = function() Camera.Position = ReinforcementsEntryPoint.CenterPosition - Media.PlayMovieFullscreen("mcv.vqa") - ConvoyTimer(DateTime.Seconds(3), "TenMinutesRemaining") ConvoyTimer(DateTime.Minutes(5), "WarningFiveMinutesRemaining") ConvoyTimer(DateTime.Minutes(6), "WarningFourMinutesRemaining") diff --git a/mods/ra/maps/allies-03a/allies03a.lua b/mods/ra/maps/allies-03a/allies03a.lua index 52a322de74..d914365daa 100644 --- a/mods/ra/maps/allies-03a/allies03a.lua +++ b/mods/ra/maps/allies-03a/allies03a.lua @@ -100,8 +100,6 @@ InitPlayers = function() ussr = Player.GetPlayer("USSR") ussr.Cash = 10000 - - Media.PlayMovieFullscreen("brdgtilt.vqa") end InitObjectives = function() @@ -263,8 +261,10 @@ end WorldLoaded = function() InitPlayers() - InitObjectives() - InitTriggers() - SendAlliedUnits() + Media.PlayMovieFullscreen("brdgtilt.vqa", function() + InitObjectives() + InitTriggers() + SendAlliedUnits() + end) end