diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index f5bcf5fa36..47d2dad544 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -253,6 +253,8 @@ namespace OpenRA public int IntroductionPromptVersion = 0; public MPGameFilters MPGameFilters = MPGameFilters.Waiting | MPGameFilters.Empty | MPGameFilters.Protected | MPGameFilters.Started; + + public bool PauseShellmap = false; } public class Settings diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 568c77a92c..e16e25b861 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -32,6 +32,7 @@ namespace OpenRA readonly List effects = new List(); readonly List unpartitionedEffects = new List(); readonly List syncedEffects = new List(); + readonly GameSettings gameSettings; readonly Queue> frameEndActions = new Queue>(); @@ -226,6 +227,7 @@ namespace OpenRA }; RulesContainTemporaryBlocker = map.Rules.Actors.Any(a => a.Value.HasTraitInfo()); + gameSettings = Game.Settings.Game; } public void AddToMaps(Actor self, IOccupySpace ios) @@ -424,7 +426,9 @@ namespace OpenRA wasLoadingGameSave = false; } - if (!Paused) + // Allow users to pause the shellmap via the settings menu + // Some traits initialize important state during the first tick, so we must allow it to tick at least once + if (!Paused && (Type != WorldType.Shellmap || !gameSettings.PauseShellmap || WorldTick == 0)) { WorldTick++; diff --git a/OpenRA.Mods.Common/Scripting/Global/MapGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/MapGlobal.cs index b3e0643a61..c85d4f1b6c 100644 --- a/OpenRA.Mods.Common/Scripting/Global/MapGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/MapGlobal.cs @@ -21,12 +21,14 @@ namespace OpenRA.Mods.Common.Scripting { readonly SpawnMapActors sma; readonly World world; + readonly GameSettings gameSettings; public MapGlobal(ScriptContext context) : base(context) { sma = context.World.WorldActor.Trait(); world = context.World; + gameSettings = Game.Settings.Game; // Register map actors as globals (yuck!) foreach (var kv in sma.Actors) @@ -109,6 +111,9 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Returns true if there is only one human player.")] public bool IsSinglePlayer { get { return Context.World.LobbyInfo.NonBotPlayers.Count() == 1; } } + [Desc("Returns true if this is a shellmap and the player has paused animations.")] + public bool IsPausedShellmap { get { return Context.World.Type == WorldType.Shellmap && gameSettings.PauseShellmap; } } + [Desc("Returns the value of a `ScriptLobbyDropdown` selected in the game lobby.")] public LuaValue LobbyOption(string id) { diff --git a/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs index 1b63b0b75f..2ff1a93e9d 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs @@ -246,6 +246,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate"); BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate"); BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors"); + if (panel.GetOrNull("PAUSE_SHELLMAP_CHECKBOX") != null) + BindCheckboxPref(panel, "PAUSE_SHELLMAP_CHECKBOX", gs, "PauseShellmap"); var windowModeDropdown = panel.Get("MODE_DROPDOWN"); windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown, ds); diff --git a/mods/common/chrome/settings.yaml b/mods/common/chrome/settings.yaml index 62da738f24..23ee7c823d 100644 --- a/mods/common/chrome/settings.yaml +++ b/mods/common/chrome/settings.yaml @@ -188,12 +188,19 @@ Background@SETTINGS_PANEL: Font: Regular Text: Increase Cursor Size Checkbox@PLAYER_STANCE_COLORS_CHECKBOX: - X: 310 + X: 195 Y: 133 Width: 200 Height: 20 Font: Regular Text: Player Stance Colors + Checkbox@PAUSE_SHELLMAP_CHECKBOX: + X: 375 + Y: 133 + Width: 200 + Height: 20 + Font: Regular + Text: Pause Menu Background Label@VIDEO_TITLE: Y: 190 Width: PARENT_RIGHT diff --git a/mods/d2k/maps/shellmap/d2k-shellmap.lua b/mods/d2k/maps/shellmap/d2k-shellmap.lua index bb6fc2d0b7..1254fa1769 100644 --- a/mods/d2k/maps/shellmap/d2k-shellmap.lua +++ b/mods/d2k/maps/shellmap/d2k-shellmap.lua @@ -147,8 +147,10 @@ speed = 5 Tick = function() ticks = ticks + 1 - local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed; - Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 28800 * math.cos(t), 0) + if ticks > 1 or not Map.IsPausedShellmap then + local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed; + Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 28800 * math.cos(t), 0) + end end WorldLoaded = function()