From a285b00eb9722391f317a784d208ecc948ac91cf Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 2 Oct 2015 21:33:33 +0300 Subject: [PATCH] autoupdater fixes, cursor fix, consistent directory separators + use of Path.Combine(), wire bugfixes, more loading screens --- Launcher/Form1.Designer.cs | 2 +- Launcher/Form1.cs | 26 +- Launcher/Form1.resx | 2 +- Launcher2/LauncherMain.cs | 58 +- .../BackgroundSpritePrefabs.xml | 4 +- Subsurface/Content/SavedMaps/Aegir.gz | Bin 7480 -> 0 bytes Subsurface/Content/SavedMaps/ag2.gz | Bin 7206 -> 0 bytes Subsurface/Content/SavedMaps/ag3.gz | Bin 7418 -> 0 bytes Subsurface/Content/SavedMaps/c.gz | Bin 7414 -> 0 bytes Subsurface/Content/SavedMaps/d.gz | Bin 8119 -> 0 bytes Subsurface/Content/SavedMaps/empty.gz | Bin 209 -> 0 bytes Subsurface/Content/SavedMaps/small.gz | Bin 186 -> 0 bytes Subsurface/Content/SavedMaps/test.gz | Bin 7462 -> 0 bytes Subsurface/Content/SavedMaps/test2.xml | 1036 ----------------- Subsurface/Content/UI/cursor.png | Bin 0 -> 849 bytes .../Data/ContentPackages/Vanilla 0.1.3.xml | 36 + Subsurface/Data/SavedSubs/Aegir Mark II.gz | Bin 0 -> 11341 bytes Subsurface/Data/SavedSubs/TutorialSub.gz | Bin 0 -> 9006 bytes Subsurface/Data/SavedSubs/Vellamo.gz | Bin 0 -> 6255 bytes Subsurface/Source/Characters/Character.cs | 5 - .../Source/Characters/FishAnimController.cs | 5 - Subsurface/Source/ContentPackage.cs | 2 +- Subsurface/Source/CoroutineManager.cs | 8 + Subsurface/Source/DebugConsole.cs | 4 +- Subsurface/Source/GUI/GUI.cs | 9 +- Subsurface/Source/GUI/GUIMessageBox.cs | 14 +- Subsurface/Source/GUI/TitleScreen.cs | 87 +- Subsurface/Source/{Game1.cs => GameMain.cs} | 62 +- Subsurface/Source/GameSession/GameSession.cs | 2 + Subsurface/Source/GameSettings.cs | 12 + .../Source/Items/Components/ItemComponent.cs | 5 +- .../Source/Items/Components/Power/Powered.cs | 1 - .../Components/Signal/ConnectionPanel.cs | 13 +- .../Source/Items/Components/Signal/Wire.cs | 12 + Subsurface/Source/Map/Explosion.cs | 2 +- Subsurface/Source/Map/Submarine.cs | 28 +- Subsurface/Source/Networking/GameClient.cs | 99 +- Subsurface/Source/Networking/GameServer.cs | 43 +- Subsurface/Source/PlayerInput.cs | 2 +- .../Source/Screens/EditCharacterScreen.cs | 5 +- Subsurface/Source/Screens/EditMapScreen.cs | 3 +- Subsurface/Source/Screens/GameScreen.cs | 44 - Subsurface/Source/Screens/LobbyScreen.cs | 15 +- Subsurface/Source/Screens/MainMenuScreen.cs | 22 +- Subsurface/Source/Screens/NetLobbyScreen.cs | 11 +- Subsurface/Source/Sounds/Sound.cs | 3 + Subsurface/Source/Utils/SaveUtil.cs | 34 +- Subsurface/Source/Utils/UpdaterUtil.cs | 29 +- Subsurface/Subsurface.csproj | 8 +- Subsurface/Subsurface.csproj.user | 2 +- Subsurface_Solution.v12.suo | Bin 746496 -> 759808 bytes 51 files changed, 451 insertions(+), 1304 deletions(-) delete mode 100644 Subsurface/Content/SavedMaps/Aegir.gz delete mode 100644 Subsurface/Content/SavedMaps/ag2.gz delete mode 100644 Subsurface/Content/SavedMaps/ag3.gz delete mode 100644 Subsurface/Content/SavedMaps/c.gz delete mode 100644 Subsurface/Content/SavedMaps/d.gz delete mode 100644 Subsurface/Content/SavedMaps/empty.gz delete mode 100644 Subsurface/Content/SavedMaps/small.gz delete mode 100644 Subsurface/Content/SavedMaps/test.gz delete mode 100644 Subsurface/Content/SavedMaps/test2.xml create mode 100644 Subsurface/Content/UI/cursor.png create mode 100644 Subsurface/Data/ContentPackages/Vanilla 0.1.3.xml create mode 100644 Subsurface/Data/SavedSubs/Aegir Mark II.gz create mode 100644 Subsurface/Data/SavedSubs/TutorialSub.gz create mode 100644 Subsurface/Data/SavedSubs/Vellamo.gz rename Subsurface/Source/{Game1.cs => GameMain.cs} (86%) diff --git a/Launcher/Form1.Designer.cs b/Launcher/Form1.Designer.cs index 39e556ab8..827db9ed0 100644 --- a/Launcher/Form1.Designer.cs +++ b/Launcher/Form1.Designer.cs @@ -227,7 +227,7 @@ this.Controls.Add(this.pictureBox1); this.DoubleBuffered = true; this.Name = "LauncherMain"; - this.Text = "Form1"; + this.Text = "Launcher"; this.Load += new System.EventHandler(this.LauncherMain_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); diff --git a/Launcher/Form1.cs b/Launcher/Form1.cs index 644810e88..ed2448611 100644 --- a/Launcher/Form1.cs +++ b/Launcher/Form1.cs @@ -131,7 +131,30 @@ namespace Launcher { SaveSettings(configPath); - Process.Start(new ProcessStartInfo(Directory.GetCurrentDirectory() + "//"+settings.SelectedContentPackage.GetFilesOfType(ContentType.Executable)[0])); + var executables = settings.SelectedContentPackage.GetFilesOfType(ContentType.Executable); + if (executables.Count == 0) + { + MessageBox.Show("Error", "The game executable isn't configured in the selected content package."); + return; + } + + string exePath = Directory.GetCurrentDirectory() + "//" + executables[0]; + if (!File.Exists(exePath)) + { + MessageBox.Show("Error", "Couldn't find the executable ''" + exePath + "''!"); + return; + } + + try + { + Process.Start(new ProcessStartInfo(exePath)); + } + catch (Exception exception) + { + MessageBox.Show("Error while opening executable ''" + exePath + "''", exception.Message); + return; + } + Application.Exit(); } @@ -294,6 +317,7 @@ namespace Launcher updateLabel.Visible = false; MessageBox.Show("Download completed!"); + settings.WasGameUpdated = true; return; } diff --git a/Launcher/Form1.resx b/Launcher/Form1.resx index 3a4f4e9e2..4c150f4e1 100644 --- a/Launcher/Form1.resx +++ b/Launcher/Form1.resx @@ -3677,7 +3677,7 @@ iVBORw0KGgoAAAANSUhEUgAABYQAAAWKCAYAAABIIWEyAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1 - MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACxAAAAsQAa0jvXUAAP+WSURBVHhe7P3ptuw8c6QJSpka + MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACw8AAAsPAZL5A6UAAP+WSURBVHhe7P3ptuw8c6QJSpka Xs2Zyqys6q5/ff/3qKZ7uHkYjA4QZDBiDwda61mAmw8YyIgg8W2d92+2//uvxWKxWCzu4G//9r+V+uJz /KRrwHO1PuxPreEd41Rrcv7735UxPXoxqJc216X+CMzHkXG4/q5POdVYGRN5CfLUx7qgY6q9q7O1GePa 3z8I+5n/996HjT7T00dgHMzVNZ4rzZnjEZs55PeW8rIea/9N+mFzPd6HJPZhr0d9HavSldm4X0XcZ3fy diff --git a/Launcher2/LauncherMain.cs b/Launcher2/LauncherMain.cs index f9e99b77b..376b92b44 100644 --- a/Launcher2/LauncherMain.cs +++ b/Launcher2/LauncherMain.cs @@ -66,7 +66,7 @@ namespace Launcher2 { graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 640; - graphics.PreferredBackBufferHeight = 360; + graphics.PreferredBackBufferHeight = 400; IsMouseVisible = true; @@ -116,13 +116,13 @@ namespace Launcher2 updateInfoText = new GUITextBlock(new Rectangle(0,y+30,100,20), "", GUI.Style, guiRoot); - updateInfoBox = new GUIListBox(new Rectangle(0, y + 55, 330, 150), GUI.Style, guiRoot); + updateInfoBox = new GUIListBox(new Rectangle(0, y + 55, 330, graphicsHeight-y-55-30-80), GUI.Style, guiRoot); updateInfoBox.Visible = false; - progressBar = new GUIProgressBar(new Rectangle(110,y+220,220,20), Color.Green, 0.0f, guiRoot); + progressBar = new GUIProgressBar(new Rectangle(110,0,220,20), Color.Green, 0.0f, Alignment.BottomLeft, guiRoot); progressBar.Visible = false; - downloadButton = new GUIButton(new Rectangle(0, y+220, 100, 20), "Download", GUI.Style, guiRoot); + downloadButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Download", Alignment.BottomLeft, GUI.Style, guiRoot); downloadButton.OnClicked = DownloadButtonClicked; downloadButton.Visible = false; @@ -196,10 +196,15 @@ namespace Launcher2 Color.White); spriteBatch.Draw(titleTexture, new Vector2(40.0f, 20.0f), null, Color.White, 0.0f, Vector2.Zero, new Vector2(0.2f, 0.2f), SpriteEffects.None, 0.0f); - - + guiRoot.Draw(spriteBatch); + if (GUIMessageBox.MessageBoxes.Count > 0) + { + var messageBox = GUIMessageBox.MessageBoxes.Peek(); + if (messageBox != null) messageBox.Draw(spriteBatch); + } + spriteBatch.End(); } @@ -236,8 +241,31 @@ namespace Launcher2 private bool LaunchClick(GUIButton button, object obj) { if (!TrySaveSettings(configPath)) return false; + + var executables = settings.SelectedContentPackage.GetFilesOfType(ContentType.Executable); + if (executables.Count == 0) + { + ShowError("Error", "The game executable isn't configured in the selected content package."); + return false; + } - Process.Start(new ProcessStartInfo(Directory.GetCurrentDirectory() + "//" + settings.SelectedContentPackage.GetFilesOfType(ContentType.Executable)[0])); + string exePath = Directory.GetCurrentDirectory() + "//" + executables[0]; + if (!File.Exists(exePath)) + { + ShowError("Error", "Couldn't find the executable ''" + exePath + "''!"); + return false; + } + + try + { + Process.Start(new ProcessStartInfo(exePath)); + } + catch (Exception exception) + { + ShowError("Error while opening executable ''" + exePath + "''", exception.Message); + return false; + } + Exit(); return true; @@ -428,12 +456,15 @@ namespace Launcher2 catch (Exception e) { updateInfoText.Text = "Update failed"; - SetUpdateInfoBox("Error while installing the update: "+e.Message); + ShowError("Error while installing the update", e.Message); + launchButton.Enabled = true; return; - } + } - //UpdaterUtil.CleanUnnecessaryFiles(latestVersionFiles); + settings.WasGameUpdated = true; + + UpdaterUtil.CleanUnnecessaryFiles(latestVersionFiles); updateInfoText.Text = "The game was updated succesfully!"; launchButton.Enabled = true; @@ -468,6 +499,13 @@ namespace Launcher2 webClient.DownloadFileAsync(new Uri(latestVersionFolder + filesToDownload[filesDownloaded]), @dir + "\\" + filesToDownload[filesDownloaded]); } + private void ShowError(string header, string message) + { + GUIFrame dummyFrame = new GUIFrame(new Rectangle(0,0,graphicsWidth,graphicsHeight)); + + new GUIMessageBox(header, message, new string[] { "OK" }, 400, 250, Alignment.TopLeft, dummyFrame); + } + private void Completed(object sender, AsyncCompletedEventArgs e) { if (e.Error!=null) diff --git a/Subsurface/Content/BackgroundSprites/BackgroundSpritePrefabs.xml b/Subsurface/Content/BackgroundSprites/BackgroundSpritePrefabs.xml index ab56223ad..bd90adf5f 100644 --- a/Subsurface/Content/BackgroundSprites/BackgroundSpritePrefabs.xml +++ b/Subsurface/Content/BackgroundSprites/BackgroundSpritePrefabs.xml @@ -1,10 +1,10 @@  - + - + \ No newline at end of file diff --git a/Subsurface/Content/SavedMaps/Aegir.gz b/Subsurface/Content/SavedMaps/Aegir.gz deleted file mode 100644 index a20d5762968446516ebe3458ac10a95580900023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7480 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 diff --git a/Subsurface/Content/SavedMaps/ag3.gz b/Subsurface/Content/SavedMaps/ag3.gz deleted file mode 100644 index 81226941fbb9272f9f60ca0b2f8cec3219a5dbb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7418 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 diff --git a/Subsurface/Content/SavedMaps/c.gz b/Subsurface/Content/SavedMaps/c.gz deleted file mode 100644 index 2398312c91d64229bce31fb44e2a13569b0d7053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7414 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 diff --git a/Subsurface/Content/SavedMaps/d.gz b/Subsurface/Content/SavedMaps/d.gz deleted file mode 100644 index c3cbf794aca2dd7b7b010e26f8048e4ff57cd939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8119 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%0AG`_fss%YCc<(HvH4 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 diff --git a/Subsurface/Content/SavedMaps/empty.gz b/Subsurface/Content/SavedMaps/empty.gz deleted file mode 100644 index 9a982a560d39320cd5286e2769ee306769f15533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmV;?051O@iwFP!0000406mXQ3xYrtMfXAf;qlf+<2a5JI6-M*yP!quL5CFlLZ6ub zK2vCWx%Y5xXzPwM)66gTjbqX%vq3#%N5W29YC0lRR#B0 zV}S6{co0$`%o;tZ5T-Jx1*I56C~WyINTV;7!eq$y8khLEVV=~F8I8S##?)3LwcTW@ z3Rm<(>TO0px?;}34Wy$y?s)t^f0_BwmJO|Smv1U3xtjchhR#fl#&oPrvyH;z`uF?= L*N&9R_W%F@QKn}6 diff --git a/Subsurface/Content/SavedMaps/small.gz b/Subsurface/Content/SavedMaps/small.gz deleted file mode 100644 index ae850ffbaa5fd6e383b4f73a664a39416f52a73c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmV;r07d^FiwFP!000040F9494uUWcMfWD&p_w&=b|^&?N+Ly~YfsQXV@W^_l%Th_ z!it@{$^UsTf3mUHT}S#Rv3j%;l2p**$Sa`~o&`Gy7MCn8POPE|6U8Cl?+D2*lZURQ z1P0_SAw=XrJ`#{qAamO|uS%)UtZDDoN#OKXXlDiq{)$%3%?(rSrooVh?u`WZe9e9i oENTQYnA)xO08z^&07M5+?f?J) diff --git a/Subsurface/Content/SavedMaps/test.gz b/Subsurface/Content/SavedMaps/test.gz deleted file mode 100644 index fd4283f53699bac75612d991b52555e379abedcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7462 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 diff --git a/Subsurface/Content/SavedMaps/test2.xml b/Subsurface/Content/SavedMaps/test2.xml deleted file mode 100644 index d986442b9..000000000 --- a/Subsurface/Content/SavedMaps/test2.xml +++ /dev/null @@ -1,1036 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Subsurface/Content/UI/cursor.png b/Subsurface/Content/UI/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcbe4ec5f3284155717efa28bb3e3554c431c0d GIT binary patch literal 849 zcmV-X1FrmuP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;*GWV{RCwBqlR-#YaU93LG#_}_Gb>-@AvYgdhkO}DZ)2hDFxIvjUIq~ZH!2E%*>!#t#(XJO+|{u;+>j60O;uGKrk3Yp-?b;z25NA(UGMl5CGcS+Ytx^ zP$(2k)6>)8N~LnMCJ+EPjzcIELa9{h5d`6_BuTdbKyeY2OeV3gumH7M4N(-ava-^n zR;%9(4i3Kh3tV4cM>d;<-EPOm#s*@s7sMG1dFbu%5Y{XzN5Sz_LoKEM){{Fs^FVktJ3Bis&i$%Fp}_9$E*OSM&Cbp~mn12p)oOnx5{dZQ+8S&&8%!n>mX?+tR4Nto z*Cn0YV6((I{A!1ptrR?Iwf}5(orHUtb@|=kw3bg1o%Eyu7SVkg+i{=TYWws zu~;l5pU;n<N09?3H6h(x?;ky799S%pdTrS@} bo&6pF?=GdmEe?^@00000NkvXXu0mjfUix~o literal 0 HcmV?d00001 diff --git a/Subsurface/Data/ContentPackages/Vanilla 0.1.3.xml b/Subsurface/Data/ContentPackages/Vanilla 0.1.3.xml new file mode 100644 index 000000000..f16534828 --- /dev/null +++ b/Subsurface/Data/ContentPackages/Vanilla 0.1.3.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Subsurface/Data/SavedSubs/Aegir Mark II.gz b/Subsurface/Data/SavedSubs/Aegir Mark II.gz new file mode 100644 index 0000000000000000000000000000000000000000..21d1c980f9d491aabf253787831881e622c898a1 GIT binary patch literal 11341 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 P@xS~RJlr%aOsoL_+Pg-F literal 0 HcmV?d00001 diff --git a/Subsurface/Data/SavedSubs/TutorialSub.gz b/Subsurface/Data/SavedSubs/TutorialSub.gz new file mode 100644 index 0000000000000000000000000000000000000000..96f8aa1b3cf0bedfce2ca67eb83ba49b93f5e074 GIT binary patch literal 9006 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 Z=joI8+fTP~3PAkZ{{v2ocK;6Y004VYI(q;B literal 0 HcmV?d00001 diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 1962bc932..416b51dcd 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -601,11 +601,6 @@ namespace Subsurface /// public void ControlLocalPlayer(float deltaTime, Camera cam, bool moveCam = true) { - if (PlayerInput.KeyHit(Keys.U)) - { - AnimController.SimplePhysicsEnabled = !AnimController.SimplePhysicsEnabled; - } - Limb head = AnimController.GetLimb(LimbType.Head); Lights.LightManager.ViewPos = ConvertUnits.ToDisplayUnits(head.SimPosition); diff --git a/Subsurface/Source/Characters/FishAnimController.cs b/Subsurface/Source/Characters/FishAnimController.cs index 9ef14ac76..dda729e26 100644 --- a/Subsurface/Source/Characters/FishAnimController.cs +++ b/Subsurface/Source/Characters/FishAnimController.cs @@ -49,11 +49,6 @@ namespace Subsurface public override void UpdateAnim(float deltaTime) { - if (PlayerInput.KeyHit(Keys.I)) - { - SimplePhysicsEnabled = !SimplePhysicsEnabled; - } - if (character.IsDead) { UpdateDying(deltaTime); diff --git a/Subsurface/Source/ContentPackage.cs b/Subsurface/Source/ContentPackage.cs index d44fd3576..aaf32d591 100644 --- a/Subsurface/Source/ContentPackage.cs +++ b/Subsurface/Source/ContentPackage.cs @@ -125,7 +125,7 @@ namespace Subsurface //{ // doc.Root.Add(new XElement("item", new XAttribute("file", itemFile))); //} - doc.Save(filePath+"//"+name+".xml"); + doc.Save(System.IO.Path.Combine(filePath, name+".xml")); } private void CalculateHash() diff --git a/Subsurface/Source/CoroutineManager.cs b/Subsurface/Source/CoroutineManager.cs index c5be073fc..d1ffb1f09 100644 --- a/Subsurface/Source/CoroutineManager.cs +++ b/Subsurface/Source/CoroutineManager.cs @@ -24,6 +24,14 @@ namespace Subsurface Coroutines.Add(func.GetEnumerator()); } + public static bool IsCoroutineRunning(string name) + { + IEnumerator coroutine = Coroutines.FirstOrDefault( + c => c.ToString().Contains(name)); + + return coroutine!=null; + } + public static void StopCoroutine(string name) { IEnumerator coroutine = Coroutines.FirstOrDefault(c => c.ToString().Contains(name)); diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index b5aba238a..fcf5de848 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -282,13 +282,13 @@ namespace Subsurface DebugConsole.ThrowError("Illegal symbols in filename (../)"); return; } - Submarine.SaveCurrent("Content/SavedMaps/" + fileName +".gz"); + Submarine.SaveCurrent(fileName +".gz"); NewMessage("map saved", Color.Green); break; case "loadmap": case "loadsub": if (commands.Length < 2) break; - Submarine.Load("Content/SavedMaps/" + string.Join(" ", commands.Skip(1))); + Submarine.Load(string.Join(" ", commands.Skip(1))); break; case "messagebox": if (commands.Length < 3) break; diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 602304e6d..369ac7475 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -23,6 +23,8 @@ namespace Subsurface static Texture2D t; public static SpriteFont Font, SmallFont, LargeFont; + private static Sprite cursor; + private static GraphicsDevice graphicsDevice; private static List messages = new List(); @@ -37,6 +39,8 @@ namespace Subsurface GUI.Font = ToolBox.TryLoadFont("SpriteFont1", content); GUI.SmallFont = ToolBox.TryLoadFont("SmallFont", content); GUI.LargeFont = ToolBox.TryLoadFont("LargeFont", content); + + cursor = new Sprite("Content/UI/cursor.png" ,Vector2.Zero); } public static bool PauseMenuOpen @@ -344,9 +348,10 @@ namespace Subsurface } DebugConsole.Draw(spriteBatch); - - + if (GUIComponent.MouseOn != null && !string.IsNullOrWhiteSpace(GUIComponent.MouseOn.ToolTip)) GUIComponent.MouseOn.DrawToolTip(spriteBatch); + + cursor.Draw(spriteBatch, PlayerInput.MousePosition); } public static void Update(float deltaTime) diff --git a/Subsurface/Source/GUI/GUIMessageBox.cs b/Subsurface/Source/GUI/GUIMessageBox.cs index 6bd36bbe9..c7143dff7 100644 --- a/Subsurface/Source/GUI/GUIMessageBox.cs +++ b/Subsurface/Source/GUI/GUIMessageBox.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace Subsurface { - class GUIMessageBox : GUIFrame + public class GUIMessageBox : GUIFrame { public static Queue MessageBoxes = new Queue(); @@ -38,18 +38,10 @@ namespace Subsurface this.Buttons[0].OnClicked = Close; } - public GUIMessageBox(string header, string text, string[] buttons, int width=DefaultWidth, int height=DefaultHeight, Alignment textAlignment = Alignment.TopLeft) + public GUIMessageBox(string header, string text, string[] buttons, int width=DefaultWidth, int height=DefaultHeight, Alignment textAlignment = Alignment.TopLeft, GUIComponent parent = null) : base(new Rectangle(0,0, width, height), - null, Alignment.Center, GUI.Style, null) + null, Alignment.Center, GUI.Style, parent) { - //Padding = GUI.style.smallPadding; - - //if (buttons == null || buttons.Length == 0) - //{ - // DebugConsole.ThrowError("Creating a message box with no buttons isn't allowed"); - // return; - //} - new GUITextBlock(new Rectangle(0, 0, 0, 30), header, Color.Transparent, Color.White, textAlignment, GUI.Style, this, true); new GUITextBlock(new Rectangle(0, 30, 0, height - 70), text, Color.Transparent, Color.White, textAlignment, GUI.Style, this, true); diff --git a/Subsurface/Source/GUI/TitleScreen.cs b/Subsurface/Source/GUI/TitleScreen.cs index f52d86d37..5908a09aa 100644 --- a/Subsurface/Source/GUI/TitleScreen.cs +++ b/Subsurface/Source/GUI/TitleScreen.cs @@ -9,7 +9,7 @@ using System.Text; namespace Subsurface { - class TitleScreen + class LoadingScreen { private Texture2D backgroundTexture,monsterTexture,titleTexture; @@ -20,6 +20,8 @@ namespace Subsurface public Vector2 CenterPosition; public Vector2 TitlePosition; + + private float? loadState; public Vector2 TitleSize { @@ -32,7 +34,24 @@ namespace Subsurface private set; } - public TitleScreen(GraphicsDevice graphics) + public float? LoadState + { + get { return loadState; } + set + { + loadState = value; + DrawLoadingText = true; + } + } + + public bool DrawLoadingText + { + get; + set; + } + + + public LoadingScreen(GraphicsDevice graphics) { backgroundTexture = TextureLoader.FromFile("Content/UI/titleBackground.png"); monsterTexture = TextureLoader.FromFile("Content/UI/titleMonster.png"); @@ -40,31 +59,27 @@ namespace Subsurface renderTarget = new RenderTarget2D(graphics, GameMain.GraphicsWidth, GameMain.GraphicsHeight); + DrawLoadingText = true; } - public void Draw(SpriteBatch spriteBatch, GraphicsDevice graphics, float loadState, float deltaTime) + + public void Draw(SpriteBatch spriteBatch, GraphicsDevice graphics, float deltaTime) { - //if (stopwatch == null) - //{ - // stopwatch = new Stopwatch(); - // stopwatch.Start(); - //} + drawn = true; graphics.SetRenderTarget(renderTarget); - //Debug.WriteLine(stopwatch.Elapsed.TotalMilliseconds); Scale = GameMain.GraphicsHeight/1500.0f; state += deltaTime; - if (loadState>-1) + if (DrawLoadingText) { CenterPosition = new Vector2(GameMain.GraphicsWidth*0.3f, GameMain.GraphicsHeight/2.0f); TitlePosition = CenterPosition + new Vector2(-0.0f + (float)Math.Sqrt(state) * 220.0f, 0.0f) * Scale; TitlePosition.X = Math.Min(TitlePosition.X, (float)GameMain.GraphicsWidth / 2.0f); } - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied); graphics.Clear(Color.Black); @@ -92,21 +107,51 @@ namespace Subsurface TitlePosition, null, Color.White * Math.Min((state - 3.0f) / 5.0f, 1.0f), 0.0f, new Vector2(titleTexture.Width / 2.0f, titleTexture.Height / 2.0f), Scale, SpriteEffects.None, 0.0f); - string loadText = ""; - if (loadState == 100.0f) + if (DrawLoadingText) { - loadText = "Press any key to continue"; + string loadText = ""; + if (loadState == 100.0f) + { + loadText = "Press any key to continue"; + } + else + { + loadText = "Loading... "; + if (loadState!=null) + { + loadText += (int)loadState + " %"; + } + } + spriteBatch.DrawString(GUI.LargeFont, loadText, + new Vector2(GameMain.GraphicsWidth/2.0f - GUI.LargeFont.MeasureString(loadText).X/2.0f, GameMain.GraphicsHeight*0.8f), + Color.White); } - else if (loadState > 0.0f) - { - loadText = "Loading... " + (int)loadState + " %"; - } - - spriteBatch.DrawString(GUI.Font, loadText, new Vector2(GameMain.GraphicsWidth/2.0f - 50.0f, GameMain.GraphicsHeight*0.8f), Color.White); - spriteBatch.End(); } + + bool drawn; + public IEnumerable DoLoading(IEnumerable loader) + { + drawn = false; + LoadState = null; + + while (!drawn) + { + yield return CoroutineStatus.Running; + } + + CoroutineManager.StartCoroutine(loader); + + yield return CoroutineStatus.Running; + + while (CoroutineManager.IsCoroutineRunning(loader.ToString())) + { + yield return CoroutineStatus.Running; + } + + loadState = 100.0f; + } } } diff --git a/Subsurface/Source/Game1.cs b/Subsurface/Source/GameMain.cs similarity index 86% rename from Subsurface/Source/Game1.cs rename to Subsurface/Source/GameMain.cs index 3a188df65..351812ead 100644 --- a/Subsurface/Source/Game1.cs +++ b/Subsurface/Source/GameMain.cs @@ -57,11 +57,13 @@ namespace Subsurface public static World World; - public static TitleScreen TitleScreen; - private bool titleScreenOpen; + public static LoadingScreen TitleScreen; + private static bool titleScreenOpen; public static GameSettings Config; + private bool hasLoaded; + //public static Random localRandom; //public static Random random; @@ -98,6 +100,12 @@ namespace Subsurface Graphics = new GraphicsDeviceManager(this); Config = new GameSettings("config.xml"); + if (Config.WasGameUpdated) + { + UpdaterUtil.CleanOldFiles(); + Config.WasGameUpdated = false; + Config.Save("config.xml"); + } graphicsWidth = Config.GraphicsWidth; graphicsHeight = Config.GraphicsHeight; @@ -112,9 +120,7 @@ namespace Subsurface FrameCounter = new FrameCounter(); - //renderTimer = new Stopwatch(); - - IsMouseVisible = true; + //IsMouseVisible = true; IsFixedTimeStep = false; //TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 55); @@ -158,12 +164,11 @@ namespace Subsurface TextureLoader.Init(GraphicsDevice); titleScreenOpen = true; - TitleScreen = new TitleScreen(GraphicsDevice); + TitleScreen = new LoadingScreen(GraphicsDevice); CoroutineManager.StartCoroutine(Load()); } - private float loadState = 0.0f; private IEnumerable Load() { GUI.Init(Content); @@ -173,42 +178,42 @@ namespace Subsurface LightManager = new Lights.LightManager(GraphicsDevice); Hull.renderer = new WaterRenderer(GraphicsDevice); - loadState = 1.0f; + TitleScreen.LoadState = 1.0f; yield return CoroutineStatus.Running; GUI.LoadContent(GraphicsDevice); - loadState = 2.0f; + TitleScreen.LoadState = 2.0f; yield return CoroutineStatus.Running; MapEntityPrefab.Init(); - loadState = 10.0f; + TitleScreen.LoadState = 10.0f; yield return CoroutineStatus.Running; JobPrefab.LoadAll(SelectedPackage.GetFilesOfType(ContentType.Jobs)); - loadState = 15.0f; + TitleScreen.LoadState = 15.0f; yield return CoroutineStatus.Running; StructurePrefab.LoadAll(SelectedPackage.GetFilesOfType(ContentType.Structure)); - loadState = 25.0f; + TitleScreen.LoadState = 25.0f; yield return CoroutineStatus.Running; ItemPrefab.LoadAll(SelectedPackage.GetFilesOfType(ContentType.Item)); - loadState = 40.0f; + TitleScreen.LoadState = 40.0f; yield return CoroutineStatus.Running; Debug.WriteLine("sounds"); CoroutineManager.StartCoroutine(AmbientSoundManager.Init()); - loadState = 70.0f; + TitleScreen.LoadState = 70.0f; yield return CoroutineStatus.Running; GameModePreset.Init(); - Submarine.Preload("Content/SavedMaps"); - loadState = 80.0f; + Submarine.Preload(); + TitleScreen.LoadState = 80.0f; yield return CoroutineStatus.Running; GameScreen = new GameScreen(Graphics.GraphicsDevice); - loadState = 90.0f; + TitleScreen.LoadState = 90.0f; yield return CoroutineStatus.Running; MainMenuScreen = new MainMenuScreen(this); @@ -233,8 +238,10 @@ namespace Subsurface MainMenuScreen.Select(); yield return CoroutineStatus.Running; - loadState = 100.0f; + TitleScreen.LoadState = 100.0f; + hasLoaded = true; yield return CoroutineStatus.Success; + } /// @@ -259,7 +266,7 @@ namespace Subsurface double deltaTime = gameTime.ElapsedGameTime.TotalSeconds; PlayerInput.Update(deltaTime); - if (loadState >= 100.0f && !titleScreenOpen) + if (hasLoaded && !titleScreenOpen) { if (PlayerInput.KeyHit(Keys.Escape)) GUI.TogglePauseMenu(); @@ -296,18 +303,18 @@ namespace Subsurface if (titleScreenOpen) { - TitleScreen.Draw(spriteBatch, GraphicsDevice, loadState, (float)deltaTime); - if (loadState>=100.0f && (PlayerInput.GetKeyboardState.GetPressedKeys().Length>0 || PlayerInput.LeftButtonClicked())) + TitleScreen.Draw(spriteBatch, GraphicsDevice, (float)deltaTime); + if (TitleScreen.LoadState>=100.0f && (PlayerInput.GetKeyboardState.GetPressedKeys().Length>0 || PlayerInput.LeftButtonClicked())) { titleScreenOpen = false; } } - else if (loadState >= 100.0f) + else if (hasLoaded) { Screen.Selected.Draw(deltaTime, GraphicsDevice, spriteBatch); } - double elapsed =sw.Elapsed.TotalSeconds; + double elapsed = sw.Elapsed.TotalSeconds; if (elapsed < Physics.step) { System.Threading.Thread.Sleep((int)((Physics.step - elapsed) * 1000.0)); @@ -317,6 +324,15 @@ namespace Subsurface Stopwatch sw; + public static void ShowLoading(IEnumerable loader) + { + titleScreenOpen = true; + CoroutineManager.StartCoroutine(TitleScreen.DoLoading(loader)); + + } + + + protected override void OnExiting(object sender, EventArgs args) { if (NetworkMember != null) NetworkMember.Disconnect(); diff --git a/Subsurface/Source/GameSession/GameSession.cs b/Subsurface/Source/GameSession/GameSession.cs index 08b279630..641f711a7 100644 --- a/Subsurface/Source/GameSession/GameSession.cs +++ b/Subsurface/Source/GameSession/GameSession.cs @@ -190,6 +190,8 @@ namespace Subsurface var now = DateTime.Now; doc.Root.Add(new XAttribute("savetime", now.Hour + ":" + now.Minute + ", " + now.ToShortDateString())); + doc.Root.Add(new XAttribute("submarine", submarine==null ? "" : submarine.Name)); + ((SinglePlayerMode)gameMode).Save(doc.Root); try diff --git a/Subsurface/Source/GameSettings.cs b/Subsurface/Source/GameSettings.cs index 74b84e378..cdf8df2ba 100644 --- a/Subsurface/Source/GameSettings.cs +++ b/Subsurface/Source/GameSettings.cs @@ -43,6 +43,12 @@ namespace Subsurface set; } + public bool WasGameUpdated + { + get; + set; + } + public GameSettings(string filePath) { Load(filePath); @@ -75,6 +81,7 @@ namespace Subsurface MasterServerUrl = ToolBox.GetAttributeString(doc.Root, "masterserverurl", ""); AutoCheckUpdates = ToolBox.GetAttributeBool(doc.Root, "autocheckupdates", true); + WasGameUpdated = ToolBox.GetAttributeBool(doc.Root, "wasgameupdated", false); foreach (XElement subElement in doc.Root.Elements()) { @@ -102,6 +109,11 @@ namespace Subsurface doc.Root.Add( new XAttribute("masterserverurl", MasterServerUrl), new XAttribute("autocheckupdates", AutoCheckUpdates)); + + if (WasGameUpdated) + { + doc.Root.Add(new XAttribute("gamupdated", true)); + } XElement gMode = doc.Root.Element("graphicsmode"); diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index 0dbb5c1f1..b9c2e38d1 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -232,7 +232,10 @@ namespace Subsurface.Items.Components case "sound": string filePath = ToolBox.GetAttributeString(subElement, "file", ""); if (filePath=="") continue; - if (!filePath.Contains("/")) filePath = Path.GetDirectoryName(item.Prefab.ConfigFile)+"/"+filePath; + if (!filePath.Contains("/") && !filePath.Contains("\\") && !filePath.Contains(Path.DirectorySeparatorChar)) + { + filePath = Path.Combine(Path.GetDirectoryName(item.Prefab.ConfigFile), filePath); + } ActionType type; diff --git a/Subsurface/Source/Items/Components/Power/Powered.cs b/Subsurface/Source/Items/Components/Power/Powered.cs index 2ca91e3d8..1e5334b99 100644 --- a/Subsurface/Source/Items/Components/Power/Powered.cs +++ b/Subsurface/Source/Items/Components/Power/Powered.cs @@ -78,7 +78,6 @@ namespace Subsurface.Items.Components if (sparkSounds == null) { sparkSounds = new Sound[4]; - string dir = Path.GetDirectoryName(item.Prefab.ConfigFile) + "\\"; for (int i = 0; i < 4; i++) { sparkSounds[i] = Sound.Load("Content/Items/Electricity/zap" + (i + 1) + ".ogg", false); diff --git a/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs b/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs index 18806c7e3..467341d1a 100644 --- a/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs @@ -82,21 +82,10 @@ namespace Subsurface.Items.Components } float degreeOfSuccess = DegreeOfSuccess(character); - if (Rand.Range(0.0f, 0.5f) < degreeOfSuccess) return false; + if (Rand.Range(0.0f, 50.0f) < degreeOfSuccess) return false; item.ApplyStatusEffects(ActionType.OnFailure, 1.0f, character); - //Vector2 baseVel = Rand.Vector(300.0f); - //for (int i = 0; i < 10; i++) - //{ - // var particle = GameMain.ParticleManager.CreateParticle("spark", item.Position, - // baseVel + Rand.Vector(100.0f), 0.0f); - - // if (particle != null) particle.Size *= Rand.Range(0.5f, 1.0f); - //} - - //character.AddDamage(item.SimPosition, DamageType.None, Math.Abs(degreeOfSuccess-100.0f)/10.0f, 0.0f, 3.0f, false); - return true; } diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 4cc8d5121..d8ddde6ca 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -68,6 +68,15 @@ namespace Subsurface.Items.Components if (connections[i] == newConnection) return; } + for (int i = 0; i < 2; i++) + { + if (connections[i] != null && connections[i].Item == newConnection.Item) + { + addNode = false; + break; + } + } + for (int i = 0; i < 2; i++) { if (connections[i] != null) continue; @@ -76,6 +85,9 @@ namespace Subsurface.Items.Components if (!addNode) break; + if (Nodes.Count>0&&Nodes[0] == newConnection.Item.Position) break; + if (Nodes.Count > 1 && Nodes[Nodes.Count-1] == newConnection.Item.Position) break; + if (i == 0) { Nodes.Insert(0, newConnection.Item.Position); diff --git a/Subsurface/Source/Map/Explosion.cs b/Subsurface/Source/Map/Explosion.cs index 2946127ce..d04cba010 100644 --- a/Subsurface/Source/Map/Explosion.cs +++ b/Subsurface/Source/Map/Explosion.cs @@ -126,7 +126,7 @@ namespace Subsurface distFactor = 1.0f - Vector2.Distance(limb.SimPosition, simPosition)/attack.Range; c.AddDamage(limb.SimPosition, DamageType.None, - attack.GetDamage(1.0f) / c.AnimController.Limbs.Length * distFactor, 0.0f, attack.Stun * distFactor, true); + attack.GetDamage(1.0f) / c.AnimController.Limbs.Length * distFactor, 0.0f, attack.Stun * distFactor, false); if (force>0.0f) { limb.body.ApplyLinearImpulse(Vector2.Normalize(limb.SimPosition - simPosition) * distFactor * force); diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 8d18ce961..e9cb8e845 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -22,6 +22,8 @@ namespace Subsurface class Submarine : Entity { + public const string SavePath = "Data/SavedSubs"; + public static List SavedSubmarines = new List(); public static readonly Vector2 GridSize = new Vector2(16.0f, 16.0f); @@ -33,7 +35,6 @@ namespace Subsurface private static Vector2 lastPickedPosition; private static float lastPickedFraction; - static string SaveFolder; Md5Hash hash; private string filePath; @@ -448,35 +449,34 @@ namespace Subsurface //doc.Save(filePath); } - public static void SaveCurrent(string savePath) + public static void SaveCurrent(string fileName) { if (loaded==null) { - loaded = new Submarine(savePath); + loaded = new Submarine(fileName); // return; } - loaded.SaveAs(savePath); + loaded.SaveAs(SavePath+"/"+fileName); } - public static void Preload(string folder) + public static void Preload() { - SaveFolder = folder; //string[] mapFilePaths; Unload(); SavedSubmarines.Clear(); - if (!Directory.Exists(SaveFolder)) + if (!Directory.Exists(SavePath)) { try { - Directory.CreateDirectory(SaveFolder); + Directory.CreateDirectory(SavePath); } - catch + catch (Exception e) { - DebugConsole.ThrowError("Directory ''"+SaveFolder+"'' not found and creating the directory failed."); + DebugConsole.ThrowError("Directory ''" + SavePath + "'' not found and creating the directory failed.", e); return; } } @@ -485,11 +485,11 @@ namespace Subsurface try { - filePaths = Directory.GetFiles(SaveFolder); + filePaths = Directory.GetFiles(SavePath); } catch (Exception e) { - DebugConsole.ThrowError("Couldn't open directory ''" + SaveFolder + "''!", e); + DebugConsole.ThrowError("Couldn't open directory ''" + SavePath + "''!", e); return; } @@ -618,11 +618,11 @@ namespace Subsurface loaded = this; } - public static Submarine Load(string file) + public static Submarine Load(string fileName) { Unload(); - Submarine sub = new Submarine(file); + Submarine sub = new Submarine(SavePath+"/"+fileName); sub.Load(); //Entity.dictionary.Add(int.MaxValue, sub); diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 7e8224bf2..299c145ee 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -319,47 +319,7 @@ namespace Subsurface.Networking case (byte)PacketTypes.StartGame: if (gameStarted) continue; - if (this.Character != null) Character.Remove(); - - int seed = inc.ReadInt32(); - - - string levelSeed = inc.ReadString(); - - string mapName = inc.ReadString(); - string mapHash = inc.ReadString(); - - GameMain.NetLobbyScreen.TrySelectMap(mapName, mapHash); - - double durationMinutes = inc.ReadDouble(); - - TimeSpan duration = new TimeSpan(0,(int)durationMinutes,0); - Rand.SetSyncedSeed(seed); - //int gameModeIndex = inc.ReadInt32(); - GameMain.GameSession = new GameSession(Submarine.Loaded, "", GameMain.NetLobbyScreen.SelectedMode); - GameMain.GameSession.StartShift(duration, levelSeed); - - //myCharacter = ReadCharacterData(inc); - //Character.Controlled = myCharacter; - - List crew = new List(); - - int count = inc.ReadInt32(); - for (int n = 0; n < count; n++) - { - int id = inc.ReadInt32(); - Character newCharacter = ReadCharacterData(inc, id == myID); - - crew.Add(newCharacter); - } - - gameStarted = true; - - GameMain.GameScreen.Select(); - - AddChatMessage("Press TAB to chat", ChatMessageType.Server); - - CreateCrewFrame(crew); + GameMain.ShowLoading(StartGame(inc)); break; case (byte)PacketTypes.EndGame: @@ -416,6 +376,63 @@ namespace Subsurface.Networking } } + private IEnumerable StartGame(NetIncomingMessage inc) + { + + if (this.Character != null) Character.Remove(); + + int seed = inc.ReadInt32(); + + string levelSeed = inc.ReadString(); + + string mapName = inc.ReadString(); + string mapHash = inc.ReadString(); + + GameMain.NetLobbyScreen.TrySelectMap(mapName, mapHash); + + yield return CoroutineStatus.Running; + + double durationMinutes = inc.ReadDouble(); + + TimeSpan duration = new TimeSpan(0, (int)durationMinutes, 0); + Rand.SetSyncedSeed(seed); + //int gameModeIndex = inc.ReadInt32(); + GameMain.GameSession = new GameSession(Submarine.Loaded, "", GameMain.NetLobbyScreen.SelectedMode); + + yield return CoroutineStatus.Running; + + GameMain.GameSession.StartShift(duration, levelSeed); + + yield return CoroutineStatus.Running; + + //myCharacter = ReadCharacterData(inc); + //Character.Controlled = myCharacter; + + List crew = new List(); + + int count = inc.ReadInt32(); + for (int n = 0; n < count; n++) + { + int id = inc.ReadInt32(); + Character newCharacter = ReadCharacterData(inc, id == myID); + + crew.Add(newCharacter); + + yield return CoroutineStatus.Running; + } + + gameStarted = true; + + GameMain.GameScreen.Select(); + + AddChatMessage("Press TAB to chat", ChatMessageType.Server); + + CreateCrewFrame(crew); + + yield return CoroutineStatus.Success; + } + + public IEnumerable EndGame(string endMessage) { gameStarted = false; diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 81fd3e84b..fa95c2e06 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -578,25 +578,33 @@ namespace Subsurface.Networking } - public bool StartGame(GUIButton button, object obj) + public bool StartGameClicked(GUIButton button, object obj) { - Submarine selectedMap = GameMain.NetLobbyScreen.SelectedMap as Submarine; + Submarine selectedSub = GameMain.NetLobbyScreen.SelectedMap as Submarine; - if (selectedMap == null) + if (selectedSub == null) { GameMain.NetLobbyScreen.SubList.Flash(); return false; } - - AssignJobs(); - + + GameMain.ShowLoading(StartGame(selectedSub)); + + return true; + } + + private IEnumerable StartGame(Submarine selectedSub) + { + AssignJobs(); + //selectedMap.Load(); int seed = DateTime.Now.Millisecond; Rand.SetSyncedSeed(seed); - GameMain.GameSession = new GameSession(selectedMap, "", GameMain.NetLobbyScreen.SelectedMode); + GameMain.GameSession = new GameSession(selectedSub, "", GameMain.NetLobbyScreen.SelectedMode); GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.GameDuration, GameMain.NetLobbyScreen.LevelSeed); - //EventManager.SelectEvent(Game1.netLobbyScreen.SelectedEvent); + + yield return CoroutineStatus.Running; List characterInfos = new List(); @@ -622,7 +630,7 @@ namespace Subsurface.Networking List crew = new List(); WayPoint[] assignedWayPoints = WayPoint.SelectCrewSpawnPoints(characterInfos); - for (int i = 0; i < connectedClients.Count; i++ ) + for (int i = 0; i < connectedClients.Count; i++) { connectedClients[i].character = new Character( connectedClients[i].characterInfo, assignedWayPoints[i], true); @@ -633,14 +641,16 @@ namespace Subsurface.Networking if (characterInfo != null) { - myCharacter = new Character(characterInfo, assignedWayPoints[assignedWayPoints.Length-1]); + myCharacter = new Character(characterInfo, assignedWayPoints[assignedWayPoints.Length - 1]); Character.Controlled = myCharacter; myCharacter.GiveJobItems(assignedWayPoints[assignedWayPoints.Length - 1]); crew.Add(myCharacter); } - + + yield return CoroutineStatus.Running; + NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)PacketTypes.StartGame); @@ -650,10 +660,10 @@ namespace Subsurface.Networking msg.Write(GameMain.NetLobbyScreen.SelectedMap.Name); msg.Write(GameMain.NetLobbyScreen.SelectedMap.MD5Hash.Hash); - + msg.Write(GameMain.NetLobbyScreen.GameDuration.TotalMinutes); - msg.Write((myCharacter == null) ? connectedClients.Count : connectedClients.Count+1); + msg.Write((myCharacter == null) ? connectedClients.Count : connectedClients.Count + 1); foreach (Client client in connectedClients) { msg.Write(client.ID); @@ -666,7 +676,9 @@ namespace Subsurface.Networking WriteCharacterData(msg, myCharacter.Info.Name, Character.Controlled); } - SendMessage(msg, NetDeliveryMethod.ReliableUnordered, null); + SendMessage(msg, NetDeliveryMethod.ReliableUnordered, null); + + yield return CoroutineStatus.Running; gameStarted = true; @@ -676,7 +688,8 @@ namespace Subsurface.Networking CreateCrewFrame(crew); - return true; + yield return CoroutineStatus.Success; + } private bool EndButtonHit(GUIButton button, object obj) diff --git a/Subsurface/Source/PlayerInput.cs b/Subsurface/Source/PlayerInput.cs index bc687faea..89cfad5a3 100644 --- a/Subsurface/Source/PlayerInput.cs +++ b/Subsurface/Source/PlayerInput.cs @@ -80,7 +80,7 @@ namespace Subsurface public static Vector2 MousePosition { - get { return new Vector2(mouseState.X, mouseState.Y); } + get { return new Vector2(mouseState.Position.X, mouseState.Position.Y); } } public static MouseState GetMouseState diff --git a/Subsurface/Source/Screens/EditCharacterScreen.cs b/Subsurface/Source/Screens/EditCharacterScreen.cs index dec16e249..faffba83e 100644 --- a/Subsurface/Source/Screens/EditCharacterScreen.cs +++ b/Subsurface/Source/Screens/EditCharacterScreen.cs @@ -118,10 +118,7 @@ namespace Subsurface } Physics.Alpha = Physics.accumulator / Physics.step; - } - - - + } } /// diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index dedcc3737..3ddf107f6 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -225,8 +225,9 @@ namespace Subsurface } } - dummyCharacter.ControlLocalPlayer((float)deltaTime, cam); + dummyCharacter.ControlLocalPlayer((float)deltaTime, cam, false); dummyCharacter.Control((float)deltaTime, cam); + cam.TargetPos = Vector2.Zero; } else { diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 891779d48..1451423ec 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -58,15 +58,8 @@ namespace Subsurface //http://gafferongames.com/game-physics/fix-your-timestep/ Physics.accumulator += deltaTime; - Stopwatch sw = new Stopwatch(); - sw.Start(); - AmbientSoundManager.Update(); - sw.Stop(); - Debug.WriteLine("************** abupdate: "+sw.ElapsedTicks); - sw.Restart(); - //if (Game1.GameSession != null && Game1.GameSession.Level != null) //{ // Vector2 targetMovement = Vector2.Zero; @@ -81,38 +74,17 @@ namespace Subsurface if (GameMain.GameSession!=null) GameMain.GameSession.Update((float)deltaTime); //EventManager.Update(gameTime); - sw.Stop(); - Debug.WriteLine("gamesession update: " + sw.ElapsedTicks); - sw.Restart(); - Character.UpdateAll(cam, (float)deltaTime); - sw.Stop(); - Debug.WriteLine("characterupdate: " + sw.ElapsedTicks); - sw.Restart(); - BackgroundSpriteManager.Update(cam, (float)deltaTime); - sw.Stop(); - Debug.WriteLine("bgsprite: " + sw.ElapsedTicks); - sw.Restart(); - GameMain.ParticleManager.Update((float)deltaTime); - sw.Stop(); - Debug.WriteLine("particlemanager: " + sw.ElapsedTicks); - sw.Restart(); - StatusEffect.UpdateAll((float)deltaTime); - sw.Stop(); - Debug.WriteLine("statuseff: " + sw.ElapsedTicks); - - Physics.accumulator = Math.Min(Physics.accumulator, Physics.step * 4); while (Physics.accumulator >= Physics.step) { - sw.Restart(); cam.MoveCamera((float)Physics.step); foreach (PhysicsBody pb in PhysicsBody.list) @@ -122,16 +94,8 @@ namespace Subsurface MapEntity.UpdateAll(cam, (float)Physics.step); - sw.Stop(); - Debug.WriteLine(" mapentity: " + sw.ElapsedTicks); - sw.Restart(); - Character.UpdateAnimAll((float)Physics.step); - sw.Stop(); - Debug.WriteLine(" char: " + sw.ElapsedTicks); - sw.Restart(); - Ragdoll.UpdateAll(cam, (float)Physics.step); if (GameMain.GameSession != null && GameMain.GameSession.Level != null) @@ -139,16 +103,8 @@ namespace Subsurface GameMain.GameSession.Submarine.Update((float)Physics.step); } - sw.Stop(); - Debug.WriteLine(" sub: " + sw.ElapsedTicks); - sw.Restart(); - GameMain.World.Step((float)Physics.step); - sw.Stop(); - Debug.WriteLine(" worldstep: " + sw.ElapsedTicks); - sw.Restart(); - Level.AfterWorldStep(); Physics.accumulator -= Physics.step; diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index 286a8fecc..c06a2ecf3 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -4,6 +4,7 @@ using FarseerPhysics.Factories; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; +using System.Collections.Generic; namespace Subsurface { @@ -444,13 +445,21 @@ namespace Subsurface } private bool StartShift(GUIButton button, object selection) - { - GameMain.GameSession.StartShift(TimeSpan.Zero, selectedLevel, false); - GameMain.GameScreen.Select(); + { + GameMain.ShowLoading(ShiftLoading()); return true; } + private IEnumerable ShiftLoading() + { + + GameMain.GameSession.StartShift(TimeSpan.Zero, selectedLevel, false); + GameMain.GameScreen.Select(); + + yield return CoroutineStatus.Success; + } + public bool QuitToMainMenu(GUIButton button, object selection) { GameMain.MainMenuScreen.Select(); diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index 8df5cd707..1d9e4e416 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -4,6 +4,7 @@ using Microsoft.Xna.Framework.Graphics; using Subsurface.Networking; using System.IO; using System.Xml.Linq; +using System.Collections.Generic; namespace Subsurface { @@ -231,6 +232,7 @@ namespace Subsurface return true; } + private bool QuitClicked(GUIButton button, object obj) { game.Exit(); @@ -261,7 +263,6 @@ namespace Subsurface var button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start", Alignment.Right | Alignment.Bottom, GUI.Style, menuTabs[(int)Tabs.LoadGame]); button.OnClicked = LoadGame; - } private bool SelectSaveFile(GUIComponent component, object obj) @@ -278,6 +279,8 @@ namespace Subsurface RemoveSaveFrame(); + string subName = ToolBox.GetAttributeString(doc.Root, "submarine", ""); + string saveTime = ToolBox.GetAttributeString(doc.Root, "savetime", "unknown"); XElement modeElement = null; @@ -291,17 +294,20 @@ namespace Subsurface string mapseed = ToolBox.GetAttributeString(modeElement, "mapseed", "unknown"); - GUIFrame saveFileFrame = new GUIFrame(new Rectangle((int)(saveList.Rect.Width + 20), 0, 200, 200), Color.Black*0.4f, GUI.Style, menuTabs[(int)Tabs.LoadGame]); + GUIFrame saveFileFrame = new GUIFrame(new Rectangle((int)(saveList.Rect.Width + 20), 0, 200, 230), Color.Black*0.4f, GUI.Style, menuTabs[(int)Tabs.LoadGame]); saveFileFrame.UserData = "savefileframe"; saveFileFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f); new GUITextBlock(new Rectangle(0,0,0,20), fileName, GUI.Style, saveFileFrame); - new GUITextBlock(new Rectangle(0, 30, 0, 20), "Last saved: ", GUI.Style, saveFileFrame).Font = GUI.SmallFont; - new GUITextBlock(new Rectangle(15, 45, 0, 20), saveTime, GUI.Style, saveFileFrame).Font = GUI.SmallFont; + new GUITextBlock(new Rectangle(0, 30, 0, 20), subName, GUI.Style, saveFileFrame); - new GUITextBlock(new Rectangle(0, 65, 0, 20), "Map seed: ", GUI.Style, saveFileFrame).Font = GUI.SmallFont; - new GUITextBlock(new Rectangle(15, 80, 0, 20), mapseed, GUI.Style, saveFileFrame).Font = GUI.SmallFont; + + new GUITextBlock(new Rectangle(0, 50, 0, 20), "Last saved: ", GUI.Style, saveFileFrame).Font = GUI.SmallFont; + new GUITextBlock(new Rectangle(15, 65, 0, 20), saveTime, GUI.Style, saveFileFrame).Font = GUI.SmallFont; + + new GUITextBlock(new Rectangle(0, 85, 0, 20), "Map seed: ", GUI.Style, saveFileFrame).Font = GUI.SmallFont; + new GUITextBlock(new Rectangle(15, 100, 0, 20), mapseed, GUI.Style, saveFileFrame).Font = GUI.SmallFont; var deleteSaveButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Delete", Alignment.BottomCenter, GUI.Style, saveFileFrame); deleteSaveButton.UserData = fileName; @@ -353,7 +359,8 @@ namespace Subsurface { graphics.Clear(Color.CornflowerBlue); - GameMain.TitleScreen.Draw(spriteBatch, graphics, -1.0f, (float)deltaTime); + GameMain.TitleScreen.DrawLoadingText = false; + GameMain.TitleScreen.Draw(spriteBatch, graphics, (float)deltaTime); //Game1.GameScreen.DrawMap(graphics, spriteBatch); @@ -406,7 +413,6 @@ namespace Subsurface private bool LoadGame(GUIButton button, object obj) { - string saveFile = saveList.SelectedData as string; if (string.IsNullOrWhiteSpace(saveFile)) return false; diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 8089d8c56..7ca5533ee 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -273,7 +273,7 @@ namespace Subsurface if (IsServer && GameMain.Server != null) { GUIButton startButton = new GUIButton(new Rectangle(0, 0, 200, 30), "Start", Alignment.BottomRight, GUI.Style, infoFrame); - startButton.OnClicked = GameMain.Server.StartGame; + startButton.OnClicked = GameMain.Server.StartGameClicked; startButton.UserData = "startButton"; //mapList.OnSelected = new GUIListBox.OnSelectedHandler(Game1.server.UpdateNetLobby); @@ -523,14 +523,7 @@ namespace Subsurface if ((prevSize == 1.0f && chatBox.BarScroll == 0.0f) || (prevSize < 1.0f && chatBox.BarScroll == 1.0f)) chatBox.BarScroll = 1.0f; } - - - public bool StartGame(object obj) - { - GameMain.Server.StartGame(null, obj); - return true; - } - + public bool EnterChatMessage(GUITextBox textBox, string message) { if (String.IsNullOrEmpty(message)) return false; diff --git a/Subsurface/Source/Sounds/Sound.cs b/Subsurface/Source/Sounds/Sound.cs index 4e831a597..df1190f66 100644 --- a/Subsurface/Source/Sounds/Sound.cs +++ b/Subsurface/Source/Sounds/Sound.cs @@ -229,6 +229,9 @@ namespace Subsurface public void Remove() { + //sound already removed? + if (!loadedSounds.Contains(this)) return; + loadedSounds.Remove(this); System.Diagnostics.Debug.WriteLine("Removing sound " + filePath + " (buffer id" + AlBufferId + ")"); diff --git a/Subsurface/Source/Utils/SaveUtil.cs b/Subsurface/Source/Utils/SaveUtil.cs index 140cde774..c73ea070c 100644 --- a/Subsurface/Source/Utils/SaveUtil.cs +++ b/Subsurface/Source/Utils/SaveUtil.cs @@ -10,7 +10,7 @@ namespace Subsurface { public class SaveUtil { - private const string SaveFolder = "Content/Data/Saves/"; + private const string SaveFolder = "Data/Saves/"; public delegate void ProgressDelegate(string sMessage); @@ -18,10 +18,8 @@ namespace Subsurface { fileName = SaveFolder + fileName; - string tempPath = SaveFolder + "\\temp"; - - - + string tempPath = Path.Combine(SaveFolder, "temp"); + if (Directory.Exists(tempPath)) { Directory.Delete(tempPath, true); @@ -34,11 +32,11 @@ namespace Subsurface { if (Submarine.Loaded!=null) { - Submarine.Loaded.SaveAs(tempPath + "\\map.gz"); + Submarine.Loaded.SaveAs(Path.Combine(tempPath, "map.gz")); } else { - File.Copy(GameMain.GameSession.Submarine.FilePath, tempPath + "\\map.gz"); + File.Copy(GameMain.GameSession.Submarine.FilePath, Path.Combine(tempPath, "map.gz")); } } catch (Exception e) @@ -48,7 +46,7 @@ namespace Subsurface try { - GameMain.GameSession.Save(tempPath + "\\gamesession.xml"); + GameMain.GameSession.Save(Path.Combine(tempPath, "gamesession.xml")); } catch (Exception e) @@ -69,32 +67,31 @@ namespace Subsurface public static void LoadGame(string fileName) { - string filePath = SaveFolder + fileName+".save"; - - string tempPath = SaveFolder + "\\temp"; + string filePath = Path.Combine(SaveFolder, fileName+".save"); + string tempPath = Path.Combine(SaveFolder, "temp"); DecompressToDirectory(filePath, tempPath, null); - Submarine selectedMap = Submarine.Load(tempPath +"\\map.gz"); - GameMain.GameSession = new GameSession(selectedMap, fileName, tempPath + "\\gamesession.xml"); + Submarine selectedMap = new Submarine(Path.Combine(tempPath, "map.gz"), "");// Submarine.Load(); + GameMain.GameSession = new GameSession(selectedMap, fileName, Path.Combine(tempPath, "gamesession.xml")); //Directory.Delete(tempPath, true); } public static XDocument LoadGameSessionDoc(string fileName) { - string filePath = SaveFolder + fileName + ".save"; + string filePath = Path.Combine(SaveFolder, fileName + ".save"); - string tempPath = SaveFolder + "\\temp"; + string tempPath = Path.Combine(SaveFolder, "temp"); DecompressToDirectory(filePath, tempPath, null); - return ToolBox.TryLoadXml(tempPath + "\\gamesession.xml"); + return ToolBox.TryLoadXml(Path.Combine(tempPath, "gamesession.xml")); } public static void DeleteSave(string fileName) { - fileName = SaveFolder + fileName + ".save"; + fileName = Path.Combine(SaveFolder, fileName + ".save"); try { @@ -142,9 +139,10 @@ namespace Subsurface } string extension = ".save"; + string pathWithoutExtension = Path.Combine(SaveFolder, fileName); int i = 0; - while (File.Exists(SaveFolder + fileName + i + extension)) + while (File.Exists(pathWithoutExtension + i + extension)) { i++; } diff --git a/Subsurface/Source/Utils/UpdaterUtil.cs b/Subsurface/Source/Utils/UpdaterUtil.cs index 5541efa7d..83e55b512 100644 --- a/Subsurface/Source/Utils/UpdaterUtil.cs +++ b/Subsurface/Source/Utils/UpdaterUtil.cs @@ -136,17 +136,25 @@ namespace Subsurface File.Delete(fileRelPath); } + //couldn't delete file, probably because it's already in use catch { - string oldFileName = currentDir+"\\"+Path.GetDirectoryName(fileRelPath)+"\\OLD_"+Path.GetFileName(fileRelPath); + string oldFileName = Path.Combine(currentDir, Path.GetDirectoryName(fileRelPath), "OLD_"+Path.GetFileName(fileRelPath)); if (File.Exists(oldFileName)) File.Delete(oldFileName); - - //couldn't delete file, probably because it's already in use + File.Move(fileRelPath, oldFileName); } } + string directoryName = Path.GetDirectoryName(fileRelPath); + if (!string.IsNullOrWhiteSpace(directoryName)) + { + Directory.CreateDirectory(directoryName); + } + + + System.Diagnostics.Debug.WriteLine("moving: "+file+" -> "+fileRelPath); File.Move(file, fileRelPath); } @@ -161,13 +169,20 @@ namespace Subsurface foreach (string file in files) { - if (filesToKeep.Contains(GetRelativePath(file, currentDir))) continue; + string relativePath = GetRelativePath(file, currentDir); + + string dirRoot = relativePath.Split(Path.DirectorySeparatorChar).First(); + if (dirRoot == "Data") continue; + + if (filesToKeep.Contains(relativePath)) continue; + + if (Path.GetFileName(file).Split('_').First() == "OLD") continue; System.Diagnostics.Debug.WriteLine("deleting file "+file); try { - File.Delete(currentDir + "\\" + file); + File.Delete(file); } catch (Exception e) @@ -187,13 +202,13 @@ namespace Subsurface foreach (string file in files) { - if (file.Length<4 || file.Substring(0,4)!="OLD_") continue; + if (Path.GetFileName(file).Split('_').First() != "OLD") continue; System.Diagnostics.Debug.WriteLine("deleting file " + file); try { - File.Delete(currentDir + "\\" + file); + File.Delete(file); } catch (Exception e) diff --git a/Subsurface/Subsurface.csproj b/Subsurface/Subsurface.csproj index ef3785d5f..493c0afeb 100644 --- a/Subsurface/Subsurface.csproj +++ b/Subsurface/Subsurface.csproj @@ -215,7 +215,7 @@ - + @@ -536,6 +536,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -741,6 +744,7 @@ PreserveNewest + PreserveNewest @@ -976,7 +980,7 @@ - + diff --git a/Subsurface/Subsurface.csproj.user b/Subsurface/Subsurface.csproj.user index c2dd67340..d8060d791 100644 --- a/Subsurface/Subsurface.csproj.user +++ b/Subsurface/Subsurface.csproj.user @@ -9,7 +9,7 @@ en-US false - ShowAllFiles + ProjectFiles diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 3932c192e0688e87a1ecb480c15c1884e611aa48..b6b8ebe6f758eeebf6ce637de7a6f87b5d6bfa67 100644 GIT binary patch delta 24503 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 KM!(f?pZ@~ep{C9N