From f351f0346f687b6a2f212530c915b8b94f124591 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Fri, 16 Mar 2018 21:59:27 +0100 Subject: [PATCH] Cache map option ShortGame at game load To reduce MapOptions calls. --- OpenRA.Mods.Common/PlayerExtensions.cs | 5 ++--- .../Scripting/Properties/MissionObjectiveProperties.cs | 4 +++- .../Traits/Player/ConquestVictoryConditions.cs | 4 +++- .../Traits/Player/StrategicVictoryConditions.cs | 4 +++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/OpenRA.Mods.Common/PlayerExtensions.cs b/OpenRA.Mods.Common/PlayerExtensions.cs index b33915fa6d..2820ac6a4d 100644 --- a/OpenRA.Mods.Common/PlayerExtensions.cs +++ b/OpenRA.Mods.Common/PlayerExtensions.cs @@ -16,10 +16,9 @@ namespace OpenRA.Mods.Common { public static class PlayerExtensions { - public static bool HasNoRequiredUnits(this Player player) + public static bool HasNoRequiredUnits(this Player player, bool shortGame) { - var mapOptions = player.World.WorldActor.Trait(); - if (mapOptions.ShortGame) + if (shortGame) return !player.World.ActorsHavingTrait(t => t.Info.RequiredForShortGame).Any(a => a.Owner == player); return !player.World.ActorsHavingTrait().Any(a => a.Owner == player && a.IsInWorld); } diff --git a/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs index af6aba4908..ce1fc66425 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs @@ -20,11 +20,13 @@ namespace OpenRA.Mods.Common.Scripting public class MissionObjectiveProperties : ScriptPlayerProperties, Requires { readonly MissionObjectives mo; + readonly bool shortGame; public MissionObjectiveProperties(ScriptContext context, Player player) : base(context, player) { mo = player.PlayerActor.Trait(); + shortGame = player.World.WorldActor.Trait().ShortGame; } [ScriptActorPropertyActivity] @@ -112,7 +114,7 @@ namespace OpenRA.Mods.Common.Scripting "the MustBeDestroyed trait (according to the short game option).")] public bool HasNoRequiredUnits() { - return Player.HasNoRequiredUnits(); + return Player.HasNoRequiredUnits(shortGame); } } } diff --git a/OpenRA.Mods.Common/Traits/Player/ConquestVictoryConditions.cs b/OpenRA.Mods.Common/Traits/Player/ConquestVictoryConditions.cs index 54baf8e4f1..6a40a74261 100644 --- a/OpenRA.Mods.Common/Traits/Player/ConquestVictoryConditions.cs +++ b/OpenRA.Mods.Common/Traits/Player/ConquestVictoryConditions.cs @@ -33,6 +33,7 @@ namespace OpenRA.Mods.Common.Traits { readonly ConquestVictoryConditionsInfo info; readonly MissionObjectives mo; + readonly bool shortGame; Player[] otherPlayers; int objectiveID = -1; @@ -40,6 +41,7 @@ namespace OpenRA.Mods.Common.Traits { info = cvcInfo; mo = self.Trait(); + shortGame = self.Owner.World.WorldActor.Trait().ShortGame; } void ITick.Tick(Actor self) @@ -49,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits if (objectiveID < 0) objectiveID = mo.Add(self.Owner, info.Objective, ObjectiveType.Primary, true); - if (!self.Owner.NonCombatant && self.Owner.HasNoRequiredUnits()) + if (!self.Owner.NonCombatant && self.Owner.HasNoRequiredUnits(shortGame)) mo.MarkFailed(self.Owner, objectiveID); // Players, NonCombatants, and IsAlliedWith are all fixed once the game starts, so we can cache the result. diff --git a/OpenRA.Mods.Common/Traits/Player/StrategicVictoryConditions.cs b/OpenRA.Mods.Common/Traits/Player/StrategicVictoryConditions.cs index 855dd8e091..bee659e249 100644 --- a/OpenRA.Mods.Common/Traits/Player/StrategicVictoryConditions.cs +++ b/OpenRA.Mods.Common/Traits/Player/StrategicVictoryConditions.cs @@ -51,6 +51,7 @@ namespace OpenRA.Mods.Common.Traits [Sync] public int TicksLeft; readonly Player player; readonly MissionObjectives mo; + readonly bool shortGame; int objectiveID = -1; public StrategicVictoryConditions(Actor self, StrategicVictoryConditionsInfo svcInfo) @@ -59,6 +60,7 @@ namespace OpenRA.Mods.Common.Traits TicksLeft = info.HoldDuration; player = self.Owner; mo = self.Trait(); + shortGame = player.World.WorldActor.Trait().ShortGame; } public IEnumerable AllPoints @@ -78,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits if (objectiveID < 0) objectiveID = mo.Add(player, info.Objective, ObjectiveType.Primary, true); - if (!self.Owner.NonCombatant && self.Owner.HasNoRequiredUnits()) + if (!self.Owner.NonCombatant && self.Owner.HasNoRequiredUnits(shortGame)) mo.MarkFailed(self.Owner, objectiveID); var others = self.World.Players.Where(p => !p.NonCombatant