diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj
index 220638680..a38c3cead 100644
--- a/Subsurface/Barotrauma.csproj
+++ b/Subsurface/Barotrauma.csproj
@@ -321,6 +321,10 @@
..\packages\RestSharp.105.1.0\lib\net4\RestSharp.dll
+
+ False
+ C:\Program Files (x86)\MonoGame\v3.0\Assemblies\Windows\SharpDX.dll
+
diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs
index e981bde10..42bfe573e 100644
--- a/Subsurface/Source/DebugConsole.cs
+++ b/Subsurface/Source/DebugConsole.cs
@@ -64,6 +64,15 @@ namespace Barotrauma
textBox = new GUITextBox(new Rectangle(0,0,0,20), Color.Black, Color.White, Alignment.BottomLeft, Alignment.Left, GUI.Style, frame);
textBox.Color = Color.Black * 0.7f;
+ //messages already added before initialization -> add them to the listbox
+ List unInitializedMessages = new List(Messages);
+ Messages.Clear();
+
+ foreach (ColoredText msg in unInitializedMessages)
+ {
+ NewMessage(msg.Text, msg.Color);
+ }
+
NewMessage("Press F3 to open/close the debug console", Color.Cyan);
NewMessage("Enter \"help\" for a list of available console commands", Color.Cyan);
@@ -752,6 +761,14 @@ namespace Barotrauma
Messages.Add(new ColoredText(msg, color));
+ if (Messages.Count > MaxMessages)
+ {
+ Messages.RemoveRange(0, Messages.Count - MaxMessages);
+ }
+
+ //listbox not created yet, don't attempt to add
+ if (listBox == null) return;
+
try
{
var textBlock = new GUITextBlock(new Rectangle(0, 0, listBox.Rect.Width, 0), msg, GUI.Style, Alignment.TopLeft, Alignment.Left, null, true, GUI.SmallFont);
@@ -765,14 +782,7 @@ namespace Barotrauma
{
return;
}
-
- if (Messages.Count > MaxMessages)
- {
- Messages.RemoveRange(0, Messages.Count - MaxMessages);
- }
-
- //messages.Add(new ColoredText(msg, color));
-
+
selectedIndex = listBox.children.Count;
}
diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs
index 7326838e2..14f2ff8b9 100644
--- a/Subsurface/Source/GameMain.cs
+++ b/Subsurface/Source/GameMain.cs
@@ -103,7 +103,7 @@ namespace Barotrauma
{
get { return NetworkMember as GameClient; }
}
-
+
public GameMain()
{
Graphics = new GraphicsDeviceManager(this);
@@ -119,21 +119,11 @@ namespace Barotrauma
Config.WasGameUpdated = false;
Config.Save("config.xml");
}
-
- graphicsWidth = Config.GraphicsWidth;
- graphicsHeight = Config.GraphicsHeight;
- Graphics.SynchronizeWithVerticalRetrace = Config.VSyncEnabled;
- Graphics.HardwareModeSwitch = Config.WindowMode != WindowMode.BorderlessWindowed;
+ ApplyGraphicsSettings();
- Graphics.IsFullScreen = Config.WindowMode == WindowMode.Fullscreen || Config.WindowMode == WindowMode.BorderlessWindowed;
- Graphics.PreferredBackBufferWidth = graphicsWidth;
- Graphics.PreferredBackBufferHeight = graphicsHeight;
Content.RootDirectory = "Content";
- //graphics.SynchronizeWithVerticalRetrace = false;
- //graphics.ApplyChanges();
-
FrameCounter = new FrameCounter();
//IsMouseVisible = true;
@@ -150,6 +140,20 @@ namespace Barotrauma
FarseerPhysics.Settings.VelocityIterations = 1;
FarseerPhysics.Settings.PositionIterations = 1;
+ }
+
+ public void ApplyGraphicsSettings()
+ {
+ graphicsWidth = Config.GraphicsWidth;
+ graphicsHeight = Config.GraphicsHeight;
+ Graphics.SynchronizeWithVerticalRetrace = Config.VSyncEnabled;
+
+ Graphics.HardwareModeSwitch = Config.WindowMode != WindowMode.BorderlessWindowed;
+
+ Graphics.IsFullScreen = Config.WindowMode == WindowMode.Fullscreen || Config.WindowMode == WindowMode.BorderlessWindowed;
+ Graphics.PreferredBackBufferWidth = graphicsWidth;
+ Graphics.PreferredBackBufferHeight = graphicsHeight;
+
Graphics.ApplyChanges();
}
diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs
index 38a6bdb2b..5e204c01a 100644
--- a/Subsurface/Source/Program.cs
+++ b/Subsurface/Source/Program.cs
@@ -8,6 +8,7 @@ using System.Text;
#if WINDOWS
using System.Management;
using System.Windows.Forms;
+using Microsoft.Xna.Framework.Graphics;
#endif
#endregion
@@ -20,6 +21,8 @@ namespace Barotrauma
///
public static class Program
{
+ private static int restartAttempts;
+
///
/// The main entry point for the application.
///
@@ -27,22 +30,84 @@ namespace Barotrauma
static void Main()
{
using (var game = new GameMain())
- {
-#if !DEBUG
- try
+ {
+#if DEBUG
+ game.Run();
+#else
+ bool attemptRestart = false;
+
+ do
{
-#endif
- game.Run();
-#if !DEBUG
- }
- catch (Exception e)
- {
- CrashDump(game, "crashreport.txt", e);
- }
+ try
+ {
+ game.Run();
+ attemptRestart = false;
+ }
+ catch (Exception e)
+ {
+ if (restartAttempts < 5 && CheckException(game, e))
+ {
+ attemptRestart = true;
+ restartAttempts++;
+ }
+ else
+ {
+ CrashDump(game, "crashreport.txt", e);
+ }
+
+ }
+ } while (attemptRestart);
#endif
}
}
+ private static bool CheckException(GameMain game, Exception e)
+ {
+ if (e is SharpDX.SharpDXException)
+ {
+ switch ((uint)((SharpDX.SharpDXException)e).ResultCode.Code)
+ {
+ case 0x887A0022: //DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
+ switch (restartAttempts)
+ {
+ case 0:
+ //just wait and try again
+ System.Threading.Thread.Sleep(100);
+ return true;
+ case 1:
+ //force focus to this window
+ var myForm = (System.Windows.Forms.Form)System.Windows.Forms.Form.FromHandle(game.Window.Handle);
+ myForm.Focus();
+ return true;
+ case 2:
+ //try disabling hardware mode switch
+ if (GameMain.Config.WindowMode == WindowMode.Fullscreen)
+ {
+ DebugConsole.NewMessage("Failed to set fullscreen mode, switching configuration to borderless windowed", Microsoft.Xna.Framework.Color.Red);
+ GameMain.Config.WindowMode = WindowMode.BorderlessWindowed;
+ GameMain.Config.Save("config.xml");
+ }
+ return false;
+ default:
+ return false;
+
+ }
+ case 0x80070057: //E_INVALIDARG/Invalid Arguments
+ DebugConsole.NewMessage("Invalid graphics settings, attempting to fix", Microsoft.Xna.Framework.Color.Red);
+
+ GameMain.Config.GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
+ GameMain.Config.GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
+ game.ApplyGraphicsSettings();
+
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ return false;
+ }
+
public static void CrashMessageBox(string message)
{
#if WINDOWS
@@ -63,7 +128,7 @@ namespace Barotrauma
sb.AppendLine("If you'd like to help fix the bug that caused the crash, please send this file to the developers on the Undertow Games forums.");
sb.AppendLine("\n");
sb.AppendLine("Game version " + GameMain.Version);
- sb.AppendLine("Graphics mode: " + GameMain.Config.WindowMode + "x" + GameMain.Config.GraphicsHeight + " (" + GameMain.Config.WindowMode.ToString() + ")");
+ sb.AppendLine("Graphics mode: " + GameMain.Config.GraphicsWidth + "x" + GameMain.Config.GraphicsHeight + " (" + GameMain.Config.WindowMode.ToString() + ")");
sb.AppendLine("Selected content package: " + GameMain.SelectedPackage.Name);
sb.AppendLine("Level seed: " + ((Level.Loaded == null) ? "no level loaded" : Level.Loaded.Seed));
sb.AppendLine("Loaded submarine: " + ((Submarine.MainSub == null) ? "None" : Submarine.MainSub.Name + " (" + Submarine.MainSub.MD5Hash + ")"));