diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index ce9312fa8..e36010d9c 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -302,18 +302,18 @@ namespace Barotrauma private bool TryEndShift(GUIButton button, object obj) { - int subsNotDocked = 0; + List subsNotDocked = new List(); var leavingSub = obj as Submarine; if (leavingSub != null) { - subsNotDocked = GetSubsToLeaveBehind(leavingSub).Count; + subsNotDocked = GetSubsToLeaveBehind(leavingSub); } - if (subsNotDocked > 0) + if (subsNotDocked.Any()) { string msg = ""; - if (subsNotDocked == 1) + if (subsNotDocked.Count==1) { msg = "One of your vessels isn't at the exit yet. Do you want to leave it behind?"; } @@ -325,6 +325,8 @@ namespace Barotrauma var msgBox = new GUIMessageBox("Warning", msg, new string[] {"Yes", "No"}); msgBox.Buttons[0].OnClicked += EndShift; msgBox.Buttons[0].OnClicked += msgBox.Close; + msgBox.Buttons[0].UserData = Submarine.Loaded.FindAll(s => !subsNotDocked.Contains(s)); + msgBox.Buttons[1].OnClicked += msgBox.Close; } else @@ -339,7 +341,10 @@ namespace Barotrauma { isRunning = false; - var cinematic = new TransitionCinematic(Submarine.MainSub, GameMain.GameScreen.Cam, 5.0f); + List leavingSubs = obj as List; + if (leavingSubs == null) leavingSubs = new List() { GetLeavingSub() }; + + var cinematic = new TransitionCinematic(leavingSubs, GameMain.GameScreen.Cam, 5.0f); SoundPlayer.OverrideMusicType = CrewManager.characters.Any(c => !c.IsDead) ? "endshift" : "crewdead"; diff --git a/Subsurface/Source/Map/LinkedSubmarine.cs b/Subsurface/Source/Map/LinkedSubmarine.cs index 68e3ec05e..c98dcab0a 100644 --- a/Subsurface/Source/Map/LinkedSubmarine.cs +++ b/Subsurface/Source/Map/LinkedSubmarine.cs @@ -277,6 +277,9 @@ namespace Barotrauma saveElement = this.saveElement; } + if (saveElement.Attribute("pos") != null) saveElement.Attribute("pos").Remove(); + saveElement.Add(new XAttribute("pos", ToolBox.Vector2ToString(Position - Submarine.HiddenSubPosition))); + var linkedPort = linkedTo.FirstOrDefault(lt => (lt is Item) && ((Item)lt).GetComponent() != null); @@ -298,7 +301,22 @@ namespace Barotrauma if (sub != null) { + bool leaveBehind = false; if (!sub.DockedTo.Contains(Submarine.MainSub)) + { + System.Diagnostics.Debug.Assert(Submarine.MainSub.AtEndPosition || Submarine.MainSub.AtStartPosition); + if (Submarine.MainSub.AtEndPosition) + { + leaveBehind = sub.AtEndPosition != Submarine.MainSub.AtEndPosition; + } + else + { + leaveBehind = sub.AtStartPosition != Submarine.MainSub.AtStartPosition; + } + } + + + if (leaveBehind) { saveElement.Add(new XAttribute("location", Level.Loaded.Seed)); saveElement.Add(new XAttribute("worldpos", ToolBox.Vector2ToString(sub.SubBody.Position))); diff --git a/Subsurface/Source/Map/TransitionCinematic.cs b/Subsurface/Source/Map/TransitionCinematic.cs index b0e14352b..15dda5317 100644 --- a/Subsurface/Source/Map/TransitionCinematic.cs +++ b/Subsurface/Source/Map/TransitionCinematic.cs @@ -19,14 +19,24 @@ namespace Barotrauma private float duration; public TransitionCinematic(Submarine submarine, Camera cam, float duration) + : this(new List() { submarine }, cam, duration) { - Vector2 targetPos = submarine.Position; - if (submarine.AtEndPosition) + } + + public TransitionCinematic(List submarines, Camera cam, float duration) + { + Vector2 targetPos = new Vector2( + submarines.Sum(s => s.Position.X), + submarines.Sum(s => s.Position.Y)) / submarines.Count; + + if (!submarines.Any()) return; + + if (submarines.First().AtEndPosition) { targetPos = Level.Loaded.EndPosition + Vector2.UnitY * 500.0f; } - else if (submarine.AtStartPosition) + else if (submarines.First().AtStartPosition) { targetPos = Level.Loaded.StartPosition + Vector2.UnitY * 500.0f; } @@ -34,16 +44,18 @@ namespace Barotrauma this.duration = duration; Running = true; - CoroutineManager.StartCoroutine(UpdateTransitionCinematic(submarine, cam, targetPos)); + CoroutineManager.StartCoroutine(UpdateTransitionCinematic(submarines, cam, targetPos)); } - private IEnumerable UpdateTransitionCinematic(Submarine sub, Camera cam, Vector2 targetPos) + private IEnumerable UpdateTransitionCinematic(List subs, Camera cam, Vector2 targetPos) { + if (!subs.Any()) yield return CoroutineStatus.Success; + Character.Controlled = null; cam.TargetPos = Vector2.Zero; GameMain.LightManager.LosEnabled = false; - Vector2 diff = targetPos - sub.Position; + //Vector2 diff = targetPos - sub.Position; float targetSpeed = 10.0f; Level.Loaded.ShaftBodies[0].Enabled = false; @@ -66,17 +78,18 @@ namespace Barotrauma cam.Zoom = Math.Max(0.2f, cam.Zoom - CoroutineManager.UnscaledDeltaTime * 0.1f); - Vector2 cameraPos = sub.Position + Submarine.MainSub.HiddenSubPosition; + Vector2 cameraPos = subs.First().Position + Submarine.MainSub.HiddenSubPosition; cameraPos.Y = Math.Min(cameraPos.Y, ConvertUnits.ToDisplayUnits(Level.Loaded.ShaftBodies[0].Position.Y) - cam.WorldView.Height/2.0f); GUI.ScreenOverlayColor = Color.Lerp(Color.TransparentBlack, Color.Black, timer/duration); cam.Translate((cameraPos - cam.Position) * CoroutineManager.UnscaledDeltaTime*10.0f); - if (diff != Vector2.Zero) + foreach (Submarine sub in subs) { - sub.ApplyForce((Vector2.Normalize(diff) * targetSpeed - sub.Velocity) * 500.0f); + sub.ApplyForce((Vector2.Normalize(sub.Position - targetPos) * targetSpeed - sub.Velocity) * 500.0f); } + timer += CoroutineManager.UnscaledDeltaTime; diff --git a/Subsurface/Source/Networking/ServerLog.cs b/Subsurface/Source/Networking/ServerLog.cs index 109af4624..9dc388a5a 100644 --- a/Subsurface/Source/Networking/ServerLog.cs +++ b/Subsurface/Source/Networking/ServerLog.cs @@ -120,6 +120,8 @@ namespace Barotrauma.Networking textBlock.Visible = textBlock.Text.ToLower().Contains(text); } + listBox.BarScroll = 0.0f; + return true; } diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 10ab83d1d..d65528fab 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -464,9 +464,12 @@ namespace Barotrauma foreach (GUIComponent child in GUItabs[selectedTab].GetChild().children) { - child.Visible = child.GetChild().Text.ToLower().Contains(text); + var textBlock = child.GetChild(); + child.Visible = textBlock.Text.ToLower().Contains(text); } + GUItabs[selectedTab].GetChild().BarScroll = 0.0f; + return true; }