diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj
index 0eaf694e59..71024b6d7d 100644
--- a/Content.Client/Content.Client.csproj
+++ b/Content.Client/Content.Client.csproj
@@ -75,6 +75,7 @@
+
@@ -120,6 +121,7 @@
+
diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs
index 2ac904e533..aeae753655 100644
--- a/Content.Client/EntryPoint.cs
+++ b/Content.Client/EntryPoint.cs
@@ -12,14 +12,12 @@ using Content.Client.Interfaces;
using Content.Client.Interfaces.GameObjects;
using Content.Client.Interfaces.Parallax;
using Content.Client.Parallax;
-using Content.Shared.GameObjects.Components.Weapons.Ranged;
using Content.Shared.Interfaces;
using Robust.Client;
using Robust.Client.Interfaces;
using Robust.Client.Interfaces.Graphics.Overlays;
using Robust.Client.Interfaces.Input;
using Robust.Client.Player;
-using Robust.Client.Utility;
using Robust.Shared.ContentPack;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.IoC;
@@ -31,14 +29,14 @@ using Content.Client.GameObjects.Components.Mobs;
using Content.Client.GameObjects.Components.Research;
using Content.Client.GameObjects.Components.Sound;
using Content.Client.Interfaces.Chat;
-using Content.Client.Research;
using Content.Client.UserInterface;
using Content.Shared.GameObjects.Components.Markers;
using Content.Shared.GameObjects.Components.Materials;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.Components.Research;
+using Robust.Client.Interfaces.State;
using Robust.Client.Interfaces.UserInterface;
-using Robust.Shared.Log;
+using Robust.Client.State.States;
namespace Content.Client
{
@@ -46,6 +44,7 @@ namespace Content.Client
{
#pragma warning disable 649
[Dependency] private readonly IPlayerManager _playerManager;
+ [Dependency] private readonly IEscapeMenuOwner _escapeMenuOwner;
#pragma warning restore 649
public override void Init()
@@ -139,6 +138,7 @@ namespace Content.Client
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
+ IoCManager.Register();
IoCManager.BuildGraph();
IoCManager.Resolve().LoadParallax();
@@ -146,11 +146,13 @@ namespace Content.Client
var stylesheet = new NanoStyle();
+ IoCManager.Resolve().Stylesheet = stylesheet.Stylesheet;
IoCManager.Resolve().Stylesheet = stylesheet.Stylesheet;
IoCManager.InjectDependencies(this);
- }
+ _escapeMenuOwner.Initialize();
+ }
///
/// Subscribe events to the player manager after the player manager is set up
///
diff --git a/Content.Client/EscapeMenuOwner.cs b/Content.Client/EscapeMenuOwner.cs
new file mode 100644
index 0000000000..667026cd53
--- /dev/null
+++ b/Content.Client/EscapeMenuOwner.cs
@@ -0,0 +1,88 @@
+using Content.Client.UserInterface;
+using Robust.Client.Console;
+using Robust.Client.Interfaces.Graphics;
+using Robust.Client.Interfaces.Input;
+using Robust.Client.Interfaces.Placement;
+using Robust.Client.Interfaces.ResourceManagement;
+using Robust.Client.Interfaces.State;
+using Robust.Client.State.States;
+using Robust.Client.UserInterface.CustomControls;
+using Robust.Shared.Input;
+using Robust.Shared.Interfaces.Configuration;
+using Robust.Shared.Interfaces.Map;
+using Robust.Shared.IoC;
+using Robust.Shared.Prototypes;
+
+namespace Content.Client
+{
+ internal sealed class EscapeMenuOwner : IEscapeMenuOwner
+ {
+#pragma warning disable 649
+ [Dependency] private readonly IStateManager _stateManager;
+ [Dependency] private readonly IDisplayManager _displayManager;
+ [Dependency] private readonly IClientConsole _clientConsole;
+ [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager;
+ [Dependency] private readonly IPlacementManager _placementManager;
+ [Dependency] private readonly IPrototypeManager _prototypeManager;
+ [Dependency] private readonly IResourceCache _resourceCache;
+ [Dependency] private readonly IConfigurationManager _configurationManager;
+ [Dependency] private readonly IInputManager _inputManager;
+#pragma warning restore 649
+
+ private EscapeMenu _escapeMenu;
+
+ public void Initialize()
+ {
+ _stateManager.OnStateChanged += StateManagerOnOnStateChanged;
+ }
+
+ private void StateManagerOnOnStateChanged(StateChangedEventArgs obj)
+ {
+ if (obj.NewState is GameScreen)
+ {
+ // Switched TO GameScreen.
+ _escapeMenu = new EscapeMenu(_displayManager, _clientConsole, _tileDefinitionManager, _placementManager,
+ _prototypeManager, _resourceCache, _configurationManager)
+ {
+ Visible = false
+ };
+
+ _escapeMenu.AddToScreen();
+
+ var escapeMenuCommand = InputCmdHandler.FromDelegate(session =>
+ {
+ if (_escapeMenu.Visible)
+ {
+ if (_escapeMenu.IsAtFront())
+ {
+ _escapeMenu.Visible = false;
+ }
+ else
+ {
+ _escapeMenu.MoveToFront();
+ }
+ }
+ else
+ {
+ _escapeMenu.OpenCentered();
+ }
+ });
+
+ _inputManager.SetInputCommand(EngineKeyFunctions.EscapeMenu, escapeMenuCommand);
+ }
+ else if (obj.OldState is GameScreen)
+ {
+ // Switched FROM GameScreen.
+ _escapeMenu.Dispose();
+ _escapeMenu = null;
+
+ _inputManager.SetInputCommand(EngineKeyFunctions.EscapeMenu, null);
+ }
+ }
+ }
+
+ public interface IEscapeMenuOwner
+ {
+ void Initialize();
+ }
+}
diff --git a/Content.Client/UserInterface/EscapeMenu.cs b/Content.Client/UserInterface/EscapeMenu.cs
new file mode 100644
index 0000000000..324d9590da
--- /dev/null
+++ b/Content.Client/UserInterface/EscapeMenu.cs
@@ -0,0 +1,121 @@
+using Robust.Client.Console;
+using Robust.Client.Interfaces.Graphics;
+using Robust.Client.Interfaces.Placement;
+using Robust.Client.Interfaces.ResourceManagement;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.CustomControls;
+using Robust.Shared.Interfaces.Configuration;
+using Robust.Shared.Interfaces.Map;
+using Robust.Shared.Prototypes;
+
+namespace Content.Client.UserInterface
+{
+ internal sealed class EscapeMenu : SS14Window
+ {
+ private readonly IClientConsole _console;
+ private readonly ITileDefinitionManager __tileDefinitionManager;
+ private readonly IPlacementManager _placementManager;
+ private readonly IPrototypeManager _prototypeManager;
+ private readonly IResourceCache _resourceCache;
+ private readonly IDisplayManager _displayManager;
+ private readonly IConfigurationManager _configSystem;
+
+ private BaseButton QuitButton;
+ private BaseButton OptionsButton;
+ private BaseButton SpawnEntitiesButton;
+ private BaseButton SpawnTilesButton;
+ private OptionsMenu optionsMenu;
+
+ public EscapeMenu(IDisplayManager displayManager,
+ IClientConsole console,
+ ITileDefinitionManager tileDefinitionManager,
+ IPlacementManager placementManager,
+ IPrototypeManager prototypeManager,
+ IResourceCache resourceCache,
+ IConfigurationManager configSystem) : base(displayManager)
+ {
+ _configSystem = configSystem;
+ _displayManager = displayManager;
+ _console = console;
+ __tileDefinitionManager = tileDefinitionManager;
+ _placementManager = placementManager;
+ _prototypeManager = prototypeManager;
+ _resourceCache = resourceCache;
+
+ PerformLayout();
+ }
+
+ private void PerformLayout()
+ {
+ optionsMenu = new OptionsMenu(_displayManager, _configSystem)
+ {
+ Visible = false
+ };
+ optionsMenu.AddToScreen();
+
+ Resizable = false;
+ HideOnClose = true;
+
+ Title = "Menu";
+
+ var vBox = new VBoxContainer {SeparationOverride = 2};
+ Contents.AddChild(vBox);
+
+ SpawnEntitiesButton = new Button {Text = "Spawn Entities"};
+ SpawnEntitiesButton.OnPressed += OnSpawnEntitiesButtonClicked;
+ vBox.AddChild(SpawnEntitiesButton);
+
+ SpawnTilesButton = new Button {Text = "Spawn Tiles"};
+ SpawnTilesButton.OnPressed += OnSpawnTilesButtonClicked;
+ vBox.AddChild(SpawnTilesButton);
+
+ // Add a spacer.
+ vBox.AddChild(new Control { CustomMinimumSize = (0, 5)});
+
+ OptionsButton = new Button {Text = "Options"};
+ OptionsButton.OnPressed += OnOptionsButtonClicked;
+ vBox.AddChild(OptionsButton);
+
+ QuitButton = new Button {Text = "Quit"};
+ QuitButton.OnPressed += OnQuitButtonClicked;
+ vBox.AddChild(QuitButton);
+
+ Size = CombinedMinimumSize;
+ }
+
+ private void OnQuitButtonClicked(BaseButton.ButtonEventArgs args)
+ {
+ _console.ProcessCommand("disconnect");
+ Dispose();
+ }
+
+ private void OnOptionsButtonClicked(BaseButton.ButtonEventArgs args)
+ {
+ optionsMenu.OpenCentered();
+ }
+
+ private void OnSpawnEntitiesButtonClicked(BaseButton.ButtonEventArgs args)
+ {
+ var window = new EntitySpawnWindow(_displayManager, _placementManager, _prototypeManager, _resourceCache);
+ window.AddToScreen();
+ window.OpenToLeft();
+ }
+
+ private void OnSpawnTilesButtonClicked(BaseButton.ButtonEventArgs args)
+ {
+ var window = new TileSpawnWindow(__tileDefinitionManager, _placementManager, _displayManager, _resourceCache);
+ window.AddToScreen();
+ window.OpenToLeft();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+ if (disposing)
+ {
+ optionsMenu.Dispose();
+ }
+ }
+ }
+}
diff --git a/RobustToolbox b/RobustToolbox
index bb7288d26a..3bad55a705 160000
--- a/RobustToolbox
+++ b/RobustToolbox
@@ -1 +1 @@
-Subproject commit bb7288d26ab45198ea43e134cb3935ae6a7932a6
+Subproject commit 3bad55a705b000e691bdcf50e54948f59fcc51bc