From 0628e47b9759537c68afd7cbbd89ac67d257137d Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 6 Jul 2015 22:48:18 +0300 Subject: [PATCH] level seeds --- Subsurface/GameSession/GameSession.cs | 4 ++-- Subsurface/Map/Level.cs | 3 +-- Subsurface/Networking/GameClient.cs | 11 ++++------- Subsurface/Networking/GameServer.cs | 4 +++- Subsurface/Screens/NetLobbyScreen.cs | 1 + Subsurface/ToolBox.cs | 9 +++++++++ Subsurface_Solution.v12.suo | Bin 378368 -> 378368 bytes 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Subsurface/GameSession/GameSession.cs b/Subsurface/GameSession/GameSession.cs index 3ab85c9e7..b11ad8bb0 100644 --- a/Subsurface/GameSession/GameSession.cs +++ b/Subsurface/GameSession/GameSession.cs @@ -113,15 +113,15 @@ namespace Subsurface public void StartShift(TimeSpan duration, string levelSeed, int scriptedEventCount = 1) { + Level level = Level.CreateRandom(levelSeed); + StartShift(duration, level, scriptedEventCount); } public void StartShift(TimeSpan duration, Level level, int scriptedEventCount = 1) { //if (crewManager.characterInfos.Count == 0) return; - - this.level = level; if (Submarine.Loaded!=submarine) submarine.Load(); diff --git a/Subsurface/Map/Level.cs b/Subsurface/Map/Level.cs index fb9e100b2..19d70ac12 100644 --- a/Subsurface/Map/Level.cs +++ b/Subsurface/Map/Level.cs @@ -61,10 +61,9 @@ namespace Subsurface public static Level CreateRandom(string seed = "") { - if (seed == "") { - seed = Rand.Range(0, int.MaxValue).ToString(); + seed = Rand.Range(0, int.MaxValue, false).ToString(); } return new Level((string)seed, 100000, 40000, 2000); } diff --git a/Subsurface/Networking/GameClient.cs b/Subsurface/Networking/GameClient.cs index 836ee94e4..2174b4335 100644 --- a/Subsurface/Networking/GameClient.cs +++ b/Subsurface/Networking/GameClient.cs @@ -212,23 +212,20 @@ namespace Subsurface.Networking int seed = inc.ReadInt32(); Rand.SetSyncedSeed(seed); + string levelSeed = inc.ReadString(); + string mapName = inc.ReadString(); string mapHash = inc.ReadString(); Game1.NetLobbyScreen.TrySelectMap(mapName, mapHash); - - - //Map.Load(mapFile); - - - + double durationMinutes = inc.ReadDouble(); TimeSpan duration = new TimeSpan(0,(int)durationMinutes,0); //int gameModeIndex = inc.ReadInt32(); Game1.GameSession = new GameSession(Submarine.Loaded); - Game1.GameSession.StartShift(duration, "asdf"); + Game1.GameSession.StartShift(duration, levelSeed); myCharacter = ReadCharacterData(inc); Character.Controlled = myCharacter; diff --git a/Subsurface/Networking/GameServer.cs b/Subsurface/Networking/GameServer.cs index e0814099c..1b1e80d96 100644 --- a/Subsurface/Networking/GameServer.cs +++ b/Subsurface/Networking/GameServer.cs @@ -273,7 +273,7 @@ namespace Subsurface.Networking //selectedMap.Load(); Game1.GameSession = new GameSession(selectedMap, Game1.NetLobbyScreen.SelectedMode); - Game1.GameSession.StartShift(Game1.NetLobbyScreen.GameDuration, "asdf", 1); + Game1.GameSession.StartShift(Game1.NetLobbyScreen.GameDuration, Game1.NetLobbyScreen.LevelSeed, 1); //EventManager.SelectEvent(Game1.netLobbyScreen.SelectedEvent); foreach (Client client in connectedClients) @@ -304,6 +304,8 @@ namespace Subsurface.Networking msg.Write(seed); + msg.Write(Game1.NetLobbyScreen.LevelSeed); + msg.Write(Game1.NetLobbyScreen.SelectedMap.Name); msg.Write(Game1.NetLobbyScreen.SelectedMap.Hash.MD5Hash); diff --git a/Subsurface/Screens/NetLobbyScreen.cs b/Subsurface/Screens/NetLobbyScreen.cs index 3e5a5e8b5..85fe13758 100644 --- a/Subsurface/Screens/NetLobbyScreen.cs +++ b/Subsurface/Screens/NetLobbyScreen.cs @@ -180,6 +180,7 @@ namespace Subsurface GUI.style, 0.1f, infoFrame); durationBar.BarSize = 0.1f; durationBar.Enabled = (Game1.Server != null); + LevelSeed = ToolBox.RandomSeed(8); new GUITextBlock(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 100, 100, 20), "Level Seed: ", GUI.style, Alignment.Left, Alignment.TopLeft, infoFrame); diff --git a/Subsurface/ToolBox.cs b/Subsurface/ToolBox.cs index 54a309dfe..d19d51758 100644 --- a/Subsurface/ToolBox.cs +++ b/Subsurface/ToolBox.cs @@ -247,6 +247,15 @@ namespace Subsurface return floatArray; } + public static string RandomSeed(int length) + { + var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + return new string( + Enumerable.Repeat(chars, length) + .Select(s => s[Rand.Int(s.Length)]) + .ToArray()); + } + public static int SeedToInt(string seed) { StringBuilder sb = new StringBuilder(); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a0ed447d0630057df4a768e4b5a11614956668ba..87ea3e923635711711bb14fb2aa0a9d7e6c370c4 100644 GIT binary patch delta 7331 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 Oo7SN1_4h8(X8ji~t0Sxc