diff --git a/Barotrauma/BarotraumaClient/ClientCode.projitems b/Barotrauma/BarotraumaClient/ClientCode.projitems index e2df0a544..1b79fd2eb 100644 --- a/Barotrauma/BarotraumaClient/ClientCode.projitems +++ b/Barotrauma/BarotraumaClient/ClientCode.projitems @@ -43,12 +43,8 @@ - - + - - - diff --git a/Barotrauma/BarotraumaClient/Launch_Barotrauma b/Barotrauma/BarotraumaClient/Launch_Barotrauma index 4e95158fd..8792fad24 100644 --- a/Barotrauma/BarotraumaClient/Launch_Barotrauma +++ b/Barotrauma/BarotraumaClient/Launch_Barotrauma @@ -1,3 +1,3 @@ #!/bin/sh -./Barotrauma +exec mono "./Barotrauma.exe" MONO_LOG_LEVEL=debug "$@" diff --git a/Barotrauma/BarotraumaClient/LinuxClient.csproj b/Barotrauma/BarotraumaClient/LinuxClient.csproj index 080c09481..f0d80d9ee 100644 --- a/Barotrauma/BarotraumaClient/LinuxClient.csproj +++ b/Barotrauma/BarotraumaClient/LinuxClient.csproj @@ -60,6 +60,9 @@ + + ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll + ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll @@ -129,10 +132,6 @@ - - {0e7fee6a-15e5-4a4e-943c-80276003478c} - Concentus - {3af0347c-5a9b-4421-868c-8ee3dbfaebc6} Facepunch.Steamworks @@ -187,18 +186,12 @@ PreserveNewest - - PreserveNewest - PreserveNewest PreserveNewest - - PreserveNewest - PreserveNewest diff --git a/Barotrauma/BarotraumaClient/MacClient.csproj b/Barotrauma/BarotraumaClient/MacClient.csproj index 99902b0ca..f9fdba9c8 100644 --- a/Barotrauma/BarotraumaClient/MacClient.csproj +++ b/Barotrauma/BarotraumaClient/MacClient.csproj @@ -59,6 +59,9 @@ + + ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll + ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll @@ -128,10 +131,6 @@ - - {0e7fee6a-15e5-4a4e-943c-80276003478c} - Concentus - {3af0347c-5a9b-4421-868c-8ee3dbfaebc6} Facepunch.Steamworks diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs index 5e2918897..b67af8559 100644 --- a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.8.10.0")] -[assembly: AssemblyFileVersion("0.8.10.0")] +[assembly: AssemblyVersion("0.8.9.10")] +[assembly: AssemblyFileVersion("0.8.9.10")] diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs index 2e11c7af2..864fd5996 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs @@ -98,7 +98,7 @@ namespace Barotrauma if (distSqrd > 10.0f || !character.AllowInput) { Collider.TargetRotation = newRotation; - SetPosition(newPosition, lerp: distSqrd < 5.0f, ignorePlatforms: false); + SetPosition(newPosition, lerp: distSqrd < 5.0f); } else { @@ -238,16 +238,20 @@ namespace Barotrauma } float errorMagnitude = positionError.Length(); - if (errorMagnitude > 0.5f) - { - character.MemLocalState.Clear(); - SetPosition(serverPos.Position, lerp: true, ignorePlatforms: false); - } - else if (errorMagnitude > 0.01f) + if (errorMagnitude > 0.01f) { Collider.TargetPosition = Collider.SimPosition + positionError; Collider.TargetRotation = Collider.Rotation + rotationError; Collider.MoveToTargetPosition(lerp: true); + if (errorMagnitude > 0.5f) + { + character.MemLocalState.Clear(); + foreach (Limb limb in Limbs) + { + limb.body.TargetPosition = limb.body.SimPosition + positionError; + limb.body.MoveToTargetPosition(lerp: true); + } + } } } @@ -436,15 +440,14 @@ namespace Barotrauma return; } - Color? color = null; - if (character.ExternalHighlight) - { - color = Color.Lerp(Color.White, Color.OrangeRed, (float)Math.Sin(Timing.TotalTime * 3.5f)); - } + //foreach (Limb limb in Limbs) + //{ + // limb.Draw(spriteBatch, cam); + //} for (int i = 0; i < limbs.Length; i++) { - inversedLimbDrawOrder[i].Draw(spriteBatch, cam, color); + inversedLimbDrawOrder[i].Draw(spriteBatch, cam); } LimbJoints.ForEach(j => j.Draw(spriteBatch)); } diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs index b4e831e77..5e58e5b4a 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs @@ -46,7 +46,8 @@ namespace Barotrauma if (controlled == value) return; controlled = value; if (controlled != null) controlled.Enabled = true; - CharacterHealth.OpenHealthWindow = null; + CharacterHealth.OpenHealthWindow = null; + } } @@ -110,33 +111,6 @@ namespace Barotrauma get { return gibEmitters; } } - public class ObjectiveEntity - { - public Entity Entity; - public Sprite Sprite; - public Color Color; - - public ObjectiveEntity(Entity entity, Sprite sprite, Color? color = null) - { - Entity = entity; - Sprite = sprite; - if (color.HasValue) - { - Color = color.Value; - } - else - { - Color = Color.White; - } - } - } - - private List activeObjectiveEntities = new List(); - public IEnumerable ActiveObjectiveEntities - { - get { return activeObjectiveEntities; } - } - partial void InitProjSpecific(XDocument doc) { soundInterval = doc.Root.GetAttributeFloat("soundinterval", 10.0f); @@ -164,6 +138,7 @@ namespace Barotrauma break; } } + } hudProgressBars = new Dictionary(); } @@ -760,20 +735,6 @@ namespace Barotrauma soundTimer = soundInterval; } - public void AddActiveObjectiveEntity(Entity entity, Sprite sprite, Color? color = null) - { - if (activeObjectiveEntities.Any(aoe => aoe.Entity == entity)) return; - ObjectiveEntity objectiveEntity = new ObjectiveEntity(entity, sprite, color); - activeObjectiveEntities.Add(objectiveEntity); - } - - public void RemoveActiveObjectiveEntity(Entity entity) - { - ObjectiveEntity found = activeObjectiveEntities.Find(aoe => aoe.Entity == entity); - if (found == null) return; - activeObjectiveEntities.Remove(found); - } - partial void ImplodeFX() { Vector2 centerOfMass = AnimController.GetCenterOfMass(); diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs index 34cc2ebeb..a2137e660 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs @@ -85,8 +85,7 @@ namespace Barotrauma { if (character.Inventory != null) { - if (!character.LockHands && character.Stun < 0.1f && - (character.SelectedConstruction == null || character.SelectedConstruction.GetComponent() == null)) + if (!character.LockHands && character.Stun < 0.1f) { character.Inventory.Update(deltaTime, cam); } @@ -169,12 +168,7 @@ namespace Barotrauma DrawOrderIndicator(spriteBatch, cam, character, character.CurrentOrder, 1.0f); } } - - foreach (Character.ObjectiveEntity objectiveEntity in character.ActiveObjectiveEntities) - { - DrawObjectiveIndicator(spriteBatch, cam, character, objectiveEntity, 1.0f); - } - + foreach (Item brokenItem in brokenItems) { float dist = Vector2.Distance(character.WorldPosition, brokenItem.WorldPosition); @@ -321,7 +315,6 @@ namespace Barotrauma } if (character.Inventory != null && !character.LockHands) { - character.Inventory.Locked = (character.SelectedConstruction != null && character.SelectedConstruction.GetComponent() != null); character.Inventory.DrawOwn(spriteBatch); character.Inventory.CurrentLayout = CharacterHealth.OpenHealthWindow == null && character.SelectedCharacter == null ? CharacterInventory.Layout.Default : @@ -366,33 +359,17 @@ namespace Barotrauma private static void DrawOrderIndicator(SpriteBatch spriteBatch, Camera cam, Character character, Order order, float iconAlpha = 1.0f) { - if (order.TargetAllCharacters && !order.HasAppropriateJob(character)) { return; } + if (order.TargetAllCharacters && !order.HasAppropriateJob(character)) return; Entity target = order.ConnectedController != null ? order.ConnectedController.Item : order.TargetEntity; - if (target == null) { return; } + if (target == null) return; - //don't show the indicator if far away and not inside the same sub - //prevents exploiting the indicators in locating the sub - if (character.Submarine != target.Submarine && - Vector2.DistanceSquared(character.WorldPosition, target.WorldPosition) > 1000.0f * 1000.0f) - { - return; - } - - if (!orderIndicatorCount.ContainsKey(target)) { orderIndicatorCount.Add(target, 0); } + if (!orderIndicatorCount.ContainsKey(target)) orderIndicatorCount.Add(target, 0); Vector2 drawPos = target.WorldPosition + Vector2.UnitX * order.SymbolSprite.size.X * 1.5f * orderIndicatorCount[target]; GUI.DrawIndicator(spriteBatch, drawPos, cam, 100.0f, order.SymbolSprite, order.Color * iconAlpha); orderIndicatorCount[target] = orderIndicatorCount[target] + 1; } - - private static void DrawObjectiveIndicator(SpriteBatch spriteBatch, Camera cam, Character character, Character.ObjectiveEntity objectiveEntity, float iconAlpha = 1.0f) - { - if (objectiveEntity == null) return; - - Vector2 drawPos = objectiveEntity.Entity.WorldPosition;// + Vector2.UnitX * objectiveEntity.Sprite.size.X * 1.5f; - GUI.DrawIndicator(spriteBatch, drawPos, cam, 100.0f, objectiveEntity.Sprite, objectiveEntity.Color * iconAlpha); - } } } diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs b/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs index 34ebcb336..3799e1756 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Health/CharacterHealth.cs @@ -136,17 +136,6 @@ namespace Barotrauma } } - public GUIButton CPRButton - { - get { return cprButton; } - } - - public float HealthBarPulsateTimer - { - get { return healthBarPulsateTimer; } - set { healthBarPulsateTimer = MathHelper.Clamp(value, 0.0f, 10.0f); } - } - static CharacterHealth() { damageOverlay = new Sprite("Content/UI/damageOverlay.png", Vector2.Zero); diff --git a/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs b/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs index 7a63b7cb6..132950a07 100644 --- a/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs +++ b/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs @@ -279,7 +279,7 @@ namespace Barotrauma if (text[i] == '\n') { currentLineX = 0.0f; - retVal.Y += baseHeight * 1.8f; + retVal.Y += baseHeight * 18 / 10; continue; } uint charIndex = text[i]; diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs index bb18cab55..dddd37a0f 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs @@ -129,8 +129,6 @@ namespace Barotrauma get { return pauseMenuOpen; } } - public static bool PreventPauseMenuToggle = false; - public static Color ScreenOverlayColor { get; @@ -1415,7 +1413,6 @@ namespace Barotrauma public static void TogglePauseMenu() { if (Screen.Selected == GameMain.MainMenuScreen) return; - if (PreventPauseMenuToggle) return; settingsMenuOpen = false; @@ -1549,9 +1546,9 @@ namespace Barotrauma if (GameMain.GameSession != null) { - if (Tutorial.Initialized) + if (ContextualTutorial.Initialized && GameMain.GameSession.GameMode is SinglePlayerCampaign) { - ((TutorialMode)GameMain.GameSession.GameMode).Tutorial.Stop(); + ((SinglePlayerCampaign)GameMain.GameSession.GameMode).ContextualTutorial.Stop(); } if (GameSettings.SendUserStatistics) diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIButton.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIButton.cs index c4746fa69..7917d904f 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUIButton.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIButton.cs @@ -168,11 +168,6 @@ namespace Barotrauma if (frame != null) frame.ApplyStyle(style); } - public override void Flash(Color? color = null, float flashDuration = 1.5f, bool useRectangleFlash = false, Vector2? flashRectInflate = null) - { - Frame.Flash(color, flashDuration, useRectangleFlash, flashRectInflate); - } - protected override void Draw(SpriteBatch spriteBatch) { //do nothing diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs index 6f56b0654..f67787327 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs @@ -121,22 +121,17 @@ namespace Barotrauma protected Color selectedColor; protected Color pressedColor; - private CoroutineHandle pulsateCoroutine; - protected ComponentState state; protected Color flashColor; protected float flashDuration = 1.5f; - private bool useRectangleFlash; - public float FlashTimer - { - get { return flashTimer; } - } protected float flashTimer; private Vector2 flashRectInflate; public bool IgnoreLayoutGroups; + public bool IgnoreLayoutGroups; + public virtual ScalableFont Font { get; @@ -269,8 +264,6 @@ namespace Barotrauma set { pressedColor = value; } } - public bool ExternalHighlight = false; - private RectTransform rectTransform; public RectTransform RectTransform { @@ -445,21 +438,11 @@ namespace Barotrauma int flashCycleCount = (int)Math.Max(flashDuration, 1); float flashCycleDuration = flashDuration / flashCycleCount; - Rectangle flashRect = Rect; - flashRect.Inflate(flashRectInflate.X, flashRectInflate.Y); - //MathHelper.Pi * 0.8f -> the curve goes from 144 deg to 0, //i.e. quickly bumps up from almost full brightness to full and then fades out - if (!useRectangleFlash) - { - GUI.UIGlow.Draw(spriteBatch, - flashRect, - flashColor * (float)Math.Sin(flashTimer % flashCycleDuration / flashCycleDuration * MathHelper.Pi * 0.8f)); - } - else - { - GUI.DrawRectangle(spriteBatch, flashRect, flashColor * (float)Math.Sin(flashTimer % flashCycleDuration / flashCycleDuration * MathHelper.Pi * 0.8f), true); - } + GUI.UIGlow.Draw(spriteBatch, + rect, + flashColor * (float)Math.Sin(flashTimer % flashCycleDuration / flashCycleDuration * MathHelper.Pi * 0.8f)); } } @@ -507,11 +490,9 @@ namespace Barotrauma color = new Color(color.R / 255.0f, color.G / 255.0f, color.B / 255.0f, a); } - public virtual void Flash(Color? color = null, float flashDuration = 1.5f, bool useRectangleFlash = false, Vector2? flashRectInflate = null) + public virtual void Flash(Color? color = null, float flashDuration = 1.5f) { flashTimer = flashDuration; - this.flashRectInflate = flashRectInflate ?? Vector2.Zero; - this.useRectangleFlash = useRectangleFlash; this.flashDuration = flashDuration; flashColor = (color == null) ? Color.Red : (Color)color; } @@ -529,7 +510,9 @@ namespace Barotrauma while (t < duration) { t += CoroutineManager.DeltaTime; + SetAlpha(MathHelper.Lerp(startA, to, t / duration)); + yield return CoroutineStatus.Running; } @@ -542,30 +525,9 @@ namespace Barotrauma yield return CoroutineStatus.Success; } + #endregion - public void Pulsate(Vector2 startScale, Vector2 endScale, float duration) - { - if (CoroutineManager.IsCoroutineRunning(pulsateCoroutine)) - { - return; - } - pulsateCoroutine = CoroutineManager.StartCoroutine(DoPulsate(startScale, endScale, duration), "Pulsate" + ToString()); - } - - private IEnumerable DoPulsate(Vector2 startScale, Vector2 endScale, float duration) - { - float t = 0.0f; - while (t < duration) - { - t += CoroutineManager.DeltaTime; - RectTransform.LocalScale = Vector2.Lerp(startScale, endScale, (float)Math.Sin(t / duration * MathHelper.Pi)); - yield return CoroutineStatus.Running; - } - RectTransform.LocalScale = startScale; - yield return CoroutineStatus.Success; - } - - public virtual void ApplyStyle(GUIComponentStyle style) + protected virtual void SetAlpha(float a) { if (style == null) return; @@ -578,7 +540,13 @@ namespace Barotrauma OutlineColor = style.OutlineColor; - this.style = style; + public virtual void Flash(Color? color = null, float flashDuration = 1.5f, bool useRectangleFlash = false, Vector2? flashRectInflate = null) + { + flashTimer = flashDuration; + this.flashRectInflate = flashRectInflate ?? Vector2.Zero; + this.useRectangleFlash = useRectangleFlash; + this.flashDuration = flashDuration; + flashColor = (color == null) ? Color.Red : (Color)color; } } } diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs index 0c091c992..ec9c026e6 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs @@ -41,22 +41,33 @@ namespace Barotrauma InnerFrame = new GUIFrame(new RectTransform(new Point(width, height), RectTransform, Anchor.Center) { IsFixedSize = false }, style: null); GUI.Style.Apply(InnerFrame, "", this); + InnerFrame = new GUIFrame(new RectTransform(new Point(width, height), RectTransform, Anchor.Center) { IsFixedSize = false }, style: null); + GUI.Style.Apply(InnerFrame, "", this); + Content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), InnerFrame.RectTransform, Anchor.Center)) { AbsoluteSpacing = 5 }; Tag = tag; - + + if (height == 0) + { + string wrappedText = ToolBox.WrapText(text, Content.Rect.Width, GUI.Font); + string[] lines = wrappedText.Split('\n'); + foreach (string line in lines) + { + height += (int)GUI.Font.MeasureString(line).Y; + } + height += string.IsNullOrWhiteSpace(headerText) ? 220 : 220 - headerHeight; + } + InnerFrame.RectTransform.NonScaledSize = new Point(InnerFrame.Rect.Width, height); + Header = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), Content.RectTransform), headerText, textAlignment: Alignment.Center, wrap: true); - GUI.Style.Apply(Header, "", this); - Header.RectTransform.MinSize = new Point(0, Header.Rect.Height); + GUI.Style.Apply(Header, "", this); - if (!string.IsNullOrWhiteSpace(text)) + if (height == 0) { Text = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), Content.RectTransform), text, textAlignment: textAlignment, wrap: true); GUI.Style.Apply(Text, "", this); - Text.RectTransform.NonScaledSize = Text.RectTransform.MinSize = Text.RectTransform.MaxSize = - new Point(Text.Rect.Width, Text.Rect.Height); - Text.RectTransform.IsFixedSize = true; } var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.15f), Content.RectTransform, Anchor.BottomCenter, maxSize: new Point(1000, 50)), @@ -65,22 +76,7 @@ namespace Barotrauma AbsoluteSpacing = 5, IgnoreLayoutGroups = true }; - buttonContainer.RectTransform.NonScaledSize = buttonContainer.RectTransform.MinSize = buttonContainer.RectTransform.MaxSize = - new Point(buttonContainer.Rect.Width, (int)(30 * GUI.Scale)); - buttonContainer.RectTransform.IsFixedSize = true; - - if (height == 0) - { - height += Header.Rect.Height + Content.AbsoluteSpacing; - height += (Text == null ? 0 : Text.Rect.Height) + Content.AbsoluteSpacing; - height += buttonContainer.Rect.Height; - - InnerFrame.RectTransform.NonScaledSize = - new Point(InnerFrame.Rect.Width, (int)Math.Max(height / Content.RectTransform.RelativeSize.Y, height + 50)); - Content.RectTransform.NonScaledSize = - new Point(Content.Rect.Width, height); - } - + Buttons = new List(buttons.Length); for (int i = 0; i < buttons.Length; i++) { diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs index 04e0d0848..65a234dfb 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs @@ -1,8 +1,6 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; -using System.Collections.Generic; -using System.Linq; namespace Barotrauma { @@ -249,7 +247,7 @@ namespace Barotrauma return; } - textPos = new Vector2(padding.X + (rect.Width - padding.Z - padding.X) / 2.0f, padding.Y + (rect.Height - padding.Y - padding.W) / 2.0f); + textPos = new Vector2(rect.Width / 2.0f, rect.Height / 2.0f); origin = TextSize * 0.5f; if (textAlignment.HasFlag(Alignment.Left) && !overflowClipActive) diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBox.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBox.cs index 886e5aa2c..73fcd1b3a 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBox.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBox.cs @@ -365,9 +365,9 @@ namespace Barotrauma OnDeselected?.Invoke(this, Keys.None); } - public override void Flash(Color? color = null, float flashDuration = 1.5f, bool useRectangleFlash = false, Vector2? flashRectOffset = null) + public override void Flash(Color? color = null, float flashDuration = 1.5f) { - textBlock.Flash(color, flashDuration, useRectangleFlash, flashRectOffset); + textBlock.Flash(color, flashDuration); } protected override void Update(float deltaTime) diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs index 06e197eeb..913914243 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs @@ -44,11 +44,10 @@ namespace Barotrauma public Color TextColor { - get { return text.TextColor; } - set { text.TextColor = value; } + get { return box; } } - public override Rectangle MouseRect + public GUITextBlock TextBlock { get { @@ -57,17 +56,14 @@ namespace Barotrauma } } - public override ScalableFont Font + public override string ToolTip { - get - { - return base.Font; - } - + get { return base.ToolTip; } set { - base.Font = value; - if (text != null) text.Font = value; + base.ToolTip = value; + box.ToolTip = value; + text.ToolTip = value; } } @@ -76,11 +72,6 @@ namespace Barotrauma get { return box; } } - public GUITextBlock TextBlock - { - get { return text; } - } - public override string ToolTip { get { return base.ToolTip; } @@ -128,7 +119,6 @@ namespace Barotrauma private void ResizeBox() { box.RectTransform.NonScaledSize = new Point(RectTransform.NonScaledSize.Y); - text.RectTransform.NonScaledSize = new Point(Rect.Width - box.Rect.Width, text.Rect.Height); text.RectTransform.AbsoluteOffset = new Point(box.Rect.Width, 0); } diff --git a/Barotrauma/BarotraumaClient/Source/GUI/VideoPlayer.cs b/Barotrauma/BarotraumaClient/Source/GUI/VideoPlayer.cs index ea9adc6f3..bb327ac69 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/VideoPlayer.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/VideoPlayer.cs @@ -10,10 +10,9 @@ namespace Barotrauma { class VideoPlayer { - public bool IsPlaying; - private Video currentVideo; private string filePath; + private bool isPlaying; private GUIFrame background, videoFrame, textFrame; private GUITextBlock title, textContent, objectiveTitle, objectiveText; @@ -25,14 +24,12 @@ namespace Barotrauma private Point scaledVideoResolution; private readonly int borderSize = 20; - private readonly Point buttonSize = new Point(120, 30); + private readonly Point buttonSize = new Point(160, 50); private readonly int titleHeight = 30; private readonly int objectiveFrameHeight = 60; private readonly int textHeight = 25; - private bool useTextOnRightSide = false; - - public class TextSettings + public struct TextSettings { public string Text; public int Width; @@ -44,7 +41,7 @@ namespace Barotrauma } } - public class VideoSettings + public struct VideoSettings { public string File; @@ -65,14 +62,7 @@ namespace Barotrauma background = new GUIFrame(new RectTransform(Point.Zero, GUI.Canvas, Anchor.Center), "InnerFrame", backgroundColor); videoFrame = new GUIFrame(new RectTransform(Point.Zero, background.RectTransform, Anchor.Center, Pivot.Center), "SonarFrame"); - if (useTextOnRightSide) - { - textFrame = new GUIFrame(new RectTransform(Point.Zero, videoFrame.RectTransform, Anchor.CenterLeft, Pivot.CenterLeft), "TextFrame"); - } - else - { - textFrame = new GUIFrame(new RectTransform(Point.Zero, videoFrame.RectTransform, Anchor.TopCenter, Pivot.TopCenter), "TextFrame"); - } + textFrame = new GUIFrame(new RectTransform(Point.Zero, videoFrame.RectTransform, Anchor.CenterLeft, Pivot.CenterLeft), "TextFrame"); videoView = new GUICustomComponent(new RectTransform(Point.Zero, videoFrame.RectTransform, Anchor.Center), (spriteBatch, guiCustomComponent) => { DrawVideo(spriteBatch, guiCustomComponent.Rect); }); title = new GUITextBlock(new RectTransform(Point.Zero, textFrame.RectTransform, Anchor.TopLeft, Pivot.TopLeft), string.Empty, font: GUI.VideoTitleFont, textColor: new Color(253, 174, 0), textAlignment: Alignment.Left); @@ -80,7 +70,7 @@ namespace Barotrauma textContent = new GUITextBlock(new RectTransform(Point.Zero, textFrame.RectTransform, Anchor.TopLeft, Pivot.TopLeft), string.Empty, font: GUI.Font, textAlignment: Alignment.TopLeft); objectiveTitle = new GUITextBlock(new RectTransform(new Vector2(1f, 0f), textFrame.RectTransform, Anchor.TopCenter, Pivot.TopCenter), string.Empty, font: GUI.ObjectiveTitleFont, textAlignment: Alignment.CenterRight, textColor: Color.White); - objectiveTitle.Text = TextManager.Get("Tutorial.NewObjective"); + objectiveTitle.Text = TextManager.Get("NewObjective"); objectiveText = new GUITextBlock(new RectTransform(Point.Zero, textFrame.RectTransform, Anchor.TopCenter, Pivot.TopCenter), string.Empty, font: GUI.ObjectiveNameFont, textColor: new Color(4, 180, 108), textAlignment: Alignment.CenterRight); objectiveTitle.Visible = objectiveText.Visible = false; @@ -88,12 +78,12 @@ namespace Barotrauma public void Play() { - IsPlaying = true; + isPlaying = true; } public void Stop() { - IsPlaying = false; + isPlaying = false; if (currentVideo == null) return; currentVideo.Dispose(); currentVideo = null; @@ -109,6 +99,13 @@ namespace Barotrauma public void Update() { if (currentVideo == null) return; + + if (PlayerInput.KeyHit(Keys.Enter) || PlayerInput.KeyHit(Keys.Escape)) + { + DisposeVideo(null, null); + return; + } + if (currentVideo.IsPlaying) return; currentVideo.Dispose(); @@ -118,7 +115,7 @@ namespace Barotrauma public void AddToGUIUpdateList(bool ignoreChildren = false, int order = 0) { - if (!IsPlaying) return; + if (!isPlaying) return; background.AddToGUIUpdateList(ignoreChildren, order); } @@ -142,7 +139,7 @@ namespace Barotrauma currentVideo = CreateVideo(scaledVideoResolution); title.Text = TextManager.Get(contentId); - textContent.Text = textSettings != null ? textSettings.Text : string.Empty; + textContent.Text = textSettings.Text; objectiveText.Text = objective; AdjustFrames(videoSettings, textSettings); @@ -168,8 +165,7 @@ namespace Barotrauma title.TextScale = textContent.TextScale = objectiveText.TextScale = objectiveTitle.TextScale = GUI.Scale; int scaledBorderSize = (int)(borderSize * GUI.Scale); - int scaledTextWidth = 0; - if (textSettings != null) scaledTextWidth = useTextOnRightSide ? (int)(textSettings.Width * GUI.Scale) : scaledVideoResolution.X / 2; + int scaledTextWidth = (int)(textSettings.Width * GUI.Scale); int scaledTitleHeight = (int)(titleHeight * GUI.Scale); int scaledTextHeight = (int)(textHeight * GUI.Scale); int scaledObjectiveFrameHeight = (int)(objectiveFrameHeight * GUI.Scale); @@ -184,21 +180,13 @@ namespace Barotrauma title.RectTransform.NonScaledSize += new Point(scaledTextWidth, scaledTitleHeight); title.RectTransform.AbsoluteOffset = new Point((int)(5 * GUI.Scale), (int)(10 * GUI.Scale)); - if (textSettings != null && !string.IsNullOrEmpty(textSettings.Text)) + if (!string.IsNullOrEmpty(textSettings.Text)) { textSettings.Text = ToolBox.WrapText(textSettings.Text, scaledTextWidth, GUI.Font); int wrappedHeight = textSettings.Text.Split('\n').Length * scaledTextHeight; textFrame.RectTransform.NonScaledSize += new Point(scaledTextWidth + scaledBorderSize, wrappedHeight + scaledBorderSize + scaledButtonSize.Y + scaledTitleHeight); - - if (useTextOnRightSide) - { - textFrame.RectTransform.AbsoluteOffset = new Point(scaledVideoResolution.X + scaledBorderSize * 2, 0); - } - else - { - textFrame.RectTransform.AbsoluteOffset = new Point(0, scaledVideoResolution.Y + scaledBorderSize * 2); - } + textFrame.RectTransform.AbsoluteOffset = new Point(scaledVideoResolution.X + scaledBorderSize * 2, 0); textContent.RectTransform.NonScaledSize += new Point(scaledTextWidth, wrappedHeight); textContent.RectTransform.AbsoluteOffset = new Point(0, scaledBorderSize + scaledTitleHeight); @@ -221,41 +209,22 @@ namespace Barotrauma objectiveTitle.Visible = objectiveText.Visible = false; } + int totalFrameWidth = videoFrame.Rect.Width + textFrame.Rect.Width + scaledBorderSize * 2; + int xOffset = videoFrame.Rect.Width / 2 + scaledBorderSize - (videoFrame.Rect.Width / 2 - textFrame.Rect.Width / 2); + + + videoFrame.RectTransform.AbsoluteOffset = new Point(-xOffset, (int)(50 * GUI.Scale)); + if (okButton != null) { textFrame.RemoveChild(okButton); okButton = null; } - if (textSettings != null) + okButton = new GUIButton(new RectTransform(scaledButtonSize, textFrame.RectTransform, Anchor.BottomRight, Pivot.BottomRight) { AbsoluteOffset = new Point(scaledBorderSize, scaledBorderSize) }, TextManager.Get("OK")) { - if (useTextOnRightSide) - { - int totalFrameWidth = videoFrame.Rect.Width + textFrame.Rect.Width + scaledBorderSize * 2; - int xOffset = videoFrame.Rect.Width / 2 + scaledBorderSize - (videoFrame.Rect.Width / 2 - textFrame.Rect.Width / 2); - videoFrame.RectTransform.AbsoluteOffset = new Point(-xOffset, (int)(50 * GUI.Scale)); - } - else - { - int totalFrameHeight = videoFrame.Rect.Height + textFrame.Rect.Height + scaledBorderSize * 2; - int yOffset = videoFrame.Rect.Height / 2 + scaledBorderSize - (videoFrame.Rect.Height / 2 - textFrame.Rect.Height / 2); - videoFrame.RectTransform.AbsoluteOffset = new Point(0, -yOffset); - } - - okButton = new GUIButton(new RectTransform(scaledButtonSize, textFrame.RectTransform, Anchor.BottomRight, Pivot.BottomRight) { AbsoluteOffset = new Point(scaledBorderSize, scaledBorderSize) }, TextManager.Get("OK")) - { - OnClicked = DisposeVideo - }; - } - else - { - videoFrame.RectTransform.AbsoluteOffset = new Point(0, (int)(100 * GUI.Scale)); - - okButton = new GUIButton(new RectTransform(scaledButtonSize, videoFrame.RectTransform, Anchor.TopLeft, Pivot.TopLeft) { AbsoluteOffset = new Point(scaledBorderSize, scaledBorderSize) }, TextManager.Get("Back")) - { - OnClicked = DisposeVideo - }; - } + OnClicked = DisposeVideo + }; } private Video CreateVideo(Point resolution) @@ -276,7 +245,7 @@ namespace Barotrauma private void DrawVideo(SpriteBatch spriteBatch, Rectangle rect) { - if (!IsPlaying) return; + if (!isPlaying) return; spriteBatch.Draw(currentVideo.GetTexture(), rect, Color.White); } diff --git a/Barotrauma/BarotraumaClient/Source/GameMain.cs b/Barotrauma/BarotraumaClient/Source/GameMain.cs index 7ddb42f09..d795cbaea 100644 --- a/Barotrauma/BarotraumaClient/Source/GameMain.cs +++ b/Barotrauma/BarotraumaClient/Source/GameMain.cs @@ -178,6 +178,10 @@ namespace Barotrauma GUI.KeyboardDispatcher = new EventInput.KeyboardDispatcher(Window); + GUI.KeyboardDispatcher = new EventInput.KeyboardDispatcher(Window); + + + PerformanceCounter = new PerformanceCounter(); PerformanceCounter = new PerformanceCounter(); @@ -521,20 +525,11 @@ namespace Barotrauma } /// - /// Returns the file paths of all files of the given type in the content packages. + /// Returns the file paths of all files of the given type in the currently selected content packages. /// - /// - /// If true, also returns files in content packages that are installed but not currently selected. - public IEnumerable GetFilesOfType(ContentType type, bool searchAllContentPackages = false) + public IEnumerable GetFilesOfType(ContentType type) { - if (searchAllContentPackages) - { - return ContentPackage.GetFilesOfType(ContentPackage.List, type); - } - else - { - return ContentPackage.GetFilesOfType(SelectedPackages, type); - } + return ContentPackage.GetFilesOfType(SelectedPackages, type); } /// @@ -627,12 +622,8 @@ namespace Barotrauma { ((GUIMessageBox)GUIMessageBox.VisibleBox).Close(); } - else if (Tutorial.Initialized && Tutorial.ContentRunning) - { - (GameMain.GameSession.GameMode as TutorialMode).Tutorial.CloseActiveContentGUI(); - } else if ((Character.Controlled?.SelectedConstruction == null || !Character.Controlled.SelectedConstruction.ActiveHUDs.Any(ic => ic.GuiFrame != null)) - && Inventory.SelectedSlot == null && CharacterHealth.OpenHealthWindow == null) + && Inventory.SelectedSlot == null && CharacterHealth.OpenHealthWindow == null) { // Otherwise toggle pausing, unless another window/interface is open. GUI.TogglePauseMenu(); @@ -640,7 +631,7 @@ namespace Barotrauma } GUI.ClearUpdateList(); - paused = (DebugConsole.IsOpen || GUI.PauseMenuOpen || GUI.SettingsMenuOpen || Tutorial.ContentRunning) && + paused = (DebugConsole.IsOpen || GUI.PauseMenuOpen || GUI.SettingsMenuOpen || ContextualTutorial.ContentRunning) && (NetworkMember == null || !NetworkMember.GameStarted); Screen.Selected.AddToGUIUpdateList(); @@ -659,9 +650,9 @@ namespace Barotrauma { Screen.Selected.Update(Timing.Step); } - else if (Tutorial.Initialized && Tutorial.ContentRunning) + else if (ContextualTutorial.Initialized && ContextualTutorial.ContentRunning && GameSession.GameMode is SinglePlayerCampaign) { - (GameSession.GameMode as TutorialMode).Update((float)Timing.Step); + (GameSession.GameMode as SinglePlayerCampaign).ContextualTutorial.Update((float)Timing.Step); } if (NetworkMember != null) @@ -726,7 +717,7 @@ namespace Barotrauma PerformanceCounter.DrawTimeGraph.Update(sw.ElapsedTicks / (float)TimeSpan.TicksPerMillisecond); } - public void ShowCampaignDisclaimer(Action onContinue) + public void ShowCampaignDisclaimer() { var msgBox = new GUIMessageBox(TextManager.Get("CampaignDisclaimerTitle"), TextManager.Get("CampaignDisclaimerText"), new string[] { TextManager.Get("CampaignRoadMapTitle"), TextManager.Get("OK") }); @@ -735,15 +726,13 @@ namespace Barotrauma { var roadMap = new GUIMessageBox(TextManager.Get("CampaignRoadMapTitle"), TextManager.Get("CampaignRoadMapText"), new string[] { TextManager.Get("Back"), TextManager.Get("OK") }); + roadMap.Buttons[0].OnClicked = (_, __) => { ShowCampaignDisclaimer(); return true; }; roadMap.Buttons[0].OnClicked += roadMap.Close; - roadMap.Buttons[0].OnClicked += (_, __) => { ShowCampaignDisclaimer(onContinue); return true; }; roadMap.Buttons[1].OnClicked += roadMap.Close; - roadMap.Buttons[1].OnClicked += (_, __) => { onContinue?.Invoke(); return true; }; return true; }; msgBox.Buttons[0].OnClicked += msgBox.Close; msgBox.Buttons[1].OnClicked += msgBox.Close; - msgBox.Buttons[1].OnClicked += (_, __) => { onContinue?.Invoke(); return true; }; Config.CampaignDisclaimerShown = true; Config.SaveNewPlayerConfig(); @@ -753,13 +742,12 @@ namespace Barotrauma { var msgBox = new GUIMessageBox(TextManager.Get("EditorDisclaimerTitle"), TextManager.Get("EditorDisclaimerText")); var linkHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.25f), msgBox.Content.RectTransform)) { Stretch = true, RelativeSpacing = 0.025f }; - linkHolder.RectTransform.MaxSize = new Point(int.MaxValue, linkHolder.Rect.Height); List> links = new List>() - { - new Pair(TextManager.Get("EditorDisclaimerWikiLink"),TextManager.Get("EditorDisclaimerWikiUrl")), - new Pair(TextManager.Get("EditorDisclaimerDiscordLink"),TextManager.Get("EditorDisclaimerDiscordUrl")), - new Pair(TextManager.Get("EditorDisclaimerForumLink"),TextManager.Get("EditorDisclaimerForumUrl")), - }; + { + new Pair(TextManager.Get("EditorDisclaimerWikiLink"),TextManager.Get("EditorDisclaimerWikiUrl")), + new Pair(TextManager.Get("EditorDisclaimerDiscordLink"),TextManager.Get("EditorDisclaimerDiscordUrl")), + new Pair(TextManager.Get("EditorDisclaimerForumLink"),TextManager.Get("EditorDisclaimerForumUrl")), + }; foreach (var link in links) { new GUIButton(new RectTransform(new Vector2(1.0f, 0.2f), linkHolder.RectTransform), link.First, style: "MainMenuGUIButton", textAlignment: Alignment.Left) @@ -779,6 +767,19 @@ namespace Barotrauma Config.SaveNewPlayerConfig(); } + // ToDo: Move texts/links to localization, when possible. + public void ShowBugReporter() + { + var msgBox = new GUIMessageBox("", ""); + var linkHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), msgBox.Content.RectTransform)) { Stretch = true, RelativeSpacing = 0.05f }; + + msgBox.Text.RectTransform.MaxSize = new Point(int.MaxValue, msgBox.Text.Rect.Height); + linkHolder.RectTransform.MaxSize = new Point(int.MaxValue, linkHolder.Rect.Height); + msgBox.RectTransform.MinSize = new Point(0, msgBox.Rect.Height + linkHolder.Rect.Height + msgBox.Buttons.First().Rect.Height * 8); + Config.EditorDisclaimerShown = true; + Config.SaveNewPlayerConfig(); + } + // ToDo: Move texts/links to localization, when possible. public void ShowBugReporter() { diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs index 8d1b7f83a..73c350584 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs @@ -49,8 +49,6 @@ namespace Barotrauma private GUIComponent orderTargetFrame, orderTargetFrameShadow; - public bool AllowCharacterSwitch = true; - public bool ToggleCrewAreaOpen { get { return toggleCrewAreaOpen; } @@ -65,8 +63,6 @@ namespace Barotrauma } } - public List OrderOptionButtons = new List(); - #endregion #region Constructors @@ -477,10 +473,7 @@ namespace Barotrauma orderButtonFrame.RectTransform; var btn = new GUIButton(new RectTransform(new Point(iconSize, iconSize), btnParent, Anchor.CenterLeft), - style: null) - { - UserData = order - }; + style: null); new GUIFrame(new RectTransform(new Vector2(1.5f), btn.RectTransform, Anchor.Center), "OuterGlow") { @@ -572,7 +565,6 @@ namespace Barotrauma /// public bool CharacterClicked(GUIComponent component, object selection) { - if (!AllowCharacterSwitch) { return false; } Character character = selection as Character; if (character == null || character.IsDead || character.IsUnconscious) return false; SelectCharacter(character); @@ -837,6 +829,12 @@ namespace Barotrauma matchingItems.RemoveAll(it => it.Submarine != submarine && !submarine.DockedTo.Contains(it.Submarine)); matchingItems.RemoveAll(it => it.Submarine != null && it.Submarine.IsOutpost); } + var characterElement = characterListBox.Content.FindChild(character); + GUIButton orderBtn = characterElement.FindChild(order, recursive: true) as GUIButton; + if (orderBtn.Frame.FlashTimer <= 0) + { + orderBtn.Flash(color, 1.5f, false, flashRectInflate); + } //more than one target item -> create a minimap-like selection with a pic of the sub if (matchingItems.Count > 1) @@ -916,12 +914,9 @@ namespace Barotrauma if (Character.Controlled == null) return false; SetCharacterOrder(character, userData as Order, option, Character.Controlled); orderTargetFrame = null; - OrderOptionButtons.Clear(); return true; } }; - - OrderOptionButtons.Add(optionButton); } } @@ -954,13 +949,9 @@ namespace Barotrauma if (Character.Controlled == null) return false; SetCharacterOrder(character, userData as Order, option, Character.Controlled); orderTargetFrame = null; - OrderOptionButtons.Clear(); return true; } }; - - OrderOptionButtons.Add(optionButton); - //lines between the order buttons if (i < order.Options.Length - 1) { @@ -976,24 +967,6 @@ namespace Barotrauma color: matchingItems.Count > 1 ? Color.Black * 0.9f : Color.Black * 0.7f); } - public void HighlightOrderButton(Character character, string orderAiTag, Color color, Vector2? flashRectInflate = null) - { - var order = Order.PrefabList.Find(o => o.AITag == orderAiTag); - if (order == null) - { - DebugConsole.ThrowError("Could not find an order with the AI tag \"" + orderAiTag + "\".\n" + Environment.StackTrace); - return; - } - var characterElement = characterListBox.Content.FindChild(character); - GUIButton orderBtn = characterElement.FindChild(order, recursive: true) as GUIButton; - if (orderBtn.Frame.FlashTimer <= 0) - { - orderBtn.Flash(color, 1.5f, false, flashRectInflate); - } - - //orderBtn.Pulsate(Vector2.One, Vector2.One * 2.0f, 1.5f); - } - #region Updating and drawing the UI private void DrawMiniMapOverlay(SpriteBatch spriteBatch, GUICustomComponent container) @@ -1051,7 +1024,6 @@ namespace Barotrauma public void SelectNextCharacter() { - if (!AllowCharacterSwitch) { return; } if (GameMain.IsMultiplayer) { return; } if (characters.None()) { return; } SelectCharacter(characters[TryAdjustIndex(1)]); @@ -1059,7 +1031,6 @@ namespace Barotrauma public void SelectPreviousCharacter() { - if (!AllowCharacterSwitch) { return; } if (GameMain.IsMultiplayer) { return; } if (characters.None()) { return; } SelectCharacter(characters[TryAdjustIndex(-1)]); @@ -1067,7 +1038,6 @@ namespace Barotrauma private void SelectCharacter(Character character) { - if (!AllowCharacterSwitch) { return; } //make the previously selected character wait in place for some time //(so they don't immediately start idling and walking away from their station) if (Character.Controlled?.AIController?.ObjectiveManager != null) diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/SinglePlayerCampaign.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/SinglePlayerCampaign.cs index 2fd770e74..b4a7414e3 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/SinglePlayerCampaign.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/SinglePlayerCampaign.cs @@ -9,6 +9,8 @@ namespace Barotrauma { class SinglePlayerCampaign : CampaignMode { + public ContextualTutorial ContextualTutorial; + private GUIButton endRoundButton; private bool crewDead; @@ -39,6 +41,13 @@ namespace Barotrauma CrewManager.AddCharacterInfo(new CharacterInfo(Character.HumanConfigFile, "", jobPrefab)); } } + + ContextualTutorial = Tutorial.Tutorials.Find(t => t is ContextualTutorial) as ContextualTutorial; + + if (ContextualTutorial.Selected) // Selected when starting a new game -> initialize + { + ContextualTutorial.Initialize(); + } } public override void Start() @@ -56,6 +65,11 @@ namespace Barotrauma endTimer = 5.0f; isRunning = true; CrewManager.InitSinglePlayerRound(); + + if (ContextualTutorial.Initialized) + { + ContextualTutorial.Start(); + } } public bool TryHireCharacter(Location location, CharacterInfo characterInfo) @@ -148,6 +162,11 @@ namespace Barotrauma base.AddToGUIUpdateList(); CrewManager.AddToGUIUpdateList(); endRoundButton.AddToGUIUpdateList(); + + if (ContextualTutorial.Initialized) + { + ContextualTutorial.AddToGUIUpdateList(); + } } public override void Update(float deltaTime) @@ -156,6 +175,11 @@ namespace Barotrauma base.Update(deltaTime); + if (ContextualTutorial.Initialized) + { + ContextualTutorial.Update(deltaTime); + } + if (!GUI.DisableHUD && !GUI.DisableUpperHUD) { endRoundButton.UpdateManually(deltaTime); @@ -292,6 +316,7 @@ namespace Barotrauma TextManager.Get("QuitButton")); quitButton.OnClicked += GameMain.LobbyScreen.QuitToMainMenu; quitButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Remove(GUIMessageBox.VisibleBox); return true; }; + quitButton.OnClicked += (GUIButton button, object obj) => { if (ContextualTutorial.Initialized) ContextualTutorial.Stop(); return true; }; } } @@ -376,6 +401,10 @@ namespace Barotrauma case "map": campaign.map = Map.LoadNew(subElement); break; + case "contextualtutorial": + campaign.ContextualTutorial.Initialize(); // Initialize when saved element found + campaign.ContextualTutorial.LoadPartiallyComplete(subElement); + break; } } @@ -411,6 +440,12 @@ namespace Barotrauma new XAttribute("cheatsenabled", CheatsEnabled)); CrewManager.Save(modeElement); Map.Save(modeElement); + + if (ContextualTutorial.Initialized) + { + ContextualTutorial.SavePartiallyComplete(modeElement); + } + element.Add(modeElement); } } diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs index 0a0677484..95f619e22 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/BasicTutorial.cs @@ -303,7 +303,7 @@ namespace Barotrauma.Tutorials yield return new WaitForSeconds(1.0f); - infoBox = CreateInfoFrame("", "Uh-oh... Something enormous just appeared on the sonar."); + infoBox = CreateInfoFrame("Uh-oh... Something enormous just appeared on the sonar."); List windows = new List(); foreach (Structure s in Structure.WallList) diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ContextualTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ContextualTutorial.cs index a05c6a835..d8ac5bc80 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ContextualTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ContextualTutorial.cs @@ -1,20 +1,25 @@ -/*using System.Collections.Generic; +using System.Collections.Generic; using System.Xml.Linq; using System; using Microsoft.Xna.Framework; using Barotrauma.Items.Components; using System.Linq; +using Microsoft.Xna.Framework.Input; namespace Barotrauma.Tutorials { class ContextualTutorial : Tutorial { - public ContextualTutorial(XElement element) : base(element) - { - //Name = "ContextualTutorial"; - } - public static bool Selected = false; + public static bool ContentRunning = false; + public static bool Initialized = false; + + private enum ContentTypes { None = 0, Video = 1, TextOnly = 2 }; + + private TutorialSegment activeSegment; + private List segments; + + private VideoPlayer videoPlayer; private Steering navConsole; private Reactor reactor; @@ -28,24 +33,83 @@ namespace Barotrauma.Tutorials private List> characterTimeOnSonar; private float requiredTimeOnSonar = 5f; + private bool started = false; + private string playableContentPath; + private float tutorialTimer; private bool disableTutorialOnDeficiencyFound = true; + private GUIFrame holderFrame, objectiveFrame; + private List activeObjectives = new List(); + private string objectiveTranslated; + private float floodTutorialTimer = 0.0f; private const float floodTutorialDelay = 2.0f; private float medicalTutorialTimer = 0.0f; private const float medicalTutorialDelay = 2.0f; + private Point screenResolution; + private float prevUIScale; + + private class TutorialSegment + { + public string Id; + public string Objective; + public ContentTypes ContentType; + public XElement TextContent; + public XElement VideoContent; + public bool IsTriggered; + public GUIButton ReplayButton; + public GUITextBlock LinkedTitle, LinkedText; + + public TutorialSegment(XElement config) + { + Id = config.GetAttributeString("id", "Missing ID"); + Objective = TextManager.Get(config.GetAttributeString("objective", string.Empty), true); + Enum.TryParse(config.GetAttributeString("contenttype", "None"), true, out ContentType); + IsTriggered = config.GetAttributeBool("istriggered", false); + + switch (ContentType) + { + case ContentTypes.None: + break; + case ContentTypes.Video: + VideoContent = config.Element("Video"); + TextContent = config.Element("Text"); + break; + case ContentTypes.TextOnly: + TextContent = config.Element("Text"); + break; + } + } + } + + public ContextualTutorial(XElement element) : base(element) + { + playableContentPath = element.GetAttributeString("playablecontentpath", ""); + segments = new List(); + + foreach (var segment in element.Elements("Segment")) + { + segments.Add(new TutorialSegment(segment)); + } + + Name = "ContextualTutorial"; + } + public override void Initialize() { - base.Initialize(); - for (int i = 0; i < segments.Count; i++) { segments[i].IsTriggered = false; } + if (Initialized) return; + Initialized = true; + + base.Initialize(); + videoPlayer = new VideoPlayer(); characterTimeOnSonar = new List>(); } @@ -103,7 +167,10 @@ namespace Barotrauma.Tutorials base.Start(); injuredMember = null; - activeContentSegment = null; + activeObjectives.Clear(); + objectiveTranslated = TextManager.Get("Objective"); + CreateObjectiveFrame(); + activeSegment = null; tutorialTimer = floodTutorialTimer = medicalTutorialTimer = 0.0f; subStartingPosition = Vector2.Zero; characterTimeOnSonar.Clear(); @@ -116,10 +183,10 @@ namespace Barotrauma.Tutorials #if DEBUG if (reactor == null || navConsole == null || sonar == null) { - infoBox = CreateInfoFrame("Error", "Submarine not compatible with the tutorial:" + infoBox = CreateInfoFrame("Submarine not compatible with the tutorial:" + "\nReactor - " + (reactor != null ? "OK" : "Tag 'reactor' not found") + "\nNavigation Console - " + (navConsole != null ? "OK" : "Tag 'command' not found") - + "\nSonar - " + (sonar != null ? "OK" : "Not found under Navigation Console"), hasButton: true); + + "\nSonar - " + (sonar != null ? "OK" : "Not found under Navigation Console"), true); CoroutineManager.StartCoroutine(WaitForErrorClosed()); return; } @@ -155,15 +222,62 @@ namespace Barotrauma.Tutorials } #endif - public override void Stop() + public void Stop() { - base.Stop(); + started = ContentRunning = Initialized = false; + videoPlayer.Remove(); + videoPlayer = null; characterTimeOnSonar = null; } + private void CreateObjectiveFrame() + { + holderFrame = new GUIFrame(new RectTransform(new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight), GUI.Canvas, Anchor.Center)); + objectiveFrame = new GUIFrame(HUDLayoutSettings.ToRectTransform(HUDLayoutSettings.ObjectiveAnchor, holderFrame.RectTransform), style: null); + + for (int i = 0; i < activeObjectives.Count; i++) + { + CreateObjectiveGUI(activeObjectives[i], i); + } + + screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight); + prevUIScale = GUI.Scale; + } + + public override void AddToGUIUpdateList() + { + if (videoPlayer != null) + { + videoPlayer.AddToGUIUpdateList(order: 100); + } + + if (GUI.DisableHUD) return; + if (GameMain.GraphicsWidth != screenResolution.X || GameMain.GraphicsHeight != screenResolution.Y || prevUIScale != GUI.Scale) + { + CreateObjectiveFrame(); + } + + if (objectiveFrame != null && activeObjectives.Count > 0) + { + objectiveFrame.AddToGUIUpdateList(order: -1); + } + base.AddToGUIUpdateList(); + } + public override void Update(float deltaTime) { - base.Update(deltaTime); + if (videoPlayer != null) + { + videoPlayer.Update(); + } + + if (infoBox != null) + { + if (PlayerInput.KeyHit(Keys.Enter) || PlayerInput.KeyHit(Keys.Escape)) + { + CloseInfoFrame(null, null); + } + } if (!started || ContentRunning) return; @@ -171,12 +285,93 @@ namespace Barotrauma.Tutorials for (int i = 0; i < segments.Count; i++) { - if (segments[i].IsTriggered || HasObjective(segments[i])) continue; + if (segments[i].IsTriggered || activeObjectives.Contains(segments[i])) continue; if (CheckContextualTutorials(i, deltaTime)) // Found a relevant tutorial, halt finding new ones { break; } } + + for (int i = 0; i < activeObjectives.Count; i++) + { + CheckActiveObjectives(activeObjectives[i], deltaTime); + } + } + + private void ClosePreTextAndTriggerVideoCallback() + { + videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(activeSegment.VideoContent), new VideoPlayer.TextSettings(activeSegment.VideoContent), activeSegment.Id, true, activeSegment.Objective, CurrentSegmentStopCallback); + } + + private void CurrentSegmentStopCallback() + { + if (!string.IsNullOrEmpty(activeSegment.Objective)) + { + AddNewObjective(activeSegment); + } + + activeSegment = null; + ContentRunning = false; + } + + private void AddNewObjective(TutorialSegment segment) + { + activeObjectives.Add(segment); + CreateObjectiveGUI(segment, activeObjectives.Count - 1); + } + + private void CreateObjectiveGUI(TutorialSegment segment, int index) + { + Point replayButtonSize = new Point((int)(GUI.ObjectiveNameFont.MeasureString(segment.Objective).X * GUI.Scale), (int)(GUI.ObjectiveNameFont.MeasureString(segment.Objective).Y * 1.45f * GUI.Scale)); + + segment.ReplayButton = new GUIButton(new RectTransform(replayButtonSize, objectiveFrame.RectTransform, Anchor.TopRight, Pivot.TopRight) { AbsoluteOffset = new Point(0, (replayButtonSize.Y + (int)(20f * GUI.Scale)) * index) }, style: null); + segment.ReplayButton.OnClicked += (GUIButton btn, object userdata) => + { + ReplaySegmentVideo(segment); + return true; + }; + + int yOffset = (int)((GUI.ObjectiveNameFont.MeasureString(objectiveTranslated).Y / 2f + 5) * GUI.Scale); + segment.LinkedTitle = new GUITextBlock(new RectTransform(new Point(replayButtonSize.X, yOffset), segment.ReplayButton.RectTransform, Anchor.Center, Pivot.BottomCenter) { AbsoluteOffset = new Point((int)(10 * GUI.Scale), 0) }, objectiveTranslated, textColor: Color.White, font: GUI.ObjectiveTitleFont, textAlignment: Alignment.CenterRight); + segment.LinkedText = new GUITextBlock(new RectTransform(new Point(replayButtonSize.X, yOffset), segment.ReplayButton.RectTransform, Anchor.Center, Pivot.TopCenter) { AbsoluteOffset = new Point((int)(10 * GUI.Scale), 0) }, segment.Objective, textColor: new Color(4, 180, 108), font: GUI.ObjectiveNameFont, textAlignment: Alignment.CenterRight); + + segment.LinkedTitle.TextScale = segment.LinkedText.TextScale = GUI.Scale; + + segment.LinkedTitle.Color = segment.LinkedTitle.HoverColor = segment.LinkedTitle.PressedColor = segment.LinkedTitle.SelectedColor = Color.Transparent; + segment.LinkedText.Color = segment.LinkedText.HoverColor = segment.LinkedText.PressedColor = segment.LinkedText.SelectedColor = Color.Transparent; + segment.ReplayButton.Color = segment.ReplayButton.HoverColor = segment.ReplayButton.PressedColor = segment.ReplayButton.SelectedColor = Color.Transparent; + } + + private void RemoveCompletedObjective(TutorialSegment objective) + { + objective.IsTriggered = true; + + int checkMarkHeight = (int)(objective.ReplayButton.Rect.Height * 1.2f); + int checkMarkWidth = (int)(checkMarkHeight * 0.93f); + + Color color = new Color(4, 180, 108); + RectTransform rectTA = new RectTransform(new Point(checkMarkWidth, checkMarkHeight), objective.ReplayButton.RectTransform, Anchor.BottomLeft, Pivot.BottomLeft); + rectTA.AbsoluteOffset = new Point(-rectTA.Rect.Width - 5, 0); + GUIImage checkmark = new GUIImage(rectTA, "CheckMark"); + checkmark.Color = color; + + RectTransform rectTB = new RectTransform(new Vector2(1.1f, .8f), objective.LinkedText.RectTransform, Anchor.Center, Pivot.Center); + GUIImage stroke = new GUIImage(rectTB, "Stroke"); + stroke.Color = color; + + CoroutineManager.StartCoroutine(WaitForObjectiveEnd(objective)); + } + + private IEnumerable WaitForObjectiveEnd(TutorialSegment objective) + { + yield return new WaitForSeconds(2.0f); + objectiveFrame.RemoveChild(objective.ReplayButton); + activeObjectives.Remove(objective); + + for (int i = 0; i < activeObjectives.Count; i++) + { + activeObjectives[i].ReplayButton.RectTransform.AbsoluteOffset = new Point(0, (activeObjectives[i].ReplayButton.Rect.Height + 20) * i); + } } private bool CheckContextualTutorials(int index, float deltaTime) @@ -331,7 +526,17 @@ namespace Barotrauma.Tutorials return true; } - protected override void CheckActiveObjectives(TutorialSegment objective, float deltaTime) + private bool HasObjective(string objectiveName) + { + for (int i = 0; i < activeObjectives.Count; i++) + { + if (activeObjectives[i].Id == objectiveName) return true; + } + + return false; + } + + private void CheckActiveObjectives(TutorialSegment objective, float deltaTime) { switch(objective.Id) { @@ -499,9 +704,50 @@ namespace Barotrauma.Tutorials return characterTimeOnSonar.Find(ct => ct.Second >= requiredTimeOnSonar && !ct.First.IsDead) != null; } - protected override void TriggerTutorialSegment(int index, params object[] args) + private void TriggerTutorialSegment(int index, params object[] args) { - base.TriggerTutorialSegment(index, args); + Inventory.draggingItem = null; + ContentRunning = true; + activeSegment = segments[index]; + + string tutorialText = TextManager.GetFormatted(activeSegment.TextContent.GetAttributeString("tag", ""), true, args); + string objectiveText = string.Empty; + + if (!string.IsNullOrEmpty(activeSegment.Objective)) + { + if (args.Length == 0) + { + objectiveText = activeSegment.Objective; + } + else + { + objectiveText = string.Format(activeSegment.Objective, args); + } + + activeSegment.Objective = objectiveText; + } + else + { + activeSegment.IsTriggered = true; // Complete at this stage only if no related objective + } + + switch (activeSegment.ContentType) + { + case ContentTypes.None: + break; + case ContentTypes.Video: + infoBox = CreateInfoFrame(TextManager.Get(activeSegment.Id), tutorialText, + activeSegment.TextContent.GetAttributeInt("width", 300), + activeSegment.TextContent.GetAttributeInt("height", 80), + activeSegment.TextContent.GetAttributeString("anchor", "Center"), true, ClosePreTextAndTriggerVideoCallback); + break; + case ContentTypes.TextOnly: + infoBox = CreateInfoFrame(TextManager.Get(activeSegment.Id), tutorialText, + activeSegment.TextContent.GetAttributeInt("width", 300), + activeSegment.TextContent.GetAttributeInt("height", 80), + activeSegment.TextContent.GetAttributeString("anchor", "Center"), true, CurrentSegmentStopCallback); + break; + } for (int i = 0; i < segments.Count; i++) { @@ -511,10 +757,17 @@ namespace Barotrauma.Tutorials CoroutineManager.StartCoroutine(WaitToStop()); // Completed } + private void ReplaySegmentVideo(TutorialSegment segment) + { + if (ContentRunning) return; + ContentRunning = true; + videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(segment.VideoContent), new VideoPlayer.TextSettings(segment.VideoContent), segment.Id, true, callback: () => ContentRunning = false); + } + private IEnumerable WaitToStop() { while (ContentRunning) yield return null; Stop(); } } -}*/ +} diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ScenarioTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ScenarioTutorial.cs index cbff14dca..025ae979e 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ScenarioTutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/ScenarioTutorial.cs @@ -1,118 +1,44 @@ -using Barotrauma.Items.Components; -using Microsoft.Xna.Framework; -using System; +using System; using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Xml.Linq; namespace Barotrauma.Tutorials { class ScenarioTutorial : Tutorial { - private CoroutineHandle tutorialCoroutine; - private Character character; - private string spawnSub; private SpawnType spawnPointType; private string submarinePath; - private string startOutpostPath; - private string endOutpostPath; private string levelSeed; - private string levelParams; - - private Submarine startOutpost = null; - private Submarine endOutpost = null; - private bool currentTutorialCompleted = false; - private float fadeOutTime = 3f; - protected float waitBeforeFade = 4f; - - // Colors - protected Color highlightColor = Color.OrangeRed; - protected Color uiHighlightColor = new Color(150, 50, 0); - protected Color buttonHighlightColor = new Color(255, 100, 0); - protected Color inaccessibleColor = Color.Red; - protected Color accessibleColor = Color.Green; public ScenarioTutorial(XElement element) : base(element) { submarinePath = element.GetAttributeString("submarinepath", ""); - startOutpostPath = element.GetAttributeString("startoutpostpath", ""); - endOutpostPath = element.GetAttributeString("endoutpostpath", ""); - levelSeed = element.GetAttributeString("levelseed", "tuto"); - levelParams = element.GetAttributeString("levelparams", ""); - - spawnSub = element.GetAttributeString("spawnsub", ""); - Enum.TryParse(element.GetAttributeString("spawnpointtype", "Human"), true, out spawnPointType); + Enum.TryParse(element.GetAttributeString("spawnpointtype", "Human"), true, out spawnPointType); } public override void Initialize() { base.Initialize(); - currentTutorialCompleted = false; GameMain.Instance.ShowLoading(Loading()); } - private IEnumerable Loading() - { - Submarine.MainSub = Submarine.Load(submarinePath, "", true); - - LevelGenerationParams generationParams = LevelGenerationParams.LevelParams.Find(p => p.Name == levelParams); - - yield return CoroutineStatus.Running; - - GameMain.GameSession = new GameSession(Submarine.MainSub, "", - GameModePreset.List.Find(g => g.Identifier == "tutorial")); - (GameMain.GameSession.GameMode as TutorialMode).Tutorial = this; - - if (generationParams != null) - { - Biome biome = LevelGenerationParams.GetBiomes().Find(b => generationParams.AllowedBiomes.Contains(b)); - - if (startOutpostPath != string.Empty) - { - startOutpost = Submarine.Load(startOutpostPath, "", false); - } - - if (endOutpostPath != string.Empty) - { - endOutpost = Submarine.Load(endOutpostPath, "", false); - } - - Level tutorialLevel = new Level(levelSeed, 0, 0, generationParams, biome, startOutpost, endOutpost); - GameMain.GameSession.StartRound(tutorialLevel); - } - else - { - GameMain.GameSession.StartRound(levelSeed); - } - - GameMain.GameSession.EventManager.Events.Clear(); - GameMain.GameSession.EventManager.Enabled = false; - GameMain.GameScreen.Select(); - - yield return CoroutineStatus.Success; - } - public override void Start() { base.Start(); - Submarine.MainSub.GodMode = true; - - CharacterInfo charInfo = configElement.Element("Character") == null ? - new CharacterInfo(Character.HumanConfigFile, "", JobPrefab.List.Find(jp => jp.Identifier == "engineer")) : - new CharacterInfo(configElement.Element("Character")); - - WayPoint wayPoint = GetSpawnPoint(charInfo); - + WayPoint wayPoint = WayPoint.GetRandom(spawnPointType, null); if (wayPoint == null) { DebugConsole.ThrowError("A waypoint with the spawntype \"" + spawnPointType + "\" is required for the tutorial event"); return; } + CharacterInfo charInfo = configElement.Element("Character") == null ? + new CharacterInfo(Character.HumanConfigFile, "", JobPrefab.List.Find(jp => jp.Identifier == "engineer")) : + new CharacterInfo(configElement.Element("Character")); + character = Character.Create(charInfo, wayPoint.WorldPosition, "", false, false); Character.Controlled = character; character.GiveJobItems(null); @@ -126,82 +52,22 @@ namespace Barotrauma.Tutorials idCard.AddTag("com"); idCard.AddTag("eng"); - tutorialCoroutine = CoroutineManager.StartCoroutine(UpdateState()); + CoroutineManager.StartCoroutine(UpdateState()); } - public override void AddToGUIUpdateList() + private IEnumerable Loading() { - if (!currentTutorialCompleted) - { - base.AddToGUIUpdateList(); - } - } + Submarine.MainSub = Submarine.Load(submarinePath, "", true); + yield return CoroutineStatus.Running; - private WayPoint GetSpawnPoint(CharacterInfo charInfo) - { - Submarine spawnSub = null; + GameMain.GameSession = new GameSession(Submarine.MainSub, "", + GameModePreset.List.Find(g => g.Identifier == "tutorial")); + (GameMain.GameSession.GameMode as TutorialMode).tutorial = this; + GameMain.GameSession.StartRound(levelSeed); + GameMain.GameSession.EventManager.Events.Clear(); + GameMain.GameScreen.Select(); - if (this.spawnSub != string.Empty) - { - switch (this.spawnSub) - { - case "startoutpost": - spawnSub = startOutpost; - break; - - case "endoutpost": - spawnSub = endOutpost; - break; - - default: - spawnSub = Submarine.MainSub; - break; - } - } - - return WayPoint.GetRandom(spawnPointType, charInfo.Job, spawnSub); - } - - protected bool HasOrder(Character character, string aiTag, string option = null) - { - if (character.CurrentOrder?.AITag == aiTag) - { - if (option == null) - { - return true; - } - else - { - HumanAIController humanAI = character.AIController as HumanAIController; - return humanAI.CurrentOrderOption == option; - } - } - - return false; - } - - protected void SetHighlight(Item item, bool state) - { - if (item.ExternalHighlight == state) return; - item.SpriteColor = (state) ? highlightColor : Color.White; - item.ExternalHighlight = state; - } - - protected void SetHighlight(Structure structure, bool state) - { - structure.SpriteColor = (state) ? highlightColor : Color.White; - structure.ExternalHighlight = state; - } - - protected void SetHighlight(Character character, bool state) - { - character.ExternalHighlight = state; - } - - protected void SetDoorAccess(Door door, LightComponent light, bool state) - { - if (state && door != null) door.requiredItems.Clear(); - if (light != null) light.LightColor = (state) ? accessibleColor : inaccessibleColor; + yield return CoroutineStatus.Success; } public override void Update(float deltaTime) @@ -209,47 +75,27 @@ namespace Barotrauma.Tutorials base.Update(deltaTime); if (character != null) { - if (character.Oxygen < 1) + if (Character.Controlled == null) { - character.Oxygen = 1; - } - if (character.IsDead) - { - CoroutineManager.StartCoroutine(Dead()); - } - else if (Character.Controlled == null) - { - if (tutorialCoroutine != null) - { - CoroutineManager.StopCoroutines(tutorialCoroutine); - } + CoroutineManager.StopCoroutines("TutorialMode.UpdateState"); infoBox = null; } else if (Character.Controlled.IsDead) { + Character.Controlled = null; + + CoroutineManager.StopCoroutines("TutorialMode.UpdateState"); + infoBox = null; CoroutineManager.StartCoroutine(Dead()); } } } - public override void Stop() - { - if (tutorialCoroutine != null) - { - CoroutineManager.StopCoroutines(tutorialCoroutine); - } - base.Stop(); - } - private IEnumerable Dead() { - GUI.PreventPauseMenuToggle = true; - Character.Controlled = character = null; - Stop(); - yield return new WaitForSeconds(3.0f); - var messageBox = new GUIMessageBox(TextManager.Get("Tutorial.TryAgainHeader"), TextManager.Get("Tutorial.TryAgain"), new string[] { TextManager.Get("Yes"), TextManager.Get("No") }); + var messageBox = new GUIMessageBox("You have died", "Do you want to try again?", new string[] { "Yes", "No" }); messageBox.Buttons[0].OnClicked += Restart; messageBox.Buttons[0].OnClicked += messageBox.Close; @@ -260,29 +106,5 @@ namespace Barotrauma.Tutorials yield return CoroutineStatus.Success; } - - protected IEnumerable TutorialCompleted() - { - GUI.PreventPauseMenuToggle = true; - - Character.Controlled.ClearInputs(); - Character.Controlled = null; - - yield return new WaitForSeconds(waitBeforeFade); - - var endCinematic = new RoundEndCinematic(Submarine.MainSub, GameMain.GameScreen.Cam, fadeOutTime); - currentTutorialCompleted = Completed = true; - while (endCinematic.Running) yield return null; - Stop(); - GameMain.MainMenuScreen.ReturnToMainMenu(null, null); - } - - protected void Heal(Character character) - { - character.SetAllDamage(0.0f, 0.0f, 0.0f); - character.Oxygen = 100.0f; - character.Bloodloss = 0.0f; - character.SetStun(0.0f, true); - } } } diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/Tutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/Tutorial.cs index 0eb1d1d0c..69a5e98c9 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/Tutorial.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/Tutorial.cs @@ -1,74 +1,21 @@ using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Input; using System; using System.Collections.Generic; using System.Reflection; -using System.Linq; using System.Xml.Linq; -using Barotrauma.Items.Components; -using Barotrauma.Extensions; namespace Barotrauma.Tutorials { abstract class Tutorial { - #region Tutorial variables - public static bool Initialized = false; - public static bool ContentRunning = false; public static List Tutorials; - protected bool started = false; protected GUIComponent infoBox; private Action infoBoxClosedCallback; protected XElement configElement; - protected VideoPlayer videoPlayer; - protected enum TutorialContentTypes { None = 0, Video = 1, ManualVideo = 2, TextOnly = 3 }; - protected string playableContentPath; - protected Point screenResolution; - protected float prevUIScale; - - private GUIFrame holderFrame, objectiveFrame; - private List activeObjectives = new List(); - private string objectiveTranslated; - - protected TutorialSegment activeContentSegment; - protected List segments; - - protected class TutorialSegment - { - public string Id; - public string Objective; - public TutorialContentTypes ContentType; - public XElement TextContent; - public XElement VideoContent; - public bool IsTriggered; - public GUIButton ReplayButton; - public GUITextBlock LinkedTitle, LinkedText; - public object[] Args; - - public TutorialSegment(XElement config) - { - Id = config.GetAttributeString("id", "Missing ID"); - Objective = TextManager.Get(config.GetAttributeString("objective", string.Empty), true); - Enum.TryParse(config.GetAttributeString("contenttype", "None"), true, out ContentType); - IsTriggered = config.GetAttributeBool("istriggered", false); - - switch (ContentType) - { - case TutorialContentTypes.None: - break; - case TutorialContentTypes.Video: - case TutorialContentTypes.ManualVideo: - VideoContent = config.Element("Video"); - TextContent = config.Element("Text"); - break; - case TutorialContentTypes.TextOnly: - TextContent = config.Element("Text"); - break; - } - } - } + private enum TutorialType { None, Scenario, Contextual }; + private TutorialType tutorialType = TutorialType.None; public string Name { @@ -87,9 +34,7 @@ namespace Barotrauma.Tutorials GameMain.Config.SaveNewPlayerConfig(); } } - #endregion - #region Tutorial Controls public static void Init() { Tutorials = new List(); @@ -161,85 +106,27 @@ namespace Barotrauma.Tutorials configElement = element; Name = element.GetAttributeString("name", "Unnamed"); completed = GameMain.Config.CompletedTutorialNames.Contains(Name); - playableContentPath = element.GetAttributeString("playablecontentpath", ""); - - segments = new List(); - - foreach (var segment in element.Elements("Segment")) - { - segments.Add(new TutorialSegment(segment)); - } + Enum.TryParse(element.GetAttributeString("tutorialtype", "Scenario"), true, out tutorialType); } public virtual void Initialize() { - if (Initialized) return; - Initialized = true; - videoPlayer = new VideoPlayer(); + } public virtual void Start() { - activeObjectives.Clear(); - objectiveTranslated = TextManager.Get("Tutorial.Objective"); - CreateObjectiveFrame(); - - // Setup doors: Clear all requirements, unless the door is setup as locked. - foreach (var item in Item.ItemList) - { - var door = item.GetComponent(); - if (door != null) - { - if (door.requiredItems.Values.None(ris => ris.None(ri => ri.Identifiers.None(i => i == "locked")))) - { - door.requiredItems.Clear(); - } - } - } + } public virtual void AddToGUIUpdateList() { - if (GameMain.GraphicsWidth != screenResolution.X || GameMain.GraphicsHeight != screenResolution.Y || prevUIScale != GUI.Scale) - { - CreateObjectiveFrame(); - } - - if (objectiveFrame != null && activeObjectives.Count > 0) - { - objectiveFrame.AddToGUIUpdateList(order: -1); - } - if (infoBox != null) infoBox.AddToGUIUpdateList(order: 100); - if (videoPlayer != null) videoPlayer.AddToGUIUpdateList(order: 100); } public virtual void Update(float deltaTime) { - if (videoPlayer != null) - { - videoPlayer.Update(); - } - - if (activeObjectives != null) - { - for (int i = 0; i < activeObjectives.Count; i++) - { - CheckActiveObjectives(activeObjectives[i], deltaTime); - } - } - } - - public void CloseActiveContentGUI() - { - if (videoPlayer.IsPlaying) - { - videoPlayer.Stop(); - } - else if (infoBox != null) - { - CloseInfoFrame(null, null); - } + } public virtual IEnumerable UpdateState() @@ -247,231 +134,6 @@ namespace Barotrauma.Tutorials yield return CoroutineStatus.Success; } - protected bool Restart(GUIButton button, object obj) - { - GUI.PreventPauseMenuToggle = false; - TutorialMode.StartTutorial(this); - return true; - } - - protected virtual void TriggerTutorialSegment(int index, params object[] args) - { - Inventory.draggingItem = null; - ContentRunning = true; - activeContentSegment = segments[index]; - segments[index].Args = args; - - string tutorialText = TextManager.GetFormatted(activeContentSegment.TextContent.GetAttributeString("tag", ""), true, args); - tutorialText = TextManager.ParseInputTypes(tutorialText); - string objectiveText = string.Empty; - - if (!string.IsNullOrEmpty(activeContentSegment.Objective)) - { - if (args.Length == 0) - { - objectiveText = activeContentSegment.Objective; - } - else - { - objectiveText = string.Format(activeContentSegment.Objective, args); - } - objectiveText = TextManager.ParseInputTypes(objectiveText); - activeContentSegment.Objective = objectiveText; - } - else - { - activeContentSegment.IsTriggered = true; // Complete at this stage only if no related objective - } - - - switch (activeContentSegment.ContentType) - { - case TutorialContentTypes.None: - break; - case TutorialContentTypes.Video: - infoBox = CreateInfoFrame(TextManager.Get(activeContentSegment.Id), tutorialText, - activeContentSegment.TextContent.GetAttributeInt("width", 300), - activeContentSegment.TextContent.GetAttributeInt("height", 80), - activeContentSegment.TextContent.GetAttributeString("anchor", "Center"), true, () => LoadVideo(activeContentSegment)); - break; - case TutorialContentTypes.ManualVideo: - infoBox = CreateInfoFrame(TextManager.Get(activeContentSegment.Id), tutorialText, - activeContentSegment.TextContent.GetAttributeInt("width", 300), - activeContentSegment.TextContent.GetAttributeInt("height", 80), - activeContentSegment.TextContent.GetAttributeString("anchor", "Center"), true, StopCurrentContentSegment, () => LoadVideo(activeContentSegment, false)); - break; - case TutorialContentTypes.TextOnly: - infoBox = CreateInfoFrame(TextManager.Get(activeContentSegment.Id), tutorialText, - activeContentSegment.TextContent.GetAttributeInt("width", 300), - activeContentSegment.TextContent.GetAttributeInt("height", 80), - activeContentSegment.TextContent.GetAttributeString("anchor", "Center"), true, StopCurrentContentSegment); - break; - } - } - - public virtual void Stop() - { - started = ContentRunning = Initialized = false; - infoBox = null; - if (videoPlayer != null) - { - videoPlayer.Remove(); - videoPlayer = null; - } - } - #endregion - - #region Objectives - private void CreateObjectiveFrame() - { - holderFrame = new GUIFrame(new RectTransform(new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight), GUI.Canvas, Anchor.Center)); - objectiveFrame = new GUIFrame(HUDLayoutSettings.ToRectTransform(HUDLayoutSettings.ObjectiveAnchor, holderFrame.RectTransform), style: null); - - for (int i = 0; i < activeObjectives.Count; i++) - { - CreateObjectiveGUI(activeObjectives[i], i, activeObjectives[i].ContentType); - } - - screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight); - prevUIScale = GUI.Scale; - } - - protected void StopCurrentContentSegment() - { - if (!string.IsNullOrEmpty(activeContentSegment.Objective)) - { - AddNewObjective(activeContentSegment, activeContentSegment.ContentType); - } - - activeContentSegment = null; - ContentRunning = false; - } - - protected virtual void CheckActiveObjectives(TutorialSegment objective, float deltaTime) - { - - } - - protected bool HasObjective(TutorialSegment segment) - { - return activeObjectives.Contains(segment); - } - - protected void AddNewObjective(TutorialSegment segment, TutorialContentTypes type) - { - activeObjectives.Add(segment); - CreateObjectiveGUI(segment, activeObjectives.Count - 1, type); - } - - private void CreateObjectiveGUI(TutorialSegment segment, int index, TutorialContentTypes type) - { - Point replayButtonSize = new Point((int)(GUI.ObjectiveNameFont.MeasureString(segment.Objective).X * GUI.Scale), (int)(GUI.ObjectiveNameFont.MeasureString(segment.Objective).Y * 1.45f * GUI.Scale)); - - segment.ReplayButton = new GUIButton(new RectTransform(replayButtonSize, objectiveFrame.RectTransform, Anchor.TopRight, Pivot.TopRight) { AbsoluteOffset = new Point(0, (replayButtonSize.Y + (int)(20f * GUI.Scale)) * index) }, style: null); - segment.ReplayButton.OnClicked += (GUIButton btn, object userdata) => - { - if (type == TutorialContentTypes.Video) - { - ReplaySegmentVideo(segment); - } - else - { - ShowSegmentText(segment); - } - return true; - }; - - string objectiveText = TextManager.ParseInputTypes(objectiveTranslated); - int yOffset = (int)((GUI.ObjectiveNameFont.MeasureString(objectiveText).Y / 2f + 5)); - segment.LinkedTitle = new GUITextBlock(new RectTransform(new Point((int)GUI.ObjectiveNameFont.MeasureString(objectiveText).X, yOffset), segment.ReplayButton.RectTransform, Anchor.CenterRight, Pivot.BottomRight) { AbsoluteOffset = new Point((int)(-10 * GUI.Scale), 0) }, - objectiveText, textColor: Color.White, font: GUI.ObjectiveTitleFont, textAlignment: Alignment.CenterRight); - segment.LinkedText = new GUITextBlock(new RectTransform(new Point(replayButtonSize.X, yOffset), segment.ReplayButton.RectTransform, Anchor.Center, Pivot.TopCenter) { AbsoluteOffset = new Point((int)(10 * GUI.Scale), 0) }, - TextManager.ParseInputTypes(segment.Objective), textColor: new Color(4, 180, 108), font: GUI.ObjectiveNameFont, textAlignment: Alignment.CenterRight); - - segment.LinkedTitle.Color = segment.LinkedTitle.HoverColor = segment.LinkedTitle.PressedColor = segment.LinkedTitle.SelectedColor = Color.Transparent; - segment.LinkedText.Color = segment.LinkedText.HoverColor = segment.LinkedText.PressedColor = segment.LinkedText.SelectedColor = Color.Transparent; - segment.ReplayButton.Color = segment.ReplayButton.HoverColor = segment.ReplayButton.PressedColor = segment.ReplayButton.SelectedColor = Color.Transparent; - } - - private void ReplaySegmentVideo(TutorialSegment segment) - { - if (ContentRunning) return; - ContentRunning = true; - videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(segment.VideoContent), new VideoPlayer.TextSettings(segment.VideoContent), segment.Id, true, callback: () => ContentRunning = false); - } - - private void ShowSegmentText(TutorialSegment segment) - { - if (ContentRunning) return; - Inventory.draggingItem = null; - ContentRunning = true; - - string tutorialText = TextManager.GetFormatted(segment.TextContent.GetAttributeString("tag", ""), true, segment.Args); - - Action videoAction = null; - - if (segment.ContentType != TutorialContentTypes.TextOnly) - { - videoAction = () => LoadVideo(segment, false); - } - - infoBox = CreateInfoFrame(TextManager.Get(segment.Id), tutorialText, - segment.TextContent.GetAttributeInt("width", 300), - segment.TextContent.GetAttributeInt("height", 80), - segment.TextContent.GetAttributeString("anchor", "Center"), true, () => ContentRunning = false, videoAction); - } - - protected void RemoveCompletedObjective(TutorialSegment segment) - { - if (!HasObjective(segment)) return; - segment.IsTriggered = true; - segment.ReplayButton.OnClicked = null; - - int checkMarkHeight = (int)(segment.ReplayButton.Rect.Height * 1.2f); - int checkMarkWidth = (int)(checkMarkHeight * 0.93f); - - Color color = new Color(4, 180, 108); - - int objectiveTextWidth = segment.LinkedText.Rect.Width; - int objectiveTitleWidth = segment.LinkedTitle.Rect.Width; - - RectTransform rectTA; - if (objectiveTextWidth > objectiveTitleWidth) - { - rectTA = new RectTransform(new Point(checkMarkWidth, checkMarkHeight), segment.ReplayButton.RectTransform, Anchor.BottomLeft, Pivot.BottomLeft); - rectTA.AbsoluteOffset = new Point(-rectTA.Rect.Width - 5, 0); - } - else - { - rectTA = new RectTransform(new Point(checkMarkWidth, checkMarkHeight), segment.ReplayButton.RectTransform, Anchor.BottomLeft, Pivot.BottomLeft); - rectTA.AbsoluteOffset = new Point(-rectTA.Rect.Width - 5 - (objectiveTitleWidth), 0); - } - - GUIImage checkmark = new GUIImage(rectTA, "CheckMark"); - checkmark.Color = checkmark.SelectedColor = checkmark.HoverColor = checkmark.PressedColor = color; - - RectTransform rectTB = new RectTransform(new Vector2(1.1f, .8f), segment.LinkedText.RectTransform, Anchor.Center, Pivot.Center); - GUIImage stroke = new GUIImage(rectTB, "Stroke"); - stroke.Color = stroke.SelectedColor = stroke.HoverColor = stroke.PressedColor = color; - - CoroutineManager.StartCoroutine(WaitForObjectiveEnd(segment)); - } - - private IEnumerable WaitForObjectiveEnd(TutorialSegment objective) - { - yield return new WaitForSeconds(2.0f); - objectiveFrame.RemoveChild(objective.ReplayButton); - activeObjectives.Remove(objective); - - for (int i = 0; i < activeObjectives.Count; i++) - { - activeObjectives[i].ReplayButton.RectTransform.AbsoluteOffset = new Point(0, (activeObjectives[i].ReplayButton.Rect.Height + 20) * i); - } - } - - #endregion - - #region InfoFrame protected bool CloseInfoFrame(GUIButton button, object userData) { infoBox = null; @@ -479,130 +141,87 @@ namespace Barotrauma.Tutorials return true; } - protected GUIComponent CreateInfoFrame(string title, string text, int width = 300, int height = 80, string anchorStr = "", bool hasButton = false, Action callback = null, Action showVideo = null) + protected GUIComponent CreateInfoFrame(string text, bool hasButton = false, Action callback = null) { - if (hasButton) height += 60; + int width = 300; + int height = hasButton ? 110 : 80; + + string wrappedText = ToolBox.WrapText(text, width, GUI.Font); + + height += wrappedText.Split('\n').Length * 25; + + var infoBlock = new GUIFrame(new RectTransform(new Point(width, height), GUI.Canvas, Anchor.TopRight) { AbsoluteOffset = new Point(20) }); + infoBlock.Flash(Color.Green); + + var textBlock = new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.7f), infoBlock.RectTransform, Anchor.Center), + text, wrap: true); + + infoBoxClosedCallback = callback; + + if (hasButton) + { + var okButton = new GUIButton(new RectTransform(new Point(160, 50), infoBlock.RectTransform, Anchor.BottomCenter, Pivot.TopCenter) { AbsoluteOffset = new Point(0, -10) }, + TextManager.Get("OK")) + { + OnClicked = CloseInfoFrame + }; + } + GUI.PlayUISound(GUISoundType.UIMessage); + + return infoBlock; + } + + protected GUIComponent CreateInfoFrame(string title, string text, int width, int height, string anchorStr, bool hasButton = false, Action callback = null) + { + if (hasButton) height += 30; + string wrappedText = ToolBox.WrapText(text, width, GUI.Font); - height += (int)(GUI.Font.MeasureString(wrappedText).Y + 50); + height += wrappedText.Split('\n').Length * 25; + if (title.Length > 0) { height += 35; } Anchor anchor = Anchor.TopRight; + Enum.TryParse(anchorStr, out anchor); - if (anchorStr != string.Empty) - { - Enum.TryParse(anchorStr, out anchor); - } - - var background = new GUIFrame(new RectTransform(new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight), GUI.Canvas, Anchor.Center), "InnerFrame", new Color(0, 0, 0, 1f)); - - var infoBlock = new GUIFrame(new RectTransform(new Point((int)(width * GUI.Scale), (int)(height * GUI.Scale)), background.RectTransform, anchor) { AbsoluteOffset = new Point(20) }); + var infoBlock = new GUIFrame(new RectTransform(new Point((int)(width * GUI.Scale), (int)(height * GUI.Scale)), GUI.Canvas, anchor) { AbsoluteOffset = new Point(20) }); infoBlock.Flash(Color.Green); - var infoContent = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.8f), infoBlock.RectTransform, Anchor.Center)) - { - Stretch = true, - AbsoluteSpacing = 5 - }; - if (title.Length > 0) { - var titleBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), infoContent.RectTransform), - title, font: GUI.VideoTitleFont, textAlignment: Alignment.Center, textColor: new Color(253, 174, 0)); - titleBlock.RectTransform.IsFixedSize = true; + var titleBlock = new GUITextBlock(new RectTransform(new Vector2(1f, .35f), infoBlock.RectTransform, Anchor.TopCenter, + Pivot.TopCenter), title, font: GUI.VideoTitleFont, textAlignment: Alignment.Center, textColor: new Color(253, 174, 0)); + titleBlock.TextScale = GUI.Scale; } - var textBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), infoContent.RectTransform), text, wrap: true); - textBlock.RectTransform.IsFixedSize = true; + var textBlock = new GUITextBlock(new RectTransform(new Vector2(0.9f, 1f), infoBlock.RectTransform, Anchor.BottomCenter), + text, wrap: true); + textBlock.TextScale = GUI.Scale; infoBoxClosedCallback = callback; if (hasButton) { - var buttonContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.3f), infoContent.RectTransform) { MinSize = new Point(0, 30), MaxSize = new Point((int) infoContent.Rect.X, 60) }, isHorizontal: true) - { - Stretch = true, - RelativeSpacing = 0.1f - }; - buttonContainer.RectTransform.IsFixedSize = true; - - if (showVideo != null) - { - var videoButton = new GUIButton(new RectTransform(new Vector2(0.4f, 1.0f), buttonContainer.RectTransform), - TextManager.Get("Video"), style: "GUIButtonLarge") - { - OnClicked = (GUIButton button, object obj) => - { - showVideo(); - return true; - } - }; - } - - var okButton = new GUIButton(new RectTransform(new Vector2(0.6f, 1.0f), buttonContainer.RectTransform), - TextManager.Get("OK"), style: "GUIButtonLarge") + var okButton = new GUIButton(new RectTransform(new Point(160, 50), infoBlock.RectTransform, Anchor.BottomCenter, Pivot.TopCenter) { AbsoluteOffset = new Point(0, -10) }, + TextManager.Get("OK")) { OnClicked = CloseInfoFrame }; } - infoBlock.RectTransform.NonScaledSize = new Point(infoBlock.Rect.Width, (int)(infoContent.Children.Sum(c => c.Rect.Height + infoContent.AbsoluteSpacing) / infoContent.RectTransform.RelativeSize.Y)); - GUI.PlayUISound(GUISoundType.UIMessage); - return background; - } - #endregion - - #region Video - protected void LoadVideo(TutorialSegment segment, bool showText = true) - { - if (videoPlayer == null) videoPlayer = new VideoPlayer(); - if (showText) - { - videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(segment.VideoContent), new VideoPlayer.TextSettings(segment.VideoContent), segment.Id, true, segment.Objective, StopCurrentContentSegment); - } - else - { - videoPlayer.LoadContent(playableContentPath, new VideoPlayer.VideoSettings(segment.VideoContent), null, segment.Id, true, segment.Objective, null); - } - } - #endregion - - #region Highlights - protected void HighlightInventorySlot(Inventory inventory, string identifier, Color color, float fadeInDuration, float fadeOutDuration, float scaleUpAmount) - { - if (inventory.slots == null) { return; } - for (int i = 0; i < inventory.Items.Length; i++) - { - if (inventory.Items[i] != null && inventory.Items[i].Prefab.Identifier == identifier) - { - HighlightInventorySlot(inventory, i, color, fadeInDuration, fadeOutDuration, scaleUpAmount); - } - } + return infoBlock; } - protected void HighlightInventorySlotWithTag(Inventory inventory, string tag, Color color, float fadeInDuration, float fadeOutDuration, float scaleUpAmount) + protected bool Restart(GUIButton button, object obj) { - if (inventory.slots == null) { return; } - for (int i = 0; i < inventory.Items.Length; i++) - { - if (inventory.Items[i] != null && inventory.Items[i].HasTag(tag)) - { - HighlightInventorySlot(inventory, i, color, fadeInDuration, fadeOutDuration, scaleUpAmount); - } - } + TutorialMode.StartTutorial(this); + return true; } - - protected void HighlightInventorySlot(Inventory inventory, int index, Color color, float fadeInDuration, float fadeOutDuration, float scaleUpAmount) - { - if (inventory.slots == null || index < 0 || inventory.slots[index].HighlightTimer > 0) return; - inventory.slots[index].ShowBorderHighlight(color, fadeInDuration, fadeOutDuration, scaleUpAmount); - } - #endregion } } diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/TutorialMode.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/TutorialMode.cs index 407f742e9..942168cfb 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/TutorialMode.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/TutorialMode.cs @@ -4,7 +4,7 @@ namespace Barotrauma { class TutorialMode : GameMode { - public Tutorial Tutorial; + public Tutorial tutorial; public static void StartTutorial(Tutorial tutorial) { @@ -19,20 +19,18 @@ namespace Barotrauma public override void Start() { base.Start(); - GameMain.GameSession.CrewManager = new CrewManager(true); - Tutorial.Start(); + tutorial.Start(); } public override void AddToGUIUpdateList() { - base.AddToGUIUpdateList(); - Tutorial.AddToGUIUpdateList(); + tutorial.AddToGUIUpdateList(); } public override void Update(float deltaTime) { base.Update(deltaTime); - Tutorial.Update(deltaTime); + tutorial.Update(deltaTime); } } } diff --git a/Barotrauma/BarotraumaClient/Source/GameSettings.cs b/Barotrauma/BarotraumaClient/Source/GameSettings.cs index f3c55c859..90399592b 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSettings.cs @@ -657,15 +657,13 @@ namespace Barotrauma { Stretch = true, RelativeSpacing = 0.02f }; var inputNames = Enum.GetValues(typeof(InputType)); - var inputNameBlocks = new List(); for (int i = 0; i < inputNames.Length; i++) { var inputContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.06f),(i <= (inputNames.Length / 2.2f) ? inputColumnLeft : inputColumnRight).RectTransform)) { Stretch = true, IsHorizontal = true, RelativeSpacing = 0.05f, Color = new Color(12, 14, 15, 215) }; - var inputName = new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), inputContainer.RectTransform, Anchor.TopLeft) { MinSize = new Point(150, 0) }, + new GUITextBlock(new RectTransform(new Vector2(0.3f, 1.0f), inputContainer.RectTransform, Anchor.TopLeft) { MinSize = new Point(150, 0) }, TextManager.Get("InputType." + ((InputType)i)) + ": ", font: GUI.SmallFont) { ForceUpperCase = true }; - inputNameBlocks.Add(inputName); - var keyBox = new GUITextBox(new RectTransform(new Vector2(0.5f, 1.0f), inputContainer.RectTransform), + var keyBox = new GUITextBox(new RectTransform(new Vector2(0.7f, 1.0f), inputContainer.RectTransform), text: keyMapping[i].ToString(), font: GUI.SmallFont) { UserData = i @@ -674,14 +672,12 @@ namespace Barotrauma keyBox.SelectedColor = Color.Gold * 0.3f; } - GUITextBlock.AutoScaleAndNormalize(inputNameBlocks); - var resetControlsHolder = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.07f), controlsLayoutGroup.RectTransform), isHorizontal: true) { RelativeSpacing = 0.02f }; - var defaultBindingsButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), resetControlsHolder.RectTransform), TextManager.Get("SetDefaultBindings")) + new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), resetControlsHolder.RectTransform), TextManager.Get("SetDefaultBindings")) { ToolTip = TextManager.Get("SetDefaultBindingsToolTip"), OnClicked = (button, data) => @@ -691,7 +687,7 @@ namespace Barotrauma } }; - var legacyBindingsButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), resetControlsHolder.RectTransform), TextManager.Get("SetLegacyBindings")) + new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), resetControlsHolder.RectTransform), TextManager.Get("SetLegacyBindings")) { ToolTip = TextManager.Get("SetLegacyBindingsToolTip"), OnClicked = (button, data) => @@ -701,8 +697,6 @@ namespace Barotrauma } }; - GUITextBlock.AutoScaleAndNormalize(defaultBindingsButton.TextBlock, legacyBindingsButton.TextBlock); - //spacing new GUIFrame(new RectTransform(new Vector2(1.0f, 0.02f), generalLayoutGroup.RectTransform), style: null); diff --git a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs index 0ea60b4a5..f32dcb58b 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs @@ -100,7 +100,6 @@ namespace Barotrauma limbSlotIcons.Add(InvSlotType.Head, new Sprite("Content/UI/IconAtlas.png", new Rectangle(896 + margin, 128 + margin, 128 - margin * 2, 128 - margin * 2))); limbSlotIcons.Add(InvSlotType.LeftHand, new Sprite("Content/UI/IconAtlas.png", new Rectangle(640 + margin, 383 + margin, 128 - margin * 2, 128 - margin * 2))); limbSlotIcons.Add(InvSlotType.RightHand, new Sprite("Content/UI/IconAtlas.png", new Rectangle(768 + margin, 383 + margin, 128 - margin * 2, 128 - margin * 2))); - limbSlotIcons.Add(InvSlotType.OuterClothes, new Sprite("Content/UI/IconAtlas.png", new Rectangle(768 + margin, 896 + margin, 128 - margin * 2, 128 - margin * 2))); } SlotPositions = new Vector2[SlotTypes.Length]; CurrentLayout = Layout.Default; @@ -793,7 +792,7 @@ namespace Barotrauma base.Draw(spriteBatch); - if (hideButton != null && hideButton.Visible && !Locked) + if (hideButton != null && hideButton.Visible) { hideButton.DrawManually(spriteBatch, alsoChildren: true); } @@ -835,7 +834,6 @@ namespace Barotrauma color = Color.White; highlightedQuickUseSlot = slots[i]; } - if (Locked) { color *= 0.3f; } var quickUseIndicator = Items[i].AllowedSlots.Any(a => a == InvSlotType.Any) ? EquipIndicator : DropIndicator; diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/LightComponent.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/LightComponent.cs index 7f676175e..141433f4e 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/LightComponent.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/LightComponent.cs @@ -23,7 +23,7 @@ namespace Barotrauma.Items.Components { if (light.LightSprite != null && (item.body == null || item.body.Enabled) && lightBrightness > 0.0f) { - light.LightSprite.Draw(spriteBatch, new Vector2(item.DrawPosition.X, -item.DrawPosition.Y), lightColor * lightBrightness, 0.0f, item.Scale, SpriteEffects.None, item.SpriteDepth - 0.0001f); + light.LightSprite.Draw(spriteBatch, new Vector2(item.DrawPosition.X, -item.DrawPosition.Y), lightColor * lightBrightness, 0.0f, 1.0f, Microsoft.Xna.Framework.Graphics.SpriteEffects.None, item.SpriteDepth - 0.0001f); } } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Deconstructor.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Deconstructor.cs index cb8889292..85150941e 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Deconstructor.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Deconstructor.cs @@ -9,10 +9,6 @@ namespace Barotrauma.Items.Components { partial class Deconstructor : Powered, IServerSerializable, IClientSerializable { - public GUIButton ActivateButton - { - get { return activateButton; } - } private GUIButton activateButton; private GUIComponent inputInventoryHolder, outputInventoryHolder; private GUICustomComponent inputInventoryOverlay; @@ -48,6 +44,7 @@ namespace Barotrauma.Items.Components Visible = false, CanBeFocused = false }; + outputInventoryHolder = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.3f), paddedFrame.RectTransform), style: null); } @@ -74,7 +71,7 @@ namespace Barotrauma.Items.Components public override void UpdateHUD(Character character, float deltaTime, Camera cam) { inSufficientPowerWarning.Visible = powerConsumption > 0 && voltage < minVoltage; - //activateButton.Enabled = !inSufficientPowerWarning.Visible; + activateButton.Enabled = !inSufficientPowerWarning.Visible; } private bool ToggleActive(GUIButton button, object obj) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs index fe1b9aa82..b55286f50 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs @@ -30,25 +30,25 @@ namespace Barotrauma.Items.Components partial void InitProjSpecific(XElement element) { - var content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.8f), GuiFrame.RectTransform, Anchor.Center)) - { - Stretch = true, - RelativeSpacing = 0.05f - }; - - powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), content.RectTransform), + powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), GuiFrame.RectTransform) { RelativeOffset = new Vector2(0.05f, 0.15f) }, TextManager.Get("EnginePowered"), style: "IndicatorLightGreen") { CanBeFocused = false }; string powerLabel = TextManager.Get("EngineForce"); - new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), content.RectTransform), "", textAlignment: Alignment.Center) + new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.3f), GuiFrame.RectTransform, Anchor.BottomCenter) + { RelativeOffset = new Vector2(0.0f, 0.4f) }, "", textAlignment: Alignment.Center) { TextGetter = () => { return powerLabel + ": " + (int)(targetForce) + " %"; } }; - forceSlider = new GUIScrollBar(new RectTransform(new Vector2(1.0f, 0.3f), content.RectTransform), barSize: 0.2f, style: "GUISlider") + var sliderArea = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.25f), GuiFrame.RectTransform, Anchor.BottomCenter) + { RelativeOffset = new Vector2(0.0f, 0.2f) }, isHorizontal: true); + + new GUITextBlock(new RectTransform(new Vector2(0.2f, 1.0f), sliderArea.RectTransform), TextManager.Get("EngineBackwards"), + font: GUI.SmallFont, textAlignment: Alignment.Center); + forceSlider = new GUIScrollBar(new RectTransform(new Vector2(0.6f, 1.0f), sliderArea.RectTransform), barSize: 0.25f, style: "GUISlider") { Step = 0.05f, OnMoved = (GUIScrollBar scrollBar, float barScroll) => @@ -66,16 +66,8 @@ namespace Barotrauma.Items.Components return true; } }; - - var textArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.2f), content.RectTransform), isHorizontal: true) - { - Stretch = true - }; - - new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), textArea.RectTransform), TextManager.Get("EngineBackwards"), - font: GUI.SmallFont, textAlignment: Alignment.CenterLeft); - new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), textArea.RectTransform), TextManager.Get("EngineForwards"), - font: GUI.SmallFont, textAlignment: Alignment.CenterRight); + new GUITextBlock(new RectTransform(new Vector2(0.2f, 1.0f), sliderArea.RectTransform), TextManager.Get("EngineForwards"), + font: GUI.SmallFont, textAlignment: Alignment.Center); foreach (XElement subElement in element.Elements()) { diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Fabricator.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Fabricator.cs index 6b447391c..4dc0b89a1 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Fabricator.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Fabricator.cs @@ -15,10 +15,6 @@ namespace Barotrauma.Items.Components private GUIFrame selectedItemFrame; - public GUIButton ActivateButton - { - get { return activateButton; } - } private GUIButton activateButton; private GUITextBox itemFilterBox; @@ -26,10 +22,6 @@ namespace Barotrauma.Items.Components private GUIComponent inputInventoryHolder, outputInventoryHolder; private GUICustomComponent inputInventoryOverlay, outputInventoryOverlay; - public FabricationRecipe SelectedItem - { - get { return selectedItem; } - } private FabricationRecipe selectedItem; private GUIComponent inSufficientPowerWarning; @@ -81,31 +73,7 @@ namespace Barotrauma.Items.Components { CanBeFocused = false }; - - CreateRecipes(); - - activateButton = new GUIButton(new RectTransform(new Vector2(0.8f, 0.07f), paddedFrame.RectTransform), - TextManager.Get("FabricatorCreate"), style: "GUIButtonLarge") - { - OnClicked = StartButtonClicked, - UserData = selectedItem, - Enabled = false - }; - - inSufficientPowerWarning = new GUITextBlock(new RectTransform(Vector2.One, activateButton.RectTransform), TextManager.Get("FabricatorNoPower"), - textColor: Color.Orange, textAlignment: Alignment.Center, color: Color.Black, style: "OuterGlow") - { - HoverColor = Color.Black, - IgnoreLayoutGroups = true, - Visible = false, - CanBeFocused = false - }; - } - - partial void CreateRecipes() - { - itemList.Content.RectTransform.ClearChildren(); - + foreach (FabricationRecipe fi in fabricationRecipes) { GUIFrame frame = new GUIFrame(new RectTransform(new Point(itemList.Rect.Width, 30), itemList.Content.RectTransform), style: null) @@ -133,6 +101,23 @@ namespace Barotrauma.Items.Components }; } } + + activateButton = new GUIButton(new RectTransform(new Vector2(0.8f, 0.07f), paddedFrame.RectTransform), + TextManager.Get("FabricatorCreate"), style: "GUIButtonLarge") + { + OnClicked = StartButtonClicked, + UserData = selectedItem, + Enabled = false + }; + + inSufficientPowerWarning = new GUITextBlock(new RectTransform(Vector2.One, activateButton.RectTransform), TextManager.Get("FabricatorNoPower"), + textColor: Color.Orange, textAlignment: Alignment.Center, color: Color.Black, style: "OuterGlow") + { + HoverColor = Color.Black, + IgnoreLayoutGroups = true, + Visible = false, + CanBeFocused = false + }; } partial void OnItemLoadedProjSpecific() @@ -164,15 +149,13 @@ namespace Barotrauma.Items.Components return string.Compare(item1.DisplayName, item2.DisplayName); }); - var sufficientSkillsText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), itemList.Content.RectTransform), - TextManager.Get("fabricatorsufficientskills", returnNull: true) ?? "Sufficient skills to fabricate", textColor: Color.LightGreen) + var sufficientSkillsText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), itemList.Content.RectTransform), "Sufficient skills to fabricate:", textColor: Color.LightGreen) { CanBeFocused = false }; sufficientSkillsText.RectTransform.SetAsFirstChild(); - var insufficientSkillsText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), itemList.Content.RectTransform), - TextManager.Get("fabricatorinsufficientskills", returnNull: true) ?? "Insufficient skills to fabricate", textColor: Color.Orange) + var insufficientSkillsText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), itemList.Content.RectTransform), "Insufficient skills to fabricate:", textColor: Color.Orange) { CanBeFocused = false }; @@ -258,7 +241,6 @@ namespace Barotrauma.Items.Components } } } - private void DrawOutputOverLay(SpriteBatch spriteBatch, GUICustomComponent overlayComponent) { overlayComponent.RectTransform.SetAsLastChild(); @@ -381,29 +363,6 @@ namespace Barotrauma.Items.Components return true; } - public void HighlightRecipe(string identifier, Color color) - { - foreach (GUIComponent child in itemList.Content.Children) - { - FabricationRecipe recipe = child.UserData as FabricationRecipe; - if (recipe?.DisplayName == null) { continue; } - if (recipe.TargetItem.Identifier == identifier) - { - if (child.FlashTimer > 0.0f) return; - child.Flash(color, 1.5f, false); - - for (int i = 0; i < child.CountChildren; i++) - { - var grandChild = child.GetChild(i); - if (grandChild is GUITextBlock) continue; - grandChild.Flash(color, 1.5f, false); - } - - return; - } - } - } - private bool StartButtonClicked(GUIButton button, object obj) { if (selectedItem == null) { return false; } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs index 5ef0e010c..b13727818 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs @@ -10,10 +10,6 @@ namespace Barotrauma.Items.Components { partial class Pump : Powered, IServerSerializable, IClientSerializable { - public GUIScrollBar IsActiveSlider - { - get { return isActiveSlider; } - } private GUIScrollBar isActiveSlider; private GUIScrollBar pumpSpeedSlider; private GUITickBox powerIndicator; @@ -53,6 +49,7 @@ namespace Barotrauma.Items.Components }; var sliderHandle = isActiveSlider.GetChild(); sliderHandle.RectTransform.NonScaledSize = new Point(84, sliderHandle.Rect.Height); + isActiveSlider.OnMoved = (GUIScrollBar scrollBar, float barScroll) => { bool active = scrollBar.BarScroll < 0.5f; diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs index 7fa05648b..893943a62 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs @@ -11,16 +11,7 @@ namespace Barotrauma.Items.Components { partial class Reactor : Powered, IServerSerializable, IClientSerializable { - public GUIScrollBar AutoTempSlider - { - get { return autoTempSlider; } - } private GUIScrollBar autoTempSlider; - - public GUIScrollBar OnOffSwitch - { - get { return onOffSwitch; } - } private GUIScrollBar onOffSwitch; private const int GraphSize = 25; @@ -36,16 +27,7 @@ namespace Barotrauma.Items.Components private Sprite graphLine; - public GUIScrollBar FissionRateScrollBar - { - get { return fissionRateScrollBar; } - } private GUIScrollBar fissionRateScrollBar; - - public GUIScrollBar TurbineOutputScrollBar - { - get { return turbineOutputScrollBar; } - } private GUIScrollBar turbineOutputScrollBar; private float[] outputGraph = new float[GraphSize]; @@ -110,8 +92,8 @@ namespace Barotrauma.Items.Components GUIFrame columnLeft = new GUIFrame(new RectTransform(new Vector2(0.2f, 1.0f), paddedFrame.RectTransform), style: null); leftHUDColumn = columnLeft; - GUIFrame columnMid = new GUIFrame(new RectTransform(new Vector2(0.5f, 1.0f), paddedFrame.RectTransform), style: null); - GUIFrame columnRight = new GUIFrame(new RectTransform(new Vector2(0.3f, 1.0f), paddedFrame.RectTransform), style: null); + GUIFrame columnMid = new GUIFrame(new RectTransform(new Vector2(0.45f, 1.0f), paddedFrame.RectTransform), style: null); + GUIFrame columnRight = new GUIFrame(new RectTransform(new Vector2(0.35f, 1.0f), paddedFrame.RectTransform), style: null); //---------------------------------------------------------- //left column @@ -136,7 +118,6 @@ namespace Barotrauma.Items.Components btnText.SetTextPos(); warningButtons.Add(warningTexts[i], warningBtn); } - GUITextBlock.AutoScaleAndNormalize(warningButtons.Values.Select(b => b.TextBlock)); inventoryContainer = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.45f), columnLeft.RectTransform, Anchor.BottomLeft), style: null); @@ -144,37 +125,33 @@ namespace Barotrauma.Items.Components //mid column //---------------------------------------------------------- - criticalHeatWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, 30), columnMid.RectTransform), + criticalHeatWarning = new GUITickBox(new RectTransform(new Point(30, 30), columnMid.RectTransform), TextManager.Get("ReactorWarningCriticalTemp"), font: GUI.SmallFont, style: "IndicatorLightRed") { CanBeFocused = false }; - lowTemperatureWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.27f, 0.0f) }, + lowTemperatureWarning = new GUITickBox(new RectTransform(new Point(30, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.3f, 0.0f) }, TextManager.Get("ReactorWarningCriticalLowTemp"), font: GUI.SmallFont, style: "IndicatorLightRed") { CanBeFocused = false }; - criticalOutputWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.66f, 0.0f) }, + criticalOutputWarning = new GUITickBox(new RectTransform(new Point(30, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.75f, 0.0f) }, TextManager.Get("ReactorWarningCriticalOutput"), font: GUI.SmallFont, style: "IndicatorLightRed") { CanBeFocused = false }; - - GUITextBlock.AutoScaleAndNormalize(criticalHeatWarning.TextBlock, lowTemperatureWarning.TextBlock, criticalOutputWarning.TextBlock); - - float gaugeOffset = criticalHeatWarning.Rect.Height / (float)columnMid.Rect.Height + 0.05f; - new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, gaugeOffset) }, + new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.25f) }, TextManager.Get("ReactorFissionRate")); - new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, gaugeOffset + 0.05f) }, + new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.3f) }, DrawFissionRateMeter, null) { ToolTip = TextManager.Get("ReactorTipFissionRate") }; - new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, gaugeOffset) }, + new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.25f) }, TextManager.Get("ReactorTurbineOutput")); - new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, gaugeOffset + 0.05f) }, + new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.3f) }, DrawTurbineOutputMeter, null) { ToolTip = TextManager.Get("ReactorTipTurbineOutput") @@ -214,13 +191,12 @@ namespace Barotrauma.Items.Components //right column //---------------------------------------------------------- - new GUITextBlock(new RectTransform(new Vector2(0.7f, 0.1f), columnRight.RectTransform), TextManager.Get("ReactorAutoTemp")) + new GUITextBlock(new RectTransform(new Point(100, 20), columnRight.RectTransform), TextManager.Get("ReactorAutoTemp")) { - ToolTip = TextManager.Get("ReactorTipAutoTemp"), - AutoScale = true + ToolTip = TextManager.Get("ReactorTipAutoTemp") }; - autoTempSlider = new GUIScrollBar(new RectTransform(new Vector2(0.6f, 0.15f), columnRight.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.1f) }, - barSize: 0.55f, style: "OnOffSlider") + autoTempSlider = new GUIScrollBar(new RectTransform(new Point(100, 30), columnRight.RectTransform) { AbsoluteOffset = new Point(0, 30) }, + barSize: 0.5f, style: "OnOffSlider") { ToolTip = TextManager.Get("ReactorTipAutoTemp"), IsBooleanSwitch = true, @@ -232,10 +208,8 @@ namespace Barotrauma.Items.Components return true; } }; - var sliderSprite = autoTempSlider.Frame.Style.Sprites[GUIComponent.ComponentState.None].First(); - autoTempSlider.RectTransform.MaxSize = sliderSprite.Sprite.size.ToPoint(); - - onOffSwitch = new GUIScrollBar(new RectTransform(new Vector2(0.4f, 0.3f), columnRight.RectTransform, Anchor.TopRight), + + onOffSwitch = new GUIScrollBar(new RectTransform(new Point(50, 80), columnRight.RectTransform, Anchor.TopRight), barSize: 0.2f, style: "OnOffLever") { IsBooleanSwitch = true, @@ -248,8 +222,6 @@ namespace Barotrauma.Items.Components return true; } }; - var switchSprite = onOffSwitch.Frame.Style.Sprites[GUIComponent.ComponentState.None].First(); - onOffSwitch.RectTransform.MaxSize = switchSprite.Sprite.size.ToPoint(); var lever = onOffSwitch.GetChild(); lever.RectTransform.NonScaledSize = new Point(lever.Rect.Width + 30, lever.Rect.Height); diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs index 0c7c9c058..557a747f3 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs @@ -20,10 +20,6 @@ namespace Barotrauma.Items.Components private bool unsentChanges; private float networkUpdateTimer; - public GUITickBox ActiveTickBox - { - get { return activeTickBox; } - } private GUITickBox activeTickBox, passiveTickBox; private GUITextBlock signalWarningText; @@ -64,6 +60,8 @@ namespace Barotrauma.Items.Components new Color(255, 255, 255) }; + private float prevDockingDist; + public Vector2 DisplayOffset { get; private set; } public float DisplayRadius { get; private set; } @@ -285,8 +283,31 @@ namespace Barotrauma.Items.Components sonarBlips.Add(flowBlip); } } - } - + } + + Steering steering = item.GetComponent(); + if (steering != null && steering.DockingModeEnabled) + { + float dockingDist = Vector2.Distance(steering.DockingSource.Item.WorldPosition, steering.DockingTarget.Item.WorldPosition); + if (prevDockingDist > steering.DockingAssistThreshold && dockingDist <= steering.DockingAssistThreshold) + { + zoom = Math.Max(zoom, MathHelper.Lerp(MinZoom, MaxZoom, 0.5f)); + } + else if (prevDockingDist > steering.DockingAssistThreshold * 0.6f && dockingDist <= steering.DockingAssistThreshold * 0.6f) + { + zoom = Math.Max(zoom, MathHelper.Lerp(MinZoom, MaxZoom, 0.75f)); + } + else if (prevDockingDist > steering.DockingAssistThreshold * 0.3f && dockingDist <= steering.DockingAssistThreshold * 0.3f) + { + zoom = Math.Max(zoom, MaxZoom); + } + prevDockingDist = Math.Min(dockingDist, prevDockingDist); + } + else + { + prevDockingDist = float.MaxValue; + } + if (IsActive) { float pingRadius = DisplayRadius * pingState / zoom; @@ -370,7 +391,6 @@ namespace Barotrauma.Items.Components DisplayOffset = Vector2.Zero; } - if (sonarBlips.Count > 0) { zoomSqrt = (float)Math.Sqrt(zoom); @@ -535,61 +555,12 @@ namespace Barotrauma.Items.Components Steering steering = item.GetComponent(); if (steering != null && steering.DockingModeEnabled) { - DisplayOffset = - Vector2.Lerp(DisplayOffset, - (steering.DockingSource.Item.WorldPosition + steering.DockingTarget.Item.WorldPosition) / 2.0f - transducerCenter, - 0.1f); - transducerCenter += DisplayOffset; - - Vector2 sourcePortDiff = (steering.DockingSource.Item.WorldPosition - transducerCenter) * scale; - Vector2 sourcePortPos = new Vector2(sourcePortDiff.X, -sourcePortDiff.Y); - Vector2 targetPortDiff = (steering.DockingTarget.Item.WorldPosition - transducerCenter) * scale; - Vector2 targetPortPos = new Vector2(targetPortDiff.X, -targetPortDiff.Y); - - Vector2 midPos = (sourcePortPos + targetPortPos) / 2.0f; - - System.Diagnostics.Debug.Assert(steering.DockingSource.IsHorizontal == steering.DockingTarget.IsHorizontal); - - float xDist = Math.Abs(steering.DockingSource.Item.WorldPosition.X - steering.DockingTarget.Item.WorldPosition.X); - float normalizedXDist = xDist / steering.DockingSource.DistanceTolerance.X; - float yDist = Math.Abs(steering.DockingSource.Item.WorldPosition.Y - steering.DockingTarget.Item.WorldPosition.Y); - float normalizedYDist = yDist / steering.DockingSource.DistanceTolerance.Y; - - Color xColor = normalizedXDist <= 1.0f ? Color.Lime : Color.Lerp(Color.Orange, Color.Red, normalizedXDist - 1.0f); - Color yColor = normalizedYDist <= 1.0f ? Color.Lime : Color.Lerp(Color.Orange, Color.Red, normalizedYDist - 1.0f); - - if (steering.DockingSource.IsHorizontal) - { - if (yDist < steering.DockingSource.DistanceTolerance.Y) - { - DrawLine(spriteBatch, sourcePortPos, new Vector2(targetPortPos.X, sourcePortPos.Y), xColor, width: 3); - } - else - { - DrawLine(spriteBatch, sourcePortPos, new Vector2(midPos.X, sourcePortPos.Y), xColor, width: 3); - DrawLine(spriteBatch, targetPortPos, new Vector2(midPos.X, targetPortPos.Y), xColor, width: 3); - DrawLine(spriteBatch, new Vector2(midPos.X, sourcePortPos.Y), new Vector2(midPos.X, targetPortPos.Y), yColor, width: 3); - } - } - else - { - if (xDist < steering.DockingSource.DistanceTolerance.X) - { - DrawLine(spriteBatch, sourcePortPos, new Vector2(sourcePortPos.X, targetPortPos.Y), yColor, width: 3); - } - else - { - DrawLine(spriteBatch, sourcePortPos, new Vector2(sourcePortPos.X, midPos.Y), yColor, width: 3); - DrawLine(spriteBatch, targetPortPos, new Vector2(targetPortPos.X, midPos.Y), yColor, width: 3); - DrawLine(spriteBatch, new Vector2(sourcePortPos.X, midPos.Y), new Vector2(targetPortPos.X, midPos.Y), xColor, width: 3); - } - } + DrawDockingIndicator(spriteBatch, steering, ref transducerCenter); } else { DisplayOffset = Vector2.Lerp(DisplayOffset, Vector2.Zero, 0.1f); - } - + } foreach (DockingPort dockingPort in DockingPort.List) { @@ -610,7 +581,101 @@ namespace Barotrauma.Items.Components } GUI.DrawLine(spriteBatch, center + offset - size / 2, center + offset + size / 2, Color.LightGreen, width: (int)(zoom)); } + } + private void DrawDockingIndicator(SpriteBatch spriteBatch, Steering steering, ref Vector2 transducerCenter) + { + float scale = displayScale * zoom; + + Vector2 worldFocusPos = (steering.DockingSource.Item.WorldPosition + steering.DockingTarget.Item.WorldPosition) / 2.0f; + worldFocusPos.X = steering.DockingTarget.Item.WorldPosition.X; + + DisplayOffset = Vector2.Lerp(DisplayOffset, worldFocusPos - transducerCenter, 0.1f); + transducerCenter += DisplayOffset; + + Vector2 sourcePortDiff = (steering.DockingSource.Item.WorldPosition - transducerCenter) * scale; + Vector2 sourcePortPos = new Vector2(sourcePortDiff.X, -sourcePortDiff.Y); + Vector2 targetPortDiff = (steering.DockingTarget.Item.WorldPosition - transducerCenter) * scale; + Vector2 targetPortPos = new Vector2(targetPortDiff.X, -targetPortDiff.Y); + + Vector2 midPos = (sourcePortPos + targetPortPos) / 2.0f; + + System.Diagnostics.Debug.Assert(steering.DockingSource.IsHorizontal == steering.DockingTarget.IsHorizontal); + float dist = Vector2.Distance(steering.DockingSource.Item.WorldPosition, steering.DockingTarget.Item.WorldPosition); + dist *= Physics.DisplayToRealWorldRatio; + + Vector2 dockingDir = Vector2.Normalize(sourcePortPos - targetPortPos); + if (steering.DockingSource.IsHorizontal) + { + dockingDir = new Vector2(Math.Sign(dockingDir.X), 0.0f); + } + else + { + dockingDir = new Vector2(0.0f, Math.Sign(dockingDir.Y)); + } + + Color staticLineColor = Color.White * 0.8f; + + float sector = MathHelper.ToRadians(MathHelper.Lerp(10.0f, 45.0f, MathHelper.Clamp(dist / 20.0f, 0.0f, 1.0f))); + float sectorLength = DisplayRadius; + //use law of cosines to calculate the length of the center line + float midLength = (float)(Math.Cos(sector) * sectorLength); + + Vector2 midNormal = new Vector2(-dockingDir.Y, dockingDir.X); + + DrawLine(spriteBatch, targetPortPos, targetPortPos + dockingDir * midLength, staticLineColor, width: 2); + DrawLine(spriteBatch, targetPortPos, + targetPortPos + MathUtils.RotatePoint(dockingDir, sector) * sectorLength, staticLineColor, width: 2); + DrawLine(spriteBatch, targetPortPos, + targetPortPos + MathUtils.RotatePoint(dockingDir, -sector) * sectorLength, staticLineColor, width: 2); + + for (float z = 0; z < 1.0f; z += 0.1f * zoom) + { + Vector2 linePos = targetPortPos + dockingDir * midLength * z; + DrawLine(spriteBatch, linePos + midNormal * 3.0f, linePos - midNormal * 3.0f, staticLineColor, width: 2); + } + + + float indicatorSector = sector * 0.75f; + float indicatorSectorLength = (float)(midLength / Math.Cos(indicatorSector)); + + bool withinSector = + Vector2.Dot(dockingDir, MathUtils.RotatePoint(dockingDir, indicatorSector)) < + Vector2.Dot(dockingDir, Vector2.Normalize(steering.DockingSource.Item.WorldPosition - steering.DockingTarget.Item.WorldPosition)); + + Color indicatorColor = withinSector ? Color.LightGreen * 0.9f : Color.Red * 0.9f; + + DrawLine(spriteBatch, targetPortPos, + targetPortPos + MathUtils.RotatePoint(dockingDir,indicatorSector) * indicatorSectorLength, indicatorColor, width: 2); + DrawLine(spriteBatch, targetPortPos, + targetPortPos + MathUtils.RotatePoint(dockingDir, -indicatorSector) * indicatorSectorLength, indicatorColor, width: 2); + + /*if (steering.DockingSource.IsHorizontal) + { + if (yDist < steering.DockingSource.DistanceTolerance.Y) + { + DrawLine(spriteBatch, sourcePortPos, new Vector2(targetPortPos.X, sourcePortPos.Y), xColor, width: 3); + } + else + { + DrawLine(spriteBatch, sourcePortPos, new Vector2(midPos.X, sourcePortPos.Y), xColor, width: 3); + DrawLine(spriteBatch, targetPortPos, new Vector2(midPos.X, targetPortPos.Y), xColor, width: 3); + DrawLine(spriteBatch, new Vector2(midPos.X, sourcePortPos.Y), new Vector2(midPos.X, targetPortPos.Y), yColor, width: 3); + } + } + else + { + if (xDist < steering.DockingSource.DistanceTolerance.X) + { + DrawLine(spriteBatch, sourcePortPos, new Vector2(sourcePortPos.X, targetPortPos.Y), yColor, width: 3); + } + else + { + DrawLine(spriteBatch, sourcePortPos, new Vector2(sourcePortPos.X, midPos.Y), yColor, width: 3); + DrawLine(spriteBatch, targetPortPos, new Vector2(targetPortPos.X, midPos.Y), yColor, width: 3); + DrawLine(spriteBatch, new Vector2(sourcePortPos.X, midPos.Y), new Vector2(targetPortPos.X, midPos.Y), xColor, width: 3); + } + }*/ } private void UpdateDisruptions(Vector2 pingSource, float worldPingRadius, float worldPrevPingRadius) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs index acc8ce7cc..53df689c9 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs @@ -38,8 +38,6 @@ namespace Barotrauma.Items.Components private Vector2 keyboardInput = Vector2.Zero; private float inputCumulation; - private bool? swapDestinationOrder; - private bool levelStartSelected; public bool LevelStartSelected { @@ -425,15 +423,6 @@ namespace Barotrauma.Items.Components public override void UpdateHUD(Character character, float deltaTime, Camera cam) { - if (swapDestinationOrder == null) - { - swapDestinationOrder = item.Submarine != null && item.Submarine.FlippedX; - if (swapDestinationOrder.Value) - { - levelStartTickBox.RectTransform.SetAsLastChild(); - } - } - if (steerArea.Rect.Contains(PlayerInput.MousePosition)) { if (!PlayerInput.KeyDown(InputType.Deselect) && !PlayerInput.KeyHit(InputType.Deselect)) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs index 5cde6d3ec..ddd2ffb29 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Repairable.cs @@ -10,10 +10,6 @@ namespace Barotrauma.Items.Components { partial class Repairable : ItemComponent, IDrawableComponent { - public GUIButton RepairButton - { - get { return repairButton; } - } private GUIButton repairButton; private GUIProgressBar progressBar; diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs index f5a3c8999..53c247abe 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs @@ -18,14 +18,6 @@ namespace Barotrauma.Items.Components private static Wire draggingConnected; - private Color flashColor; - private float flashDuration = 1.5f; - public float FlashTimer - { - get { return flashTimer; } - } - private float flashTimer; - public static void DrawConnections(SpriteBatch spriteBatch, ConnectionPanel panel, Character character) { Rectangle panelRect = panel.GuiFrame.Rect; @@ -182,38 +174,14 @@ namespace Barotrauma.Items.Components } } } - - if (flashTimer > 0.0f) - { - //the number of flashes depends on the duration, 1 flash per 1 full second - int flashCycleCount = (int)Math.Max(flashDuration, 1); - float flashCycleDuration = flashDuration / flashCycleCount; - - //MathHelper.Pi * 0.8f -> the curve goes from 144 deg to 0, - //i.e. quickly bumps up from almost full brightness to full and then fades out - connectionSpriteHighlight.Draw(spriteBatch, position, flashColor * (float)Math.Sin(flashTimer % flashCycleDuration / flashCycleDuration * MathHelper.Pi * 0.8f)); - } - + if (Wires.Any(w => w != null && w != draggingConnected)) { int screwIndex = (int)Math.Floor(position.Y / 30.0f) % screwSprites.Count; screwSprites[screwIndex].Draw(spriteBatch, position); } } - - public void Flash(Color? color = null, float flashDuration = 1.5f) - { - flashTimer = flashDuration; - this.flashDuration = flashDuration; - flashColor = (color == null) ? Color.Red : (Color)color; - } - - public void UpdateFlashTimer(float deltaTime) - { - if (flashTimer <= 0) return; - flashTimer -= deltaTime; - } - + private static void DrawWire(SpriteBatch spriteBatch, Wire wire, Item item, Vector2 end, Vector2 start, bool mouseIn, Wire equippedWire, ConnectionPanel panel, string label) { if (draggingConnected == wire) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/CustomInterface.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/CustomInterface.cs index 124992e2c..fe1fbc065 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/CustomInterface.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/CustomInterface.cs @@ -92,25 +92,6 @@ namespace Barotrauma.Items.Components } } - public void HighlightElement(int index, Color color, float duration, float pulsateAmount = 0.0f) - { - if (index < 0 || index >= uiElements.Count) { return; } - uiElements[index].Flash(color, duration); - - if (pulsateAmount > 0.0f) - { - if (uiElements[index] is GUIButton button) - { - button.Frame.Pulsate(Vector2.One, Vector2.One * (1.0f + pulsateAmount), duration); - button.Frame.RectTransform.SetPosition(Anchor.Center); - } - else - { - uiElements[index].Pulsate(Vector2.One, Vector2.One * (1.0f + pulsateAmount), duration); - } - } - } - partial void UpdateLabelsProjSpecific() { for (int i = 0; i < labels.Length && i < uiElements.Count; i++) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs index e3c4ea985..30eaf8155 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs @@ -26,7 +26,6 @@ namespace Barotrauma public Color Color; public Color HighlightColor; - public float HighlightScaleUpAmount; private CoroutineHandle highlightCoroutine; public float HighlightTimer; @@ -81,7 +80,7 @@ namespace Barotrauma return rect.Contains(PlayerInput.MousePosition); } - public void ShowBorderHighlight(Color color, float fadeInDuration, float fadeOutDuration, float scaleUpAmount = 0.5f) + public void ShowBorderHighlight(Color color, float fadeInDuration, float fadeOutDuration) { if (highlightCoroutine != null) { @@ -89,7 +88,6 @@ namespace Barotrauma highlightCoroutine = null; } - HighlightScaleUpAmount = scaleUpAmount; highlightCoroutine = CoroutineManager.StartCoroutine(UpdateBorderHighlight(color, fadeInDuration, fadeOutDuration)); } @@ -802,7 +800,8 @@ namespace Barotrauma if (slot.HighlightColor.A > 0) { - float inflateAmount = (slot.HighlightColor.A / 255.0f) * slot.HighlightScaleUpAmount * 0.5f; + float scaleUpAmount = 0.5f; + float inflateAmount = (slot.HighlightColor.A / 255.0f) * scaleUpAmount * 0.5f; rect.Inflate(rect.Width * inflateAmount, rect.Height * inflateAmount); } @@ -820,9 +819,8 @@ namespace Barotrauma else { Sprite slotSprite = slot.SlotSprite ?? slotSpriteSmall; - Color slotColor = slot.IsHighlighted ? Color.White : Color.White * 0.8f; - if (inventory != null && inventory.Locked) { slotColor = Color.Gray * 0.5f; } - spriteBatch.Draw(slotSprite.Texture, rect, slotSprite.SourceRect, slotColor); + + spriteBatch.Draw(slotSprite.Texture, rect, slotSprite.SourceRect, slot.IsHighlighted ? Color.White : Color.White * 0.8f); if (item != null && drawItem) { @@ -874,17 +872,14 @@ namespace Barotrauma } indicatorSprite.Draw(spriteBatch, containedIndicatorArea.Center.ToVector2(), - (inventory != null && inventory.Locked) ? Color.DarkGray * 0.5f : Color.DarkGray * 0.9f, + Color.DarkGray * 0.9f, origin: indicatorSprite.size / 2, rotate: 0.0f, scale: indicatorScale); - - Color indicatorColor = ToolBox.GradientLerp(containedState, Color.Red, Color.Orange, Color.Green); - if (inventory != null && inventory.Locked) { indicatorColor *= 0.5f; } - + spriteBatch.Draw(indicatorSprite.Texture, containedIndicatorArea.Center.ToVector2(), sourceRectangle: new Rectangle(indicatorSprite.SourceRect.Location, new Point((int)(indicatorSprite.SourceRect.Width * containedState), indicatorSprite.SourceRect.Height)), - color: indicatorColor, + color: ToolBox.GradientLerp(containedState, Color.Red, Color.Orange, Color.Green), rotation: 0.0f, origin: indicatorSprite.size / 2, scale: indicatorScale, @@ -924,7 +919,6 @@ namespace Barotrauma } Color spriteColor = sprite == item.Sprite ? item.GetSpriteColor() : item.GetInventoryIconColor(); - if (inventory != null && inventory.Locked) { spriteColor *= 0.5f; } if (CharacterHealth.OpenHealthWindow != null && !item.UseInHealthInterface) { spriteColor = Color.Lerp(spriteColor, Color.TransparentBlack, 0.5f); @@ -936,10 +930,7 @@ namespace Barotrauma sprite.Draw(spriteBatch, itemPos, spriteColor, rotation, scale); } - if (inventory != null && - !inventory.Locked && - Character.Controlled?.Inventory == inventory && - slot.QuickUseKey != Keys.None) + if (inventory != null && Character.Controlled?.Inventory == inventory && slot.QuickUseKey != Keys.None) { GUI.DrawString(spriteBatch, rect.Location.ToVector2(), slot.QuickUseKey.ToString().Substring(1, 1), diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs index 2c5e3b5cc..501f023e5 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs @@ -184,7 +184,7 @@ namespace Barotrauma if (!Visible || (!editing && hiddenInGame)) return; if (editing && !ShowItems) return; - Color color = IsHighlighted && !GUI.DisableItemHighlights && Screen.Selected != GameMain.GameScreen ? Color.Orange : GetSpriteColor(); + Color color = isHighlighted && !GUI.DisableItemHighlights && Screen.Selected != GameMain.GameScreen ? Color.Orange : GetSpriteColor(); //if (IsSelected && editing) color = Color.Lerp(color, Color.Gold, 0.5f); BrokenItemSprite fadeInBrokenSprite = null; diff --git a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs index 252662461..6f5fad842 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs @@ -326,6 +326,33 @@ namespace Barotrauma Color.Green, width: 2); } } + + foreach (MapEntity e in linkedTo) + { + if (e is Hull) + { + Hull linkedHull = (Hull)e; + Rectangle connectedHullRect = e.Submarine == null ? + linkedHull.rect : + new Rectangle( + (int)(Submarine.DrawPosition.X + linkedHull.WorldPosition.X), + (int)(Submarine.DrawPosition.Y + linkedHull.WorldPosition.Y), + linkedHull.WorldRect.Width, linkedHull.WorldRect.Height); + + //center of the hull + Rectangle currentHullRect = Submarine == null ? + WorldRect : + new Rectangle( + (int)(Submarine.DrawPosition.X + WorldPosition.X), + (int)(Submarine.DrawPosition.Y + WorldPosition.Y), + WorldRect.Width, WorldRect.Height); + + GUI.DrawLine(spriteBatch, + new Vector2(currentHullRect.X, -currentHullRect.Y), + new Vector2(connectedHullRect.X, -connectedHullRect.Y), + Color.Green, width: 2); + } + } } public static void UpdateVertices(GraphicsDevice graphicsDevice, Camera cam, WaterRenderer renderer) diff --git a/Barotrauma/BarotraumaClient/Source/Map/ItemAssemblyPrefab.cs b/Barotrauma/BarotraumaClient/Source/Map/ItemAssemblyPrefab.cs index 02184babd..7c8bfc1e6 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/ItemAssemblyPrefab.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/ItemAssemblyPrefab.cs @@ -22,7 +22,7 @@ namespace Barotrauma drawRect = new Rectangle( (int)(drawRect.X * scale) + drawArea.Center.X, -((int)((drawRect.Y - drawRect.Height) * scale) + drawArea.Center.Y), (int)(drawRect.Width * scale), (int)(drawRect.Height * scale)); - entity.First.DrawPlacing(spriteBatch, drawRect, entity.First.Scale * scale); + entity.First.DrawPlacing(spriteBatch, drawRect, scale); } } @@ -34,7 +34,7 @@ namespace Barotrauma { Rectangle drawRect = entity.Second; drawRect.Location += Submarine.MouseToWorldGrid(cam, Submarine.MainSub).ToPoint(); - entity.First.DrawPlacing(spriteBatch, drawRect, entity.First.Scale); + entity.First.DrawPlacing(spriteBatch, drawRect); } } diff --git a/Barotrauma/BarotraumaClient/Source/Map/Structure.cs b/Barotrauma/BarotraumaClient/Source/Map/Structure.cs index 99b7bbedd..8d893af08 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Structure.cs @@ -1,9 +1,6 @@ using Barotrauma.Extensions; using Barotrauma.Lights; using Barotrauma.Networking; -using FarseerPhysics; -using FarseerPhysics.Dynamics; -using FarseerPhysics.Dynamics.Contacts; using Lidgren.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -45,21 +42,7 @@ namespace Barotrauma MathHelper.Clamp(value.Y, 0.01f, 10)); } } - - private string specialTag; - [Editable, Serialize("", true)] - public string SpecialTag - { - get { return specialTag; } - set { specialTag = value; } - } - - // Only for testing in the debug build. Not saved. -#if DEBUG - [Editable, Serialize(true, false)] -#endif - public bool DrawTiled { get; protected set; } = true; - + protected Vector2 textureOffset = Vector2.Zero; [Editable(MinValueFloat = -1000f, MaxValueFloat = 1000f, ValueStep = 10f), Serialize("0.0, 0.0", true)] public Vector2 TextureOffset @@ -168,20 +151,6 @@ namespace Barotrauma { Vector2 pos = ConvertUnits.ToDisplayUnits(f2.Body.Position); - int section = FindSectionIndex(pos); - if (section > -1) - { - Vector2 normal = contact.Manifold.LocalNormal; - - float impact = Vector2.Dot(f2.Body.LinearVelocity, -normal) * f2.Body.Mass * 0.1f; - if (impact > 10.0f) - { - SoundPlayer.PlayDamageSound("StructureBlunt", impact, SectionPosition(section, true), tags: Tags); - } - } - } - } - public override bool IsVisible(Rectangle worldView) { Rectangle worldRect = WorldRect; @@ -218,7 +187,7 @@ namespace Barotrauma if (HasBody && !ShowWalls) return; } - Color color = IsHighlighted ? Color.Orange : spriteColor; + Color color = isHighlighted ? Color.Orange : spriteColor; if (IsSelected && editing) { //color = Color.Lerp(color, Color.Gold, 0.5f); diff --git a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs index 3cbe63212..e0e35f159 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs @@ -1079,8 +1079,6 @@ namespace Barotrauma.Networking bool isTraitor = inc.ReadBoolean(); string traitorTargetName = isTraitor ? inc.ReadString() : null; - bool allowRagdollButton = inc.ReadBoolean(); - serverSettings.ReadMonsterEnabled(inc); GameModePreset gameMode = GameModePreset.List.Find(gm => gm.Identifier == modeIdentifier); @@ -1097,7 +1095,6 @@ namespace Barotrauma.Networking GameMain.LightManager.LosMode = (LosMode)losMode; serverSettings.AllowDisguises = disguisesAllowed; - serverSettings.AllowRagdollButton = allowRagdollButton; if (campaign == null) { diff --git a/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs b/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs index e636ac341..85e008a65 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs @@ -24,8 +24,8 @@ namespace Barotrauma.Networking return true; }; - GUIFrame innerFrame = new GUIFrame(new RectTransform(new Vector2(0.5f, 0.5f), LogFrame.RectTransform, Anchor.Center) { MinSize = new Point(700, 500) }); - GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.95f, 0.85f), innerFrame.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.0f, -0.03f) }, style: null); + GUIFrame innerFrame = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.4f), LogFrame.RectTransform, Anchor.Center) { MinSize = new Point(600, 420) }); + GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.85f), innerFrame.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.0f, -0.03f) }, style: null); new GUITextBlock(new RectTransform(new Vector2(0.75f, 0.05f), paddedFrame.RectTransform, Anchor.TopRight), TextManager.Get("ServerLog.Filter"), font: GUI.SmallFont); GUITextBox searchBox = new GUITextBox(new RectTransform(new Vector2(0.6f, 0.05f), paddedFrame.RectTransform, Anchor.TopRight), font: GUI.SmallFont); @@ -45,12 +45,20 @@ namespace Barotrauma.Networking listBox = new GUIListBox(new RectTransform(new Vector2(0.75f, 0.95f), paddedFrame.RectTransform, Anchor.BottomRight)); + var tickBoxContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.2f, 0.95f), paddedFrame.RectTransform, Anchor.BottomLeft)); + var tickBoxContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.25f, 0.95f), paddedFrame.RectTransform, Anchor.BottomLeft)); int y = 30; List tickBoxes = new List(); foreach (MessageType msgType in Enum.GetValues(typeof(MessageType))) { - var tickBox = new GUITickBox(new RectTransform(new Point(tickBoxContainer.Rect.Width, 30), tickBoxContainer.RectTransform), TextManager.Get("ServerLog." + messageTypeName[(int)msgType]), font: GUI.SmallFont) + var tickBox = new GUITickBox(new RectTransform(new Point(20, 20), tickBoxContainer.RectTransform), TextManager.Get("ServerLog." + messageTypeName[(int)msgType]), font: GUI.SmallFont) + { + Selected = true, + TextColor = messageColor[(int)msgType] + }; + + tickBox.OnSelected += (GUITickBox tb) => { Selected = true, TextColor = messageColor[(int)msgType], diff --git a/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs b/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs index a4e27b2e1..7607be585 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs @@ -295,7 +295,7 @@ namespace Barotrauma.Networking OnClicked = SelectSettingsTab }; } - GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(b => b.TextBlock)); + SelectSettingsTab(tabButtons[0], 0); //"Close" @@ -504,8 +504,6 @@ namespace Barotrauma.Networking return true; }; - GUITextBlock.AutoScaleAndNormalize(buttonHolder.Children.Select(c => ((GUIButton)c).TextBlock)); - foreach (ItemPrefab ip in MapEntityPrefab.List.Where(p => p is ItemPrefab).Select(p => p as ItemPrefab)) { if (!ip.CanBeBought && !ip.Tags.Contains("smallitem")) continue; diff --git a/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs b/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs index 4d4f12241..9a729b108 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs @@ -583,23 +583,6 @@ namespace Barotrauma.Steam ContentPackage contentPackage = new ContentPackage(metaDataFilePath); string newContentPackagePath = GetWorkshopItemContentPackagePath(contentPackage); - if (!contentPackage.IsCompatible()) - { - errorMsg = TextManager.Get(contentPackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage") - .Replace("[packagename]", contentPackage.Name) - .Replace("[packageversion]", contentPackage.GameVersion.ToString()) - .Replace("[gameversion]", GameMain.Version.ToString()); - return false; - } - - if (contentPackage.CorePackage && !contentPackage.ContainsRequiredCorePackageFiles(out List missingContentTypes)) - { - errorMsg = TextManager.Get("ContentPackageMissingCoreFiles") - .Replace("[packagename]", contentPackage.Name) - .Replace("[missingfiletypes]", string.Join(", ", missingContentTypes)); - return false; - } - var allPackageFiles = Directory.GetFiles(item.Directory.FullName, "*", SearchOption.AllDirectories); List nonContentFiles = new List(); foreach (string file in allPackageFiles) @@ -616,7 +599,9 @@ namespace Barotrauma.Steam if (!allowFileOverwrite) { - if (File.Exists(newContentPackagePath) && !CheckFileEquality(newContentPackagePath, metaDataFilePath)) + // TODO: If you create a new mod via the workshop interface and enable it, it will show the error msg, but still allows you to enable the content. + + if (File.Exists(newContentPackagePath)) { errorMsg = TextManager.Get("WorkshopErrorOverwriteOnEnable") .Replace("[itemname]", item.Title) @@ -628,7 +613,7 @@ namespace Barotrauma.Steam foreach (ContentFile contentFile in contentPackage.Files) { string sourceFile = Path.Combine(item.Directory.FullName, contentFile.Path); - if (File.Exists(sourceFile) && File.Exists(contentFile.Path) && !CheckFileEquality(sourceFile, contentFile.Path)) + if (File.Exists(sourceFile) && File.Exists(contentFile.Path)) { errorMsg = TextManager.Get("WorkshopErrorOverwriteOnEnable") .Replace("[itemname]", item.Title) @@ -644,41 +629,12 @@ namespace Barotrauma.Steam foreach (ContentFile contentFile in contentPackage.Files) { string sourceFile = Path.Combine(item.Directory.FullName, contentFile.Path); - - //path not allowed -> the content file must be a reference to an external file (such as some vanilla file outside the Mods folder) + if (!File.Exists(sourceFile)) { continue; } if (!ContentPackage.IsModFilePathAllowed(contentFile)) { - //the content package is trying to copy a file to a prohibited path, which is not allowed - if (File.Exists(sourceFile)) - { - errorMsg = TextManager.Get("WorkshopErrorIllegalPathOnEnable").Replace("[filename]", contentFile.Path); - return false; - } - //not trying to copy anything, so this is a reference to an external file - //if the external file doesn't exist, we cannot enable the package - else if (!File.Exists(contentFile.Path)) - { - //TODO: add the error message to localization - errorMsg = TextManager.Get("WorkshopErrorEnableFailed").Replace("[itemname]", item.Title) + " {File \"" + contentFile.Path + "\" not found.}"; - return false; - } + DebugConsole.ThrowError(TextManager.Get("WorkshopErrorIllegalPathOnEnable").Replace("[filename]", contentFile.Path)); continue; } - else if (!File.Exists(sourceFile)) - { - if (File.Exists(contentFile.Path)) - { - //the file is already present in the game folder, all good - continue; - } - else - { - //file not present in either the mod or the game folder -> cannot enable the package - //TODO: add the error message to localization - errorMsg = TextManager.Get("WorkshopErrorEnableFailed").Replace("[itemname]", item.Title) + " {File \"" + contentFile.Path + "\" not found.}"; - return false; - } - } //make sure the destination directory exists Directory.CreateDirectory(Path.GetDirectoryName(contentFile.Path)); @@ -700,7 +656,7 @@ namespace Barotrauma.Steam } catch (Exception e) { - errorMsg = TextManager.Get("WorkshopErrorEnableFailed").Replace("[itemname]", item.Title) + " {" + e.Message + "}"; + errorMsg = TextManager.Get("WorkshopErrorEnableFailed").Replace("[itemname]", item.Title) + " " + e.Message; DebugConsole.NewMessage(errorMsg, Microsoft.Xna.Framework.Color.Red); return false; } @@ -729,22 +685,6 @@ namespace Barotrauma.Steam return true; } - private static bool CheckFileEquality(string filePath1, string filePath2) - { - if (filePath1 == filePath2) - { - return true; - } - - using (FileStream fs1 = File.OpenRead(filePath1)) - using (FileStream fs2 = File.OpenRead(filePath2)) - { - Md5Hash hash1 = new Md5Hash(fs1); - Md5Hash hash2 = new Md5Hash(fs2); - return hash1.Hash == hash2.Hash; - } - } - /// /// Disables a workshop item by removing the files from the game folder. /// @@ -871,7 +811,7 @@ namespace Barotrauma.Steam { foreach (ContentFile contentFile in contentPackage.Files) { - if (!File.Exists(contentFile.Path)) { return false; } + if (!File.Exists(contentFile.Path)) return false; } } diff --git a/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs b/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs index cd0d3352e..bd1df6c87 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs @@ -76,8 +76,7 @@ namespace Barotrauma.Networking if (!GUIMessageBox.MessageBoxes.Any(mb => mb.UserData as string == "capturedevicenotfound")) { GUI.SettingsMenuOpen = false; - new GUIMessageBox(TextManager.Get("Error"), - TextManager.Get("VoipCaptureDeviceNotFound", returnNull: true) ?? "Could not start voice capture, suitable capture device not found.") + new GUIMessageBox(TextManager.Get("Error"), TextManager.Get("VoipCaptureDeviceNotFound")) { UserData = "capturedevicenotfound" }; diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs index f989d7926..954fe58e9 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs @@ -16,6 +16,9 @@ namespace Barotrauma private GUIListBox saveList; private GUITextBox saveNameBox, seedBox; + private GUITickBox contextualTutorialBox; + + private GUILayoutGroup subPreviewContainer; private GUILayoutGroup subPreviewContainer; @@ -23,6 +26,14 @@ namespace Barotrauma public Action StartNewGame; public Action LoadGame; + public bool TutorialSelected + { + get + { + if (contextualTutorialBox == null) return false; + return contextualTutorialBox.Selected; + } + } private readonly bool isMultiplayer; @@ -59,6 +70,12 @@ namespace Barotrauma new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.02f), leftColumn.RectTransform) { MinSize = new Point(0, 20) }, TextManager.Get("MapSeed") + ":"); seedBox = new GUITextBox(new RectTransform(new Vector2(1.0f, 0.05f), leftColumn.RectTransform) { MinSize = new Point(0, 20) }, ToolBox.RandomSeed(8)); + if (!isMultiplayer) + { + contextualTutorialBox = new GUITickBox(new RectTransform(new Point(32, 32), leftColumn.RectTransform), TextManager.Get("TutorialActive")); + UpdateTutorialSelection(); + } + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.02f), leftColumn.RectTransform) { MinSize = new Point(0, 20) }, TextManager.Get("SelectedSub") + ":"); var filterContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.05f), leftColumn.RectTransform), isHorizontal: true) { @@ -385,7 +402,14 @@ namespace Barotrauma }, Enabled = false }; - } + } + + public void UpdateTutorialSelection() + { + if (isMultiplayer) return; + Tutorial contextualTutorial = Tutorial.Tutorials.Find(t => t is ContextualTutorial); + contextualTutorialBox.Selected = (contextualTutorial != null) ? !GameMain.Config.CompletedTutorialNames.Contains(contextualTutorial.Name) : true; + } private bool SelectSaveFile(GUIComponent component, object obj) { diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs index 95ba8dd5a..44859a667 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs @@ -78,6 +78,7 @@ namespace Barotrauma int i = 0; var tabValues = Enum.GetValues(typeof(Tab)); + float minTextScale = 1.0f; foreach (Tab tab in tabValues) { var tabButton = new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), tabButtonContainer.RectTransform), @@ -92,12 +93,17 @@ namespace Barotrauma var buttonSprite = tabButton.Style.Sprites[GUIComponent.ComponentState.None][0]; tabButton.RectTransform.MaxSize = new Point( (int)(tabButton.Rect.Height * (buttonSprite.Sprite.size.X / buttonSprite.Sprite.size.Y)), int.MaxValue); - tabButtons.Add(tabButton); tabButton.Font = GUI.LargeFont; + tabButton.TextBlock.AutoScale = true; + minTextScale = Math.Min(tabButton.TextBlock.TextScale, minTextScale); i++; } - GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.TextBlock)); + + foreach (GUIButton tabButton in tabButtons) + { + tabButton.TextBlock.TextScale = minTextScale; + } // crew tab ------------------------------------------------------------------------- diff --git a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs index 94bb1bd2c..f838dfc6e 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs @@ -59,10 +59,10 @@ namespace Barotrauma Stretch = true, RelativeSpacing = 0.02f }; - + // === CAMPAIGN var campaignHolder = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 1.0f), parent: buttonsParent.RectTransform) { RelativeOffset = new Vector2(0.1f, 0.0f) }, isHorizontal: true); - + new GUIImage(new RectTransform(new Vector2(0.2f, 0.7f), campaignHolder.RectTransform), "MainMenuCampaignIcon") { CanBeFocused = false @@ -84,17 +84,6 @@ namespace Barotrauma RelativeSpacing = 0.035f }; - new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), campaignList.RectTransform), "Tutorial", textAlignment: Alignment.Left, style: "MainMenuGUIButton") - { - ForceUpperCase = true, - UserData = Tab.Tutorials, - OnClicked = (tb, userdata) => - { - SelectTab(tb, userdata); - return true; - } - }; - new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), campaignList.RectTransform), TextManager.Get("LoadGameButton"), textAlignment: Alignment.Left, style: "MainMenuGUIButton") { ForceUpperCase = true, @@ -195,10 +184,6 @@ namespace Barotrauma UserData = Tab.SteamWorkshop, OnClicked = SelectTab }; - -#if OSX && !DEBUG - steamWorkshopButton.Text += " (Not yet available on MacOS)"; -#endif } new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), customizeList.RectTransform), TextManager.Get("SubEditorButton"), textAlignment: Alignment.Left, style: "MainMenuGUIButton") @@ -335,11 +320,13 @@ namespace Barotrauma return true; }; + UpdateTutorialList(); + this.game = game; } -#endregion + #endregion -#region Selection + #region Selection public override void Select() { base.Select(); @@ -354,6 +341,10 @@ namespace Barotrauma ResetButtonStates(null); + UpdateTutorialList(); + + ResetButtonStates(null); + GameAnalyticsManager.SetCustomDimension01(""); } @@ -397,14 +388,9 @@ namespace Barotrauma switch (selectedTab) { case Tab.NewGame: - if (!GameMain.Config.CampaignDisclaimerShown) - { - selectedTab = 0; - GameMain.Instance.ShowCampaignDisclaimer(() => { SelectTab(null, Tab.NewGame); }); - return true; - } campaignSetupUI.CreateDefaultSaveName(); campaignSetupUI.RandomizeSeed(); + campaignSetupUI.UpdateTutorialSelection(); campaignSetupUI.UpdateSubList(Submarine.SavedSubmarines); break; case Tab.LoadGame: @@ -421,13 +407,6 @@ namespace Barotrauma case Tab.HostServer: break; case Tab.Tutorials: - if (!GameMain.Config.CampaignDisclaimerShown) - { - selectedTab = 0; - GameMain.Instance.ShowCampaignDisclaimer(() => { SelectTab(null, Tab.Tutorials); }); - return true; - } - UpdateTutorialList(); break; case Tab.CharacterEditor: Submarine.MainSub = null; @@ -458,8 +437,6 @@ namespace Barotrauma public bool ReturnToMainMenu(GUIButton button, object obj) { - GUI.PreventPauseMenuToggle = false; - if (Selected != this) { Select(); @@ -484,7 +461,7 @@ namespace Barotrauma otherButton.Selected = false; } } -#endregion + #endregion private void QuickStart() { @@ -702,7 +679,6 @@ namespace Barotrauma GameMain.TitleScreen.TitleSize.Y / 2.0f * GameMain.TitleScreen.Scale + 30.0f), 0.1f); #if !DEBUG -#if !OSX if (Steam.SteamManager.USE_STEAM) { if (GameMain.Config.UseSteamMatchmaking) @@ -712,16 +688,6 @@ namespace Barotrauma } steamWorkshopButton.Enabled = Steam.SteamManager.IsInitialized; } -#else - if (Steam.SteamManager.USE_STEAM) - { - if (GameMain.Config.UseSteamMatchmaking) - { - joinServerButton.Enabled = Steam.SteamManager.IsInitialized; - hostServerButton.Enabled = Steam.SteamManager.IsInitialized; - } - } -#endif #else joinServerButton.Enabled = true; hostServerButton.Enabled = true; @@ -806,11 +772,13 @@ namespace Barotrauma } selectedSub = new Submarine(Path.Combine(SaveUtil.TempPath, selectedSub.Name + ".sub"), ""); - + + ContextualTutorial.Selected = campaignSetupUI.TutorialSelected; GameMain.GameSession = new GameSession(selectedSub, saveName, GameModePreset.List.Find(g => g.Identifier == "singleplayercampaign")); (GameMain.GameSession.GameMode as CampaignMode).GenerateMap(mapSeed); + GameMain.LobbyScreen.Select(); } @@ -832,7 +800,7 @@ namespace Barotrauma GameMain.LobbyScreen.Select(); } -#region UI Methods + #region UI Methods private void CreateHostServerFields() { Vector2 textLabelSize = new Vector2(1.0f, 0.1f); @@ -913,7 +881,7 @@ namespace Barotrauma OnClicked = HostServerClicked }; } -#endregion + #endregion } } diff --git a/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs index bd16c716c..a2a112ec5 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs @@ -309,23 +309,14 @@ namespace Barotrauma return; } - int prevIndex = -1; var existingFrame = listBox.Content.FindChild(item); - if (existingFrame != null) - { - prevIndex = listBox.Content.GetChildIndex(existingFrame); - listBox.Content.RemoveChild(existingFrame); - } + if (existingFrame != null) { listBox.Content.RemoveChild(existingFrame); } var itemFrame = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.1f), listBox.Content.RectTransform, minSize: new Point(0, 80)), style: "ListBoxElement") { UserData = item }; - if (prevIndex > -1) - { - itemFrame.RectTransform.RepositionChildInHierarchy(prevIndex); - } var innerFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.9f), itemFrame.RectTransform, Anchor.Center), isHorizontal: true) { @@ -338,7 +329,6 @@ namespace Barotrauma { new GUIImage(new RectTransform(new Point(iconSize), innerFrame.RectTransform), itemPreviewSprites[item.PreviewImageUrl], scaleToFit: true) { - UserData = "previewimage", CanBeFocused = false }; } @@ -346,7 +336,6 @@ namespace Barotrauma { new GUIImage(new RectTransform(new Point(iconSize), innerFrame.RectTransform), SteamManager.Instance.DefaultPreviewImage, scaleToFit: true) { - UserData = "previewimage", CanBeFocused = false }; try @@ -394,7 +383,6 @@ namespace Barotrauma var titleText = new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.0f), rightColumn.RectTransform), EnsureUTF8(item.Title), textAlignment: Alignment.CenterLeft, wrap: true) { - UserData = "titletext", CanBeFocused = false }; @@ -559,17 +547,7 @@ namespace Barotrauma itemPreviewSprites.Add(item.PreviewImageUrl, newSprite); } - - var previewImage = listBox.Content.FindChild(item)?.GetChildByUserData("previewimage") as GUIImage; - if (previewImage != null) - { - previewImage.Sprite = newSprite; - } - else - { - CreateWorkshopItemFrame(item, listBox); - } - + CreateWorkshopItemFrame(item, listBox); if (modsPreviewFrame.FindChild(item) != null) { ShowItemPreview(item, modsPreviewFrame); @@ -597,7 +575,8 @@ namespace Barotrauma private bool ToggleItemEnabled(GUITickBox tickBox) { - if (!(tickBox.UserData is Facepunch.Steamworks.Workshop.Item item)) { return false; } + Facepunch.Steamworks.Workshop.Item item = tickBox.UserData as Facepunch.Steamworks.Workshop.Item; + if (item == null) { return false; } var updateButton = tickBox.Parent.FindChild("updatebutton"); @@ -606,9 +585,7 @@ namespace Barotrauma { if (!SteamManager.EnableWorkShopItem(item, false, out errorMsg)) { - tickBox.Visible = false; - tickBox.Selected = false; - if (tickBox.Parent.GetChildByUserData("titletext") is GUITextBlock titleText) { titleText.TextColor = Color.Red; } + tickBox.Enabled = false; } } else diff --git a/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs index 7f03557a5..8936318f5 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs @@ -317,11 +317,10 @@ namespace Barotrauma Stretch = true }; - entityCategoryButtons.Add( - new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), tabButtonHolder.RectTransform), TextManager.Get("MapEntityCategory.All"), style: "GUITabButton") - { - OnClicked = (btn, userdata) => { ClearFilter(); return true; } - }); + new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), tabButtonHolder.RectTransform), TextManager.Get("MapEntityCategory.All"), style: "GUITabButton") + { + OnClicked = (btn, userdata) => { ClearFilter(); return true; } + }; foreach (MapEntityCategory category in Enum.GetValues(typeof(MapEntityCategory))) { @@ -338,8 +337,6 @@ namespace Barotrauma }); } - GUITextBlock.AutoScaleAndNormalize(entityCategoryButtons.Select(b => b.TextBlock)); - entityList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.9f), entityListHolder.RectTransform, Anchor.BottomCenter)) { OnSelected = SelectPrefab, diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs index 515bc987a..3c1705000 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs @@ -238,7 +238,7 @@ namespace Barotrauma } float ambienceVolume = 0.8f; - if (Character.Controlled != null && !Character.Controlled.Removed) + if (Character.Controlled != null) { AnimController animController = Character.Controlled.AnimController; if (animController.HeadInWater) diff --git a/Barotrauma/BarotraumaClient/WindowsClient.csproj b/Barotrauma/BarotraumaClient/WindowsClient.csproj index 131aa6e76..7cf32db5d 100644 --- a/Barotrauma/BarotraumaClient/WindowsClient.csproj +++ b/Barotrauma/BarotraumaClient/WindowsClient.csproj @@ -58,6 +58,9 @@ + + ..\..\Libraries\NuGet\Concentus.1.1.7\lib\portable-net45+win+wpa81+wp80\Concentus.dll + ..\..\Libraries\NuGet\GameAnalytics.Mono.SDK.1.1.12\lib\net45\GameAnalytics.Mono.dll @@ -212,10 +215,6 @@ - - {0e7fee6a-15e5-4a4e-943c-80276003478c} - Concentus - {3af0347c-5a9b-4421-868c-8ee3dbfaebc6} Facepunch.Steamworks diff --git a/Barotrauma/BarotraumaClient/app.config b/Barotrauma/BarotraumaClient/app.config index f067ae6ac..383108ffa 100644 --- a/Barotrauma/BarotraumaClient/app.config +++ b/Barotrauma/BarotraumaClient/app.config @@ -1,35 +1,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/packages.config b/Barotrauma/BarotraumaClient/packages.config index d637bffbb..695edea35 100644 --- a/Barotrauma/BarotraumaClient/packages.config +++ b/Barotrauma/BarotraumaClient/packages.config @@ -1,5 +1,6 @@  + diff --git a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs index 1c7c140ff..bbde03313 100644 --- a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.8.10.0")] -[assembly: AssemblyFileVersion("0.8.10.0")] +[assembly: AssemblyVersion("0.8.9.10")] +[assembly: AssemblyFileVersion("0.8.9.10")] diff --git a/Barotrauma/BarotraumaServer/Server.csproj b/Barotrauma/BarotraumaServer/Server.csproj index bc97ad59e..3647a5b6d 100644 --- a/Barotrauma/BarotraumaServer/Server.csproj +++ b/Barotrauma/BarotraumaServer/Server.csproj @@ -216,7 +216,7 @@ - + PreserveNewest diff --git a/Barotrauma/BarotraumaServer/Source/GameMain.cs b/Barotrauma/BarotraumaServer/Source/GameMain.cs index 6515b87c6..279693165 100644 --- a/Barotrauma/BarotraumaServer/Source/GameMain.cs +++ b/Barotrauma/BarotraumaServer/Source/GameMain.cs @@ -146,20 +146,11 @@ namespace Barotrauma } /// - /// Returns the file paths of all files of the given type in the content packages. + /// Returns the file paths of all files of the given type in the currently selected content packages. /// - /// - /// If true, also returns files in content packages that are installed but not currently selected. - public IEnumerable GetFilesOfType(ContentType type, bool searchAllContentPackages = false) + public IEnumerable GetFilesOfType(ContentType type) { - if (searchAllContentPackages) - { - return ContentPackage.GetFilesOfType(ContentPackage.List, type); - } - else - { - return ContentPackage.GetFilesOfType(SelectedPackages, type); - } + return ContentPackage.GetFilesOfType(SelectedPackages, type); } public void StartServer() diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs index 5717efe48..d9137afc7 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs @@ -1960,8 +1960,6 @@ namespace Barotrauma.Networking msg.Write(false); } - msg.Write(serverSettings.AllowRagdollButton); - serverSettings.WriteMonsterEnabled(msg); CompressOutgoingMessage(msg); diff --git a/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml b/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml index 6cb28c845..5d1bf37a2 100644 --- a/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml +++ b/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml @@ -12,7 +12,6 @@ - @@ -74,11 +73,14 @@ + + + diff --git a/Barotrauma/BarotraumaShared/SharedCode.projitems b/Barotrauma/BarotraumaShared/SharedCode.projitems index 05589e12a..f15f9dbd1 100644 --- a/Barotrauma/BarotraumaShared/SharedCode.projitems +++ b/Barotrauma/BarotraumaShared/SharedCode.projitems @@ -181,7 +181,6 @@ - diff --git a/Barotrauma/BarotraumaShared/SharedContent.projitems b/Barotrauma/BarotraumaShared/SharedContent.projitems index 0cfdcd61a..dfe87235b 100644 --- a/Barotrauma/BarotraumaShared/SharedContent.projitems +++ b/Barotrauma/BarotraumaShared/SharedContent.projitems @@ -364,18 +364,9 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - PreserveNewest - - PreserveNewest - PreserveNewest @@ -388,18 +379,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -430,12 +409,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -472,70 +445,34 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + PreserveNewest @@ -1207,9 +1144,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1701,6 +1635,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -2166,19 +2109,9 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - Never + PreserveNewest - - Never - - @@ -3133,6 +3066,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -3329,10 +3265,10 @@ PreserveNewest - Never + PreserveNewest - Never + PreserveNewest PreserveNewest diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs index bd8df818d..26be7ee85 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs @@ -320,9 +320,8 @@ namespace Barotrauma { State = AIState.Idle; } - else if (Character.Health < fleeHealthThreshold && SwarmBehavior == null) + else if (Character.Health < fleeHealthThreshold) { - // Don't flee from damage if in a swarm. State = AIState.Escape; } else if (targetingPriority != null) @@ -331,6 +330,8 @@ namespace Barotrauma } } + LatchOntoAI?.Update(this, deltaTime); + if (SelectedAiTarget != null && (SelectedAiTarget.Entity == null || SelectedAiTarget.Entity.Removed)) { State = AIState.Idle; @@ -368,15 +369,8 @@ namespace Barotrauma default: throw new NotImplementedException(); } - - LatchOntoAI?.Update(this, deltaTime); - IsSteeringThroughGap = false; - if (SwarmBehavior != null) - { - SwarmBehavior.IsActive = State == AIState.Idle && Character.CurrentHull == null; - SwarmBehavior.Refresh(); - SwarmBehavior.UpdateSteering(deltaTime); - } + + SwarmBehavior?.Update(deltaTime); steeringManager.Update(Character.AnimController.GetCurrentSpeed(run)); } @@ -499,7 +493,7 @@ namespace Barotrauma } else { - if (!IsLatchedOnSub) + if (!IsProperlyLatchedOnSub) { UpdateWallTarget(); } @@ -558,7 +552,7 @@ namespace Barotrauma { WallSection section = wallTarget.Structure.GetSection(wallTarget.SectionIndex); Vector2 targetPos = wallTarget.Structure.SectionPosition(wallTarget.SectionIndex, true); - if (section?.gap != null && SteerThroughGap(wallTarget.Structure, section, targetPos, deltaTime)) + if (section?.gap != null && section.gap.IsRoomToRoom && SteerThroughGap(wallTarget.Structure, section, targetPos, deltaTime)) { return; } @@ -799,21 +793,9 @@ namespace Barotrauma } } - public bool IsSteeringThroughGap { get; private set; } private bool SteerThroughGap(Structure wall, WallSection section, Vector2 targetWorldPos, float deltaTime) { - IsSteeringThroughGap = true; - SelectedAiTarget = wall.AiTarget; - wallTarget = null; - LatchOntoAI?.DeattachFromBody(); - Character.AnimController.ReleaseStuckLimbs(); Hull targetHull = section.gap?.FlowTargetHull; - float distance = Vector2.Distance(Character.WorldPosition, targetWorldPos); - float maxDistance = Math.Min(wall.Rect.Width, wall.Rect.Height); - if (distance > maxDistance) - { - return false; - } if (targetHull != null) { if (wall.IsHorizontal) @@ -824,7 +806,16 @@ namespace Barotrauma { targetWorldPos.X = targetHull.WorldRect.Center.X; } - steeringManager.SteeringManual(deltaTime, Vector2.Normalize(targetWorldPos - Character.WorldPosition)); + LatchOntoAI?.DeattachFromBody(); + Character.AnimController.ReleaseStuckLimbs(); + if (steeringManager is IndoorsSteeringManager) + { + steeringManager.SteeringManual(deltaTime, Vector2.Normalize(targetWorldPos - Character.WorldPosition)); + } + else + { + steeringManager.SteeringSeek(ConvertUnits.ToSimUnits(targetWorldPos)); + } return true; } return false; @@ -1056,43 +1047,19 @@ namespace Barotrauma #region Targeting private bool IsLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub; + private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure; + //goes through all the AItargets, evaluates how preferable it is to attack the target, //whether the Character can see/hear the target and chooses the most preferable target within //sight/hearing range public AITarget UpdateTargets(Character character, out TargetingPriority priority) { - if ((SelectedAiTarget != null || wallTarget != null) && IsLatchedOnSub) + if (IsProperlyLatchedOnSub) { - var wall = SelectedAiTarget.Entity as Structure; - if (wall == null) - { - wall = wallTarget?.Structure; - } - // The target is not a wall or it's not the same as we are attached to -> release - bool releaseTarget = wall == null || !wall.Bodies.Contains(LatchOntoAI.AttachJoints[0].BodyB); - if (!releaseTarget) - { - for (int i = 0; i < wall.Sections.Length; i++) - { - if (CanPassThroughHole(wall, i)) - { - releaseTarget = true; - } - } - } - if (releaseTarget) - { - SelectedAiTarget = null; - wallTarget = null; - LatchOntoAI.DeattachFromBody(); - } - else if (SelectedAiTarget?.Entity == wallTarget?.Structure) - { - // If attached to a valid target, just keep the target. - // Priority not used in this case. - priority = null; - return SelectedAiTarget; - } + // If attached to a valid target, just keep the target. + // Priority not used in this case. + priority = null; + return SelectedAiTarget; } AITarget newTarget = null; priority = null; @@ -1175,7 +1142,7 @@ namespace Barotrauma else if (target.Entity != null) { //skip the target if it's a room and the character is already inside a sub - if (character.CurrentHull != null && target.Entity is Hull) { continue; } + if (character.CurrentHull != null && target.Entity is Hull) continue; Door door = null; if (target.Entity is Item item) @@ -1204,37 +1171,23 @@ namespace Barotrauma // Ignore structures that doesn't have a body (not walls) continue; } - if (s.IsPlatform) - { - continue; - } - if (character.CurrentHull != null) - { - // Ignore walls when inside. - continue; - } - valueModifier = 1; - float wallMaxHealth = 400; // Anything more than this is ignored -> 200 = 1 - // Prefer weaker targets. - valueModifier *= MathHelper.Lerp(1.5f, 0.5f, MathUtils.InverseLerp(0, 1, s.Health / wallMaxHealth)); + // Ignore walls when inside. + valueModifier = character.CurrentHull == null ? 1 : 0; if (aggressiveBoarding) { - var hulls = s.Submarine.GetHulls(false); for (int i = 0; i < s.Sections.Length; i++) { var section = s.Sections[i]; - if (section.gap != null) + if (CanPassThroughHole(s, i)) { - if (CanPassThroughHole(s, i)) - { - bool leadsInside = !section.gap.IsRoomToRoom && section.gap.FlowTargetHull != null && hulls.Any(h => h.Rect.Intersects(section.rect)); - valueModifier *= leadsInside ? 5 : 0; - } - else - { - // up to 100% priority increase for every gap in the wall - valueModifier *= 1 + section.gap.Open; - } + // Ignore walls that can be passed through + valueModifier = 0; + break; + } + else if (section.gap != null) + { + // up to 100% priority increase for every gap in the wall + valueModifier *= 1 + section.gap.Open; } } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs index 277a8b54c..2d3de2875 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs @@ -223,10 +223,8 @@ namespace Barotrauma } } - bool isDiving = character.AnimController.InWater && character.AnimController.HeadInWater; - //only humanoids can climb ladders - if (!isDiving && character.AnimController is HumanoidAnimController && IsNextLadderSameAsCurrent) + if (character.AnimController is HumanoidAnimController && IsNextLadderSameAsCurrent) { if (character.SelectedConstruction != currentPath.CurrentNode.Ladders.Item && currentPath.CurrentNode.Ladders.Item.IsInsideTrigger(character.WorldPosition)) @@ -236,7 +234,7 @@ namespace Barotrauma } var collider = character.AnimController.Collider; - if (character.IsClimbing && !isDiving) + if (character.IsClimbing) { Vector2 diff = currentPath.CurrentNode.SimPosition - pos; bool nextLadderSameAsCurrent = IsNextLadderSameAsCurrent; @@ -280,12 +278,6 @@ namespace Barotrauma } else if (character.AnimController.InWater) { - // If the character is underwater, we don't need the ladders anymore - if (character.IsClimbing && isDiving) - { - character.AnimController.Anim = AnimController.Animation.None; - character.SelectedConstruction = null; - } if (Vector2.DistanceSquared(pos, currentPath.CurrentNode.SimPosition) < MathUtils.Pow(collider.radius * 3, 2)) { currentPath.SkipToNextNode(); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/LatchOntoAI.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/LatchOntoAI.cs index e68f9a3a2..c85b2caa7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/LatchOntoAI.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/LatchOntoAI.cs @@ -54,7 +54,7 @@ namespace Barotrauma get { return attachJoints.Count > 0; } } - public bool IsAttachedToSub => IsAttached && (attachTargetBody?.UserData is Submarine || attachTargetBody?.UserData is Entity entity && entity.Submarine != null); + public bool IsAttachedToSub => IsAttached && attachTargetBody?.UserData is Entity entity && (entity is Submarine sub || entity?.Submarine != null); public LatchOntoAI(XElement element, EnemyAIController enemyAI) { @@ -190,7 +190,7 @@ namespace Barotrauma case AIController.AIState.Attack: if (enemyAI.AttackingLimb != null) { - if (attachToSub && !enemyAI.IsSteeringThroughGap && wallAttachPos != Vector2.Zero && attachTargetBody != null) + if (attachToSub && wallAttachPos != Vector2.Zero && attachTargetBody != null) { // is not attached or is attached to something else if (!IsAttached || IsAttached && attachJoints[0].BodyB == attachTargetBody) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs index 76adf9000..3eb217589 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs @@ -14,16 +14,11 @@ namespace Barotrauma private float maxDistFromCenter; private float cohesion; - public List Members { get; private set; } = new List(); - public HashSet ActiveMembers { get; private set; } = new HashSet(); + private List members = new List(); - private EnemyAIController ai; + private AIController ai; - public bool IsActive { get; set; } - public bool IsEnoughMembers => ActiveMembers.Count > 1; - - - public SwarmBehavior(XElement element, EnemyAIController ai) + public SwarmBehavior(XElement element, AIController ai) { this.ai = ai; minDistFromClosest = ConvertUnits.ToSimUnits(element.GetAttributeFloat("mindistfromclosest", 10.0f)); @@ -37,36 +32,21 @@ namespace Barotrauma { if (character.AIController is EnemyAIController enemyAI && enemyAI.SwarmBehavior != null) { - enemyAI.SwarmBehavior.Members = swarm.ToList(); + enemyAI.SwarmBehavior.members = swarm.ToList(); } } } - public void Refresh() + public void Update(float deltaTime) { - Members.RemoveAll(m => m.IsDead || m.Removed); - foreach (var member in Members) - { - if (!member.AIController.Enabled && member.IsRemotePlayer || Character.Controlled == member || !((EnemyAIController)member.AIController).SwarmBehavior.IsActive) - { - ActiveMembers.Remove(member); - } - else - { - ActiveMembers.Add(member); - } - } - } + members.RemoveAll(m => m.IsDead || m.Removed); + if (members.Count < 2) { return; } - public void UpdateSteering(float deltaTime) - { - if (!IsActive) { return; } - if (!IsEnoughMembers) { return; } //calculate the "center of mass" of the swarm and the distance to the closest character in the swarm float closestDistSqr = float.MaxValue; Vector2 center = Vector2.Zero; AICharacter closest = null; - foreach (AICharacter member in Members) + foreach (AICharacter member in members) { center += member.SimPosition; if (member == ai.Character) { continue; } @@ -77,7 +57,7 @@ namespace Barotrauma closest = member; } } - center /= Members.Count; + center /= members.Count; if (closest == null) { return; } @@ -103,11 +83,11 @@ namespace Barotrauma if (cohesion > 0.0f) { Vector2 avgVel = Vector2.Zero; - foreach (AICharacter member in Members) + foreach (AICharacter member in members) { avgVel += member.AnimController.TargetMovement; } - avgVel /= Members.Count; + avgVel /= members.Count; ai.SteeringManager.SteeringManual(deltaTime, avgVel * cohesion); } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs index 1d7ac3ecb..905e06237 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs @@ -293,27 +293,6 @@ namespace Barotrauma return; } - if (GameMain.NetworkMember == null || !GameMain.NetworkMember.IsClient) - { - //stop dragging if there's something between the pull limb and the target - Vector2 sourceSimPos = mouthLimb.SimPosition; - Vector2 targetSimPos = target.SimPosition; - if (character.Submarine != null && character.SelectedCharacter.Submarine == null) - { - targetSimPos -= character.Submarine.SimPosition; - } - else if (character.Submarine == null && character.SelectedCharacter.Submarine != null) - { - sourceSimPos -= character.SelectedCharacter.Submarine.SimPosition; - } - var body = Submarine.CheckVisibility(sourceSimPos, targetSimPos, ignoreSubs: true); - if (body != null) - { - character.DeselectCharacter(); - return; - } - } - Character targetCharacter = target; float eatSpeed = character.Mass / targetCharacter.Mass * 0.1f; eatTimer += deltaTime * eatSpeed; @@ -751,6 +730,22 @@ namespace Barotrauma limb?.body.SmoothRotate(angle, torque, wrapAngle: false); } + private void SmoothRotateWithoutWrapping(Limb limb, float angle, Limb referenceLimb, float torque) + { + //make sure the angle "has the same number of revolutions" as the reference limb + //(e.g. we don't want to rotate the legs to 0 if the torso is at 360, because that'd blow up the hip joints) + while (referenceLimb.Rotation - angle > MathHelper.TwoPi) + { + angle += MathHelper.TwoPi; + } + while (referenceLimb.Rotation - angle < -MathHelper.TwoPi) + { + angle -= MathHelper.TwoPi; + } + + limb?.body.SmoothRotate(angle, torque, wrapAngle: false); + } + public override void Flip() { base.Flip(); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs index 3530df734..5de8c9140 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs @@ -560,8 +560,7 @@ namespace Barotrauma //TODO: take into account that the feet aren't necessarily in CurrentHull //full slowdown (1.5f) when water is up to the torso surfaceY = ConvertUnits.ToSimUnits(currentHull.Surface); - float bottomPos = Math.Max(colliderPos.Y, currentHull.Rect.Y - currentHull.Rect.Height); - slowdownAmount = MathHelper.Clamp((surfaceY - bottomPos) / TorsoPosition.Value, 0.0f, 1.0f) * 1.5f; + slowdownAmount = MathHelper.Clamp((surfaceY - colliderPos.Y) / TorsoPosition.Value, 0.0f, 1.0f) * 1.5f; } float maxSpeed = Math.Max(TargetMovement.Length() - slowdownAmount, 1.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index ef144932c..90321ed94 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -426,7 +426,7 @@ namespace Barotrauma } } - public bool CanSpeak; + private bool canSpeak; private bool speechImpedimentSet; @@ -436,7 +436,7 @@ namespace Barotrauma { get { - if (!CanSpeak || IsUnconscious || Stun > 0.0f || IsDead) return 100.0f; + if (!canSpeak || IsUnconscious || Stun > 0.0f || IsDead) return 100.0f; return speechImpediment; } set @@ -710,7 +710,7 @@ namespace Barotrauma displayName = TextManager.Get($"Character.{Path.GetFileName(Path.GetDirectoryName(file))}", true); IsHumanoid = doc.Root.GetAttributeBool("humanoid", false); - CanSpeak = doc.Root.GetAttributeBool("canspeak", false); + canSpeak = doc.Root.GetAttributeBool("canspeak", false); needsAir = doc.Root.GetAttributeBool("needsair", false); Noise = doc.Root.GetAttributeFloat("noise", 100f); @@ -853,7 +853,7 @@ namespace Barotrauma { if (characterConfigFiles == null) { - characterConfigFiles = GameMain.Instance.GetFilesOfType(ContentType.Character, searchAllContentPackages: true); + characterConfigFiles = GameMain.Instance.GetFilesOfType(ContentType.Character); } return characterConfigFiles; } @@ -2555,9 +2555,11 @@ namespace Barotrauma GameMain.GameSession?.CrewManager?.RemoveCharacter(this); #endif - CharacterList.Remove(this); +#if CLIENT + GameMain.GameSession?.CrewManager?.RemoveCharacter(this); +#endif - if (Controlled == this) { Controlled = null; } + CharacterList.Remove(this); if (Inventory != null) { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs b/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs index cb7df70ec..8dcf98fce 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs @@ -399,7 +399,7 @@ namespace Barotrauma { ID = idCounter; idCounter++; - Name = element.GetAttributeString("name", ""); + Name = element.GetAttributeString("name", "unnamed"); string genderStr = element.GetAttributeString("gender", "male").ToLowerInvariant(); File = element.GetAttributeString("file", ""); SourceElement = GetConfig(File).Root; @@ -423,29 +423,6 @@ namespace Barotrauma element.GetAttributeInt("beardindex", -1), element.GetAttributeInt("moustacheindex", -1), element.GetAttributeInt("faceattachmentindex", -1)); - - if (string.IsNullOrEmpty(Name)) - { - if (SourceElement.Element("name") != null) - { - string firstNamePath = SourceElement.Element("name").GetAttributeString("firstname", ""); - if (firstNamePath != "") - { - firstNamePath = firstNamePath.Replace("[GENDER]", (Head.gender == Gender.Female) ? "female" : "male"); - Name = ToolBox.GetRandomLine(firstNamePath); - } - - string lastNamePath = SourceElement.Element("name").GetAttributeString("lastname", ""); - if (lastNamePath != "") - { - lastNamePath = lastNamePath.Replace("[GENDER]", (Head.gender == Gender.Female) ? "female" : "male"); - if (Name != "") Name += " "; - Name += ToolBox.GetRandomLine(lastNamePath); - } - } - } - - StartItemsGiven = element.GetAttributeBool("startitemsgiven", false); string personalityName = element.GetAttributeString("personality", ""); ragdollFileName = element.GetAttributeString("ragdoll", string.Empty); diff --git a/Barotrauma/BarotraumaShared/Source/ContentPackage.cs b/Barotrauma/BarotraumaShared/Source/ContentPackage.cs index e51a98e27..e7407db0f 100644 --- a/Barotrauma/BarotraumaShared/Source/ContentPackage.cs +++ b/Barotrauma/BarotraumaShared/Source/ContentPackage.cs @@ -217,7 +217,6 @@ namespace Barotrauma { return corePackageRequiredFiles.All(fileType => Files.Any(file => file.Type == fileType)); } - public bool ContainsRequiredCorePackageFiles(out List missingContentTypes) { missingContentTypes = new List(); @@ -231,25 +230,6 @@ namespace Barotrauma return missingContentTypes.Count == 0; } - /// - /// Make sure all the files defined in the content package are present - /// - /// - public bool VerifyFiles(out List errorMessages) - { - errorMessages = new List(); - foreach (ContentFile file in Files) - { - if (!File.Exists(file.Path)) - { - errorMessages.Add("File \"" + file.Path + "\" not found."); - continue; - } - } - - return errorMessages.Count == 0; - } - public static ContentPackage CreatePackage(string name, string path, bool corePackage) { ContentPackage newPackage = new ContentPackage() @@ -418,13 +398,6 @@ namespace Barotrauma return path == "Mods"; } } - /// - /// Are mods allowed to install a file into the specified path. If a content package XML includes files - /// with a prohibited path, they are treated as references to external files. For example, a mod could include - /// some vanilla files in the XML, in which case the game will simply use the vanilla files present in the game folder. - /// - /// - /// public static bool IsModFilePathAllowed(string path) { while (true) @@ -449,6 +422,16 @@ namespace Barotrauma return contentPackages.SelectMany(f => f.Files).Where(f => f.Type == type).Select(f => f.Path); } + public IEnumerable GetFilesOfType(ContentType type) + { + return Files.Where(f => f.Type == type).Select(f => f.Path); + } + + public static IEnumerable GetFilesOfType(IEnumerable contentPackages, ContentType type) + { + return contentPackages.SelectMany(f => f.Files).Where(f => f.Type == type).Select(f => f.Path); + } + public IEnumerable GetFilesOfType(ContentType type) { return Files.Where(f => f.Type == type).Select(f => f.Path); diff --git a/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs b/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs index 6e8445416..01905d2cf 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs @@ -34,33 +34,14 @@ namespace Barotrauma { Level.Loaded.TryGetInterestingPosition(true, Level.PositionType.MainPath, Level.Loaded.Size.X * 0.3f, out Vector2 spawnPos); - //bool isClient = GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient; - //for (int i = 0; i < monsterCount; i++) - //{ - // monsters.Add(Character.Create(monsterFile, spawnPos, ToolBox.RandomSeed(8), null, isClient, true, false)); - //} - //monsters.ForEach(m => m.Enabled = false); - //SwarmBehavior.CreateSwarm(monsters.Cast()); - //sonarPositions.Add(spawnPos); - - float offsetAmount = 500; + bool isClient = GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient; for (int i = 0; i < monsterCount; i++) { - CoroutineManager.InvokeAfter(() => - { - bool isClient = GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient; - var monster = Character.Create(monsterFile, spawnPos + Rand.Vector(offsetAmount, Rand.RandSync.Server), i.ToString(), null, isClient, true, true); - monster.Enabled = false; - monsters.Add(monster); - if (monsters.Count == monsterCount) - { - //this will do nothing if the monsters have no swarm behavior defined, - //otherwise it'll make the spawned characters act as a swarm - SwarmBehavior.CreateSwarm(monsters.Cast()); - sonarPositions.Add(spawnPos); - } - }, Rand.Range(0f, monsterCount / 2, Rand.RandSync.Server)); + monsters.Add(Character.Create(monsterFile, spawnPos, ToolBox.RandomSeed(8), null, isClient, true, false)); } + monsters.ForEach(m => m.Enabled = false); + SwarmBehavior.CreateSwarm(monsters.Cast()); + sonarPositions.Add(spawnPos); } public override void Update(float deltaTime) diff --git a/Barotrauma/BarotraumaShared/Source/GameSettings.cs b/Barotrauma/BarotraumaShared/Source/GameSettings.cs index fc6b1cdc0..e85d877db 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSettings.cs @@ -604,14 +604,13 @@ namespace Barotrauma } foreach (ContentPackage contentPackage in SelectedContentPackages) { - bool packageOk = contentPackage.VerifyFiles(out List errorMessages); - if (!packageOk) - { - DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\":\n" + string.Join("\n", errorMessages)); - continue; - } foreach (ContentFile file in contentPackage.Files) { + if (!System.IO.File.Exists(file.Path)) + { + DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found."); + continue; + } ToolBox.IsProperFilenameCase(file.Path); } } @@ -971,14 +970,13 @@ namespace Barotrauma foreach (ContentPackage contentPackage in SelectedContentPackages) { - bool packageOk = contentPackage.VerifyFiles(out List errorMessages); - if (!packageOk) - { - DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\":\n" + string.Join("\n", errorMessages)); - continue; - } foreach (ContentFile file in contentPackage.Files) { + if (!System.IO.File.Exists(file.Path)) + { + DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found."); + continue; + } ToolBox.IsProperFilenameCase(file.Path); } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs index 188d307c5..38953e28a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs @@ -293,35 +293,10 @@ namespace Barotrauma.Items.Components //steer closer if almost in range if (dist > Range) { - Vector2 standPos = new Vector2(Math.Sign(-fromItemToLeak.X), Math.Sign(-fromItemToLeak.Y)) / 2; - if (!character.AnimController.InWater) - { - if (leak.IsHorizontal) - { - standPos.X *= 2; - standPos.Y = 0; - } - else - { - standPos.X = 0; - } - } - if (character.AIController.SteeringManager is IndoorsSteeringManager indoorSteering) - { - if (indoorSteering.CurrentPath != null && !indoorSteering.IsPathDirty && indoorSteering.CurrentPath.Unreachable) - { - Vector2 dir = Vector2.Normalize(standPos - character.WorldPosition); - character.AIController.SteeringManager.SteeringManual(deltaTime, dir / 2); - } - else - { - character.AIController.SteeringManager.SteeringSeek(standPos); - } - } - else - { - character.AIController.SteeringManager.SteeringSeek(standPos); - } + Vector2 standPos = leak.IsHorizontal ? new Vector2(Math.Sign(-fromItemToLeak.X), 0.0f) : new Vector2(0.0f, Math.Sign(-fromItemToLeak.Y) * 0.5f); + standPos = leak.WorldPosition + standPos * Range; + Vector2 dir = Vector2.Normalize(standPos - character.WorldPosition); + character.AIController.SteeringManager.SteeringManual(deltaTime, dir / 2); } else { @@ -330,29 +305,30 @@ namespace Barotrauma.Items.Components // Too close -> steer away character.AIController.SteeringManager.SteeringManual(deltaTime, Vector2.Normalize(character.SimPosition - leak.SimPosition) / 2); } - else if (dist <= Range) - { - // In range - character.AIController.SteeringManager.Reset(); - } else { - return false; + character.AIController.SteeringManager.Reset(); } } + sinTime += deltaTime; character.CursorPosition = leak.Position + VectorExtensions.Forward(Item.body.TransformedRotation + (float)Math.Sin(sinTime), dist); if (item.RequireAimToUse) { character.SetInput(InputType.Aim, false, true); } + // Press the trigger only when the tool is approximately facing the target. - var angle = VectorExtensions.Angle(VectorExtensions.Forward(item.body.TransformedRotation), fromItemToLeak); - if (angle < MathHelper.PiOver4) + // If the character is climbing, ignore the check, because we cannot aim while climbing. + if (VectorExtensions.Angle(VectorExtensions.Forward(item.body.TransformedRotation), fromItemToLeak) < MathHelper.PiOver4) { character.SetInput(InputType.Shoot, false, true); Use(deltaTime, character); } + else + { + sinTime -= deltaTime * 2; + } bool leakFixed = (leak.Open <= 0.0f || leak.Removed) && (leak.ConnectedWall == null || leak.ConnectedWall.Sections.Average(s => s.damage) < 1); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index fa9ff9e17..831c07c39 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -801,7 +801,10 @@ namespace Barotrauma.Items.Components string msg = TextManager.Get(Msg, true); if (msg != null) { - msg = TextManager.ParseInputTypes(msg); + foreach (InputType inputType in Enum.GetValues(typeof(InputType))) + { + msg = msg.Replace("[" + inputType.ToString().ToLowerInvariant() + "]", GameMain.Config.KeyBind(inputType).ToString()); + } DisplayMsg = msg; } else diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs index fb4392e3c..95476dc1f 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs @@ -13,11 +13,6 @@ namespace Barotrauma.Items.Components private ItemContainer inputContainer, outputContainer; - public ItemContainer InputContainer - { - get { return inputContainer; } - } - public ItemContainer OutputContainer { get { return outputContainer; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs index cd1b0e081..7ade916d4 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs @@ -23,16 +23,6 @@ namespace Barotrauma.Items.Components private ItemContainer inputContainer, outputContainer; - public ItemContainer InputContainer - { - get { return inputContainer; } - } - - public ItemContainer OutputContainer - { - get { return outputContainer; } - } - private float progressState; public Fabricator(Item item, XElement element) @@ -108,23 +98,7 @@ namespace Barotrauma.Items.Components { return (picker != null); } - - public void RemoveFabricationRecipes(List allowedIdentifiers) - { - for (int i = 0; i < fabricationRecipes.Count; i++) - { - if (!allowedIdentifiers.Contains(fabricationRecipes[i].TargetItem.Identifier)) - { - fabricationRecipes.RemoveAt(i); - i--; - } - } - - CreateRecipes(); - } - - partial void CreateRecipes(); - + private void StartFabricating(FabricationRecipe selectedItem, Character user) { if (selectedItem == null) return; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Sonar.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Sonar.cs index 144d8da1a..40e97dfe5 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Sonar.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Sonar.cs @@ -259,7 +259,7 @@ namespace Barotrauma.Items.Components int clockDir = (int)Math.Round((angle / MathHelper.TwoPi) * 12); if (clockDir == 0) clockDir = 12; - return TextManager.Get("roomname.subdiroclock").Replace("[dir]", clockDir.ToString()); + return TextManager.Get("SubDirOClock").Replace("[dir]", clockDir.ToString()); } private Vector2 GetTransducerCenter() diff --git a/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs b/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs index 85d352153..e6e6a9541 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs @@ -206,16 +206,6 @@ namespace Barotrauma return true; } - public bool IsFull() - { - for (int i = 0; i < capacity; i++) - { - if (Items[i] == null) return false; - } - - return true; - } - protected bool TrySwapping(int index, Item item, Character user, bool createNetworkEvent) { if (item?.ParentInventory == null || Items[index] == null) return false; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index c33f7ea82..1622e76e8 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1149,10 +1149,6 @@ namespace Barotrauma { body.SetTransform(body.SimPosition - Submarine.SimPosition, body.Rotation); } - else if (Submarine != null && prevSub != null && Submarine != prevSub) - { - body.SetTransform(body.SimPosition + prevSub.SimPosition - Submarine.SimPosition, body.Rotation); - } Vector2 displayPos = ConvertUnits.ToDisplayUnits(body.SimPosition); rect.X = (int)(displayPos.X - rect.Width / 2.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs b/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs index 40f2acd92..a73ac8907 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs @@ -40,7 +40,7 @@ namespace Barotrauma flames = true; underwaterBubble = true; } - + public Explosion(XElement element, string parentDebugName) { attack = new Attack(element, parentDebugName + ", Explosion"); @@ -62,16 +62,6 @@ namespace Barotrauma CameraShake = element.GetAttributeFloat("camerashake", attack.Range * 0.1f); } - public void DisableParticles() - { - sparks = false; - shockwave = false; - smoke = false; - flash = false; - flames = false; - underwaterBubble = false; - } - public List> GetRecentExplosions(float maxSecondsAgo) { return prevExplosions.FindAll(e => e.Third >= Timing.TotalTime - maxSecondsAgo); diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs index f3b97de1c..d78a6fdc8 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs @@ -14,15 +14,15 @@ namespace Barotrauma { const float OxygenConsumption = 50.0f; const float GrowSpeed = 5.0f; + + private Hull hull; - protected Hull hull; - - protected Vector2 position; - protected Vector2 size; + private Vector2 position; + private Vector2 size; private Entity Submarine; - protected bool removed; + private bool removed; #if CLIENT private List burnDecals = new List(); @@ -182,16 +182,6 @@ namespace Barotrauma } } - protected virtual void ReduceOxygen(float deltaTime) - { - hull.Oxygen -= size.X * deltaTime * OxygenConsumption; - } - - protected virtual void AdjustXPos(float growModifier, float deltaTime) - { - position.X -= GrowSpeed * growModifier * 0.5f * deltaTime; - } - partial void UpdateProjSpecific(float growModifier); private void OnChangeHull(Vector2 pos, Hull particleHull) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs index 695b56df0..5bace8352 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs @@ -138,9 +138,6 @@ namespace Barotrauma public Submarine StartOutpost { get; private set; } public Submarine EndOutpost { get; private set; } - private Submarine preSelectedStartOutpost; - private Submarine preSelectedEndOutpost; - public string Seed { get { return seed; } @@ -212,7 +209,7 @@ namespace Barotrauma /// /// A scalar between 0-100 /// A scalar between 0-1 (0 = the minimum width defined in the generation params is used, 1 = the max width is used) - public Level(string seed, float difficulty, float sizeFactor, LevelGenerationParams generationParams, Biome biome, Submarine startOutpost = null, Submarine endOutPost = null) + public Level(string seed, float difficulty, float sizeFactor, LevelGenerationParams generationParams, Biome biome) : base(null) { @@ -228,9 +225,6 @@ namespace Barotrauma (width / GridCellSize) * GridCellSize, (generationParams.Height / GridCellSize) * GridCellSize); - preSelectedStartOutpost = startOutpost; - preSelectedEndOutpost = endOutPost; - //remove from entity dictionary base.Remove(); } @@ -1516,24 +1510,14 @@ namespace Barotrauma continue; } - //only create a starting outpost in campaign and tutorial modes - if (!IsModeStartOutpostCompatible() && ((i == 0) == !Mirrored)) + //only create a starting outpost in campaign mode + if (GameMain.GameSession?.GameMode as CampaignMode == null && ((i == 0) == !Mirrored)) { continue; } - - Submarine outpost = null; - - if (i == 0 && preSelectedStartOutpost == null || i == 1 && preSelectedEndOutpost == null) - { - string outpostFile = outpostFiles.GetRandom(Rand.RandSync.Server); - outpost = new Submarine(outpostFile, tryLoad: false); - } - else - { - outpost = (i == 0) ? preSelectedStartOutpost : preSelectedEndOutpost; - } - + + string outpostFile = outpostFiles.GetRandom(Rand.RandSync.Server); + var outpost = new Submarine(outpostFile, tryLoad: false); outpost.Load(unloadPrevious: false); outpost.MakeOutpost(); @@ -1585,15 +1569,6 @@ namespace Barotrauma } } - private bool IsModeStartOutpostCompatible() - { -#if CLIENT - return GameMain.GameSession?.GameMode as CampaignMode != null || GameMain.GameSession?.GameMode as TutorialMode != null; -#else - return GameMain.GameSession?.GameMode as CampaignMode != null; -#endif - } - public override void Remove() { base.Remove(); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs index 38dcb8a64..59d65255f 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs @@ -635,6 +635,24 @@ namespace Barotrauma var character = ((Limb)f2.Body.UserData).character; if (character.DisableImpactDamageTimer > 0.0f || ((Limb)f2.Body.UserData).Mass < 100.0f) return true; } + + if (!Prefab.Platform && Prefab.StairDirection == Direction.None) + { + Vector2 pos = ConvertUnits.ToDisplayUnits(f2.Body.Position); + + int section = FindSectionIndex(pos); + if (section > -1) + { + Vector2 normal = contact.Manifold.LocalNormal; + + float impact = Vector2.Dot(f2.Body.LinearVelocity, -normal) * f2.Body.Mass * 0.1f; + if (impact < 10.0f) return true; +#if CLIENT + SoundPlayer.PlayDamageSound("StructureBlunt", impact, SectionPosition(section, true), tags: Tags); +#endif + AddDamage(section, impact); + } + } OnImpactProjSpecific(f1, f2, contact); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index a9c771551..9167e2774 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -431,12 +431,6 @@ namespace Barotrauma else if (ic is Pickable pickable) { //prevent picking up (or deattaching) items -#if CLIENT - if (GameMain.GameSession?.GameMode is TutorialMode) - { - continue; - } -#endif pickable.CanBePicked = false; pickable.CanBeSelected = false; } @@ -542,6 +536,20 @@ namespace Barotrauma { maxX = Math.Min(maxX, ruin.Area.X - 100.0f); } + else + { + maxX = Math.Min(maxX, ruin.Area.X - 100.0f); + } + } + + if (minX < 0.0f && maxX > Level.Loaded.Size.X) + { + //no walls found at either side, just use the initial spawnpos and hope for the best + } + else if (minX < 0) + { + //no wall found at the left side, spawn to the left from the right-side wall + spawnPos.X = maxX - minWidth - 100.0f + subDockingPortOffset; } if (minX < 0.0f && maxX > Level.Loaded.Size.X) diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs index 95575a22c..d423f76a6 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs @@ -468,7 +468,7 @@ namespace Barotrauma var gaps = newHull?.ConnectedGaps ?? Gap.GapList.Where(g => g.Submarine == submarine); targetPos = character.WorldPosition; - Gap adjacentGap = Gap.FindAdjacent(gaps, targetPos, 500.0f); + Gap adjacentGap = Gap.FindAdjacent(gaps, targetPos, 200.0f); if (adjacentGap == null) return true; if (newHull != null) diff --git a/Barotrauma/BarotraumaShared/Source/Networking/EntitySpawner.cs b/Barotrauma/BarotraumaShared/Source/Networking/EntitySpawner.cs index e89da30e1..c2cd7710d 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/EntitySpawner.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/EntitySpawner.cs @@ -102,7 +102,7 @@ namespace Barotrauma { string errorMsg = "Attempted to add a null item to entity spawn queue.\n" + Environment.StackTrace; DebugConsole.ThrowError(errorMsg); - GameAnalyticsManager.AddErrorEventOnce("EntitySpawner.AddToSpawnQueue1:ItemPrefabNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + GameAnalyticsManager.AddErrorEventOnce("EntitySpawner.AddToSpawnQueue3:ItemPrefabNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return; } spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, worldPosition, condition)); @@ -115,7 +115,7 @@ namespace Barotrauma { string errorMsg = "Attempted to add a null item to entity spawn queue.\n" + Environment.StackTrace; DebugConsole.ThrowError(errorMsg); - GameAnalyticsManager.AddErrorEventOnce("EntitySpawner.AddToSpawnQueue2:ItemPrefabNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + GameAnalyticsManager.AddErrorEventOnce("EntitySpawner.AddToSpawnQueue3:ItemPrefabNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return; } spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, position, sub, condition)); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs b/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs index 5dd5f1546..0a5ca7bb0 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs @@ -401,7 +401,7 @@ namespace Barotrauma.Networking public bool AllowRagdollButton { get; - set; + private set; } [Serialize(true, true)] diff --git a/Barotrauma/BarotraumaShared/Source/Serialization/XMLExtensions.cs b/Barotrauma/BarotraumaShared/Source/Serialization/XMLExtensions.cs index 10b3691c6..8f9090ae9 100644 --- a/Barotrauma/BarotraumaShared/Source/Serialization/XMLExtensions.cs +++ b/Barotrauma/BarotraumaShared/Source/Serialization/XMLExtensions.cs @@ -46,15 +46,7 @@ namespace Barotrauma if (File.Exists(filePath)) { - try - { - doc = XDocument.Load(filePath, LoadOptions.SetBaseUri); - } - catch - { - return null; - } - + doc = XDocument.Load(filePath, LoadOptions.SetBaseUri); if (doc.Root == null) return null; } diff --git a/Barotrauma/BarotraumaShared/Source/TextManager.cs b/Barotrauma/BarotraumaShared/Source/TextManager.cs index ff727c72b..d1d47b5ad 100644 --- a/Barotrauma/BarotraumaShared/Source/TextManager.cs +++ b/Barotrauma/BarotraumaShared/Source/TextManager.cs @@ -118,14 +118,160 @@ namespace Barotrauma } } - public static string ParseInputTypes(string text) + public static string GetFormatted(string textTag, bool returnNull = false, params object[] args) { - foreach (InputType inputType in Enum.GetValues(typeof(InputType))) + string text = Get(textTag, returnNull); + + if (text == null || text.Length == 0) { - text = text.Replace("[" + inputType.ToString().ToLowerInvariant() + "]", GameMain.Config.KeyBind(inputType).ToString()); - text = text.Replace("[InputType." + inputType.ToString() + "]", GameMain.Config.KeyBind(inputType).ToString()); + if (returnNull) + { + return null; + } + else + { + DebugConsole.ThrowError("Text \"" + textTag + "\" not found."); + return textTag; + } } - return text; + + return string.Format(text, args); + } + + // Format: ServerMessage.Identifier1/ServerMessage.Indentifier2~[variable1]=value~[variable2]=value + public static string GetServerMessage(string serverMessage) + { + if (!textPacks.ContainsKey(Language)) + { + DebugConsole.ThrowError("No text packs available for the selected language (" + Language + ")! Switching to English..."); + Language = "English"; + if (!textPacks.ContainsKey(Language)) + { + throw new Exception("No text packs available in English!"); + } + } + + string[] messages = serverMessage.Split('/'); + + try + { + for (int i = 0; i < messages.Length; i++) + { + if (!IsServerMessageWithVariables(messages[i])) // No variables, try to translate + { + if (messages[i].Contains(" ")) continue; // Spaces found, do not translate + string msg = Get(messages[i], true); + if (msg != null) // If a translation was found, otherwise use the original + { + messages[i] = msg; + } + } + else + { + string[] messageWithVariables = messages[i].Split('~'); + string msg = Get(messageWithVariables[0], true); + + if (msg != null) // If a translation was found, otherwise use the original + { + messages[i] = msg; + } + else + { + continue; // No translation found, probably caused by player input -> skip variable handling + } + + // First index is always the message identifier -> start at 1 + for (int j = 1; j < messageWithVariables.Length; j++) + { + string[] variableAndValue = messageWithVariables[j].Split('='); + messages[i] = messages[i].Replace(variableAndValue[0], variableAndValue[1]); + } + } + } + + string translatedServerMessage = string.Empty; + for (int i = 0; i < messages.Length; i++) + { + translatedServerMessage += messages[i]; + } + return translatedServerMessage; + } + + catch (IndexOutOfRangeException exception) + { + string errorMsg = "Failed to translate server message \"" + serverMessage + "\"."; +#if DEBUG + DebugConsole.ThrowError(errorMsg, exception); +#endif + GameAnalyticsManager.AddErrorEventOnce("TextManager.GetServerMessage:" + serverMessage, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + return errorMsg; + } + } + + public static bool IsServerMessageWithVariables(string message) + { + for (int i = 0; i < serverMessageCharacters.Length; i++) + { + if (!message.Contains(serverMessageCharacters[i])) return false; + } + + return true; + } + + public static List GetAll(string textTag) + { + if (!textPacks.ContainsKey(Language)) + { + DebugConsole.ThrowError("No text packs available for the selected language (" + Language + ")! Switching to English..."); + Language = "English"; + if (!textPacks.ContainsKey(Language)) + { + throw new Exception("No text packs available in English!"); + } + } + + List allText; + + foreach (TextPack textPack in textPacks[Language]) + { + allText = textPack.GetAll(textTag); + if (allText != null) return allText; + } + + //if text was not found and we're using a language other than English, see if we can find an English version + //may happen, for example, if a user has selected another language and using mods that haven't been translated to that language + if (Language != "English" && textPacks.ContainsKey("English")) + { + foreach (TextPack textPack in textPacks["English"]) + { + allText = textPack.GetAll(textTag); + if (allText != null) return allText; + } + } + + return null; + } + + public static List> GetAllTagTextPairs() + { + if (!textPacks.ContainsKey(Language)) + { + DebugConsole.ThrowError("No text packs available for the selected language (" + Language + ")! Switching to English..."); + Language = "English"; + if (!textPacks.ContainsKey(Language)) + { + throw new Exception("No text packs available in English!"); + } + } + + List> allText = new List>(); + + foreach (TextPack textPack in textPacks[Language]) + { + allText.AddRange(textPack.GetAllTagTextPairs()); + } + + return allText; } public static string GetFormatted(string textTag, bool returnNull = false, params object[] args) diff --git a/Barotrauma/BarotraumaShared/Source/Utils/MathUtils.cs b/Barotrauma/BarotraumaShared/Source/Utils/MathUtils.cs index bb12617b7..724c807d2 100644 --- a/Barotrauma/BarotraumaShared/Source/Utils/MathUtils.cs +++ b/Barotrauma/BarotraumaShared/Source/Utils/MathUtils.cs @@ -795,6 +795,18 @@ namespace Barotrauma return new Vector2((float)x, (float)y); } + /// + /// Rotates a point in 2d space around the origin + /// + public static Vector2 RotatePoint(Vector2 point, float radians) + { + var sin = Math.Sin(radians); + var cos = Math.Cos(radians); + var x = (cos * point.X) - (sin * point.Y); + var y = (sin * point.X) + (cos * point.Y); + return new Vector2((float)x, (float)y); + } + /// /// Returns the corners of an imaginary rectangle. /// Unlike the XNA rectangle, this can be rotated with the up parameter. diff --git a/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub b/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub index 6ba4eb52d..a0fb19aae 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub and b/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub index de829c19f..1875ad5b0 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub and b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Humpback.sub b/Barotrauma/BarotraumaShared/Submarines/Humpback.sub index 50175a38b..c57bc40b9 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Humpback.sub and b/Barotrauma/BarotraumaShared/Submarines/Humpback.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Orca.sub b/Barotrauma/BarotraumaShared/Submarines/Orca.sub index a95baad85..bc01cbce0 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Orca.sub and b/Barotrauma/BarotraumaShared/Submarines/Orca.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Typhon.sub b/Barotrauma/BarotraumaShared/Submarines/Typhon.sub index a689efd8d..102edb6f8 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Typhon.sub and b/Barotrauma/BarotraumaShared/Submarines/Typhon.sub differ diff --git a/Barotrauma/BarotraumaShared/changelog.txt b/Barotrauma/BarotraumaShared/changelog.txt index beb985789..a8830200b 100644 --- a/Barotrauma/BarotraumaShared/changelog.txt +++ b/Barotrauma/BarotraumaShared/changelog.txt @@ -1,62 +1,3 @@ ---------------------------------------------------------------------------------------------------------- -v0.8.10.0 ---------------------------------------------------------------------------------------------------------- - -Additions and changes: -- Completely remade tutorials (separate tutorial for each job). -- Added a door and hatch variants with integrated buttons. -- New outpost graphics. -- Added swarm behavior to crawlers. -- Added a new mission where you have to kill a swarm of crawlers. -- Numerous crew AI improvements. -- Balanced item deterioration values. -- Mineral sprites change when collected from the environment. -- Added an option to disable directional voice chat. -- Added automatic submarine repair option to the campaign. -- Added "all" tab to the entity list in the submarine editor. -- Hide the crew area, chat box and server buttons when operating a turret or searchlight. -- Doors can be repaired with a wrench. -- Some new lamp variants. -- Display a progress bar when welding doors shut. -- Items that don't give any materials when deconstructed cannot be deconstructed. -- Added a console command that resets selected items and structures to prefab values ("resetselected"). -- Option to toggle structure drop shadows and edit the position of the shadow in the sub editor. -- Minor physics optimizations. -- Disable background music & ambience in the character editor. -- More pronounced limping animation when a character's legs are injured. -- The inventory slots next to the character portrait (ID card, uniform, etc) can be hidden. -- Some new sound effects and background music. -- All walls can be scaled in the submarine editor. -- Structure damage is visualized when using debugdraw. -- Improved font scaling on different resolutions. -- Added Steam overlay support to Workshop. -- Server list shows which servers have voice chat enabled. -- Show a message box notifying respawning traitors that they're no longer a traitor. -- Added a search bar to the store menu. -- Added search bars to sub lists in campaign setup UI and sub editor. - -Bugfixes: -- Don't allow rewiring and deattaching an item at the same time (happened when interacting with an item -while holding both a screwdriver and a wrench). -- Fixed bots being unable to complete almost any task in the multiplayer due to a bug that caused -them to interpret the sub as another crew's submarine. -- When spawning multiple monsters at the same time, spread them around a bit to prevent the players -from getting attacked by a ball of overlapping crawlers. -- Fixed huge lag spikes when a character tries to escape from an enemy but can't find a path away from it. -- Fixed file transfer progress bars not being visible in the server lobby. -- Fixed crashing when attempting to start a mission round with mission type set to None. -- Fixed ElectricalDischarger electricity effect staying visible if the item breaks or the component -is deactivated from outside (e.g. via a StatusEffect or the parent component). -- Fixed specular maps being rendered on top of characters when outside the sub. -- Fixed excessively bright lights around sonar flora and lava vents. -- Fixes to item collider sizes. -- Fixed inability to scroll through long texts in the sub editor's textboxes. -- Fixed clients not being able to see other characters in spectator if they've died far away from the sub. -- Fixed non-latin characters not being displayed correctly in Workshop item texts. -- Don't prevent selecting items in the sub editor when the cursor is on a wire node, because it makes it -very difficult (or impossible) to select small items in the wiring mode. -- Fixed crashing when attempting to use the "spawnitem" command when a round is not running. - --------------------------------------------------------------------------------------------------------- v0.8.9.10 --------------------------------------------------------------------------------------------------------- diff --git a/Barotrauma_Solution.sln b/Barotrauma_Solution.sln index 94040636c..c35da4735 100644 --- a/Barotrauma_Solution.sln +++ b/Barotrauma_Solution.sln @@ -61,8 +61,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MacClient", "Barotrauma\Bar {85232B20-074D-4723-B0C6-91495391E448} = {85232B20-074D-4723-B0C6-91495391E448} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Concentus", "Libraries\Concentus\CSharp\Concentus\Concentus.csproj", "{777A5414-CAE5-4011-96DF-C9661985917E}" -EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution Barotrauma\BarotraumaClient\ClientCode.projitems*{008c0f83-e914-4966-9135-ea885059edd8}*SharedItemsImports = 4 @@ -83,16 +81,12 @@ Global Barotrauma\BarotraumaShared\SharedContent.projitems*{d7f9fdd3-af03-46ad-a2c2-f590899712b7}*SharedItemsImports = 4 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 DebugLinux|Any CPU = DebugLinux|Any CPU DebugLinux|x64 = DebugLinux|x64 DebugMac|Any CPU = DebugMac|Any CPU DebugMac|x64 = DebugMac|x64 DebugWindows|Any CPU = DebugWindows|Any CPU DebugWindows|x64 = DebugWindows|x64 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 ReleaseLinux|Any CPU = ReleaseLinux|Any CPU ReleaseLinux|x64 = ReleaseLinux|x64 ReleaseMac|Any CPU = ReleaseMac|Any CPU @@ -101,10 +95,6 @@ Global ReleaseWindows|x64 = ReleaseWindows|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|Any CPU.ActiveCfg = ReleaseWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|Any CPU.Build.0 = ReleaseWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|x64.ActiveCfg = DebugWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Debug|x64.Build.0 = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|Any CPU.ActiveCfg = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|Any CPU.Build.0 = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.DebugLinux|x64.ActiveCfg = DebugWindows|x64 @@ -114,10 +104,6 @@ Global {008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|x64.ActiveCfg = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.DebugWindows|x64.Build.0 = DebugWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Release|Any CPU.ActiveCfg = ReleaseWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Release|Any CPU.Build.0 = ReleaseWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Release|x64.ActiveCfg = ReleaseWindows|x64 - {008C0F83-E914-4966-9135-EA885059EDD8}.Release|x64.Build.0 = ReleaseWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|Any CPU.ActiveCfg = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|Any CPU.Build.0 = DebugWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseLinux|x64.ActiveCfg = ReleaseWindows|x64 @@ -127,10 +113,6 @@ Global {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64 {008C0F83-E914-4966-9135-EA885059EDD8}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64 - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|x64.ActiveCfg = Debug|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Debug|x64.Build.0 = Debug|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugLinux|x64.ActiveCfg = Debug|Any CPU @@ -143,10 +125,6 @@ Global {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|x64.ActiveCfg = Debug|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.DebugWindows|x64.Build.0 = Debug|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|Any CPU.Build.0 = Release|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x64.ActiveCfg = Release|Any CPU - {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.Release|x64.Build.0 = Release|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU @@ -159,10 +137,6 @@ Global {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU {49BA1C69-6104-41AC-A5D8-B54FA9F696E8}.ReleaseWindows|x64.Build.0 = Release|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x64.ActiveCfg = Debug|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x64.Build.0 = Debug|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugLinux|x64.ActiveCfg = Debug|Any CPU @@ -175,10 +149,6 @@ Global {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|x64.ActiveCfg = Debug|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.DebugWindows|x64.Build.0 = Debug|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Any CPU.Build.0 = Release|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x64.ActiveCfg = Release|Any CPU - {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x64.Build.0 = Release|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU @@ -191,10 +161,6 @@ Global {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.ReleaseWindows|x64.Build.0 = Release|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|x64.ActiveCfg = Debug|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|x64.Build.0 = Debug|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugLinux|x64.ActiveCfg = Debug|Any CPU @@ -207,10 +173,6 @@ Global {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|x64.ActiveCfg = Debug|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.DebugWindows|x64.Build.0 = Debug|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|Any CPU.Build.0 = Release|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|x64.ActiveCfg = Release|Any CPU - {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|x64.Build.0 = Release|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU @@ -223,10 +185,6 @@ Global {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU {C293DB32-FA42-486D-B128-5A12522FAE4E}.ReleaseWindows|x64.Build.0 = Release|Any CPU - {85232B20-074D-4723-B0C6-91495391E448}.Debug|Any CPU.ActiveCfg = ReleaseWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Debug|Any CPU.Build.0 = ReleaseWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Debug|x64.ActiveCfg = DebugWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Debug|x64.Build.0 = DebugWindows|x64 {85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x64 {85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|Any CPU.Build.0 = DebugLinux|x64 {85232B20-074D-4723-B0C6-91495391E448}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 @@ -237,10 +195,6 @@ Global {85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|x64 {85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|x64.ActiveCfg = DebugWindows|x64 {85232B20-074D-4723-B0C6-91495391E448}.DebugWindows|x64.Build.0 = DebugWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Release|Any CPU.ActiveCfg = ReleaseWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Release|Any CPU.Build.0 = ReleaseWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Release|x64.ActiveCfg = ReleaseWindows|x64 - {85232B20-074D-4723-B0C6-91495391E448}.Release|x64.Build.0 = ReleaseWindows|x64 {85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x64 {85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64 {85232B20-074D-4723-B0C6-91495391E448}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64 @@ -250,10 +204,6 @@ Global {85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x64 {85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64 {85232B20-074D-4723-B0C6-91495391E448}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64 - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|x64.ActiveCfg = Debug|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Debug|x64.Build.0 = Debug|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugLinux|x64.ActiveCfg = Debug|Any CPU @@ -266,10 +216,6 @@ Global {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|x64.ActiveCfg = Debug|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.DebugWindows|x64.Build.0 = Debug|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|Any CPU.Build.0 = Release|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|x64.ActiveCfg = Release|Any CPU - {A4610E4C-DD34-428B-BABB-779CA0B5993A}.Release|x64.Build.0 = Release|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU @@ -282,10 +228,6 @@ Global {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU {A4610E4C-DD34-428B-BABB-779CA0B5993A}.ReleaseWindows|x64.Build.0 = Release|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|x64.ActiveCfg = Debug|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Debug|x64.Build.0 = Debug|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugLinux|x64.ActiveCfg = Debug|Any CPU @@ -298,10 +240,6 @@ Global {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|x64.ActiveCfg = Debug|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.DebugWindows|x64.Build.0 = Debug|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|Any CPU.Build.0 = Release|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|x64.ActiveCfg = Release|Any CPU - {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.Release|x64.Build.0 = Release|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU @@ -314,10 +252,6 @@ Global {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU {3AF0347C-5A9B-4421-868C-8EE3DBFAEBC6}.ReleaseWindows|x64.Build.0 = Release|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|Any CPU.ActiveCfg = DebugWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|Any CPU.Build.0 = DebugWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|x64.ActiveCfg = DebugWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Debug|x64.Build.0 = DebugWindows|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|Any CPU.Build.0 = DebugLinux|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugLinux|x64.ActiveCfg = DebugLinux|Any CPU @@ -329,10 +263,6 @@ Global {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|Any CPU.ActiveCfg = DebugWindows|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|Any CPU.Build.0 = DebugWindows|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.DebugWindows|x64.ActiveCfg = DebugWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|Any CPU.ActiveCfg = ReleaseWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|Any CPU.Build.0 = ReleaseWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|x64.ActiveCfg = ReleaseWindows|Any CPU - {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.Release|x64.Build.0 = ReleaseWindows|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|Any CPU.Build.0 = ReleaseLinux|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|Any CPU @@ -344,10 +274,6 @@ Global {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|Any CPU.Build.0 = ReleaseWindows|Any CPU {0AAD36E3-51A5-4A07-AB60-5C8A66BD38B7}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Debug|Any CPU.Build.0 = Debug|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Debug|x64.ActiveCfg = Debug|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Debug|x64.Build.0 = Debug|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugLinux|Any CPU.Build.0 = DebugLinux|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugLinux|x64.ActiveCfg = DebugLinux|Any CPU @@ -358,10 +284,6 @@ Global {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|Any CPU.Build.0 = DebugWindows|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|x64.ActiveCfg = DebugWindows|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.DebugWindows|x64.Build.0 = DebugWindows|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Release|Any CPU.ActiveCfg = Release|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Release|Any CPU.Build.0 = Release|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Release|x64.ActiveCfg = Release|Any CPU - {830461AA-3E2E-4BDE-9B27-1B3280836521}.Release|x64.Build.0 = Release|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseLinux|Any CPU.Build.0 = ReleaseLinux|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|Any CPU @@ -372,10 +294,6 @@ Global {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|Any CPU.Build.0 = ReleaseWindows|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|Any CPU {830461AA-3E2E-4BDE-9B27-1B3280836521}.ReleaseWindows|x64.Build.0 = ReleaseWindows|Any CPU - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Debug|Any CPU.ActiveCfg = ReleaseLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Debug|Any CPU.Build.0 = ReleaseLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Debug|x64.ActiveCfg = DebugLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Debug|x64.Build.0 = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugLinux|x64.Build.0 = DebugLinux|x64 @@ -385,10 +303,6 @@ Global {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugWindows|Any CPU.ActiveCfg = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugWindows|Any CPU.Build.0 = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.DebugWindows|x64.ActiveCfg = DebugLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Release|Any CPU.ActiveCfg = ReleaseLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Release|Any CPU.Build.0 = ReleaseLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Release|x64.ActiveCfg = ReleaseLinux|x64 - {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.Release|x64.Build.0 = ReleaseLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64 @@ -398,10 +312,6 @@ Global {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseWindows|Any CPU.ActiveCfg = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseWindows|Any CPU.Build.0 = DebugLinux|x64 {D7F9FDD3-AF03-46AD-A2C2-F590899712B7}.ReleaseWindows|x64.ActiveCfg = ReleaseLinux|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Debug|Any CPU.ActiveCfg = ReleaseMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Debug|Any CPU.Build.0 = ReleaseMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Debug|x64.ActiveCfg = DebugMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Debug|x64.Build.0 = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugLinux|Any CPU.ActiveCfg = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugLinux|x64.ActiveCfg = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugMac|Any CPU.ActiveCfg = DebugMac|x64 @@ -411,10 +321,6 @@ Global {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugWindows|Any CPU.ActiveCfg = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugWindows|Any CPU.Build.0 = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.DebugWindows|x64.ActiveCfg = DebugMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Release|Any CPU.ActiveCfg = ReleaseMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Release|Any CPU.Build.0 = ReleaseMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Release|x64.ActiveCfg = ReleaseMac|x64 - {CC996BB6-3781-4868-B996-07F9CDC936ED}.Release|x64.Build.0 = ReleaseMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseLinux|x64.ActiveCfg = ReleaseMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseMac|Any CPU.ActiveCfg = DebugMac|x64 @@ -424,38 +330,6 @@ Global {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseWindows|Any CPU.ActiveCfg = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseWindows|Any CPU.Build.0 = DebugMac|x64 {CC996BB6-3781-4868-B996-07F9CDC936ED}.ReleaseWindows|x64.ActiveCfg = ReleaseMac|x64 - {777A5414-CAE5-4011-96DF-C9661985917E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Debug|x64.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Debug|x64.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugLinux|x64.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugLinux|x64.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugMac|Any CPU.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugMac|x64.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugMac|x64.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugWindows|Any CPU.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugWindows|Any CPU.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugWindows|x64.ActiveCfg = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.DebugWindows|x64.Build.0 = Debug|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Release|Any CPU.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Release|x64.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.Release|x64.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseLinux|x64.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseMac|x64.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseMac|x64.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseWindows|x64.ActiveCfg = Release|Any CPU - {777A5414-CAE5-4011-96DF-C9661985917E}.ReleaseWindows|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -481,7 +355,6 @@ Global {D7F9FDD3-AF03-46AD-A2C2-F590899712B7} = {B2C129F2-8E5C-419A-98EB-161AA5B5FC71} {DBCF6FF0-3DE9-11E9-B3EF-63280FDBDA4A} = {F35DF9BF-0BED-4FEF-A51C-DD83C531882F} {CC996BB6-3781-4868-B996-07F9CDC936ED} = {DBCF6FF0-3DE9-11E9-B3EF-63280FDBDA4A} - {777A5414-CAE5-4011-96DF-C9661985917E} = {DE36F45F-F09E-4719-B953-00D148F7722A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {17032EAB-554B-4B44-A4F6-EFB177ACAB7A}